第48節(jié):利用DS1302做一個(gè)實(shí)時(shí)時(shí)鐘
從業(yè)近十年!手把手教你單片機(jī)程序框架 第48講
開場白:
DS1302有兩路獨(dú)立電源輸入,我們只要在其中一路電源上掛一個(gè)紐扣電池就可以實(shí)現(xiàn)掉電時(shí)鐘繼續(xù)跑的功能,紐扣電池作為備用電源必須比主電源的電壓低一點(diǎn)。DS1302還給我們預(yù)留了一片RAM區(qū),我們可以把一些數(shù)據(jù)存入到DS1302,只要DS1302的電池有電,那么它就相當(dāng)于一個(gè)EEPROM。這個(gè)RAM區(qū)有什么用呢?因?yàn)镽AM區(qū)的數(shù)據(jù)只要一掉電,所有的數(shù)據(jù)都會(huì)變成0x00或者0xff,也就是數(shù)據(jù)掉電會(huì)丟失,我們可以利用這個(gè)特點(diǎn),可以在里面存入標(biāo)志位數(shù)據(jù),一旦發(fā)現(xiàn)這個(gè)數(shù)據(jù)改變了,就知道時(shí)鐘的數(shù)據(jù)需要重新設(shè)置過,或者說明電池沒電了。
在移植DS1302驅(qū)動(dòng)程序中,有一個(gè)地方最容易出錯(cuò),就是DS1302芯片的數(shù)據(jù)線DIO。我們編程時(shí)要特別留意這個(gè)IO口什么時(shí)候作為數(shù)據(jù)輸入,什么時(shí)候作為數(shù)據(jù)輸出,以便及時(shí)更改方向寄存器。對于51單片機(jī),IO口在讀取數(shù)據(jù)之前,要先置1。
這一節(jié)要教會(huì)大家六個(gè)知識(shí)點(diǎn):
第一個(gè):DS1302做實(shí)時(shí)時(shí)鐘時(shí),修改時(shí)間和讀取時(shí)間的常見程序框架。
第二個(gè):如何編寫監(jiān)控備用電池電量耗盡的監(jiān)控程序。
第三個(gè):在往DS1302寫入數(shù)據(jù)修改時(shí)間之前,必須注意調(diào)整一下“日”的變量,因?yàn)槊總€(gè)月的最大天數(shù)是不一樣的,有的一個(gè)月28天,有的一個(gè)月29天,有的一個(gè)月30天,有的一個(gè)月31天。
第四個(gè):本程序第一次出現(xiàn)了電平按鍵,跟之前講的下降沿按鍵不一樣,請留意我是何如用軟件濾波的,以及它具體的實(shí)現(xiàn)代碼。
第五個(gè):本程序第一次出現(xiàn)了一個(gè)按鍵按下去后,如果不松手就會(huì)觸發(fā)兩次事件,第一次是短按,第二次是長按3秒。請留意我是如何在之前的按鍵上略做修改就實(shí)現(xiàn)此功能的具體代碼。
第六個(gè):繼續(xù)加深了解按鍵與顯示是如何緊密關(guān)聯(lián)起來的程序框架。
具體內(nèi)容,請看源代碼講解。
(1) 硬件平臺(tái).
基于朱兆祺51單片機(jī)學(xué)習(xí)板。
舊版的朱兆祺51學(xué)習(xí)板在硬件上有一個(gè)bug,DS1302芯片附近的R43,R42兩個(gè)電阻應(yīng)該去掉,并且把R41的電阻換成0歐姆的電阻,或者直接短接起來。新版的朱兆祺51學(xué)習(xí)板已經(jīng)改過來了。
(2)實(shí)現(xiàn)功能:
本程序有2兩個(gè)窗口。
第1個(gè)窗口顯示日期。顯示格式“年-月-日”。注意中間有“-”分開。
第2個(gè)窗口顯示時(shí)間。顯示格式“時(shí) 分 秒”。注意中間沒“-”,只有空格分開。
系統(tǒng)上電后,默認(rèn)顯示第2個(gè)窗口,實(shí)時(shí)顯示動(dòng)態(tài)的“時(shí) 分 秒”時(shí)間。此時(shí)按下S13按鍵不松手就會(huì)切換到顯示日期的第1個(gè)窗口。松手后自動(dòng)切換回第2個(gè)顯示動(dòng)態(tài)時(shí)間的窗口。
需要更改時(shí)間的時(shí)候,長按S9按鍵不松手超過3秒后,系統(tǒng)將進(jìn)入修改時(shí)間的狀態(tài),切換到第1個(gè)日期窗口,并且顯示“年”的兩位數(shù)碼管會(huì)閃爍,此時(shí)可以按S1或者S5加減按鍵修改年的參數(shù),修改完年后,繼續(xù)短按S9按鍵,會(huì)切換到“月”的參數(shù)閃爍狀態(tài),只要依次不斷按下S9按鍵,就會(huì)依次切換年,月,日,時(shí),分,秒的參數(shù)閃爍狀態(tài),最后修改完秒的參數(shù)后,系統(tǒng)會(huì)自動(dòng)把我們修改設(shè)置的日期時(shí)間一次性寫入DS1302芯片內(nèi)部,達(dá)到修改日期時(shí)間的目的。
S13是電平變化按鍵,用來切換窗口的,專門用來查看當(dāng)前日期。按下S13按鍵時(shí)顯示日期窗口,松手后返回到顯示實(shí)時(shí)時(shí)間的窗口。
本程序在使用過程中的注意事項(xiàng):
(a)第一次上電時(shí),蜂鳴器會(huì)報(bào)警,只要DS1302芯片的備用電池電量充足,這個(gè)時(shí)候斷電再重啟一次,就不會(huì)報(bào)警了。
(b)第一次上電時(shí),時(shí)間沒有走動(dòng),需要重新設(shè)置一下日期時(shí)間才可以。長按S9按鍵可以進(jìn)入修改日期時(shí)間的狀態(tài)。
(3)源代碼講解如下:
總結(jié)陳詞:
下一節(jié)開始講單片機(jī)驅(qū)動(dòng)溫度傳感器芯片的內(nèi)容,欲知詳情,請聽下回分解-----利用DS18B20做一個(gè)溫控器 。