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