自制單片機(jī)之十三……時(shí)鐘IC_DS1302
在網(wǎng)上看了很久,發(fā)現(xiàn)初學(xué)者最有興趣的就是DS1302時(shí)鐘電路,也很自然,它是個(gè)做出來就讓你覺得最實(shí)用的電路了,但實(shí)際上制做上并不簡單,首先你要讓你的顯示部分(不管是數(shù)碼管還是LCD)調(diào)試通過。然后把DS1302接好,調(diào)試正確了才能在成功顯示時(shí)間和日期。下面我們就來說說DS1302的用法。
DS1302的圖如下:
DS1302是美國DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。實(shí)時(shí)時(shí)鐘可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。工作電壓寬達(dá)2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對(duì)后背電源進(jìn)行涓細(xì)電流充電的能力。
下面是標(biāo)準(zhǔn)的接線電路圖:
各引腳功能如下:
引腳號(hào) 名稱 功能
① Vcc2 主電源
②、③ X1,X2 接32768Hz晶振
④ GND 地線
⑤ RST 復(fù)位
⑥ I/0 數(shù)據(jù)輸入輸出
⑦ SCLK 串行時(shí)鐘
⑧ Vccl 后備電源
DS1302有關(guān)日歷、時(shí)間的寄存器共有12個(gè),其中有7個(gè)寄存器(讀時(shí)81h~8Dh,寫時(shí)80h~8Ch)是存放秒、分,小時(shí)、日、月、年、周數(shù)據(jù)的,存放的數(shù)據(jù)格式為BCD碼形式
它的內(nèi)部時(shí)間寄存器如下:
這張表呢是DS1302內(nèi)部的7個(gè)與時(shí)間、日期有關(guān)的寄存器圖和一個(gè)寫保護(hù)寄存器,我們要做的就是將初始設(shè)置的時(shí)間、日期數(shù)據(jù)寫入這幾個(gè)寄存器,然后再不斷地讀取這幾個(gè)寄存器來獲取實(shí)時(shí)時(shí)間和日期。這幾個(gè)寄存器的說明如下:
1、秒寄存器(81h、80h)的位7定義為時(shí)鐘暫停標(biāo)志(CH)。當(dāng)初始上電時(shí)該位置為1,時(shí)鐘振蕩器停止,DS1302處于低功耗狀態(tài);只有將秒寄存器的該位置改寫為0時(shí),時(shí)鐘才能開始運(yùn)行。
2、小時(shí)寄存器(85h、84h)的位7用于定義DS1302是運(yùn)行于12小時(shí)模式還是24小時(shí)模式。當(dāng)為高時(shí),選擇12小時(shí)模式。在12小時(shí)模式時(shí),位5是 ,當(dāng)為1時(shí),表示PM。在24小時(shí)模式時(shí),位5是第二個(gè)10小時(shí)位
3、控制寄存器(8Fh、8Eh)的位7是寫保護(hù)位(WP),其它7位均置為0。在任何的對(duì)時(shí)鐘和RAM的寫操作之前,WP位必須為0。當(dāng)WP位為1時(shí),寫保護(hù)位防止對(duì)任一寄存器的寫操作。也就是說在電路上電的初始態(tài)WP是1,這時(shí)是不能改寫上面任何一個(gè)時(shí)間寄存器的,只有首先將WP改寫為0,才能進(jìn)行其它寄存器的寫操作。
下面來說說如果對(duì)DS1302進(jìn)行讀寫:
上面的電路圖可以看出,除了電源和接地,DS1302只有三根線和單片機(jī)連接,SCLK、I/O和RST(有的也寫成CE),先看時(shí)序圖:
DS1302的數(shù)據(jù)讀寫是通過I/O串行進(jìn)行的。當(dāng)進(jìn)行一次讀寫操作時(shí)最少得讀寫兩個(gè)字節(jié),第一個(gè)字節(jié)是控制字節(jié),就是一個(gè)命令,告訴DS1302是讀還是寫操作,是對(duì)RAM還是對(duì)CLOK寄存器操作,以及操作的地址。第二個(gè)字節(jié)就是要讀或?qū)懙臄?shù)據(jù)了。
我們先看單字節(jié)寫:在進(jìn)行操作之前先得將CE(也可說是RST)置高電平,然后單片機(jī)將控制字的位0放到I/O上,當(dāng)I/O的數(shù)據(jù)穩(wěn)定后,將SCLK置高電平,DS1302檢測(cè)到SCLK的上升沿后就將I/O上的數(shù)據(jù)讀取,然后單片機(jī)將SCLK置為低電平,再將控制字的位1放到I/O上,如此反復(fù),將一個(gè)字節(jié)控制字的8個(gè)位傳給DS1302。接下來就是傳一個(gè)字節(jié)的數(shù)據(jù)給DS1302,當(dāng)傳完數(shù)據(jù)后,單片機(jī)將CE置為低電平,操作結(jié)束。
單字節(jié)讀操作的一開始寫控制字的過程和上面的單字節(jié)寫操作是一樣,但是單字節(jié)讀操作在寫控制字的最后一個(gè)位,SCLK還在高電平時(shí),DS1302就將數(shù)據(jù)放到I/O上,單片機(jī)將SCLK置為低電平后數(shù)據(jù)鎖存,單機(jī)機(jī)就可以讀取I/O上的數(shù)據(jù)。如此反復(fù),將一個(gè)字節(jié)的數(shù)據(jù)讀入單片機(jī)。讀與寫操作的不同就在于,寫操作是在SCLK低電平時(shí)單片機(jī)將數(shù)據(jù)放到IO上,當(dāng)SCLK上升沿時(shí),DS1302讀取。而讀操作是在SCLK高電平時(shí)DS1302放數(shù)據(jù)到IO上,將SCLK置為低電平后,單片機(jī)就可從IO上讀取數(shù)據(jù)。
現(xiàn)在我們來看看控制字的內(nèi)容:
位0就是讀寫位,當(dāng)位0為1時(shí),就是告訴DS1302,下面是進(jìn)行讀出操作,而當(dāng)位0為0時(shí)就是寫入操作。
位0-位5是要進(jìn)行操作的DS1302寄存器地址。
位6就是告訴DS1302,是要對(duì)RAM進(jìn)行操作還是對(duì)CLK寄存器進(jìn)行操作,0就是對(duì)時(shí)間寄存器操作,一般我們都是對(duì)時(shí)間寄存器進(jìn)行操作。
位7就是固定的1。為什么是1呢。還記得上面說的單字節(jié)讀操作嗎?在寫控制字的最后一個(gè)位也就是位7時(shí),DS1302已將它的寄存器數(shù)據(jù)位0放到IO上了,要是控制字的位7是0的話,DS1302就無法將它的隨后的數(shù)據(jù)放到IO上了。
這樣你現(xiàn)在就知道為什么控制字80H是寫秒寄存器,而80H是讀秒寄存器了吧!80H換成二進(jìn)制就是10000000。而81H的二進(jìn)制就是10000001,一個(gè)是寫操作,另一個(gè)是讀操作嘛!
好!我們現(xiàn)在來總結(jié)一下,如何對(duì)DS1302進(jìn)行操作。
①首先要通過8eH將寫保護(hù)去掉,這樣我們才能將日期,時(shí)間的初值寫時(shí)各個(gè)寄存器。
②然后就可以對(duì)80H、82H、84H、86H、88H、8AH、8CH進(jìn)行初值的寫入。同時(shí)也通過秒寄存器將位7的CH值改成0,這樣DS1302就開始走時(shí)運(yùn)行了。
③將寫保護(hù)寄存器再寫為80H,防止誤改寫寄存器的值。
④不斷讀取80H-8CH的值,將它們格式化后顯示到LCD或數(shù)碼管上。