#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP();{_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit k1 = P3^4;
sbit k2 = P3^5;
sbit k3 = P3^6;
sbit k4 = P3^7;
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_EN = P2^7;
bit on_off = 0;
bit direction = 1;
bit rate_dr = 1;
bit snum_dr = 1;
uchar code cdis1[]={"STEPPING MOTOR"};
uchar code cdis2[]={"CONTROL PROCESS"};
uchar code cdis3[]={" STOP "};
uchar code cdis4[]={"NUM: RATE: "};
uchar code cdis5[]={"RUNNING "};
uchar m,v=0,q=0;
uchar number = 0;number1 = 0;
uchar snum = 5,snum1 = 5;
uchar rate = 8;
uchar data_temp,data_temp1,data_temp2;
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0;k<125;k++)
{
}
}
}
void delayB(uchar x)
{
uchar i;
while(x--)
{
for(i=0;i<13;i++)
{
}
}
}
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
void lcd_init()
{
delay(30);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);
delay(5);
lcd_wcmd(0x06);
delay(5);
lcd_wcmd(0x01);
delay(5);
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80);
}
void LCD_init_DIS()
{
delay(10);
lcd_init();
lcd_pos(0);
m = 0;
while(cdis1[m]!='\0')
{
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40);
m = 0;
while(cdis2[m]!='\0')
{
lcd_wdat(cdis2[m]);
m++;
}
delay(3000);
lcd_pos(0);
m = 0;
while(cdis3[m]!='\0')
{
lcd_wdat(cdis3[m]);
m++;
}
lcd_pos(0x40);
m = 0;
while(cdis4[m]!='\0')
{
lcd_wdat(cdis4[m]);
m++;
}
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);
lcd_wdat(0x3e);
}
}
void data_conv()
{
data_temp1=data_temp/10;
if(data_temp1==0)
{
data_temp1=0x20;
}
else
{
data_temp1=data_temp1+0x30;
}
data_temp2 = data_temp%10;
data_temp2 = data_temp2+0x30;
}
void data_dis()
{
data_temp = snum;
data_conv();
lcd_pos(0x44);
lcd_wdat(data_temp1);
lcd_pos(0x45);
lcd_wdat(data_temp2);
data_temp = rate;
data_conv();
lcd_pos(0x4d);
lcd_wdat(data_temp1);
lcd_pos(0x4e);
lcd_wdat(data_temp2);
}
void motor_DR()
{
if(direction==1)
{
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);
lcd_wdat(0x3e);
}
}
else
{
for(m=0;m<2;m++)
{
lcd_pos(0x0c+m);
lcd_wdat(0x3c);
}
}
}
void motor_RUN()
{
if(on_off==1)
{
TR0 = 1;
lcd_pos(0);
m=0;
while(cdis5[m]!='0')
{
lcd_wdat(cdis5[m]);
m++;
}
motor_DR();
}
else
{
TR0 = 0;
P1 = 0xf0;
lcd_pos(0);
m = 0;
while(cdis3[m]!='0')
{
lcd_wdat(cdis3[m]);
m++;
}
motor_DR();
snum = snum1;
number1=0;
}
}
main()
{
LCD_init_DIS();
TMOD = 0x01;
TL0 = 0x33;
TH0 = 0xf5;
EA = 1;
ET0 = 1;
P1 = 0xf0;
while(1)
{
if(k1==0)
{
while(k1==0);
on_off=~on_off;
motor_RUN();
}
if(k2==0)
{
if(snum_dr==1)
{
snum++;
snum1 = snum;
if(snum==0x14)
{
snum_dr=~snum_dr;
}
}
else
{
snum--;
snum1=snum;
if(snum==0x01)
{
snum_dr=~snum_dr;
}
}
}
if(k3==0)
{
direction=~direction;
motor_DR();
}
if(k4==0)
{
if(rate_dr==1)
{
rate++;
if(rate==0x10)
{
rate_dr=~rate_dr;
}
}
else
{
rate--;
if(rate==0x01)
{
rate_dr=~rate_dr;
}
}
}
if(number1==snum1)
{
number1=0;
on_off=0;
TR0=0;
snum=snum1;
P1 = 0xf0;
motor_RUN();
}
data_dis();
}
}
void motor_onoff() interrupt 1
{
TL0 = 0x33;
TH0 = 0xf5;
q++;
if(q<rate)
{
return;
}
else
{
q=0;
number++;
if(number==96)
{
snum--;
number=0;
number1++;
}
if(direction==1)
{
if(v<8)
{
P1 = FFW[v];
v++;
}
if(v==8)
{
v=0;
}
}
else
{
if(v<8)
{
P1=REV[v];
v++;
}
if(v==8)
{
v=0;
}
}
}
}
评论0