#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^1; //段选 sbit wela=P2^0; //位选 uchar code tabledu[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //位码 uchar code tablewe[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //段码 uchar Data[8]; //存数位的段码 sbit d1=P1^0; //定义步进电机的端口 sbit d2=P1^1; sbit d3=P1^2; sbit d4=P1^3; #define A {d1=1,d2=0,d3=0,d4=0;} //1-2相励磁法 #define B {d1=0,d2=1,d3=0,d4=0;} #define C {d1=0,d2=0,d3=1,d4=0;} #define D {d1=0,d2=0,d3=0,d4=1;} #define AB {d1=1,d2=1,d3=0,d4=0;} #define BC {d1=0,d2=1,d3=1,d4=0;} #define CD {d1=0,d2=0,d3=1,d4=1;} #define DA {d1=1,d2=0,d3=0,d4=1;} #define OF {d1=0,d2=0,d3=0,d4=0;} void delay(uchar t) //延时函数 { while(--t); } void delayMS(uchar t) { while(t--) { delay(245); delay(245); } } void init(); //初始化函数 void display(uchar f,uchar n); //显示函数 uchar speed; //控制延时长度,speed越大,延时越长,步进电机转速越慢 void main() { uint i=512; //控制步进电机转的圈数 init(); //初始化定时器0 EA=1; //开总中断 EX0=1; //开外部中断 IT0=1; //边沿触发方式 speed=3; //初始化speed Data[0]=tabledu[speed/10]; //将speed的十位段码装入Data[0]中 Data[1]=tabledu[speed%10]; //将speed的个位段码装入Data[1]中 OF //关闭任意线圈,步进电机不转动 while(i--) //步进电机转圈 { A //1-2相励磁法 delayMS(speed); AB delayMS(speed); B delayMS(speed); BC delayMS(speed); C delayMS(speed); CD delayMS(speed); D delayMS(speed); DA delayMS(speed); } } void init() //初始化定时器 { TMOD=0x01; //T0方式,定时器模式,16位定时器 EA=1; //开总中断 ET0=1; //开定时器0中断 TR0=1; //T0开始工作 PT0=1; //定时器中断0优先级(优先) } void INTE() interrupt 0 //外部中断0 { if(!INT0) //判断独立按键是否按下 { delayMS(10); //延时消抖 if(!INT0) //再次判断独立按键是否按下 { speed++; if(speed==20) { speed=3; } Data[0]=tabledu[speed/10]; //将speed的十位段码装入Data[0]中 Data[1]=tabledu[speed%10]; //将speed的个位段码装入Data[1]中 } while(!INT0); //松手检测 } } void display(uchar f,uchar n) //数码管显示函数 { static uchar i=0; //定义静态变量i P0=0; //消隐 dula=1; dula=0; P0=0; wela=1; wela=0; P0=tablewe[i+f]; //因为f恒为0,i为静态变量(保存上一次调用此函数时的i值) wela=1; //所以位选的值随i值变 wela=0; P0=Data[i]; //段选的值随i值变,因为Data[i]的值只有0,1有取值,所以后面的都不显示 dula=1; dula=0; i++; if(i==n) //n恒为8,所以此语句即为if(i==8) { i=0; } } void timer0() interrupt 1 //定时器0中断 { TH0=(65536-2000)/256; //装初值,定时2MS TL0=(65536-2000)%256; display(0,8); //显示 }