第46節(jié):利用AT24C02進(jìn)行掉電后的數(shù)據(jù)保存
從業(yè)近十年!手把手教你單片機(jī)程序框架 第46講
開場白:
一個AT24C02可以存儲256個字節(jié),地址范圍是(0至255)。利用AT24C02存儲數(shù)據(jù)時,要教會大家六個知識點:
第一個:單片機(jī)操作AT24C02的通訊過程也就是IIC的通訊過程, IIC通訊過程是一個要求一氣呵成的通訊過程,中間不能被其它中斷影響時序出錯,因此在整個通訊過程中應(yīng)該先關(guān)閉總中斷,完成之后再開中斷。
第二個:在寫入或者讀取完一個字節(jié)之后,一定要加上一段延時時間。在11.0592M晶振的系統(tǒng)中,寫入數(shù)據(jù)時經(jīng)驗值用delay_short(2000),讀取數(shù)據(jù)時經(jīng)驗值用delay_short(800)。否則在連續(xù)寫入或者讀取一串?dāng)?shù)據(jù)時容易丟失數(shù)據(jù)。如果一旦發(fā)現(xiàn)丟失數(shù)據(jù),應(yīng)該適當(dāng)繼續(xù)把這個時間延長,尤其是在寫入數(shù)據(jù)時。
第三個:如何初始化EEPROM數(shù)據(jù)的方法。系統(tǒng)第一次上電時,我們從EEPROM讀取出來的數(shù)據(jù)有可能超出了范圍,可能是ff。這個時候我們應(yīng)該給它填入一個初始化的數(shù)據(jù),這一步千萬別漏了。
第四個:在時序中,發(fā)送ACK確認(rèn)信號時,要記得把數(shù)據(jù)線eeprom_sda_dr_s設(shè)置為輸入的狀態(tài)。對于51單片機(jī)來說,只要把eeprom_sda_dr_s=1就可以。而對于PIC或者AVR單片機(jī)來說,它們都是帶方向寄存器的,就不能直接eeprom_sda_dr_s=1,而要直接修改方向寄存器,把它設(shè)置為輸入狀態(tài)。在本驅(qū)動程序中,我沒有對ACK信號進(jìn)行出錯判斷,因為我這么多年一直都是這樣用也沒出現(xiàn)過什么問題。
第五個: 提醒各位讀者在硬件上應(yīng)該注意的問題,單片機(jī)跟AT24C02通訊的2根IO口都要加上一個4.7K左右的上拉電阻。凡是在IIC通訊場合,都要加上拉電阻。AT24C02的WP引腳一定要接地,否則存不進(jìn)數(shù)據(jù)。
第六個:舊版的朱兆祺51學(xué)習(xí)板在硬件上有一個bug,AT24C02的第8個引腳VCC懸空了!!!,讀者記得把它飛線連接到5V電源處。新版的朱兆祺51學(xué)習(xí)板已經(jīng)改過來了。
具體內(nèi)容,請看源代碼講解。
(1)硬件平臺:
基于朱兆祺51單片機(jī)學(xué)習(xí)板。
(2)實現(xiàn)功能:
4個被更改后的參數(shù)斷電后不丟失,數(shù)據(jù)可以保存,斷電再上電后還是上一次最新被修改的數(shù)據(jù)。
顯示和獨立按鍵部分根據(jù)第29節(jié)的程序來改編,用朱兆祺51單片機(jī)學(xué)習(xí)板中的S1,S5,S9作為獨立按鍵。
一共有4個窗口。每個窗口顯示一個參數(shù)。
第8,7,6,5位數(shù)碼管顯示當(dāng)前窗口,P-1代表第1個窗口,P-2代表第2個窗口,P-3代表第3個窗口,P-4代表第1個窗口。
第4,3,2,1位數(shù)碼管顯示當(dāng)前窗口被設(shè)置的參數(shù)。范圍是從0到9999。S1是加按鍵,按下此按鍵會依次增加當(dāng)前窗口的參數(shù)。S5是減按鍵,按下此按鍵會依次減少當(dāng)前窗口的參數(shù)。S9是切換窗口按鍵,按下此按鍵會依次循環(huán)切換不同的窗口。
(3)源代碼講解如下:
總結(jié)陳詞:
IIC通訊過程是一個要求一氣呵成的通訊過程,中間不能被其它中斷影響時序出錯,因此,在整個通訊過程中應(yīng)該先關(guān)閉總中斷,完成之后再開中斷。但是,這樣就會引起另外一個新問題,如果關(guān)閉總中斷的時間太長,會導(dǎo)致動態(tài)數(shù)碼管不能及時均勻的掃描,在按鍵更改參數(shù),內(nèi)部操作EEPROM時,數(shù)碼管就會出現(xiàn)短暫明顯的閃爍現(xiàn)象,解決這個問題最好的辦法就是在做項目中盡量不要用動態(tài)掃描數(shù)碼管的方案,應(yīng)該用靜態(tài)顯示的方案。那么在程序上還有沒有改善這種現(xiàn)象的方法?當(dāng)然有。欲知詳情,請聽下回分解-----操作AT24C02時,利用“一氣呵成的定時器方式”改善數(shù)碼管的閃爍現(xiàn)象。