51.H>
#defineDataPortP1//定义数据端口程序中遇到DataPort则用P1替换
sbitLATCH1=P2^0;//定义锁存使能端口段锁存
sbitLATCH2=P2^1;//位锁存
sbitS17=P3^3;//独立按键
sbitS18=P3^2;
sbitS19=P3^1;
sbitS20=P3^0;
unsignedcharcodeHEYAO_DuanMa[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//显示段码值89
unsignedcharcodeHEYAO_WeiMa[]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80};
//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8]={0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};//存储显示值的全局变量
sbitA1=P2^7;//定义步进电机连接端口
sbitB1=P2^6;
sbitC1=P2^5;
sbitD1=P2^4;
#defineCoil_AB1{A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#defineCoil_BC1{A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#defineCoil_CD1{A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#defineCoil_DA1{A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#defineCoil_A1{A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#defineCoil_B1{A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#defineCoil_C1{A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#defineCoil_D1{A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#defineCoil_OFF{A1=0;B1=0;C1=0;D1=0;}//全部断电
unsignedcharSpeed;
bitStopFlag;
bitFlag,sb;
voidDisplay(unsignedcharFirstBit,unsignedcharNum);
voidInit_Timer0(void);
unsignedcharKeyScan(void);//键盘扫描
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,大致xx
xx如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart){while(--t);}voidDelayMs(unsignedchart){while(t--){//大致延时1mS
DelayUs2x
(245);
DelayUs2x
(245);}}
/*------------------------------------------------
主函数
------------------------------------------------*/
main(){unsignedintj,i;//旋转一周时间
unsignedcharnum;
Init_Timer0();
while
(1)//正向
{Coil_OFF
num=KeyScan();//循环调用按键扫描
if(num==1)//第一个按键,速度等级增加{if(Speed<18)
Speed++;}elseif(num==2)//第二个按键,速度等级减小{if(Speed>1)
Speed--;}elseif(num==3)//第三个按键,电机停止和启动{switch(j)
{case0:
Coil_OFF
StopFlag=1;j++;break;
case1:
StopFlag=0;j--;break;}}
elseif(num==4)
{sb=1;
while(
(1)&&(sb)){Flag=1;
i=50;
while((i--)&&(Flag))//正向{Coil_A1
DelayMs(Speed);
Coil_AB1//遇到Coil_AB1{A1=1;B1=1;C1=0;D1=0;}代替
DelayMs(Speed);//改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_B1
DelayMs(Speed);
Coil_BC1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_CD1用DelayMs(Speed);
Coil_D1
DelayMs(Speed);
Coil_DA1
DelayMs(Speed);
num=KeyScan();
if(num==3)//第三个按键,电机停止和启动{Flag=0;sb=0;}}
Coil_OFF
i=50;
while((i--)&&(Flag))//反?
{//num=KeyScan();
Coil_A1
DelayMs(Speed);
Coil_DA1//遇到Coil_AB1{A1=1;B1=1;C1=0;D1=0;}代替
DelayMs(Speed);//改变这个参数可以调整电机转速,//数字越小,转速越大,力矩越小Coil_D1
DelayMs(Speed);
Coil_CD1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_BC1
DelayMs(Speed);
Coil_B1
DelayMs(Speed);
Coil_AB1
DelayMs(Speed);
num=KeyScan();
if(num==3)//第三个按键,电机停止和启动
{用Flag=0;sb=0;}}
TempData[0]=HEYAO_DuanMa[Speed/10];
TempData[1]=HEYAO_DuanMa[Speed%10];}}
//分解显示信息,如要显示68,则=668%10=8
TempData[0]=HEYAO_DuanMa[Speed/10];
TempData[1]=HEYAO_DuanMa[Speed%10];}}
/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数FirstBit表示需要显示的第一位,如赋值2表示
从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
voidDisplay(unsignedcharFirstBit,unsignedcharNum){staticunsignedchari=0;
DataPort=0xff;//清空数据,防止有交替重影
LATCH1=1;//xx
LATCH1=0;
DataPort=HEYAO_WeiMa[i+FirstBit];//取位码
LATCH2=1;//位锁存
LATCH2=0;
DataPort=TempData[i];//取显示数据,段码
LATCH1=1;//xx
LATCH1=0;
i++;
if(i==Num)
i=0;}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00;//给定初值
//TL0=0x00;
EA=1;//总xx打开
ET0=1;//定时器xx打开
TR0=1;//定时器开关打开
PT0=1;//优先级打开}/*------------------------------------------------
定时器xx子程序
------------------------------------------------*/
voidTimer0_isr(void)interrupt1{staticunsignedchartimes,i;
TH0=(65536-1000)/256;//重新赋值1ms
TL0=(65536-1000)%256;
TR0=0;
TR0=1;
Display(0,8);
if(!
StopFlag){if(times==(20-Speed))//最大值18,所以最小间隔值20-18=2{times=0;
switch(i){case0:
Coil_A1;i++;break;
case1:
Coil_B1;i++;break;
case2:
Coil_C1;i++;break;
case3:
Coil_D1;i++;break;
case4:
i=0;break;
default:
break;}}
times++;}}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsignedcharKeyScan(void){if(!
S20)//如果检测到低电平,说明按键按下{DelayMs
(10);//延时去抖,一般10-20ms
if(!
S20)//再次确认按键是否按下,没有按下则退出{while(!
S20);//如果确认按下按键等待按键释放,没有释放则一直等待{}
return1;}}
if(!
S19)//如果检测到低电平,说明按键按下{DelayMs
(10);//延时去抖,一般10-20ms
if(!
S19)//再次确认按键是否按下,没有按下则退出{while(!
S19);//如果确认按下按键等待按键释放,没有释放则一直等待{}
return2;}}
if(!
S18)//如果检测到低电平,说明按键按下{DelayMs
(10);//延时去抖,一般10-20ms
if(!
S18)//再次确认按键是否按下,没有按下则退出{while(!
S18);//如果确认按下按键等待按键释放,没有释放则一直等待{}
return3;}}
if(!
S17)//如果检测到低电平,说明按键按下{DelayMs
(10);//延时去抖,一般10-20ms
if(!
S17)//再次确认按键是否按下,没有按下则退出{while(!
S17);//如果确认按下按键等待按键释放,没有释放则一直等待{}
return4;}}
return0;}