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