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