- #include <reg52.h>
- #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
- typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
- 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; //位聲明數(shù)碼管
- 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延時函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時函數(shù),含有輸入?yún)?shù) 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) //位選,選擇點亮的數(shù)碼管,
- {
- 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];//發(fā)送段碼
- DelayMs(1); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- void datapros()
- {
- DisplayData[0]=smgduan[Speed/10]; //人為設(shè)定,第一個數(shù)碼管 百位
- DisplayData[1]=smgduan[Speed%10]; //十位
- DisplayData[2]=smgduan[0]; //個位
- DisplayData[4]=smgduan[temp/100]; //霍爾測速,第5個數(shù)碼管開始顯示,百位
- 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; //定時器開關(guān)打開
- // PT0=1; //優(yōu)先級打開
- }
- /*------------------------------------------------
- 定時器中斷子程序
- ------------------------------------------------*/
- 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;
- }
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- 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開始計數(shù)
- Speed1=Speed*10;
- while(1)
- {
- if(buf_min==1000) //定時達到1s后,開始處理數(shù)據(jù)
- {
- if(P1_7==1)
- P1_7=0;
- else P1_7=1;
- TR1=0; //計數(shù)器1停止計數(shù)
- temp=(TH1*256+TL1);//單位為r/s
- TH1=0;
- TL1=0; //T1初始化
- TR1=1;//計數(shù)器1開始計數(shù)
- buf_min=0;
- }
- if(K1==0)//第一個按鍵,速度等級增加
- {
- if(Speed<13)
- Speed++;
- WaitKeyFree();
- }
- else if(K2==0)//第二個按鍵,速度等級減小
- {
- if(Speed>2)
- Speed--;
- WaitKeyFree();
- }
- if(temp>Speed1) //實際測速小于認為規(guī)定,則閃爍
- {
- led0=~led0;
- DelayMs(100);
- led0=~led0;
-
- }
- else led0=0;//否則常亮
- DigDisplay();
- datapros();
- }
- }
復制代碼
|