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