|
- /********************************************************************************
- 定時器定時1ms,數(shù)碼管以秒鐘計(jì)時,加上定時器0中斷可消除數(shù)碼管刷新時的閃爍問題,
- 閃爍問題是由while語句中分離數(shù)字時計(jì)算造成的,因?yàn)槊看?s時間到,在數(shù)碼管刷新前
- 都要進(jìn)行計(jì)算,耽誤了時間,導(dǎo)致閃爍,加了中斷以后則是先刷新數(shù)碼管再分離數(shù)字。
- ********************************************************************************/
- #include <reg52.h>//52單片機(jī)頭文件
- #define uchar unsigned char // 自定義uchar為unsigned char(即無符號字符型數(shù)據(jù),數(shù)據(jù)范圍:0到255。)
- #define uint unsigned int //自定義uint為unsigned int(即有符號整數(shù)型數(shù)據(jù),數(shù)據(jù)范圍:0到65535。)
- uint count,i,sec,shumaguainitflag;//聲明定時器0中斷次數(shù)變量、選位變量、秒鐘變量、數(shù)碼管初始化標(biāo)志位變量
- uint ge,shi,bai,qian;//聲明數(shù)碼管個位變量、數(shù)碼管十位變量、數(shù)碼管百位變量、數(shù)碼管千位變量
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f} ; //共陰數(shù)碼管段碼數(shù)字0~9字碼表,高電平點(diǎn)亮數(shù)碼管段碼數(shù)字0~9。
- void Timer0Init()//定時器0初始化
- {
- TMOD=0x01;//設(shè)定定時器類型為定時器0,定時器工作模式為模式0。
- TH0=(65536-1000)/256;//TH0裝初值
- TL0=(65536-1000)%256;//TL0裝初值
- EA=1;//開啟定時器總中斷
- ET0=1;//開啟定時器0中斷開關(guān)
- TR0=1;//啟動定時器0
- }
- void Timer0() interrupt 1//定時器0中斷函數(shù)
- {
- TH0=(65536-1000)/256;//TH0重新裝值
- TL0=(65536-1000)%256;//TL0重新裝值
- count++;//定時器0中斷次數(shù)變量先賦值再加
- P2=0xff;//此句為消除瞬間錯誤,例如case 1下,P0已刷新而P2暫留在case 0瞬間狀態(tài),會造成case 0下數(shù)碼管瞬間顯示錯誤數(shù)值,在每次進(jìn)入開關(guān)語句前關(guān)閉所有數(shù)碼管即可消除該錯誤。
- switch(i)//讓4位數(shù)碼管以1ms間隔輪流刷新
- {
-
- case 0:
- P0 = ge;//數(shù)碼管個位數(shù)值顯示
- P2 = 0xf7;//數(shù)碼管個位顯示位
- i++;//選位變量先賦值再加加
- break;
- case 1:
- P0 = shi;//數(shù)碼管十位數(shù)值顯示
- P2 = 0xfb;//數(shù)碼管十位顯示位
- i++;//選位變量先賦值再加加
- break;
- case 2:
- P0 = bai;//數(shù)碼管百位數(shù)值顯示
- P2 = 0xfd;//數(shù)碼管百位顯示位
- i++;//選位變量先賦值再加加
- break;
- case 3:
- P0 = qian;//數(shù)碼管千位數(shù)值顯示
- P2 = 0xfe;//數(shù)碼管千位變量顯示位
- i=0;//選位變量置0
- break;
-
- default : break;//自定義
- }
- }
- void main()//主函數(shù)
- {
- Timer0Init();//定時器0初始化函數(shù)
- while(1)//固定循環(huán)
- {
- if(count<1000&&shumaguainitflag==0)//判斷定時器0中斷次數(shù)變量是否小于1000和數(shù)碼管初始化標(biāo)志位變量是否等于0
- {
- ge = table[0];//數(shù)碼管個位變量為0
- shi = table[0];//數(shù)碼管十位變量為0
- bai = table[0];//數(shù)碼管百位變量為0
- qian = table[0];//數(shù)碼管千位變量為0
- }
- if(count>=1000)//判斷定時器0中斷次數(shù)變量是否大于等于1000,即1s。
- {
- count = 0;//定時器0中斷次數(shù)變量置0
- sec++;//秒鐘變量先賦值再加加
- shumaguainitflag=1;//數(shù)碼管初始化標(biāo)志位變量置1
- ge = table[sec%10];//數(shù)碼管個位變量
- shi = table[sec%100/10];//數(shù)碼管十位變量
- bai = table[sec%1000/100];//數(shù)碼管百位變量
- qian = table[sec/1000];//數(shù)碼管千位變量
- }
- }
- }
復(fù)制代碼
|
評分
-
查看全部評分
|