張皓斐,劉雨瀟
(青島理工大學(xué)信息與控制工程學(xué)院,山東青島,266525)
數(shù)字鐘作為基于單片機的定時及控制設(shè)備中最基本的一個應(yīng)用實例,具有結(jié)構(gòu)簡單應(yīng)用廣泛的特點[1,2]。數(shù)字鐘使用了單片機中最為常用的輸入輸出設(shè)備按鍵開關(guān)和數(shù)碼管,被廣泛應(yīng)用于電子表、電子萬年歷等產(chǎn)品中,帶來了廣泛的經(jīng)濟效益。因此,研究數(shù)字鐘并擴大其應(yīng)用范圍,有著非?,F(xiàn)實的意義。本文將以AT89C51單片機為基礎(chǔ),并通過Keil uVision5開發(fā)工具與Proteus仿真軟件進行多功能數(shù)字鐘的系統(tǒng)設(shè)計與仿真驗證。
本文設(shè)計的數(shù)字鐘電路以AT89C51單片機為核心,將其內(nèi)部時鐘信號作為系統(tǒng)的中斷時鐘源。除時鐘電路和復(fù)位電路外,為滿足系統(tǒng)的設(shè)計要求,還要輔以數(shù)碼管顯示模塊和按鍵模塊。此外,由于單片機的總線端口都有一定的負載能力,在使用數(shù)碼管顯示器時需要驅(qū)動器加以輔佐,以為其提供更強的驅(qū)動信號,從而減輕單片機的負載壓力。在能夠完成系統(tǒng)設(shè)計所要求的功能之外,本設(shè)計還因為外接了蜂鳴器及其驅(qū)動電路,因而具備整點報時的功能,從而使得其具有更高的實用性。
本設(shè)計的系統(tǒng)結(jié)構(gòu)框圖如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)框圖
單片機的XTAL1和XTAL2引腳外接時鐘電路,從而構(gòu)成內(nèi)部并聯(lián)振蕩電路。
單片機的RST引腳連接外部復(fù)位電路,從而可以通過上電或按鍵的方式實現(xiàn)該系統(tǒng)的復(fù)位功能,亦即上電復(fù)位和按鍵復(fù)位。
按鍵模塊和報時模塊引腳用單片機P3口的I/O功能實現(xiàn),通過按鍵模塊來對數(shù)碼管顯示模塊的時間進行調(diào)整及校準。
將P2口的其中三個引腳與3線-8線譯碼器的輸入端相連,則譯碼器的輸出信號即可作為數(shù)碼管的位選信號,從而選中相應(yīng)的數(shù)碼管,且此時其他的數(shù)碼管不會被點亮;P0口則作為數(shù)碼管的段碼發(fā)送口,從而點亮被選中數(shù)碼管的相應(yīng)段符,以顯示與該二進制段碼所對應(yīng)的數(shù)字或字母。此外,在使用數(shù)碼管顯示器時需要連接驅(qū)動器,以減輕單片機P0口的負載壓力[3]。
本設(shè)計使用AT89C51主控芯片內(nèi)部自帶的反相放大器,并將該放大器與外部時鐘電路相連接,從而構(gòu)成芯片的內(nèi)部振蕩器。該反相放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構(gòu)成自激振蕩器。在本設(shè)計中,時鐘電路采用12MHz的石英晶振,電容C1、C2參數(shù)均選擇30pF,電路結(jié)構(gòu)如圖2所示。
圖2 時鐘電路
AT89C51單片機復(fù)位需要一個長達24個時鐘周期的高電平才能復(fù)位,從而使系統(tǒng)恢復(fù)為初始狀態(tài)。復(fù)位電路如圖3所示。
圖3 復(fù)位電路
當(dāng)系統(tǒng)上電時,C3有一個充電放電的過程,放電過程會產(chǎn)生一個高電平復(fù)位信號。
當(dāng)系統(tǒng)正常運行時,若按下按鍵,RST端的電平也是一個高電平,此時芯片也會產(chǎn)生一個高電平復(fù)位信號。
圖4 為系統(tǒng)的按鍵模塊電路原理圖。
圖4 按鍵模塊電路
k1為數(shù)碼管的時間設(shè)置按鍵;k2和k3為加減按鍵,可在相應(yīng)模式下進行時間的加減操作,只有在設(shè)置狀態(tài)時按下才有效;k4為模式切換按鍵,可在時、分、秒的設(shè)置模式下順序切換,只有在設(shè)置狀態(tài)時按下才有效。
由于AT89C51管腳的驅(qū)動能力是有限的,本設(shè)計在控制無源蜂鳴器工作時使用了三極管作為電子開關(guān)器件,從而通過小電流來控制大電流的通斷[2,4]。
因為蜂鳴器工作需要有一定頻率的交流電,則單片機的輸出引腳必須輸出一定頻率的電流脈沖信號,故該脈沖信號需要由單片機的內(nèi)部定時器中斷來調(diào)制。
圖5 為系統(tǒng)的報時模塊電路。
圖5 報時模塊電路
本設(shè)計所用數(shù)碼管采用由8個共陰極八段數(shù)碼管組成的數(shù)碼管顯示器,其位選信號由單片機的P2.4、P2.3、P2.2引腳經(jīng)過3線-8線譯碼器74LS138給出,而對應(yīng)數(shù)碼管的段碼是由 P0 口控制,通過 74HC245 鎖存器進行信號功率放大來驅(qū)動的。
由于P0口作為I/O口時需要外接上拉電阻,故在電路設(shè)計時通過一個排阻接入了電源。
數(shù)碼顯示模塊及其驅(qū)動電路如圖6所示。
圖6 數(shù)碼顯示模塊及其驅(qū)動電路
軟件設(shè)計流程圖如圖7所示。
圖7 軟件設(shè)計流程圖
3.2.1 數(shù)碼管掃描刷新顯示功能塊
由表1可定義一包含從0至9共10種段碼的數(shù)組,其所包含的全部元素為0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,0x7d, 0x07, 0x7f, 0x6f。
表1 共陰極數(shù)碼管真值表
3.2.2 時間計算功能塊
通過分別對時、分、秒進行取模10和除以10可得到相應(yīng)的低位和高位段碼,在時、分、秒之間用橫杠隔開,橫杠的段碼為0x40,這樣有助于增強數(shù)字鐘的易讀性。
3.2.3 主函數(shù)功能塊
在程序主函數(shù)中進行定時器T0控制方式的選擇,并開啟內(nèi)部定時器中斷以激活定時器中斷函數(shù),同時也設(shè)定了定時器的初值,從而獲得合適的定時周期。
(1)定時初值計算
定時器方式寄存器設(shè)為定時器模式,且T0按16位加1計數(shù)器的方式(方式一)工作,若設(shè)定時周期為50ms,則計數(shù)溢出20次即可得時鐘計時的最小單位秒。
在定時器模式下,計數(shù)器由單片機主脈沖經(jīng)12分頻后計數(shù)。因此,定時器定時周期T的計算公式為:
式中M為模值,與定時器工作方式有關(guān);T計數(shù)是時鐘周期的12倍;TC為定時初值,T為欲定時的定時周期。
由于單片機的晶振頻率為12MHz,設(shè)定定時周期為50ms,則當(dāng)定時器采用方式一工作時,定時初值TC滿足:
則TH0應(yīng)設(shè)置為0x3c,TL0應(yīng)設(shè)置為0xb0。
(2)采用溢出中斷次數(shù)累計,計滿20次則加1秒。
(3)在程序計時過程中,通過數(shù)值的累加及比較來實現(xiàn)時分秒的更新計時功能。
在Keil環(huán)境下對程序編譯完成后,將HEX文件導(dǎo)入Proteus中,并對電路系統(tǒng)進行仿真分析[5]。結(jié)果如圖8所示,經(jīng)過對各模塊的測試,驗證了本設(shè)計的可行性。
圖8 Proteus仿真結(jié)果
本文通過對基于AT89C51主控芯片的數(shù)字鐘電路及其控制程序的搭建和完善,在Proteus環(huán)境下對設(shè)計結(jié)果進行了仿真驗證。通過對電路各模塊的綜合聯(lián)調(diào),實現(xiàn)了基于AT89C51芯片的數(shù)字鐘電路的正常工作,此外還對其進行了功能的拓展,使得本設(shè)計具有了更強的實用性。