一、實驗思路
動態數碼管就是我們的單片機運行的太快,以至于我們的肉眼沒有辦法看到間隔,所以我們改一下數據,就可以了,有時候我們用的就是人的視覺暫留,我們在使用數碼管時,得知道是共陰還是共陽,在這里,我使用的是共陰的數碼管,使用的是12Mhz的晶振,如果我們使用的是11.0592MHz,
這是我們數碼管的原理圖,數碼管其實就是發光二極管顯示,共陰,然后我們可以根據段碼計算出來的自己想要顯示的數字,這里有一些
二、代碼原理
我們用定時器顯示,如果我們定時器定時2ms,那么2ms就中斷一次,而我們在中斷里面定義一個 數字,當達到500時,就是500×2ms=1S,然后使數據更新一邊,變成下一個數字,我們有倆個數組,一個是存放段碼的,另一個是存放實際值的,我們可以十位和各位分別顯示,存放到另一個數組里面,然后在經過138譯碼器顯示出來。
三 、實驗源碼
四、實驗現象
還有一點就是那個消隱,P0=0x00;的那個就是消隱,如果沒有消隱,顯示的數字則會很不清晰;
可能代碼還存在點問題,希望大家能夠批評指正!
單片機源程序如下:- /*************************************
- 本人用的是普中的開發板,然后138和數碼管的連接圖會貼貼出來,
- 芯片是stc89c52 ,晶振是12MHz,僅供交流使用
- *************************************/
- #include <reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- #define TIME 500
- sbit LSA=P2^2; //引腳的定義
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f};//數碼管段碼,共陰極段碼
- u8 disbuff[2];//存放00~99的數組
- unsigned char t=0;//數值00~99
- /*****************************************************
- 函數名稱:void In0Init()
- 函數功能:定時器0初始化
- 輸入參數:無
- 輸出參數:無
- *****************************************************/
- void In0Init()
- {
- TMOD = 0x01; //開啟定時器0
- TH0 = 0xF8; //賦初值
- TL0 = 0x30;
- EA = 1; //開啟總中斷
- ET0 = 1; //開啟定時器0的中斷
- TR0 = 1;
- }
- /*****************************************************
- 函數名稱:void DigDisplay()
- 函數功能:數碼管顯示
- 輸入參數:無
- 輸出參數:無
- *****************************************************/
- void DigDisplay()
- {
- u8 i,j;
- for (i=0;i<2;i++)
- {
- switch(i)//位選,選擇哪一位亮
- {
- case(0): LSA=1;LSB=1;LSC=1;break;
- case(1): LSA=0;LSB=1;LSC=1;break;
-
- }
- P0=disbuff[i];
- j=10; //消隱,要不然會很模糊
- while(j--);
- P0=0x00;
- }
- }
- /*****************************************************
- 函數名稱:void DealNumber()
- 函數功能:處理數字,拆分一位一位的顯示
- 輸入參數:無
- 輸出參數:無
- *****************************************************/
- void DealNumber()
- {
- disbuff[0]=smgduan[t/10];//處理十位
- disbuff[1]=smgduan[t%10];//處理各位
- }
- /*****************************************************
- 函數名稱:void main ()
- *****************************************************/
- void main ()
- {
- In0Init();
- while(1)
- {
- DealNumber();
- DigDisplay();
- }
- }
- /*****************************************************
- 函數名稱:void Timer0Interrupt(void) interrupt 1
- 函數功能:中斷服務函數
- 輸入參數:無
- 輸出參數:無
- *****************************************************/
- void Timer0Interrupt(void) interrupt 1
- {unsigned int n;
- TH0 = 0xF8; //重新賦初值
- TL0 = 0x30;
- n++; //當n==500時,則為1s
- if(n==TIME)//TIME定義為500,用戶可以自己修改
- {
- t++; //實際的數值
- n=0;
- }
- if(t==100)//如果t==99;然后重新顯示00
- {
- t=0;
- }
- }
復制代碼
全部資料51hei下載地址:
顯示00~99.7z
(1.5 MB, 下載次數: 16)
2020-11-13 16:16 上傳
點擊文件名下載附件
|