王文卿, 李鐘慎
(華僑大學(xué) 機電及自動化學(xué)院, 福建 廈門 361021)
機械時鐘工藝復(fù)雜,且壽命短,誤差大。本文基于I2C總線(一種簡單的雙向二線制串行通信總線,由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成。允許多個符合I2C總線標(biāo)準(zhǔn)的器件通過同一條I2C總線進行通信,而不需要增加額外的地址譯碼器[1]),設(shè)計并實現(xiàn)了電子萬年歷計時系統(tǒng)。該系統(tǒng)不但具有更高的直觀性和精確性,而且整個系統(tǒng)簡單實用,可操作性高。在家庭居室、學(xué)校、車站和廣場得到了廣泛的使用,給人們的生活、學(xué)習(xí)、工作帶來極大的方便。
圖1為系統(tǒng)的整體結(jié)構(gòu)圖,主要由電源模塊、時鐘模塊、顯示模塊、鍵盤模塊、鬧鈴模塊和單片機模塊組成。P89V51RB2微控制器是整個系統(tǒng)的核心部分,它來控制整個系統(tǒng)的工作流程。
圖1 系統(tǒng)整體結(jié)構(gòu)圖
系統(tǒng)的工作原理為微控制器通過時鐘線SCL和數(shù)據(jù)線SDA將鍵盤模塊、時鐘模塊和顯示模塊連接。時鐘模塊提供時間、日期信息,由微控制器控制顯示模塊顯示這些信息。鍵盤模塊有4個按鍵,來校正當(dāng)前時間和日期,鬧鈴模塊由微控制器控制,實現(xiàn)定點鬧鈴功能。
PCF8563是Philips生產(chǎn)的一款時鐘芯片,帶有400KHz的I2C總線接口,能提供年、月、日、時、分、秒信息,采用I2C總線協(xié)議(從機地址:讀,0A3H;寫,0A2H)設(shè)計,與單片機的連接非常的方便,因此時鐘電路利用該芯片,為系統(tǒng)提供精確的時間信息[2]。圖2所示為PCF8563構(gòu)成的典型時鐘電路。
圖2 時鐘電路圖
圖2中,PCF8563的SCL和SDA引腳內(nèi)部漏極開路,因此使用時需要外接阻值為5.1kΩ的上拉電阻。
ZLG7290是周立功公司生產(chǎn)的一款專用控制顯示與按鍵的芯片。它能夠直接驅(qū)動8位共陰式數(shù)碼管(或64只獨立的LED),同時還可以掃描管理多達64只按鍵[3]。其內(nèi)部有8個顯示緩沖寄存器DpRam0~DpRam7,它們直接決定數(shù)碼管顯示的內(nèi)容;2個命令緩沖寄存器 CmdBuf0和 CmdBuf1,通過向命令緩沖寄存器寫入相關(guān)的控制命令可以實現(xiàn)段尋址、下載顯示數(shù)據(jù)、控制閃爍等功能。ZLG7290采用I2C總線與微控制器的連接,僅需兩根信號線,簡單明了,ZLG7290的I2C總線器件地址是70H(寫操作)和71H(讀操作)。此電路中就是通過I2C總線將時鐘模塊的信息經(jīng)由微控制器送到ZLG7290命令緩沖寄存器,控制顯示緩沖寄存器顯示時間信息。
圖3 顯示與按鍵模塊電路原理圖
圖3為顯示與按鍵模塊電路的原理圖。其中芯片ZLG7290工作所需晶振的頻率為11.0592MHz,驅(qū)動兩個4位數(shù)碼管顯示時間、日期等。SDA和SCL分別為I2C總線的數(shù)據(jù)線和時鐘,通過這兩根信號線與主控制器通信。ZLG7290同時還控制四個按鍵S3(SET):設(shè)置時間日期的啟動鍵,按下開始設(shè)置;S4(NEXT):在各個數(shù)位之間切換;S5(ADD):對某一位的值進行加一操作;S6(SUB):對某一位的值進行減一操作[4]。通過這4個按鍵就可以方便地,任意地調(diào)節(jié)時間和日期。
單片機最小系統(tǒng)由P89V51RB2單片機,復(fù)位電路以及振蕩電路組成。復(fù)位電路采用電阻電容式復(fù)位電路,簡單易行,實現(xiàn)手動復(fù)位。振蕩電路使用11.0592MHz的晶振起振。P89V51RB2是一款80C51微控制器,包含16kB Flash 和 1024字節(jié)的數(shù)據(jù) RAM。
圖4 單片機最小系統(tǒng)
最小系統(tǒng)如圖4所示,P1.6和P1.7分別為I2C總線的時鐘信號線SCL和數(shù)據(jù)傳輸線SDA,使得P89V51RB2,ZLG7290以及PCF8563通過I2C總線進行通信;P1.0用于對ZLG7290進行軟件復(fù)位;P1.1用于控制蜂鳴器的通斷,實現(xiàn)鬧鐘功能;Reset為系統(tǒng)硬件復(fù)位;中斷INT0與時鐘芯片相連。
圖5為RS232通信接線方式。其中RXD為串行通信RS232的輸入端,TXD為串行通信RS232的輸出端。本系統(tǒng)中單片機輸入輸出電平為TTL電平,而PC配置的是RS232標(biāo)準(zhǔn)串行接口,二者之間的電氣規(guī)范不一致,因此必須通過MAX232把SCM的信號電平(TTL電平)轉(zhuǎn)換為RS232電平。實際應(yīng)用中只用該串口的接收(RXD)、發(fā)送(TXD)和地線(GND)3個管腳[5-6]進行通信。
圖5 RS232通信接線
主程序?qū)崿F(xiàn)系統(tǒng)所需的所有功能,是一個無限循環(huán)程序。在循環(huán)體中,調(diào)用顯示子程序顯示當(dāng)前時間和日期;調(diào)用按鍵子程序掃描鍵盤,返回按鍵值,根據(jù)不同的鍵值進行相應(yīng)的按鍵處理[7]。
顯示子程序主要完成在兩個4位LED數(shù)碼管組成的顯示屏上顯示時間或日期。如圖6顯示子程序的流程圖所示,顯示子程序主要由ZLG7290_SendBuf,ZLG7290_ SendCmd,ISendStr等3個主要的子函數(shù)構(gòu)成。其中ZLG7290_SendBuf的功能是向顯示緩沖區(qū)發(fā)送數(shù)據(jù),將時間的十進制數(shù)值轉(zhuǎn)化為ZLG7290的控制命令格式放入到disp_buf數(shù)組中,將其作為參數(shù)傳遞給ZLG7290_ SendCmd進 行 處 理;ZLG7290_SendCmd功 能 是 向ZLG7290的子地址07H和08H(ZLG7290的命令緩沖區(qū))發(fā)送控制命令,將從ZLG7290_SendBuf傳來的命令傳遞給函數(shù)ISendStr進行處理;ISendStr的功能是從啟動總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過程。此處通過I2C總線將由ZLG7290_SendCmd傳來的命令傳至ZLG7290的命令緩沖區(qū),控制數(shù)碼管的亮與滅,從而實現(xiàn)時間與日期的顯示[4]。
按鍵子程序?qū)崿F(xiàn)讀取按鍵鍵值,按鍵處理以及具體的時間、日期設(shè)置。主要由ZLG7290_GetKey,Process_ Key,Set_Date和Set_Time_Alarm等4個 函 數(shù) 組 成。ZLG7290_GetKey功能是當(dāng)有按鍵按下時,通過I2C總線操作讀取存放在ZLG7290鍵值寄存器中的鍵值,鍵值儲存在變量Key中,并返回鍵值;Process_Key的功能是根據(jù)系統(tǒng)現(xiàn)在所處的模式,調(diào)用相應(yīng)的處理子程序。當(dāng)Sysmod=1時,調(diào)用函數(shù)Set_Date完成日期設(shè)置;當(dāng)Sysmod=2、3時,調(diào)用函數(shù)Set_Time_Alarm完成時間及鬧鈴時間設(shè)置;當(dāng)Sysmod=4時,實現(xiàn)按任意鍵停止報警功能;Set_Date功能是根據(jù)接收的按鍵值,對日期設(shè)置作相應(yīng)的處理,主要檢測輸入數(shù)值是否合法;Set_ Time_Alarm功能是用來設(shè)置系統(tǒng)時間及鬧鈴時間。若Tmode=2,該函數(shù)用來設(shè)置系統(tǒng)時間;Tmode=3,用來設(shè)置系統(tǒng)的鬧鈴時間[4,8]。
圖6 顯示子程序流程圖
根據(jù)上述軟件和硬件的設(shè)計,結(jié)合各種相關(guān)元器件實現(xiàn)了電子萬年歷計時系統(tǒng)。由于手機的時間精確,可以作為標(biāo)準(zhǔn)。現(xiàn)通過反復(fù)的實驗測試,將系統(tǒng)時鐘行走一天的時間與手機時鐘行走一天的時間進行比較并修正,得出如表1和表2所示的兩組數(shù)據(jù):
表1 外接電容為22pf時的測試數(shù)據(jù)
表1是圖2中的電容C11和C12選取22pf時測得的數(shù)據(jù)。從表中可以看出系統(tǒng)時鐘一天的誤差比較大,平均超過6s/天。由于負載電容過大會使晶振的振蕩頻率降低,使振蕩頻率偏離它的標(biāo)稱值(32.768kHz),并最終導(dǎo)致時鐘走的偏慢[10]。因此,將C11與C12換成15pf的電容后又進行了一次測試。得到了如表2中所示的數(shù)據(jù)。
表2 外接電容為15pf時的測試數(shù)據(jù)
由表2可以看出,系統(tǒng)時鐘的計時小于1s/天,計時精準(zhǔn),滿足設(shè)計要求,并能應(yīng)用于我們的日常生活中。
[1] 魏芬. I2C總線協(xié)議應(yīng)用指導(dǎo)書[M]. 南京:航空工業(yè)出版社,2010:17-22.
[2] 周立功. 單片機實驗與實踐教程[M]. 北京:北京航空航天大學(xué)出版社,2008:68.
[3] 李長林. Visual Basic串口通信技術(shù)與典型實例[M].北京: 清華大學(xué)出版社, 2006: 23-26.
[4] 劉坤. 51單片機C語言應(yīng)用開發(fā)技術(shù)大全[M]. 北京:人民郵電出版社,2008: 581-582.
[5] 徐永洪,符影,杰江峰. 基于VB 6.0的串口通信實現(xiàn)[J].儀器儀表用戶, 2004( 1) : 46-48.
[6] 張毅剛,彭喜元,姜守達,喬立巖. 新編MCS-51單片機應(yīng)用設(shè)計[M]. 3版.哈爾濱:哈爾濱工業(yè)大學(xué)出版社,2008:257-258.
[7] 王懷平. Proteus仿真設(shè)計基于單片機AT89C51的電子萬年歷[J]. 科技廣場,2008(10):197-198.
[8] 求是科技. 8051系列單片機C程序設(shè)計完全手冊[M].北京:人民郵電出版社,2006.
[9] 白延敏. 51單片機典型系統(tǒng)開發(fā)實例精講[M].北京:電子工業(yè)出版社,2009:113-117.
[10] 趙聲衡,趙英. 晶體振蕩器[M].北京:科學(xué)出版社,2008.