秒表的設計
設計一個2位的LED數碼顯示的“秒表”:顯示時間為00—99秒,每秒自動加1,另設計一個“開始”鍵和一個“復位”鍵。
方案一: 直接用STC89C52芯片加上三個獨立按鍵和兩端共陽數碼管設計 方案二: 在方案一的基礎上加上74LS138動態掃描數碼管,使數碼管顯示更為清晰,這里我們采用方案二進行仿真實驗     
 
         
本系統采用protues仿真,以STC89C52為中心,采用定時器計數原理結合電源電路,晶振電路和少量按鍵實現了秒表的暫停,開始,復位功能,顯示從0到99。 
實驗中數碼管選擇錯誤導致亂碼,重新選擇后完成實驗。 體會到最任何事都要仔細認真一絲不茍學無止境。 《單片機原理與應用 ——基于C51及Protues仿真》 徐愛鈞 編著 清華大學出版社 《金沙灘視頻教學文件》 實驗程序及注釋: - #include<reg51.h>
-
- sbit ADDR0 = P1^0;
- sbit ADDR1 = P1^1;
- sbit ADDR2 = P1^2;
- sbit ADDR3 = P1^3;
- sbit ENLED = P1^4;
-
- sbit K4 = P2^7; //設置開始鍵
- sbit K3 = P2^6; //設置暫停鍵
- sbit K2 = P2^5; //設置復位鍵
-
- unsigned char code LedChar[]={
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
- 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
- }; //數碼管顯示字符轉換表
- unsigned char LedBuff[2]={
- 0xFF, 0xFF
- }; //數碼管顯示緩沖區,初值0xFF確保啟動時都不亮
- unsigned char i = 0; //定義一個變量用于動態掃描
- unsigned int cnt = 0; //記錄T0中斷次數
- unsigned char flag1s = 0; //1秒定時標志
-
- void main()
- {
- unsigned char sec = 0; //記錄經過的秒數
-
- ENLED = 0; //選擇控制數碼管
- ADDR3 = 1;
- TMOD = 0x01; //設置T0為模式1
- TH0 = 0xF8; //給T0賦值0xF8CD,定時2ms
- TL0 = 0xCD;
- TR0 = 1; //啟動T0
- EA = 1; //使能總中斷
- ET0 = 1; //使能T0中斷
- P2 = 0xF7;
-
- while(1)
- {
- P0 = 0xFF; //顯示消隱
- switch(i) //動態掃描數碼管
- {
- case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0];break;
- case 1: ADDR2=0; ADDR1=0; ADDR0=1; i=0; P0=LedBuff[1];break;
- default:break;
- }
- if(flag1s == 1) //判斷1秒定時標志
- {
- flag1s = 0; //1秒定時標志清零
- sec++; //秒計數自加1
- LedBuff[0] = LedChar[sec%10]; //取個位數
- LedBuff[1] = LedChar[sec/10%10]; //取十位數
- }
- if(K3 == 0) TR0 = 0; //按下K3,暫停計數
- if(K4 == 0) TR0 = 1; //按下K4,開始計數
- if(K2 == 0) sec = 0; //按下K2,復位
- }
- }
-
- /*定時器0中斷服務函數*/
- void InterruptTime0() interrupt 1
- {
- TH0 = 0xF8; //重新加載初值
- TL0 = 0xCD;
- cnt++; //中斷次數計數值加1
- if(cnt >= 500) //中斷次數500次即1秒
- {
- cnt = 0; //清零
- flag1s = 1; //設置為1秒
- }
- }</b>
復制代碼
全部資料51hei下載地址:
秒表的設計與仿真.zip
(209.36 KB, 下載次數: 118)
2018-12-17 22:35 上傳
點擊文件名下載附件
|