标题:
关于LCD1602的步进电机程序和原理图
[打印本页]
作者:
LLL123
时间:
2015-7-21 11:43
标题:
关于LCD1602的步进电机程序和原理图
C51单片机写的步进电机程序,有需要拿去吧
/***************************************************
程序使用1毫秒定时器中断实现转速精确控制
步进电机用8拍驱动(A-AB-B-BC-C-CD-D-DA)
****************************************************/
#include <reg52.h>
#include "LCD1602.H"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*****端口定义************/
#define P_key P3
sbit motor_a=P1^0;
sbit motor_b=P1^1;
sbit motor_c=P1^2;
sbit motor_d=P1^3;
bit run=0;
uint speed;
uint temp_t1,temp_t2;
uchar KeyValue ;
uchar motor_step;
void Disply(void); //显示
uchar GetKey(void);//返回键盘值0--16
void ScanKey(void);//键盘扫描处理
void SetMotorSpeed(uint nSpeed);//设置电机转速 nSpeed:转速 step/s
void delayNms(uint z);//延时
/*****主函数************/
void main()
{
lcd1602_init();
motor_a=0;
motor_b=1;
motor_c=1;
motor_d=1;
motor_step=0;
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
Disply();
ScanKey();
}
}
/*****延时************/
void delayNms(uint z)
{
uint x;
for( ;z>0;z--)
for(x=124;x>0;x--)
;
}
/*****设置电机转速************/
void SetMotorSpeed(uint nSpeed)// nSpeed:转速 step/s
{
speed=nSpeed;
if(speed!=0)
{
run=1;
//计算每步需要多少毫秒
temp_t2=1000/nSpeed;
}
else
{
run=0;
}
}
/*****1毫秒定时器************/
void Timer0Interrupt(void) interrupt 1
{
if(run)
{
temp_t1++;
if(temp_t1>temp_t2)
{
temp_t1=0;
motor_step++;
if(motor_step>7) motor_step=0;
switch (motor_step)
{
case 0:
{
motor_a=0; motor_b=1;
motor_c=1; motor_d=1;
break;
}
case 1:
{
motor_a=0; motor_b=0;
motor_c=1; motor_d=1;
break;
}
case 2:
{
motor_a=1; motor_b=0;
motor_c=1; motor_d=1;
break;
}
case 3:
{
motor_a=1; motor_b=0;
motor_c=0; motor_d=1;
break;
}
case 4:
{
motor_a=1; motor_b=1;
motor_c=0; motor_d=1;
break;
}
case 5:
{
motor_a=1; motor_b=1;
motor_c=0; motor_d=0;
break;
}
case 6:
{
motor_a=1; motor_b=1;
motor_c=1; motor_d=0;
break;
}
case 7:
{
motor_a=0; motor_b=1;
motor_c=1; motor_d=0;
break;
}
default: break;
}
}
}
TH0 = 0x0FC;
TL0 = 0x18;
}
/***********显示************/
void Disply( )
{
uchar DisBuff[16];
DisBuff[0]='S';
DisBuff[1]='p';
DisBuff[2]='e';
DisBuff[3]='e';
DisBuff[4]='d';
DisBuff[5]=speed>9999 ? speed%100000/10000+0x30 : 0x20;
DisBuff[6]=speed>999 ? speed%10000/1000+0x30 : 0x20;
DisBuff[7]=speed>99 ? speed%1000/100+0x30 : 0x20;
DisBuff[8]=speed>9 ? speed%100/10+0x30 : 0x20;
DisBuff[9]=speed%10+0x30;
DisBuff[10]='s';
DisBuff[11]='t';
DisBuff[12]='e';
DisBuff[13]='p';
DisBuff[14]='/';
DisBuff[15]='s';
if(run)
lcd1602_showStr(0,0," Run ");//第一行
else lcd1602_showStr(0,0," Stop ");
lcd1602_showStr(0,1,DisBuff);//第二行
}
/***********返回键盘值0--16************/
uchar GetKey()
{
P_key=0xfe;
if((P_key&0x80)!=0x80) return 0x03;
if((P_key&0x40)!=0x40) return 0x07;
if((P_key&0x20)!=0x20) return 0x0b;
if((P_key&0x10)!=0x10) return 0x0f;
P_key=0xfd;
if((P_key&0x80)!=0x80) return 0x02;
if((P_key&0x40)!=0x40) return 0x06;
if((P_key&0x20)!=0x20) return 0x0a;
if((P_key&0x10)!=0x10) return 0x0e;
P_key=0xfb;
if((P_key&0x80)!=0x80) return 0x01;
if((P_key&0x40)!=0x40) return 0x05;
if((P_key&0x20)!=0x20) return 0x09;
if((P_key&0x10)!=0x10) return 0x0d;
P_key=0xf7;
if((P_key&0x80)!=0x80) return 0x00;
if((P_key&0x40)!=0x40) return 0x04;
if((P_key&0x20)!=0x20) return 0x08;
if((P_key&0x10)!=0x10) return 0x0c;
return 0xff;
}
/***********键盘扫描处理************/
void ScanKey()
{
if(KeyValue==GetKey()) return;
delayNms(2); //防抖
if(KeyValue==GetKey()) return;
KeyValue=GetKey();
switch(KeyValue)
{
case 0x00: //按键0
{
SetMotorSpeed(0);
break;
}
case 0x01: //按键1
{
SetMotorSpeed(5);
break;
}
case 0x02: //按键2
{
SetMotorSpeed(10);
break;
}
case 0x03: //按键3
{
SetMotorSpeed(15);
break;
}
case 0x04: //按键4
{
SetMotorSpeed(20);
break;
}
case 0x05: //按键5
{
SetMotorSpeed(25);
break;
}
case 0x06: //按键6
{
SetMotorSpeed(30);
break;
}
case 0x07: //按键7
{
SetMotorSpeed(35);
break;
}
case 0x08: //按键8
{
SetMotorSpeed(40);
break;
}
case 0x09: //按键9
{
SetMotorSpeed(45);
break;
}
case 0x0a: //按键A
{
SetMotorSpeed(50);
break;
}
case 0x0b: //按键B
{
SetMotorSpeed(55);
break;
}
case 0x0c: //按键C
{
SetMotorSpeed(60);
break;
}
case 0x0d: //按键D
{
SetMotorSpeed(65);
break;
}
case 0x0e: //按键E
{
SetMotorSpeed(70);
break;
}
case 0x0f://按键F
{
SetMotorSpeed(75);
break;
}
default: break;
}
}
复制代码
lcd1602 motor.zip
2015-7-21 11:42 上传
点击文件名下载附件
下载积分: 黑币 -5
79.56 KB, 下载次数: 52, 下载积分: 黑币 -5
作者:
大青辣椒
时间:
2015-8-27 14:06
真棒,感谢楼主分享
作者:
mirage
时间:
2017-2-8 16:37
感谢楼主分享
作者:
faridzled
时间:
2017-2-9 13:10
amazing, thanks for sharing
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1