本帖最后由 a406916285 于 2014-6-24 23:01 编辑
再发一个刚才以上个步进电机程序为基础,LCD1602显示speed和 左右转的程序,程序在上个基础上增加了一个定时器1来控制LCD定时器,所以程序运转上会有个小小瑕疵,在更新显示速度等信息时,步进电机会出现停顿现象,这是不是就是数控机床上好几个控制芯片的原因?程序如下:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit led=P2^2; //定时器1溢出显示灯
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
sbit key_OFF=P1^4; //步进电机停止转动
sbit key_on=P2^0; //步进电机开始转动
sbit key_l=P2^1; //步进电机正转
sbit key_R=P1^5; //步进电机反转
sbit key_jia=P1^6; //步进电机转速加
sbit key_jian=P1^7; //步进电机转速减
sbit key_t1=P2^3; //定时器1溢出控制键
sbit RS = P2^4; //定义端口
sbit RW = P2^5;
sbit EN = P2^6;
bit Flag=1; //步进电机开关标志位
bit Flag1=0; //步进电机正转标志位
bit Flag2=0; //步进电机反转标志位
uchar speed; //步进电机转速
uchar num; //lcd写数据位
uint led_time; //led闪烁控制时间
uchar code table1[]="SPEED:";
uchar code table2[]={0,0,'2','3','4','5','6','7'};
uchar code table3[]="RIGHT";
uchar code table4[]="LEFT";
unsigned int code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// 显示段码值0~9
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
void delay(uchar t);
void IT0_init();
void coil_r();
void coil_l();
void init_led();
void write_date(uchar date);
void write_com(uchar com);
void delay_o(uint z);
void main() //主函数
{
unsigned int y;
IT0_init();
init_led();
y=512;
speed=4;
P3=table[speed%8];
while(1)
{
while(y--&&Flag&&Flag1)
{
coil_r();
}
while(y--&&Flag&&Flag2)
{
coil_l();
}
}
}
void IT0_init() //外部中断以及定时器0中断
{
TMOD=0X11;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
PT0=1;
TR0=1;
TR1=1;
EA=1;
ET0=1;
ET1=1;
// EX0=1;
// IT0=1;
}
void coil_r() //步进电机正转
{
Coil_A1
delay(speed);
Coil_B1
delay(speed);
Coil_C1
delay(speed);
Coil_D1
delay(speed);
}
void coil_l() //步进电机反转
{
Coil_D1
delay(speed);
Coil_C1
delay(speed);
Coil_B1
delay(speed);
Coil_A1
delay(speed);
}
void delay(uchar t) //延时函数MS
{
uchar z;
while(t--)
{for(z=0;z<120;z++);}
}
/*void IT0_ZD() interrupt 0 //外部中断0按键控制
{
if(!INT0)
{
delay(10);
if(!INT0)
{
while(!INT0);
// speed++;
Flag=1;
Flag1=1;
Flag2=0;;
/* if(speed>7)
speed=2;*/
// }
// }
//}*/
void t0() interrupt 1 //定时器0中断按键检测
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
P3=table[speed%8];
if(!key_on)
{
delay(10);
if(!key_on)
{
while(!key_on);
Flag=1;
}
}
if(!key_OFF)
{
delay(10);
if(!key_OFF)
{
while(!key_OFF);
Flag=0;
}
}
if(!key_R)
{
delay(10);
if(!key_R)
{
while(!key_R);
Flag=1;
Flag1=0;
Flag2=1;
}
}
if(!key_jia)
{
delay(10);
if(!key_jia)
{
while(!key_jia);
speed++;
if(speed>7)
speed=2;
}
}
if(!key_jian)
{
delay(10);
if(!key_jian)
{
while(!key_jian);
speed--;
if(speed<2)
speed=7;
}
}
if(!key_l)
{
delay(10);
if(!key_l)
{
while(!key_l);
// speed++;
Flag=1;
Flag1=1;
Flag2=0;;
}
}
if(!key_t1)
{
delay(10);
if(!key_t1)
{
while(!key_t1);
TR1=~TR1;
}
}
}
void t1() interrupt 3 //定时器1中断控制lcd1602
{
TH1=(65536-2000)/256;
TL1=(65536-2000)%256;
led_time++;
if(led_time<2000) return;
led=~led;
write_com(0x80+0X04);
for(num=0;num<6;num++)
{
write_date(table1[num]);
delay_o(5);
}
write_date(table2[speed]);
if(Flag2==1&Flag1==0)
{
write_com(0x80+0x40+0X05);
for(num=0;num<5;num++)
{
write_date(table3[num]);
delay_o(5);
}
}
if(Flag2==0&Flag1==1)
{
write_com(0x80+0x40+0X05);
for(num=0;num<4;num++)
{
write_date(table4[num]);
delay_o(5);
}
}
led_time=0;
}
void delay_o(uint z) //lcd1602延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //lcd1602写指令
{
RS=0;
RW=0;
EN=0;
P0=com;
delay_o(5);
EN=1;
delay_o(5);
EN=0;
}
void write_date(uchar date) //lcd1602写数据
{
RS=1;
RW=0;
EN=0;
P0=date;
delay_o(5);
EN=1;
delay_o(5);
EN=0;
}
void init_led() //lcd1602初始化
{
write_com(0x38);
delay_o(5);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
|