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