附 录
程序代码
#include
Char a,b,c,d,j,*q,
done1[10]={0x01,0x02,0x04,0x08,0x00,0x01,0x08,0x04,0x02,0x00}, done2[10]={0x03,0x06,0x0c,0x09,0x00,0x03,0x09,0x0c,0x06,0x00},
done3[18]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x00,0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x00}; P3=0x00; //P3.5口置1,绿灯亮,不工作
delay1();
L: a=P3;
while(!(a&0x08)) //判断是否
启动,若没启动则重新启动
{
P3=0x00; a=P3; delay1(); }
a=P3; //判断工作模式 if(a&0x01) //方式1模型 q=done1;
if(a&0x02) //方式2模型 q=done2; if(a&0x04) //方式3模型 q=done3;
if(a&0x20) //步进电机速度控制 cishu=5; else
cishu=50;
if(a&0x10) //判断电机是否要正转 {
P3=0x80; //P3.4口为
1,电机正转,红灯亮 b=0;
}
17
else {
P3=0x40; //P3.4口
为,电机反转,黄灯亮 if(a&0x04) b=9; else
b=5;
} d=b; while(1) {
c=*(q+b); //判断步数是否走完 if(c==0)
b=d; //步数走完,重新再走 else { P1=c; //从P1输出控制信号 b++;
bs++; //总步数加1 display(bs); //显示步数 j=a;
a=P3;
}
if(a!=j) //判断P3口状态信
号是否改变 {
if(!(a&0x08))
bs=0; //步数清零
goto L;
} //状态信号改变,返回到
开始,重新对电机控制 }
} void delay1() { int i,j;
for(i=0;i<200;i++) for(j=0;j<300;j++);
} void display(int n) {
Unsigned
char
tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; unsigned char i,k,t,num[4];
num[0]=n;
//将总步数的各位分别存在num数组中 num[1]=(n/10); num[2]=(n/100); num[3]=(n/1000);
for(t=0;t k=0xf7; //位选码指向最 左一位,第四位 for(i=0;i<4;i++) { P2=k; //从P2口输入位选码 18 P0=(tab[num[i]]); } //取出显示码,并从P0口输出显示码 k=k>>1; //求下一位选码 delay2(); void delay2() { int i,j; for(i=0;i<10;i++) for(j=0;j<60;j++);} } } 19 原理图 20