/*原理基本与步进电机的调速原理相同,不同之处在于新增加了两个功能,即 控制步进电机的停止与运行两个功能。这两个功能通过另外设置一个停止标志位 来控制。*/ #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit wela=P2^0; sbit dula=P2^1; uchar code tablewe[]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code tabledu[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar Data[8]; //用以存speed各个位的段码值 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;} uchar speed=1; bit stopflag; //步进电机停止与转动的控制位 void delay(uchar t) { while(--t); } void delayMS(uchar t) { while(t--) { delay(245); delay(245); } } void init(); uchar keyscan(); void display(uchar f,uchar n); void main() { uchar num; init(); OF while(1) { num=keyscan(); if(num==1) //键一控制时间加 { if(speed<18) speed++; } else if(num==2) //键二控制时间减 { if(speed>1) speed--; } else if(num==3) //键三控制停止转动 { stopflag=1; OF } else if(num==4) //键四控制开始转动 { stopflag=0; } Data[0]=tabledu[speed/10]; //将speed的十位的段码存在Data[0]中。 Data[1]=tabledu[speed%10]; //将speed的个位的段码存在Data[1]中。 } } void display(uchar f,uchar n) //显示函数 { static uchar i; P0=0; dula=1; dula=0; P0=tablewe[i+f]; wela=1; wela=0; P0=Data[i]; dula=1; dula=0; i++; if(i==n) i=0; } void timer0() interrupt 1 //定时器0中断 { static uchar times,i; TH0=(65536-1000)/256; TL0=(65536-1000)%256; display(0,8); if(!stopflag) //停止键判断 { if(times==(20-speed)) { times=0; switch(i) { case 0: A i++;break; //一相励磁 case 1: B i++;break; case 2: C i++;break; case 3: D i++;break; case 4: i=0;break; default:break; } } else times++; } } void init() { TMOD=0X01; EA=1; ET0=1; TR0=1; PT0=1; } uchar keyscan() { uchar value; if(P3!=0xff) { delayMS(10); if(P3!=0xff) { value=P3; while(P3!=0xff); switch(value) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default : return 0;break; } } } return 0; }