#include<reg52.h> #include<stdio.h> #define uchar unsigned char #define uint unsigned int uchar code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管0-9段码表,高电平导通数码管段显示,低电平导通数码管位显示。 uchar Data_Buffer[8]={0,0,0,0,0,0,0,0};//声明数据缓存变量 sbit led0=P1^4;//位定义启停led指示灯 sbit AddSpeed=P3^0;//位定义加速按键端口 sbit SubSpeed=P3^2;//位定义减速按键端口 sbit qiting=P3^4;//位定义启停按键端口 uchar qitingnum;//声明启停次数变量 uint SetSpeed=0;//声明设定速度变量 void delay(uchar x)//延时函数 { uint i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void SpeedSet()//设定速度函数 { if(qiting==0) { delay(5); if(qiting==0) { qitingnum++; while(qiting==1); } } if(qitingnum==1) { led0=0; if(AddSpeed==0)//判断加速键是否按下 { delay(5);//延时 if(AddSpeed==0)//再次判断加速键是否按下 { SetSpeed+=1;//设定速度变量每次加10 if(SetSpeed>3500)//判断设定速度变量是否大于3500 { SetSpeed=3500;//设定速度变量归为3500 } } } if(SubSpeed==0)//判断减速键是否按下 { delay(5);//延时 if(SubSpeed==0)//再次判断减速键是否按下 { SetSpeed-=1;//设定速度变量每次减10 if(SetSpeed<0)//判断设定速度变量是否小于0 SetSpeed=0;//设定速度变量归0 } } } if(qitingnum==2) { qitingnum=0; led0=1; } } void SegRefre()//数码管显示刷新函数 { Data_Buffer[0]=SetSpeed/1000;//设定速度变量千位数 Data_Buffer[1]=SetSpeed%1000/100;//设定速度变量百位数 Data_Buffer[2]=SetSpeed%100/10;//设定速度变量十位数 Data_Buffer[3]=SetSpeed%10;//设定速度变量个位数 } void SystemInit()//系统初始化函数 { TMOD=0X01;//定时器0方式1,定时器1方式2。 TH0=0xf8;//初装定时器0高八位寄存器定时数值 TL0=0x50 ;//初装定时器0低八位寄存器定时数值,即2毫秒。 EA=1;//开总中断 ET0=1;//开定时器0中断允许 TR0=1;//开定时器0中断 } void Time0() interrupt 1//定时器0中断服务函数 { static uchar Bit=0;//数码管位码静态变量,退出程序,其数值保留。 // static uint time=0;//转速测量周期变量 TH0=0xf8;//重装定时器0高八位寄存器计数值 TL0=0x50 ;//重装定时器0低八位寄存器计数值,即2毫秒。 Bit++;//数码管位码选择位变量 if(Bit>4)//判断数码管位码选择位变量是否大于8 Bit=0;//数码管位码选择位变量归0 P2=0xff;//数码管位码显示关闭 P0=Duan[Data_Buffer[Bit]];//数码管段码显示 switch(Bit)//数码管位码变量选择位 { case 0: P2=0Xfe;//实际速度变量千位 break; case 1: P2=0Xfd;//实际速度变量百位 break; case 2: P2=0Xfb;//实际速度变量十位 break; case 3: P2=0Xf7;//实际速度变量个位 break; } } /**************主函数************/ void main() { SystemInit();//系统初始化函数 while(1) { SpeedSet();//设定速度函数 SegRefre();//数码管显示刷新函数 } }