徐錦銅 康晴茜
【摘要】本文闡述了一種基于DS12C887時鐘芯片的電子萬年歷軟硬件設(shè)計方法,使用proteus軟件設(shè)計和繪制了電子萬年歷的電路連接圖,并通過1602液晶屏顯示時鐘信息,驗證了電子萬年歷電路及其程序設(shè)計的正確性,并給出了部分C程序代碼。
【關(guān)鍵詞】DS12C887;時鐘芯片;單片機(jī)
在需要時間信息的電路設(shè)計中,設(shè)計人員通常采用時鐘芯片獲取時間信息。目前,市場中的時鐘芯片種類多樣,比如DS12C887、PCF8485、SB2068、DS1302等。其中DS12C887具有價格低、功耗小、易操作等優(yōu)點,本文選用DS12C887作為設(shè)計電子萬年歷的時鐘芯片。
一、電路連接
電路原理圖如圖1所示,主要包括AT89C52單片機(jī)、DS12C887、1602液晶屏和3個獨立按鍵等元器件,通過仿真,從圖1中可以看到日歷信息是2018年9月12日,星期三,17點16分3秒,說明本文設(shè)計的電子萬年歷軟硬件設(shè)計正確,功能正常。
(一)DS12C887介紹及其與單片機(jī)的接口電路
DS12C887是DALLAS公司推出的涓流充電時鐘芯片,可計時到2100年前的年、月、日、時、分、秒、星期七種日歷時間信息并自帶閏年補(bǔ)償功能;自帶晶體振蕩器并內(nèi)置鋰電池,在沒有外部電源的情況下可工作長達(dá)10年之久;有12小時制和24小時制兩種計時模式。其中在12小時制模式中,用A.M.和RM.區(qū)分上午和下午;可選用夏令時模式;時間表示方法有兩種:一種用二進(jìn)制數(shù)表示,一種用BCD碼表示;內(nèi)部帶有128字節(jié)RAM,其中11字節(jié)用來存儲時間信息,4字節(jié)RAM用來存儲DS12C887的控制信息,113字節(jié)RAM供用戶使用;數(shù)據(jù)/地址總線復(fù)用,具有MOTOROLA和INTEL兩種總線時序,本文在設(shè)計時采用的是INTEL總線。
下面闡述DS12C887的電路連接問題:DS12C887一共有24個管腳,其中6個管腳為NC(懸空管腳,不連接),有效管腳為18個。第1腳MOT懸空不接,選擇INTEL總線時序;4腳-11腳(AD0-AD7)為數(shù)據(jù)端,接至單片機(jī)P0口,和單片機(jī)做數(shù)據(jù)交互;12腳GND接地;13腳CS為片選端,接至單片機(jī)P2.3口,在INTEL總線時序中的DS和RW信號工作期間,CS必須保持低電平;14腳AS為地址選通輸入端,在AS信號的下降沿,地址鎖存待DS12C887中,無論CS信號是否有效,AS的下一個上升沿都將清除地址,地址選通信號必須先于每個讀或?qū)懺L問。15腳RW接至單片機(jī)P2.5口,在INTEL總線時序中,RW腳與普通RAM的寫使能信號工作方式類似,在寫數(shù)據(jù)時需要將RW腳電平拉低,寫完之后數(shù)據(jù)在RW信號的上升沿鎖存。17腳DS接至單片機(jī)P2.4口,在讀周期中,DSl2C887于DS信號的后期(INTEL時序中DS為低、RW為高)將數(shù)據(jù)發(fā)送到總線上,讀周期結(jié)束后,總線恢復(fù)到高狀態(tài),同時DS變高。18腳RESET為復(fù)位輸入端,低電平時復(fù)位,本設(shè)計中將RESET端固定接高電平,意即讓DSl2C887一直正常工作,不進(jìn)行復(fù)位操作。19腳[RQ為中斷請求輸出端,可用作處理器的中斷申請輸入端子,實現(xiàn)諸如鬧鐘之類的功能,本設(shè)計不涉及鬧鐘,故IRQ腳懸空不接;23腳SQW為方波輸出端,本設(shè)計不使用,懸空不接。24腳VCC為電源端,接+5V。
(二)獨立按鍵接口電路
我們在設(shè)計電路時使用了3個獨立按鍵,一端共同接地,另一端分別接至單片機(jī)的P3.0、P3.1、P3.2口。當(dāng)按鍵被按下時,單片機(jī)對應(yīng)的端口將出現(xiàn)低電平,單片機(jī)通過判斷該低電平信號來獲知相應(yīng)按鍵被按下,本文通過按下這3個按鍵來手動設(shè)置時間。
(三)1602液晶屏接口電路
1602液晶屏接口一共有16個管腳,1腳接電源地,2腳為液晶內(nèi)部驅(qū)動芯片電源端;3腳為液晶屏幕電源輸入端,在實際使用時,該端口須經(jīng)1個10K可調(diào)電阻接至5V電源端,當(dāng)改變可調(diào)電阻大小時,3腳將獲得不同的電壓,從而起到調(diào)節(jié)屏幕對比度的作用,本設(shè)計采用仿真模擬器件,因此直接將3腳接高電平;4腳RS、5腳RW、6腳EN為液晶的三個控制端,其中RS為并行數(shù)據(jù)/指令選擇端,接至單片機(jī)的P2.0口,當(dāng)RS為低電平時,寫入的是命令,當(dāng)RS為高電平時,寫入的是數(shù)據(jù);RW為液晶讀/寫選擇端,由于對液晶的操作通常是只讀不寫,將該腳直接拉高,意即對液晶只做寫操作;EN為使能端,接至單片機(jī)的P2.1口,高電平有效;7腳—14腳(D0—D7)為液晶的數(shù)據(jù)端,接至單片機(jī)的P0口,與單片機(jī)做數(shù)據(jù)交互;15腳為液晶背光正極,接+5V;16腳為液晶背光負(fù)極,接地。
二、DS12C887內(nèi)部寄存器分析
DSl2C887內(nèi)部共有14個寄存器,地址編號為0-13。0號寄存器為SECONDS秒寄存器,用戶要調(diào)節(jié)秒時,將要設(shè)定的秒數(shù)寫入該寄存器中就可以實現(xiàn)調(diào)節(jié)秒的功能;將秒寄存器里的值讀出并顯示出來就是我們所看到時間里的秒數(shù)。2號分寄存器、4號時寄存器、6號星期寄存器、7號日期寄存器功能可以類比秒寄存器。10號A寄存器—13號D寄存器為控制寄存器,這4個寄存器各8bit,通過修改或讀取這些寄存器,可以對DS12C887做不同的配置,以實現(xiàn)不同的功能需求。下面介紹本設(shè)計用到的A、B控制寄存器的功能和配置操作。
(1)A寄存器
UIP:時鐘更新配置位,UP為1時,立即進(jìn)行更新傳輸;UIP為0時,至少244us內(nèi)不會進(jìn)行更新傳輸。本設(shè)計將UP位設(shè)置為1,這樣DS12C887在上電初始化后會立即更新時間。
DV2、DV1、DV0位:這3位組合配置后用來啟動或關(guān)閉DSl2C887的內(nèi)部晶體振蕩器。本設(shè)計將這3位配置為010,意即打開內(nèi)部晶體振蕩器,允許RTC計時。另外,若是長期不使用DS12C887,為了使其鋰電池節(jié)能,可以通過程序?qū)⑦@3位配置為010之外的其他值,比如000。
RS3、RS2、RS1、RS0:速率選擇位,這4位組合賦予不同的值,可以使得SWQ管腳對外輸出不同頻率的方波或者使得內(nèi)部產(chǎn)生相應(yīng)周期的周期中斷。比如賦值0001時,可使SWQ腳輸出256Hz的方波,中斷周期為3.90625ms。本設(shè)計沒有使用這4位,故將這4位設(shè)置為0000,意即無中斷周期,SWQ無方波輸出。
(2)B寄存器
SET:當(dāng)SET位設(shè)置為0時,芯片更新正常進(jìn)行;當(dāng)SET位設(shè)置為1時,芯片更新被禁止。本設(shè)計將SET位設(shè)置為0。
PIE:當(dāng)PIE位設(shè)置為0時,禁止周期中斷輸出至IRQ;當(dāng)PIE位設(shè)置為1時,允許周期中斷輸出至IRQ。本設(shè)計未使用周期中斷功能,故將PIE位設(shè)置為0。
AIE:當(dāng)AIE位設(shè)置為0時,禁止鬧鐘中斷輸出至IRQ;當(dāng)AIE位設(shè)置為1時,允許鬧鐘中斷輸出至IRQ。本設(shè)計未使用鬧鐘中斷功能,故將AIE位設(shè)置為0。
UIE:當(dāng)UIE位設(shè)置為0時,禁止更新結(jié)束中斷輸出至IRQ;當(dāng)UIE位設(shè)置為1時,允許更新結(jié)束中斷輸出至IRQ。本設(shè)計未使用更新結(jié)束中斷功能,故將UIE位設(shè)置為0。
SQWE:SQW方波輸出使能位,當(dāng)SQWE位設(shè)置為0時,SQW腳輸出低電平;當(dāng)SQWE位設(shè)置為1時,SQW腳輸出設(shè)定頻率的方波。本設(shè)計未使用SQW方波輸出,故將SQWE位設(shè)置為0。
DM:時鐘信息格式選擇位,當(dāng)DM=0時,采用二進(jìn)制表示時鐘信息;當(dāng)DM=1時,采用BCD碼表示時鐘信息。本設(shè)計將DM設(shè)置為1,采用BCD碼表示時鐘信息。
24/12:時制選擇位,當(dāng)這位為0時,12小時制;當(dāng)這位為1時,24小時制;本設(shè)計將這位設(shè)置為1,采用24小時制。
DSE:夏令時使能位,本設(shè)計不采用夏令時,故將DSE位設(shè)置為0。
三、DS12C887讀寫操作時序分析
DS12C887有Motorola和INTEL兩種讀寫操作時序,下面分析常用的INTEL時序。
(一)INTEL讀時序
讀操作是指單片機(jī)從DS12C887某個地址的寄存器里讀出數(shù)據(jù)(時、分、秒數(shù)等),包括寫地址和讀數(shù)據(jù)兩部分。首先將CS置低讓DS12C887正常工作,然后將AS、DS、RW置高,此時將待讀取的寄存器地址通過單片機(jī)P0口寫入DS12C887,接著將AS拉低,這樣就將待讀取的寄存器地址鎖存住了。接著讀取數(shù)據(jù),在讀取數(shù)據(jù)之前先將DS拉低,此時就將待讀取的數(shù)據(jù)通過單片機(jī)P0口讀出來了。最后將AS、DS、CS都置高,以便為下一次讀取新的數(shù)據(jù)做準(zhǔn)備。
(二)INTEL寫時序
寫操作是指單片機(jī)向DS12C887某個地址的寄存器里寫入數(shù)據(jù)(時、分、秒數(shù)等),因此包括寫地址和寫數(shù)據(jù)兩部分。首先將CS置低讓DS12C887正常工作,然后將AS、DS、RW置高,此時將待寫入的寄存器地址通過單片機(jī)P0口寫入DS12C887,接著將AS拉低,這樣就將待操作的寄存器地址鎖存住。接著寫數(shù)據(jù),在寫數(shù)據(jù)之前先將RW拉低,此時就將待寫入的數(shù)據(jù)通過單片機(jī)P0口寫入DS12C887。地址和數(shù)據(jù)都寫入至DS12C887之后,最后將AS、RW、CS都置高,以便為下一次寫入新的數(shù)據(jù)和地址做準(zhǔn)備。
四、程序編寫
讀操作和寫操作是DS12C887最關(guān)鍵的兩個操作,根據(jù)上文中對讀寫操作時序的分析,本文編寫了完整的DS12C887讀、寫操作函數(shù)以及初始化時鐘數(shù)值函數(shù),如下文所述,并給出相應(yīng)的程序注釋。
(一)DS12C887讀操作函數(shù)
uchar read(uchar add)∥讀數(shù)據(jù)
{
uchar dat;∥定義dat保存讀取的數(shù)據(jù)值
cs=0;∥片選有效
as=1;∥先將AS、DS、RW置高
ds=1;
rw=1;
P0=add;
as=0;∥此時地址寫入了時鐘芯片
ds=0;∥將DS拉低,為讀取數(shù)據(jù)做準(zhǔn)備
dat=P0;∥將讀取的數(shù)據(jù)存入dat變量
ds=1;∥最后將DS、AS、CS置高,準(zhǔn)備下次讀數(shù)據(jù)
as=1;
cs=1;
return(dat):∥將讀取的數(shù)據(jù)返回
}
(二)DSl2C887寫操作函數(shù)
void write(uchar add,uchardat)∥寫數(shù)據(jù)
{
cs=0;∥片選有效
as=1;∥先將AS、DS、RW置高
ds=1;
rw=1;
P0=add;
as=0;∥此時地址寫入了時鐘芯片
rw=0;∥將RW拉低,為寫數(shù)據(jù)做準(zhǔn)備
P0=dat;∥將數(shù)據(jù)dat通過P0口寫入時鐘芯片
rw=1;∥最后將RW、AS、CS置高,準(zhǔn)備下次寫數(shù)據(jù)
as=1;
cs=1;
}
五、結(jié)語
本文闡述了使用單片機(jī)和DS12C887設(shè)計電子萬年歷的方法,描述了DS12C887的特點、寄存器配置、讀寫操作時序,給出了完整的DS12C887讀寫操作程序代碼,并做了較為詳細(xì)的注釋。另外,由于1602液晶顯示操作和按鍵操作相對比較簡單,所以本文未予闡述。通過電子萬年歷的軟硬件設(shè)計和仿真,為以后在單片機(jī)設(shè)計領(lǐng)域開展更為深入地研究打下了基礎(chǔ)。