基于51单片机的步进电机(步数,方向,速度,LCD1602)
步进电机的控制设计任务;
1·查阅资料,了解步进电机的工作原理·2·通过单片机给步数,控制电机的较动·
3·通过按钮可控制启停·正反转及方向和转速。设计提示:
1·设计4x4键盘,10个数字键设定电机转动步数。2·4个命令键控制电机启动·停止·正转和反转。
3·选择通过单片机的P1口控制步进电机的控制端,使其按一定的控制方式进行转动·
4、*可以选择采用双四拍(AB-BC-CD-DA AB)方式·单四拍(A-B-C-D-A)方式等工作方式编程,控制步进电机的转动方向和转速。
#include "reg51.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit AA=P1^0;//步进电机
sbit BB=P1^1;
sbit CC=P1^2;
sbit DD=P1^3;
uchar flag=0,fang=0;//方向控制
uchar time=0;//速度控制
uchar start=0;//启动
uchar sec=0;
uint quan=50,num=0;//圈数
uchar disp1[]="cycle:000";//速度
uchar key_scan()//按键检测
{
uchar i,j;
i=0;
j=0;
P3=0x0f;
if(P3!=0x0f) //检测有无按下
{
switch(P3)//检测行
{
case 0x0e:i=13;break;
case 0x0d:i=9;break;
case 0x0b:i=5;break;
case 0x07:i=1;
}
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=0;
init_1602();
TMOD|=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
i=key_scan();
//按键检测
if(i==13)//启动
{
start=1;
num=quan;
}
if(i==14)//停止
{
start=0;
num=0;
}
if(i==15)//正转
{
fang=0;
}
if(i==16)//反转
{
fang=1;
}
if((i>0)&&(i<11)) //设置圈数
{
quan=quan%100;
quan=quan*10+i-1;
}
}
}
//定时器中断
void Timer0() interrupt 1
{
if(start==1)//启动
{
if(time<4)//速度
{
time++;
}
else
{
time=0;
if(fang==0) //正转
{
switch(flag)
{
case 0:BB=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:BB=0;break;
case 4:DD=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:DD=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
if(num>0)
num--;
else
start=0;
}
}
else //反转
{
switch(flag)
{
case 0:DD=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:DD=0;break;
case 4:BB=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:BB=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
if(num>0)
num--;
else
start=0;
}
}
}
}
//=================显示
if(sec<50)//0.5s
sec++;
else
{
sec=0;
disp1[6]=quan/100+0x30;//速度
disp1[7]=quan%100/10+0x30;
disp1[8]=quan%10+0x30;
write_string(1,0,disp1);
if(start)
{
write_string(2,0,"run ");
}
else
{
write_string(2,0,"stop ");
}
if(fang==0)
{
write_string(2,8,"right");
}
else
{
write_string(2,8,"left ");
}
}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}