- #include <reg52.h>
- #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- u8 DisplayData[8];
- unsigned char Speed=2;
- int temp=0; //定义变量
- int buf_min=1;
- int Speed1;
- sbit P1_0=P1^0; //霍尔传感器接口
- sbit P1_7=P1^1;
- sbit LSA=P2^2; //位声明数码管
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit D1=P1^2; //直流电机接口
- sbit K1 = P3^1;
- sbit K2 = P3^0;
- sbit led0=P2^0;//led灯
- void Init_Timer0(void);
- unsigned char KeyScan(void);
- /*------------------------------------------------
- uS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
- 长度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延时函数,含有输入参数 unsigned char t,无返回值
- unsigned char 是定义无符号字符变量,其值的范围是
- 0~255 这里使用晶振12M,精确延时请使用汇编
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延时1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- void WaitKeyFree(void){
- while(1){
- while(K1==0);
- while(K2==0);
- DelayMs(10);
- while(K1==0);
- while(K2==0);
- break;
- }
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(0):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- case(1):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(2):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(3):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(4):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(5):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(6):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(7):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- }
- P0=DisplayData[ i];//发送段码
- DelayMs(1); //间隔一段时间扫描
- P0=0x00;//消隐
- }
- }
- void datapros()
- {
- DisplayData[0]=smgduan[Speed/10]; //人为设定,第一个数码管 百位
- DisplayData[1]=smgduan[Speed%10]; //十位
- DisplayData[2]=smgduan[0]; //个位
- DisplayData[4]=smgduan[temp/100]; //霍尔测速,第5个数码管开始显示,百位
- DisplayData[5]=smgduan[temp%100/10]; //十位
- DisplayData[6]=smgduan[temp/100%10]; //个位
- }
- /*------------------------------------------------
- 定时器初始化子程序
- ------------------------------------------------*/
- void Init_Timer0(void)
- {
- // TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- TH0=(65536-1000)/256; //重新赋值 1ms
- TL0=(65536-1000)%256;
- // EA=1; //总中断打开
- // ET0=1; //定时器中断打开
- // TR0=1; //定时器开关打开
- // PT0=1; //优先级打开
- }
- /*------------------------------------------------
- 定时器中断子程序
- ------------------------------------------------*/
- void Timer0_isr(void) interrupt 1
- {
- static unsigned char times;
- TH0=(65536-1000)/256; //重新赋值 1ms
- TL0=(65536-1000)%256;
-
- if(times>(Speed-1))//最大值12
- D1=0;
- else
- D1=1;
- times++;
- if(times==13)
- times=0;
- }
- /*------------------------------------------------
- 主函数
- ------------------------------------------------*/
- main()
- {
- Init_Timer0();
- P1_0=0;
- P1_7=0;
- TMOD=0x11;
- TH1=0;
- TL1=0; //T1初始化
- EA=1;
- ET0=1;
- TR0=1;//开T0定时中断
- TR1=1;//T1开始计数
- Speed1=Speed*10;
- while(1)
- {
- if(buf_min==1000) //定时达到1s后,开始处理数据
- {
- if(P1_7==1)
- P1_7=0;
- else P1_7=1;
- TR1=0; //计数器1停止计数
- temp=(TH1*256+TL1);//单位为r/s
- TH1=0;
- TL1=0; //T1初始化
- TR1=1;//计数器1开始计数
- buf_min=0;
- }
- if(K1==0)//第一个按键,速度等级增加
- {
- if(Speed<13)
- Speed++;
- WaitKeyFree();
- }
- else if(K2==0)//第二个按键,速度等级减小
- {
- if(Speed>2)
- Speed--;
- WaitKeyFree();
- }
- if(temp>Speed1) //实际测速小于认为规定,则闪烁
- {
- led0=~led0;
- DelayMs(100);
- led0=~led0;
-
- }
- else led0=0;//否则常亮
- DigDisplay();
- datapros();
- }
- }
复制代码
|