IIC總線讀寫EEPROM(深度詮釋)_第1頁
IIC總線讀寫EEPROM(深度詮釋)_第2頁
IIC總線讀寫EEPROM(深度詮釋)_第3頁
IIC總線讀寫EEPROM(深度詮釋)_第4頁
IIC總線讀寫EEPROM(深度詮釋)_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、/*-IIC總線讀寫EEPROM(串行擴(kuò)展eeprom,24c02)(STC12C系列單片機(jī)自帶eeprom,且有另外的eeprom操作方式)作者:Allen.H(幫同學(xué)修改的一個(gè)程序)-*/#include <reg52.h>#include <intrins.h>/是用括號(hào)還是雙引號(hào)看情況,本地頭文件用雙引號(hào),系統(tǒng)頭文件用括號(hào)/這里使用了_nop_()函數(shù),所以調(diào)用此頭文件#define TRUE 1/*define宏定義一般用大寫,宏定義并不會(huì)減少最終代碼空間define多行語句時(shí),每一行末尾寫上,最后一行可以不寫,有時(shí)比較短的語句寫成一個(gè)子函數(shù)會(huì)犧牲更多的時(shí)間,

2、因?yàn)楹瘮?shù)調(diào)用耗時(shí)比較多,這個(gè)時(shí)候用一個(gè)define語句更好*/#define FALSE 0typedef unsigned char uchar;/良好的程序風(fēng)格,不應(yīng)該用#define/#define uchar unsigned char sbit sda=P20;/-你把sda和scl引腳可能定反了,我換過來了-sbit scl=P21;/等號(hào)對(duì)其,變量名長(zhǎng)短不一時(shí),注意,且測(cè)試等于號(hào)"="或者其他雙目關(guān)系運(yùn)算符兩邊都空一格/-void delay(uchar z)/帶參數(shù)很好/大括號(hào)所在行不要寫代碼uchar i,j;/局部變量中用來自加自減可以用i,j之類的定義

3、,計(jì)數(shù)建議不要用i,j/局部變量不占內(nèi)存,函數(shù)調(diào)用時(shí)生成堆棧,不應(yīng)該定義局部變量時(shí)作初始化/-局部變量命名后空一格,寫正式代碼for(i=z;i>0;i-)for(j=100;j>0;j-);/注明多少時(shí)間,在調(diào)試模式下,看窗口左邊的SEC值/函數(shù)與函數(shù)之間空一格void delay_7nop()/子程序命名最好顧名思義,比如delay_1ms(),這里考慮都是使用7nop,不帶參數(shù)/*程序代碼每進(jìn)一層邏輯就縮進(jìn)一格TAB鍵,TAB設(shè)置為3,4格, 在keil的view->options里面設(shè)置,不要使用幾個(gè)空格來縮進(jìn),統(tǒng)一使用TAB鍵*/_nop_();_nop_();_n

4、op_();_nop_();_nop_();_nop_();_nop_();/這里0-1000多個(gè)_nop_都可以/delay函數(shù)都放在一起,函數(shù)順序不要亂放,相關(guān)的放一起,/-void init()sda=1;delay_7nop();scl=1;delay_7nop();/-SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號(hào);/SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號(hào)。/但更具體還是得看時(shí)序圖,下面就沒有都先把scl先拉高再去變sdavoid start()sda=1;delay_7nop(); /這里sda和第三行的scl信號(hào)哪個(gè)放上沒什么區(qū)別,主要

5、起始和停止信號(hào)風(fēng)格保持一致就行了scl=1;delay_7nop();sda=0;delay_7nop();/scl=0;/允許數(shù)據(jù)變化,傳數(shù)據(jù)的時(shí)候拉低才允許數(shù)據(jù)變化,/但是在開始信號(hào)和停止信號(hào)scl都為高,這里看時(shí)序圖就知道了void stop()sda=0;delay_7nop();scl=1;delay_7nop();sda=1;delay_7nop();bit ask()/應(yīng)答信號(hào),return是什么類型這里函數(shù)就是什么類型, /每一個(gè)被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位) /如果一段時(shí)間內(nèi)沒有收到從機(jī)的應(yīng)答信號(hào),則自動(dòng)認(rèn)為從機(jī)已正確接收到數(shù)據(jù)bit flag;/真假

6、判斷,或只有0/1取值的標(biāo)志位設(shè)置為bitsda=1;scl=1;delay_7nop();flag=sda;delay_7nop();scl=0;delay_7nop();if(flag=1)return FALSE;/非應(yīng)答elsereturn TRUE;/應(yīng)答/用下面屏蔽的的應(yīng)答信號(hào)也可以,上面的應(yīng)答信號(hào)考慮更周全/*void ask() /應(yīng)答uchar i;scl=1;delay_7nop();while(sda=1)&&(i<250)i+;scl=0;delay_7nop();*/-void writedata(uchar dat)/下面是readdata()

7、和readadd()保持程序風(fēng)格的一致性,命名不該命為writecurrent/函數(shù)參數(shù)不要亂用P,q之類的毫無意義的名字,這里用dat,date是關(guān)鍵字,不能用uchar i;/scl=0;/此句可有可無for(i=0;i<8;i+)/按位寫dat=dat<<1;/左移一位scl=0;delay_7nop();sda=CY;/psw位中的CY進(jìn)位標(biāo)識(shí)位,左移后最高位移入CYdelay_7nop();scl=1;/scl高電平,數(shù)據(jù)穩(wěn)定delay_7nop();scl=0;delay_7nop();sda=1;/總線釋放delay_7nop();void writeadd(u

8、char add,uchar infor)start();writedata(0xa0);/器件地址 ask();writedata(add);/器件內(nèi)部存儲(chǔ)區(qū)的地址ask();writedata(infor);/數(shù)據(jù)ask();stop(); /-uchar readdata()uchar i,dat;scl=0;delay_7nop();sda=1;/數(shù)據(jù)總線釋放delay_7nop();for(i=0;i<8;i+) scl=1;delay_7nop();dat=(dat<<1)|(uchar)sda;/此處的強(qiáng)制類型轉(zhuǎn)換表現(xiàn)思維考慮到了/dat左移一位,最低位為0,此

9、時(shí)與sda按位或運(yùn)算就把sda數(shù)據(jù)讀到了最低位scl=0;delay_7nop();/密切相關(guān)的代碼緊接著寫,不很相關(guān)的空一格再寫return dat;uchar readadd(uchar add)uchar r=0;/局部變量小寫,全局變量首字母大寫start();writedata(0xa0);ask();writedata(add);ask();start();writedata(0xa1);ask();r=readdata();stop(); return r;/-void main()while(1)/在keil的調(diào)試仿真窗口(Perpherals->I/O-ports-&g

10、t;)看不出P2口的變換,/因?yàn)檫@里是外部EEPROM,要仿真芯片或者硬件的支持才能觀察結(jié)果,本程序測(cè)試無誤init();/這里初始化一下writeadd(25,0xaa);delay(50);/此處最少要delay(7);P1=readadd(25);/P1還是P2還是P3主要是看你的硬件用哪個(gè)來測(cè)試/主函數(shù)放最后是省去了函數(shù)申明,但在工程應(yīng)用中建議放在最上面/這樣一眼就能看到該工程是做什么的,且功能函數(shù)本身就應(yīng)該在頭文件中作申明/以便其他點(diǎn)C文件能方便調(diào)用,每寫一個(gè)功能函數(shù)都在頭文件中作申明,這是一個(gè)好習(xí)慣/方便其他點(diǎn)C文件隨時(shí)調(diào)用/-/總結(jié):/1.你的程序最初可能把scl和sda可能定反

11、了,/2.你沒寫ask函數(shù)(屏蔽了),應(yīng)答信號(hào)必須寫, /3.你的代碼風(fēng)格,變量名命名,函數(shù)名命名,函數(shù)排放順序,無注釋,/ 書寫排版有很大問題,看你的程序很吃力,且不美觀/4.能用子函數(shù)代替的就寫成子函數(shù),用那么多nop看上去代碼真丑/5.有關(guān)讀寫的4個(gè)函數(shù)你函數(shù)名命名風(fēng)格沒統(tǒng)一/建議:/1.看時(shí)序圖的能力和對(duì)IIC總線的理解有待加強(qiáng)/2.要慢慢形成規(guī)范的代碼風(fēng)格/3.keil軟件對(duì)你還有很大學(xué)習(xí)空間,要學(xué)習(xí)用更多的keil調(diào)試和用protus仿真/相關(guān)提示:/1.要學(xué)些使用下列對(duì)內(nèi)存和存儲(chǔ)的理解:/code :程序存儲(chǔ)區(qū)(64KB)/data :可直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(128B) 默認(rèn)的變量存儲(chǔ)區(qū)/idata:不可直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論