徐錦銅 康晴茜



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