利用實(shí)時(shí)時(shí)鐘芯片 DS1307 設(shè)計(jì)一個(gè)能夠調(diào)節(jié)時(shí)間的實(shí)時(shí)時(shí)鐘。 介紹采用 I2C 總線接口實(shí)時(shí)時(shí)鐘芯片 DS1307 進(jìn)行準(zhǔn)確定時(shí)的設(shè)計(jì)原理, 提出實(shí)時(shí)時(shí)鐘芯片 DS1307 與單片機(jī)接口電路的設(shè)計(jì)方法,同時(shí)給出幾個(gè)典型程序?qū)嵗,通過(guò) Proteus 軟件進(jìn)行仿真實(shí)現(xiàn)。 先來(lái)說(shuō)說(shuō)實(shí)時(shí)時(shí)鐘DS1307的使用! DS1307 是一款十分常用的實(shí)時(shí)時(shí)鐘芯片,它可以記錄年、月、日、時(shí)、分、秒等信息,提供至2100年的記錄?墒褂秒姵毓╇,也就是說(shuō),即使Arduino 在斷電狀態(tài)下,時(shí)鐘芯片仍然是在運(yùn)行的。它使用十分常用的兩線式串行總線(I2C),只要兩根線即可和Arduino 通信。 電控單元的時(shí)鐘基準(zhǔn)通?衫 CPU 內(nèi)部定時(shí)器作為時(shí)鐘基準(zhǔn),并通過(guò)軟件編程和 CPU 時(shí)鐘中斷來(lái)構(gòu)造一個(gè)軟時(shí)鐘。 這種方法的優(yōu)點(diǎn)是無(wú)需額外硬件支持,但缺點(diǎn)是時(shí)鐘的計(jì)時(shí)精度受 CPU 主晶振以及與其相連的起振電容的影響而無(wú)法做到很高, 因此累積誤差較大。同時(shí)在主電源掉電時(shí)為了維持時(shí)鐘不停擺,系統(tǒng)必須由備用電源給整個(gè) CPU 供電,這將導(dǎo)致功耗增大。 I2C總線虛擬技術(shù) DS1307是一款具有I2C總線接口的實(shí)時(shí)時(shí)鐘芯片,要驅(qū)動(dòng)具有I2C總線接口的DS1307芯片,一種辦法是選擇一款帶有I2C總線接口的高檔單片機(jī),然而,在很多小型儀器儀表中以及在單片機(jī)的教學(xué)環(huán)境中,使用帶有I2C總線接口的高檔單片機(jī)在經(jīng)濟(jì)上是不合算的,在這種情況下,可以采用I2C總線虛擬技術(shù),選用普遍使用的51單片機(jī),利用單片機(jī)的通用I/O端口模擬實(shí)現(xiàn)I2C總線接口。 硬件接口電路設(shè)計(jì) 本系統(tǒng)的電路由單片機(jī)AT89C51、日歷時(shí)鐘芯片DS1307、獨(dú)立按鍵及顯示電路組成。 DS1307與AT89C51的接口 為了使AT89C51單片機(jī)能夠驅(qū)動(dòng)DS1307芯片,本文采用了I2C總線虛擬技術(shù),將單片機(jī)P2.6口和P2.7口來(lái)虛擬I2C總線接口。I2C總線是同步串行數(shù)據(jù)傳輸總線,其內(nèi)部為雙向傳輸電路,端口輸出為開(kāi)漏結(jié)構(gòu),故總線上必須有上拉電阻,通?扇5~10kΩ。因單片機(jī)P2口內(nèi)部有上拉電阻,故DS1307芯片的SCL引腳與SDA引腳與單片機(jī)接口時(shí),不需再添加上拉電阻。此外,按照DALLAS公司推薦的硬件接法,往往需要精度很高的晶體,為了提高其可靠性并節(jié)約成本,可將DS1307的X2引腳添加上拉電阻,從而可以克服使用普通晶振時(shí)DS1307不起振的問(wèn)題,進(jìn)而保證了DS1307的起振。日歷時(shí)鐘芯片DS1307與AT89C51的接口電路如圖1所示。  時(shí)鐘顯示電路 為了將系統(tǒng)時(shí)間實(shí)時(shí)顯示出來(lái),本系統(tǒng)沒(méi)有采用常用的數(shù)碼管作為顯示方式,而是采用1602LCD液晶實(shí)時(shí)顯示時(shí)間,這樣電路的設(shè)計(jì)就會(huì)相對(duì)簡(jiǎn)單一些,所用到的I/O口也較少。1602液晶的接口電路如圖2所示。 時(shí)鐘調(diào)節(jié)電路 為了能夠及時(shí)對(duì)時(shí)間進(jìn)行調(diào)節(jié),本系統(tǒng)設(shè)計(jì)了時(shí)鐘調(diào)節(jié)電路,由K0、K1、K2三個(gè)按鍵組成,且分別由單片機(jī)的P2.0、P2.1和P2.2口控制。其中,K0做為時(shí)鐘調(diào)節(jié)的菜單鍵,第一次按下表示可以調(diào)節(jié)時(shí)間秒,第二次可以調(diào)節(jié)時(shí)間分,第三次按下調(diào)節(jié)時(shí),第四次按下退出調(diào)時(shí)菜單,時(shí)鐘繼續(xù)開(kāi)始走動(dòng)。K1和K2分別是時(shí)分秒調(diào)節(jié)的加減鍵。在本電路中,根據(jù)經(jīng)驗(yàn)總結(jié),額外添加三個(gè)上拉電阻,以保證在沒(méi)有按鍵按下時(shí),進(jìn)入單片機(jī)三個(gè)I/O口的按鍵均處于高電平狀態(tài),防止干擾產(chǎn)生。時(shí)鐘調(diào)節(jié)電路如圖3所示。 接口程序設(shè)計(jì) 軟件程序設(shè)計(jì)采用模塊化設(shè)計(jì)思想,包括主程序、初始化子程序、時(shí)鐘運(yùn)行子程序,按鍵掃描子程序。其中,初始化子程序主要工作有:初始化I2C總線,使總線處于備用狀態(tài);初始化LCD液晶顯示器讓其正常顯示;初始化定時(shí)器0并開(kāi)啟定時(shí)器0中斷。時(shí)鐘運(yùn)行子程序主要負(fù)責(zé)讓DS1307芯片更新時(shí)間并在LCD上顯示。按鍵掃描子程序負(fù)責(zé)檢測(cè)按鍵的狀態(tài)并將更改后的時(shí)間顯示出來(lái)。主程序主要負(fù)責(zé)初始化及鍵盤掃描工作。本系統(tǒng)主程序的流程圖如圖4所示。 在本系統(tǒng)中,因采用了I2C總線虛擬技術(shù),需嚴(yán)格按照時(shí)序圖的要求進(jìn)行操作,因此,在程序設(shè)計(jì)當(dāng)中,分別添加了幾個(gè)子程序,用于實(shí)現(xiàn)單片機(jī)與DS1307進(jìn)行通信。下面是根據(jù)本文電路對(duì)I2C總線上的信號(hào)進(jìn)行模擬的幾個(gè)子程序: void start() //模擬 I2C 啟動(dòng)信號(hào) { SDA = 1; Nop (); SCL = 1; Nop (); SDA = 0; Nop (); SCL = 0; } void stop() //模擬 I2C 停止信號(hào) { SDA = 0; Nop (); SCL = 1; Nop (); SDA = 1; Nop (); } void ack() //模擬 I2C 應(yīng)答信號(hào) { SDA = 1; Nop (); SCL = 1; Nop (); SCL = 0; } void un_ack() //模擬 I2C 非應(yīng)答信號(hào) { uchar i; i=0; SCL=1; while(SDA==1&&i《200) i++; Nop (); SCL = 0; } 需要注意的是,DS1307的各類時(shí)間數(shù)據(jù)均以BCD碼的格式存儲(chǔ)在相應(yīng)的時(shí)間寄存器中,而1602液晶顯示器只能識(shí)別字符碼,即ASCLL碼,因而1602在向DS1307讀取或?qū)懭霑r(shí)間數(shù)據(jù)時(shí),需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。本文采用以下兩個(gè)子程序用來(lái)完成上述功能: uchar dec_to_bcd (uchar dec) //ASCLL 碼 (十 進(jìn) 制 )轉(zhuǎn)BCD 碼 { Uchar x, y; x=dec/10; y=dec%10; y=(x《《4)|y; return y; } uchar bcd_to_dec(uchar bcd) //BCD 碼 轉(zhuǎn) ASCLL 碼(十進(jìn)制) { Uchar x, y; y=bcd/16; x=bcd % 16; y=y*10+x; return y; } 仿真分析 本文最后使用Proteus軟件對(duì)本實(shí)時(shí)時(shí)鐘系統(tǒng)進(jìn)行仿真,將代碼下載到單片機(jī)當(dāng)中并啟動(dòng)Proteus后,液晶顯示器與DS1307時(shí)鐘顯示模塊同時(shí)顯示初始時(shí)間并開(kāi)始計(jì)時(shí), 適當(dāng)調(diào)節(jié)三個(gè)獨(dú)立按鍵 K0~K2 后,液晶顯示器顯示調(diào)整后的 時(shí)間并且把新的 時(shí)間寫(xiě)入DS1307,DS1307 從新的時(shí)間開(kāi)始計(jì)時(shí)。 仿真效果如圖5 所示。 本文設(shè)計(jì)了一個(gè)基于 DS1307 可調(diào)實(shí)時(shí)時(shí)鐘系統(tǒng),提出了實(shí)時(shí)時(shí)鐘芯片 DS1307 與單片機(jī)接口電路的設(shè)計(jì)方法,因本系統(tǒng)采用了 I2C 總線虛擬技術(shù),需嚴(yán)格按照 I2C 總線時(shí)序圖的要求對(duì) DS1307 進(jìn)行操作,本文給出了對(duì)I2C 總線上的信號(hào)進(jìn)行模擬的幾個(gè)典型程序?qū)嵗詈笸ㄟ^(guò) Proteus 軟件成功仿真實(shí)現(xiàn)。
|