程序在这里;
- #include<reg51.h>
- #include<stdio.h>
- void delay1(void);
- void delay2(void);
- void display(int);
- int bs=0;
- main()
- { char a,b,c,d,j,*q,
- done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
- done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00}, done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};
- L: a=P1;
- while(!(a&0x08)) //判断是否启动,若没启动则重新判断
- { P3=0x08;
- delay1();
- a=P1; }
- //...............................................判断工作模式
- if(a&0x01) //方式1模型
- q=done1;
- else if(a&0x02) //方式2模型
- q=done2;
- else if(a&0x04) //方式3模型
- q=done3;
- //...............................................判断电机转向
- if(a&0x10) //判断电机是否要正转
- { P3=0x10; //P1.4口为1,电机正转,红灯亮
- b=0;}
- else
- { P3=0x20; //P1.4口为0,电机反转,黄灯亮
- if(a&0x04)b=7; //反转时将b置数,使指针指到数组反相序部分
- else b=4; }
- //....................................................
- d=b;
- while(1)
- { c=*(q+b); //判断电机步数是否走完
- if(c==0)b=d; //步数走完,电机重新再走
- else
- { P3=c; //从P3输出电机控制信号
- b++;
- bs++; //总步数加1
- display(bs); //显示步数
- j=a;
- a=P1;
- if(a!=j) //判断P1口状态信号是否改变
- { if(!(a&0x08))bs=0; //若为停止信号,总步数清零
- goto L; } //状态信号改变,返回到开始,重新对电机控制
- }
- }
- }
- void delay1() //延时5ms子程序
- { int i,j;
- for(i=0;i<200;i++)
- for(j=0;j<300;j++);
- }
- void delay2() //延时50us子程序
- { int i,j;
- for(i=0;i<10;i++)
- for(j=0;j<60;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%10; //将总步数的各位分别存在num数组中
- num[1]=(n/10)%10;
- num[2]=(n/100)%10;
- num[3]=(n/1000)%10;
- for(t=0;t<50;t++) //扫描50次
- { k=0x08; //位选码指向最左一位,第四位
- for(i=0;i<4;i++)
- { P2=k; //从P2口输入位选码
- P0=~(tab[num[i]]); //取出显示码,并从P0口输出显示码
- k=k>>1; //求下一个位选码
- delay2();
- }
- }
- }
复制代码
|