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