#include<reg52.h> //52 系列單片機頭文件 #define uchar unsignedchar //宏定義 #define uint unsigned int sbit key1=P3^4; //申明四個按鍵的鎖存端 sbit key2=P3^5; sbit key3=P3^6; sbit key4=P3^7; uchar code table[]={ //含有 0~9 的數字數組 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7c,0x07, 0x7f,0x67}; uchar code table2[]={ //含有 0~9 的數字數組(帶小數點) 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfc,0x87, 0xff,0xe7}; void delayms(uint); //聲明延時函數 voiddisplay(uchar,uchar,uchar); //聲明顯示函數 void keyscan(); //聲明按鍵函數 ucharnum1,num2,bai,shi,ge; //變量聲明 uint num; void main() //主函數入口 { TMOD=0x11; //設置 TO,T1 定時器 TH0=(65536-45872)/256; //裝初值11.05992M晶振50ms數為45872 TL0=(65536-45872)%256; TH1=(65536-45872)/256; TL1=(65536-45872)%256; EA=1; //開總中斷 ET0=1; //開啟定時器 T0 中斷 ET1=1; //開啟定時器 T1 中斷 while(1) //程序停在這里等待中斷的發生,這個大循環也是實現數據顯示的主體 { keyscan(); //三個數碼管要選送的數據 bai=num/100; //百位 shi=(num-100*bai)/10; //十位 ge=num-100*bai-shi*10; //個位 display(bai,shi,ge); //數碼管顯示 } } void display(uchar bai,uchar shi,uchar ge) { P1=0xfe; //位選選中第一個數碼管 P2=table[bai]; //送段選數據 delayms(10); //延時 P1=0xff; //關閉位選 P1=0xfd; //位選選中第二個數碼管 P2=table2[shi]; //送段選數據 delayms(10); //延時 P1=0xff; //關閉位選 P1=0xfb; //位選選中第二個數碼管 P2=table[ge]; //送段選數據 delayms(10); //延時 P1=0xff; //關閉位選 } void delayms(uintxms) //延時子函數 { uint i,j; for(i=xms;i>0;i--) //i=xms 即延時約 xms 毫秒 for(j=110;j>0;j--); } void keyscan() { if(key1==0) //清零 { delayms(10); //延時去抖 if(key1==0) { while(!key1) //等待按下 { TR0=0; //定時器 TR0 關閉 TR1=1; //定時器 TR1 打開 num=0; //送數據 num=0 TR1=0; //定時器 TR1 關閉 } } } if(key2==0) //暫停和開始 { delayms(10); if(key2==0) { while(!key2); TR0=0; TR1=~TR1; //每次按下,TR1 的狀態時相反的 } } if(key3==0) //使計數器顯示為 60.0 { while(!key3); TR0=0; TR1=1; num=999; TR1=0; } if(key4==0) //實現計數器的倒數功能 { while(!key4); TR1=0; TR0=~TR0;//TR0=1; } } void T0_time()interrupt 1 //定時器 T0,中斷序號為 1 {TH0=(65536-45872)/256; //重裝初值 TL0=(65536-45872)%256; num2++; if(num2==2) //如果到了2次,說明0.1秒的時間到 { num2=0; //然后把num2清零重新再計2次 num1++; } if(num1==10) num1=0; if(num==0) //當 num 自減為0時,重新為 60.0,再開始倒計時 num=999; //num 逐漸自減 num--; } void T1_time()interrupt 3 { TH1=(65536-45872)/256; //重裝初值 TL1=(65536-45872)%256; num2++; if(num2==2) //如果到了 2 次,說明 0.1 秒的時間到 { num2=0; //然后把 num2 清零重新再計 2 次 num1++; if(num1==10) num1=0; num++; //num 逐漸自加 if(num==999) num=0;//這個數十用來送給數碼管顯示的,到了60.0后歸零 } }
|