張皓斐,劉雨瀟
(青島理工大學信息與控制工程學院,山東青島,266525)
數字鐘作為基于單片機的定時及控制設備中最基本的一個應用實例,具有結構簡單應用廣泛的特點[1,2]。數字鐘使用了單片機中最為常用的輸入輸出設備按鍵開關和數碼管,被廣泛應用于電子表、電子萬年歷等產品中,帶來了廣泛的經濟效益。因此,研究數字鐘并擴大其應用范圍,有著非常現實的意義。本文將以AT89C51單片機為基礎,并通過Keil uVision5開發工具與Proteus仿真軟件進行多功能數字鐘的系統設計與仿真驗證。
本文設計的數字鐘電路以AT89C51單片機為核心,將其內部時鐘信號作為系統的中斷時鐘源。除時鐘電路和復位電路外,為滿足系統的設計要求,還要輔以數碼管顯示模塊和按鍵模塊。此外,由于單片機的總線端口都有一定的負載能力,在使用數碼管顯示器時需要驅動器加以輔佐,以為其提供更強的驅動信號,從而減輕單片機的負載壓力。在能夠完成系統設計所要求的功能之外,本設計還因為外接了蜂鳴器及其驅動電路,因而具備整點報時的功能,從而使得其具有更高的實用性。
本設計的系統結構框圖如圖1所示。

圖1 系統結構框圖
單片機的XTAL1和XTAL2引腳外接時鐘電路,從而構成內部并聯振蕩電路。
單片機的RST引腳連接外部復位電路,從而可以通過上電或按鍵的方式實現該系統的復位功能,亦即上電復位和按鍵復位。
按鍵模塊和報時模塊引腳用單片機P3口的I/O功能實現,通過按鍵模塊來對數碼管顯示模塊的時間進行調整及校準。
將P2口的其中三個引腳與3線-8線譯碼器的輸入端相連,則譯碼器的輸出信號即可作為數碼管的位選信號,從而選中相應的數碼管,且此時其他的數碼管不會被點亮;P0口則作為數碼管的段碼發送口,從而點亮被選中數碼管的相應段符,以顯示與該二進制段碼所對應的數字或字母。此外,在使用數碼管顯示器時需要連接驅動器,以減輕單片機P0口的負載壓力[3]。
本設計使用AT89C51主控芯片內部自帶的反相放大器,并將該放大器與外部時鐘電路相連接,從而構成芯片的內部振蕩器。該反相放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構成自激振蕩器。在本設計中,時鐘電路采用12MHz的石英晶振,電容C1、C2參數均選擇30pF,電路結構如圖2所示。

圖2 時鐘電路
AT89C51單片機復位需要一個長達24個時鐘周期的高電平才能復位,從而使系統恢復為初始狀態。復位電路如圖3所示。

圖3 復位電路
當系統上電時,C3有一個充電放電的過程,放電過程會產生一個高電平復位信號。
當系統正常運行時,若按下按鍵,RST端的電平也是一個高電平,此時芯片也會產生一個高電平復位信號。
圖4 為系統的按鍵模塊電路原理圖。

圖4 按鍵模塊電路
k1為數碼管的時間設置按鍵;k2和k3為加減按鍵,可在相應模式下進行時間的加減操作,只有在設置狀態時按下才有效;k4為模式切換按鍵,可在時、分、秒的設置模式下順序切換,只有在設置狀態時按下才有效。
由于AT89C51管腳的驅動能力是有限的,本設計在控制無源蜂鳴器工作時使用了三極管作為電子開關器件,從而通過小電流來控制大電流的通斷[2,4]。
因為蜂鳴器工作需要有一定頻率的交流電,則單片機的輸出引腳必須輸出一定頻率的電流脈沖信號,故該脈沖信號需要由單片機的內部定時器中斷來調制。
圖5 為系統的報時模塊電路。

圖5 報時模塊電路
本設計所用數碼管采用由8個共陰極八段數碼管組成的數碼管顯示器,其位選信號由單片機的P2.4、P2.3、P2.2引腳經過3線-8線譯碼器74LS138給出,而對應數碼管的段碼是由 P0 口控制,通過 74HC245 鎖存器進行信號功率放大來驅動的。
由于P0口作為I/O口時需要外接上拉電阻,故在電路設計時通過一個排阻接入了電源。
數碼顯示模塊及其驅動電路如圖6所示。

圖6 數碼顯示模塊及其驅動電路
軟件設計流程圖如圖7所示。

圖7 軟件設計流程圖
3.2.1 數碼管掃描刷新顯示功能塊
由表1可定義一包含從0至9共10種段碼的數組,其所包含的全部元素為0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,0x7d, 0x07, 0x7f, 0x6f。

表1 共陰極數碼管真值表
3.2.2 時間計算功能塊
通過分別對時、分、秒進行取模10和除以10可得到相應的低位和高位段碼,在時、分、秒之間用橫杠隔開,橫杠的段碼為0x40,這樣有助于增強數字鐘的易讀性。
3.2.3 主函數功能塊
在程序主函數中進行定時器T0控制方式的選擇,并開啟內部定時器中斷以激活定時器中斷函數,同時也設定了定時器的初值,從而獲得合適的定時周期。
(1)定時初值計算
定時器方式寄存器設為定時器模式,且T0按16位加1計數器的方式(方式一)工作,若設定時周期為50ms,則計數溢出20次即可得時鐘計時的最小單位秒。
在定時器模式下,計數器由單片機主脈沖經12分頻后計數。因此,定時器定時周期T的計算公式為:

式中M為模值,與定時器工作方式有關;T計數是時鐘周期的12倍;TC為定時初值,T為欲定時的定時周期。
由于單片機的晶振頻率為12MHz,設定定時周期為50ms,則當定時器采用方式一工作時,定時初值TC滿足:
則TH0應設置為0x3c,TL0應設置為0xb0。
(2)采用溢出中斷次數累計,計滿20次則加1秒。
(3)在程序計時過程中,通過數值的累加及比較來實現時分秒的更新計時功能。
在Keil環境下對程序編譯完成后,將HEX文件導入Proteus中,并對電路系統進行仿真分析[5]。結果如圖8所示,經過對各模塊的測試,驗證了本設計的可行性。

圖8 Proteus仿真結果
本文通過對基于AT89C51主控芯片的數字鐘電路及其控制程序的搭建和完善,在Proteus環境下對設計結果進行了仿真驗證。通過對電路各模塊的綜合聯調,實現了基于AT89C51芯片的數字鐘電路的正常工作,此外還對其進行了功能的拓展,使得本設計具有了更強的實用性。