基于51单片机的步进电机控制系统(速度,方向,步数)原理图、流程图、物料清单、仿真图、源代码
基于51单片机的步进电机(速度,方向,步数)
步进电机控制
1、设计矩阵键盘,10个数字键设定电机转动步数
2、设置命令按键,控制电机启动、停止、正转、反转、加速、减速、
3、通过单片机引脚驱动步进电机
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit L1=P1^0;//电机
sbit L2=P1^1;
sbit L3=P1^2;
sbit L4=P1^3;
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint step=0,step_set=0,start=0;//电机控制
uchar speed=0,speed_set=0;//速度
uchar fang=0;//方向
uchar cixu=0;
void delay(uint i)//延时
{
while(i--);
}
void disp()//显示
{
P0=0;//显示步数
P2=0;
P0=smgduan[step_set/1000];
delay(100);
P0=0;
P2=1;
P0=smgduan[step_set%1000/100];
delay(100);
P0=0;
P2=2;
P0=smgduan[step_set%100/10];
delay(100);
P0=0;
P2=3;
P0=smgduan[step_set%10];
delay(100);
P0=0;//显示速度
P2=4;
P0=smgduan[speed_set];
delay(100);
P0=0;//显示方向
P2=7;
if(fang)//左
P0=0x38;
else//右
P0=0x0e;
delay(100);
}
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P3=0x0f;
if(P3!=0x0f)
{
switch(P3)
{
case 0x0e:i=1;break;
case 0x0d:i=5;break;
case 0x0b:i=9;break;
case 0x07:i=13;
}
P3=0xf0;
switch(P3)
{
case 0xe0:j=0;break;
case 0xd0:j=1;break;
case 0xb0:j=2;break;
case 0x70:j=3;
}
while(P3!=0xf0);
}
return i+j;
}
void main()
{
uchar i,j;
P1=0x01;
TMOD|=0X01;
TH0=0XD8;
TL0=0XF0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
for(j=0;j<20;j++)//显示
disp();
i=key_scan();//读取按键
if((i>0)&&(i<11)) //数字键
{
step_set=(step_set%1000)*10+i-1;
}
if(i==11)//启动
{
start=1;
}
if(i==12)//停止
start=0;
if(i==13)//正转
fang=0;
if(i==14)//反转
fang=1;
if(i==15)//加速
{
if(speed_set>0)
speed_set--;
}
if(i==16)//减速
{
if(speed_set<9)
speed_set++;
}
}
}
void Timer0() interrupt 1
{
if(start)//电机驱动
{
if(speed<5+speed_set)//速度
speed++;
else
{
speed=0;
if((step<step_set))
{
step++;
if(fang)//方向
{
switch(cixu)
{
case 0:L2=1;break;
case 1:L1=0;break;
case 2:L3=1;break;
case 3:L2=0;break;
case 4:L4=1;break;
case 5:L3=0;break;
case 6:L1=1;break;
case 7:L4=0;
}
}
else
{
switch(cixu)
{
case 0:L4=1;break;
case 1:L1=0;break;
case 2:L3=1;break;
case 3:L4=0;break;
case 4:L2=1;break;
case 5:L3=0;break;
case 6:L1=1;break;
case 7:L2=0;
}
}
if(cixu<7)
cixu++;
else
cixu=0;
}
else
{
step=0; //停止
start=0;
}
}
}
TH0=0XD8;
TL0=0XF0;
}