1、/*本例程主要实现步进电机的的控制以及数码管显示档位和转速*/*S6 档位调节 S7 暂停并且查看转速 S8 正转 S9 逆转 * /*数码管第一位显示档位 后四位显示转速*/*发现的问题:由于数码管显示的延时过多,如果让数码管同步显示转速,会出现一闪一闪的现象。我将会考虑用中断定时解决这 个问题。#includetypedef unsigned char uchar;typedef unsigned int uint;#define t 5#define one 2 /这里只是用了简单的延时函数,一般用中断比较准确/*根据延时算转速:本电机的的步距角为 5.625 度,减速比为 64,设定为
2、 ONE 时,算出转速:延时为 2ms,即 2ms/脉冲/* 所以 60000ms/30000 个脉冲 即 1 分钟/30000 个脉冲 ,由于一个脉冲一个步距角,即 1 分钟/30000*5.625 度=168780 度/*即 1 分钟/168780/360 圈,所以 468.83 圈/分钟(内部) ,所以(外部)真正看到转速应为 468.83/64 圈=7.32 圈/分钟 #define two 5 /计算得转速为 2.93rpm#define three 10 /计算得转速为 1.46rpm#define four 30 /计算得转速为 0.49rpmuchar temp,num,gra
3、de=5; / 设定档bit clockwise=1; / 设定顺时针bit startstop=0; / 设定停止位sbit dula=P26;sbit wela=P27;unsigned char code table0=0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08; /正转表unsigned char code table1=0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09; /反转表uchar code table2=0x06,0x07,0x80,0x4f, 0x5b ; /一档uchar code table3=0x5b
4、,0x5b ,0x80,0x6f, 0x4f; /二档uchar code table4=0x4f ,0x06,0x80, 0x66,0x7d; /三档uchar code table5=0x66,0x3f,0x80, 0x66, 0x6f; /四档/*延时函数 MS*void delay(unsigned char z) unsigned int x,y;for(x=z;x0;x-)for(y=110;y0;y-); /*数码管显示*void display()if(grade=2) /一档 dula=1;P0=table20;dula=0;P0=0xfe;wela=1;delay(5);P
5、0=0xff;wela=0;dula=1;P0=table21;dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table22;dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table23;dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table24;dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;if(grade=5) /二档 dula=1;P0=tabl
6、e30;dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table31;dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table32;dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table33;dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table34;dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;w
7、ela=0;if(grade=10) /三档 dula=1;P0=table40;dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table41;dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table42;dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table43;dula=0;P0=0xef;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table44;dul
8、a=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;if(grade=30) /四档 dula=1;P0=table50;dula=0;P0=0xfe;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table51;dula=0;P0=0xfb;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table52;dula=0;P0=0xf7;wela=1;delay(5);P0=0xff;wela=0;dula=1;P0=table53;dula=0;P0=0xef;wela=1;delay(5)
9、;P0=0xff;wela=0;dula=1;P0=table54;dula=0;P0=0xdf;wela=1;delay(5);P0=0xff;wela=0;/*键盘扫描*void keyscan()P3=0xfe; /扫描第一行temp=P3;temp=tempif(temp!=0xf0)delay(t);temp=P3;temp=temp if(temp!=0xf0)temp=P3;switch(temp)case 0xee: /调节档速num+;if(num=1)grade=one; if(num=2)grade=two; if(num=3)grade=three; if(num=4)
10、grade=four; num=0; break; case 0xde: startstop=0;break; /停止case 0xbe: clockwise=1;startstop=1;break; /正转case 0x7e: clockwise=0;startstop=1;break; /逆转while(temp!=0xf0)temp=P3;temp=temp/*电机运转方式*void stepmotor()char i,r; while(clockwise for(i=0;i8;i+) /一轮通电P1=table0i;delay(grade);/通过延时改变速度while(!clockwise for(r=0;r8;r+) P1=table1r;delay(grade);/*主函数*void main() while(1)keyscan(); /如果单单是这里加键盘扫描,当进入电机运转程序后,会进入 while 的死循环段,将无法进行键盘扫描stepmotor(); display(); /实时显示速度