1、精選文檔Proteus 仿真大賽電子時(shí)鐘仿真 第一章 電子時(shí)鐘總體設(shè)計(jì)1.1電子時(shí)鐘簡(jiǎn)介 電子鐘是一種利用數(shù)字電路來顯示秒、分、時(shí)的計(jì)時(shí)裝置,與傳統(tǒng)的機(jī)械鐘相比,它具有走時(shí)精確、顯示直觀、無機(jī)械傳動(dòng)裝置等優(yōu)點(diǎn),因而得到廣泛應(yīng)用。隨著人們生活環(huán)境的不斷改善和美化,在很多場(chǎng)合都用到電子時(shí)鐘。很多單片機(jī)產(chǎn)品具有實(shí)時(shí)時(shí)鐘的功能,例如智能化儀器儀表、工業(yè)過程系統(tǒng)及家用電器等。這里要求實(shí)現(xiàn)一個(gè)具有實(shí)時(shí)時(shí)鐘顯示和鬧鐘把握功能的數(shù)字鐘。通過數(shù)字鐘的設(shè)計(jì)與制作,將前面所學(xué)的單片機(jī)內(nèi)部定時(shí)資源、I/O端口、鍵盤和顯示接口等學(xué)問融會(huì)貫穿,熬煉獨(dú)立設(shè)計(jì)、制作和調(diào)試應(yīng)用系統(tǒng)的力量,深化領(lǐng)悟單片機(jī)應(yīng)用系統(tǒng)的硬件設(shè)計(jì)、模塊
2、化程序設(shè)計(jì)及軟硬件調(diào)試方法等,并把握單片機(jī)應(yīng)用系統(tǒng)的開發(fā)過程。1.2電子鐘設(shè)計(jì)要求設(shè)計(jì)并制作具有如下功能的數(shù)字鐘:(1) 自動(dòng)計(jì)時(shí),由6位LED先四起顯示時(shí)、分、秒。(2) 具備校準(zhǔn)功能,可以設(shè)置當(dāng)前時(shí)間。(3) 具備定時(shí)啟動(dòng)功能,可以設(shè)置鬧鐘時(shí)間,啟鬧10s后自動(dòng)關(guān)閉鬧鈴。1.3電子鐘計(jì)時(shí)方案(1)接受實(shí)時(shí)時(shí)鐘芯片。針對(duì)應(yīng)用系統(tǒng)對(duì)實(shí)時(shí)功能的普遍需求,各大芯片生產(chǎn)廠家間續(xù)推出了一系列實(shí)時(shí)時(shí)鐘集成電路,如DS1287、DS12887、DS1302、PCF8563、S35190等。這些實(shí)時(shí)時(shí)鐘芯片具備年、月、日、時(shí)、分、秒、計(jì)時(shí)功能和多點(diǎn)定時(shí)功能,計(jì)時(shí)數(shù)據(jù)每秒自動(dòng)更新一次,不需程序干預(yù)。單片機(jī)可通
3、過中斷或查詢方式讀取計(jì)時(shí)數(shù)據(jù)。實(shí)時(shí)時(shí)鐘芯片的計(jì)時(shí)功能無須占用CPU時(shí)間,功能完善,精度高,軟件程序設(shè)計(jì)相對(duì)簡(jiǎn)潔,在實(shí)時(shí)工業(yè)測(cè)控系統(tǒng)中多接受這一類專用芯片來實(shí)現(xiàn)。(2)軟件把握。利用AT89S51內(nèi)部定時(shí)/計(jì)數(shù)器進(jìn)行中斷定時(shí),協(xié)作軟件延時(shí)、分、秒的計(jì)時(shí)。該方案節(jié)省硬件成本,且能夠使讀者對(duì)前面所學(xué)學(xué)問進(jìn)行綜合運(yùn)用,因此,本系統(tǒng)設(shè)計(jì)接受這一方案。1.4電子鐘顯示方案(1)利用串行口擴(kuò)展LED,實(shí)現(xiàn)LED靜態(tài)顯示。該方案占用單片機(jī)資源少,且靜態(tài)顯示亮度高,但硬件開銷大,電路簡(jiǎn)單,信息刷新速度慢,比適用于單片機(jī)并行口資源較少的場(chǎng)合。(2)利用單片機(jī)并行I/O端口,實(shí)現(xiàn)LED動(dòng)態(tài)顯示。該方案直接使用單片機(jī)
4、并行口作為顯示接口,無須外擴(kuò)接口芯片,但占用資源較多,且動(dòng)態(tài)掃描顯示方式需占用CPU時(shí)間。在非實(shí)時(shí)測(cè)控或單片機(jī)具有足夠并行口資源的狀況下可以接受。這里接受動(dòng)態(tài)顯示方案。其次章 硬件描述及系統(tǒng)設(shè)計(jì)構(gòu)思2.1電子時(shí)鐘功能模塊主程序函數(shù)LED顯示函數(shù)鍵盤檢測(cè)函數(shù)查值函數(shù)加1修改功能函數(shù)鬧鐘設(shè)置函數(shù)時(shí)鐘設(shè)置函數(shù)定時(shí)器中 斷函數(shù)鬧鐘推斷啟動(dòng)函數(shù)2.2系統(tǒng)硬件描述1 把握器用AT89S51 , 12M晶振2 數(shù)碼管動(dòng)態(tài)掃描驅(qū)動(dòng)P2口3 數(shù)碼管段碼驅(qū)動(dòng)P1口4 鬧鈴驅(qū)動(dòng)P1.05 調(diào)整鍵K1P3.2(外部中斷0, 正常、調(diào)時(shí)、調(diào)分、調(diào)秒)6 定時(shí)/正常切換鍵K2P3.37 時(shí)間參數(shù)低位加1鍵K3P3.48
5、時(shí)間參數(shù)高位加1鍵K4P3.52.3系統(tǒng)設(shè)計(jì)構(gòu)思1主流程是取時(shí)間參數(shù),顯示時(shí)間參數(shù)。2利用T0中斷來完成計(jì)時(shí)、比較定時(shí)時(shí)間、驅(qū)動(dòng)鬧鈴。3利用T1中斷完成動(dòng)態(tài)顯示中,調(diào)整時(shí)間閃爍效果的定時(shí)。4利用外部中斷0來完成調(diào)整選擇功能。5利用外部中斷1完成定時(shí)顯示,當(dāng)前時(shí)間顯示的切換6K3、K4鍵完成時(shí)間參數(shù)的循環(huán)加1操作2.4電子時(shí)鐘電路原理圖 如圖為電子時(shí)鐘電路原理圖第三章 電子鐘硬件介紹3.1 單片機(jī)的介紹單片機(jī)也被稱為微把握器(Microcontroller Unit),常用英文字母的縮寫MCU表示單片機(jī),它最早是被用在工業(yè)把握領(lǐng)域。它不是完成某一個(gè)規(guī)律功能的芯片,而是把一個(gè)計(jì)算機(jī)系統(tǒng)集成到一個(gè)芯
6、片上。相當(dāng)于一個(gè)微型的計(jì)算機(jī),和計(jì)算機(jī)相比,單片機(jī)只缺少了I/O設(shè)備。概括的講:一塊芯片就成了一臺(tái)計(jì)算機(jī)。它的體積小、質(zhì)量輕、價(jià)格廉價(jià)、為學(xué)習(xí)、應(yīng)用和開發(fā)供應(yīng)了便利條件。同時(shí),學(xué)習(xí)使用單片機(jī)是了解計(jì)算機(jī)原理與結(jié)構(gòu)的最佳選擇。 單片機(jī)芯片單片機(jī)是靠程序運(yùn)行的,并且可以修改。通過不同的程序?qū)崿F(xiàn)不同的功能,尤其是特殊的獨(dú)特的一些功能,這是別的器件需要費(fèi)很大力氣才能做到的,有些則是花大力氣也很難做到的。一個(gè)不是很簡(jiǎn)單的功能要是用美國50年月開發(fā)的74系列,或者60年月的CD4000系列這些純硬件來搞定的話,電路肯定是一塊大PCB板!但是假如要是用美國70年月成功投放市場(chǎng)的系列單片機(jī),結(jié)果就會(huì)有天壤之別
7、!只由于單片機(jī)的通過你編寫的程序可以實(shí)現(xiàn)高智能,高效率,以及高牢靠性! 3.2 數(shù)碼管的工作原理a.七段數(shù)碼管分共陽管和共陰管,使用時(shí)要留意區(qū)分,本項(xiàng)目使用共陽數(shù)碼管。即公共端接正極。數(shù)碼管引腳示意圖如下:b.該電路使用芯片74LS244來驅(qū)動(dòng)發(fā)光兩極管,74LS244芯片說明書如下,使用時(shí)留意推斷芯片的引腳號(hào),引腳示意圖如下:c.人眼的視覺暫停時(shí)間大約是0.02秒,當(dāng)畫面每秒變化超過24幀時(shí),人眼會(huì)將這些快速變動(dòng)的畫面視作連續(xù)畫面。數(shù)碼管動(dòng)態(tài)顯示正是利用了人的這一特性。第四章 把握系統(tǒng)的軟件設(shè)計(jì)4.1 程序設(shè)計(jì)本系統(tǒng)的軟件系統(tǒng)主要可分為主程序、定時(shí)計(jì)數(shù)中斷程序、時(shí)間調(diào)整程序、鬧鐘設(shè)置程序四大
8、模塊。在程序設(shè)計(jì)過程中,加強(qiáng)了部分軟件抗干擾措施,下面對(duì)部分模塊作介紹。/*數(shù)字鐘程序*/#include <reg51.h>#define uchar unsigned charsbit buzzer=P27; /定義蜂鳴器把握端口/*函數(shù)聲明*/void display(uchar *p);uchar keyscan(); /掃描鍵盤有無鍵按下uchar search(); /按鍵識(shí)別void alarm(); /鬧鐘推斷啟動(dòng)void ftion0(); /時(shí)鐘修改void ftion1(); /鬧鐘修改void cum(); /加1修改/*全局變量定義*/uchar cloc
9、kbuf3=0,0,0;/存放時(shí)鐘時(shí)分秒的十進(jìn)制數(shù)uchar bellbuf3=0,0,0;/存放鬧鐘時(shí)分秒的十進(jìn)制數(shù)uchar msec1; /10ms中斷次數(shù)uchar msec2; /1s循環(huán)次數(shù)uchar timdata,rtimdata;/時(shí)鐘和鬧鐘修改位置標(biāo)志uchar count;/鬧鐘啟動(dòng)后10s計(jì)時(shí)單元uchar *dis_p;/顯示緩沖區(qū)指針bit armbit;/鬧鐘標(biāo)志,為0鬧鐘未設(shè)定,為1已設(shè)定bit rtimbit;/鬧鐘是否啟動(dòng)標(biāo)志,為1已啟動(dòng)bit rhourbit;/鬧鐘小時(shí)修改標(biāo)志,為1正在修改鬧鐘小時(shí)bit rminbit;/鬧鐘分修改標(biāo)志,為1正在修改鬧
10、鐘分bit hourbit;/時(shí)鐘小時(shí)修改標(biāo)志,為1正在修改時(shí)鐘小時(shí)bit minbit;/時(shí)鐘分修改標(biāo)志,為1正在修改時(shí)鐘分bit secbit;/時(shí)鐘秒修改標(biāo)志,為1正在修改時(shí)鐘秒/*主函數(shù)*/void main()uchar a;armbit=0; /清零鬧鐘標(biāo)志位msec1=0; /設(shè)置10ms中斷次數(shù)初值msec2=0; /設(shè)置1s中斷次數(shù)初值timdata=0; /時(shí)鐘內(nèi)容修改位置記憶單元清零rtimdata=0;/鬧鐘內(nèi)容修改位置記憶單元清零count=0; /鬧鐘啟動(dòng)后保持10s計(jì)時(shí)單元清零TMOD=0x02; /定時(shí)器T0為工作方式2TL0=0x06; /定時(shí)初始值為250u
11、sTH0=0x06;EA=1; /中斷總允許位開啟ET0=1; /定時(shí)器1開中斷TR0=1; /啟動(dòng)定時(shí)器T0dis_p=clockbuf;/將時(shí)鐘值所在地址送入顯示指針P1=0x00;buzzer=0;while(1)a=keyscan(); /調(diào)用鍵盤掃描子程序if(a=0x07)display(dis_p);/無鍵輸入調(diào)用顯示程序if(armbit=1)alarm();/推斷鬧鐘設(shè)定否,若設(shè)定則調(diào)用鬧鐘啟動(dòng)函數(shù)elsedisplay(dis_p);/調(diào)用顯示子函數(shù)作為延時(shí)去抖動(dòng)a=keyscan();if(a!=0x07) /沒有抖動(dòng),表示有鍵按下a=search();/調(diào)用查鍵值子函數(shù)
12、switch(a)case 0x00:ftion0();break;/是時(shí)鐘參數(shù)修改功能鍵,調(diào)用時(shí)鐘設(shè)置子函數(shù)case 0x01:ftion1();break;/是鬧鐘參數(shù)修改功能鍵,調(diào)用鬧鐘設(shè)置子函數(shù)case 0x02:cum();break;/是加1功能鍵,調(diào)用加1修改功能子函數(shù)default:break;/*6位LED顯示函數(shù)*/void display(uchar *p) uchar buffer6=0,0,0,0,0,0;uchar k,i,j,m,temp;uchar led=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;buf
13、fer0=p0/10;buffer1=p0%10;buffer2=p1/10;buffer3=p1%10;buffer4=p2/10;buffer5=p2%10;for(k=0;k<2;k+)temp=0x01;for(i=0;i<6;i+)j=bufferi;P0=temp;P1=ledj; /P1送斷碼temp<<=1;for(m=0;m<100;m+);/每一位顯示延時(shí)P1=0x00; /關(guān)顯示/*鍵盤掃描函數(shù)*/uchar keyscan()uchar c;P0=0xf0;c=P2;c=c&0x07;/按鍵行輸入為P2.0-P2.2,屏蔽無關(guān)位re
14、turn(c);/*查鍵值函數(shù)*/uchar search()uchar a,b,c,d,e;/P2=0xfe;c=0xfe; /首列掃描字送變量ca=0; /首列號(hào)送awhile(1)P0=c; /列掃描字送P0口d=P2; /讀入P2口的行狀態(tài)if(d&0x01)=0)b=0;break;/第0行有鍵按下,第0行行首號(hào)送belse if(d&0x02)=0)b=4;break;/第1行有鍵按下,第1行行首號(hào)送belse if(d&0x04)=0)b=8;break;/第2行有鍵按下,第2行行首號(hào)送ba+; /掃描列號(hào)加1c<<=1; /修改列掃描字,掃描
15、下一列e=a+b; /將行首號(hào)與列號(hào)相加,求鍵號(hào)dodisplay(dis_p);while(d=keyscan()!=0x07);/等待釋放按鍵return(e);/*鬧鐘推斷啟動(dòng)函數(shù)*/void alarm()if(clockbuf0=bellbuf0)&&(clockbuf1=bellbuf1)buzzer=1;rtimbit=1;/設(shè)置鬧鐘計(jì)時(shí)標(biāo)志,時(shí)鐘將進(jìn)行10s計(jì)時(shí)標(biāo)志if(count=10)/推斷鬧鐘保持10s時(shí)間到否 count=0;/清除鬧鐘保持10s計(jì)時(shí) buzzer=0;/清除鬧鐘 armbit=0;/清鬧鐘標(biāo)志,否則鬧鐘設(shè)置將連續(xù)有效 rtimbit=0
16、;/*時(shí)鐘設(shè)置函數(shù)*/void ftion0()if(rhourbit=1|rtimbit=1|rtimdata=1)secbit=0;minbit=0;hourbit=0;timdata=0;else TR0=0; /關(guān)定時(shí)器dis_p=clockbuf;/將時(shí)鐘緩沖區(qū)首地址送顯示指針timdata+; /將時(shí)鐘修改記錄值加1switch(timdata)case 0x01:secbit=1;break;/記錄值為1,則將時(shí)鐘秒修改標(biāo)志置1case 0x02:secbit=0;minbit=1;break;/記錄值為2,則將時(shí)鐘分修改標(biāo)志置1case 0x03:minbit=0;hourbi
17、t=1;break;/記錄值3,則將時(shí)鐘時(shí)修改標(biāo)志置1case 0x04:timdata=0;hourbit=0;TR0=1;break;/按4次則清時(shí)鐘單元修改位置 /記錄,定時(shí)器重新開啟default:break; /*鬧鐘設(shè)置函數(shù)*/void ftion1()if(secbit=1|minbit=1|hourbit=1|timdata=1)rhourbit=0;rtimbit=0;rtimdata=0;elsedis_p=bellbuf;/設(shè)置鬧鐘顯示標(biāo)志rtimdata+;/將鬧鐘修改記錄值加1switch(rtimdata)case 0x01:rminbit=1;break;/記錄值
18、為1,將鬧鐘分修改標(biāo)志置1case 0x02:rminbit=0;rhourbit=1;break; /記錄值為2,將時(shí)鐘分修改標(biāo)志置1case 0x03:rtimdata=0;rhourbit=0;/按3次則清鬧鐘單元修改位置記錄armbit=1; /設(shè)置鬧鐘已設(shè)置標(biāo)志位dis_p=clockbuf;/恢復(fù)時(shí)鐘顯示標(biāo)志break;default:break;/*加1修改功能函數(shù)*/void cum() if(secbit=1) /時(shí)鐘秒修改標(biāo)志為1,秒單元內(nèi)容加1if(clockbuf2=59) clockbuf2=0;else clockbuf2+;else if(minbit=1)/時(shí)鐘分修改標(biāo)志為1,分單元內(nèi)容加1if(clockbuf1=59) clockbuf1=0;else clockbuf1+;else if(hourbit=1) /時(shí)鐘小時(shí)修改標(biāo)志為1,小時(shí)單元內(nèi)容加1if(clockbuf0=2
評(píng)論
0/150
提交評(píng)論