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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

7、和readadd()保持程序風格的一致性,命名不該命為writecurrent/函數(shù)參數(shù)不要亂用P,q之類的毫無意義的名字,這里用dat,date是關鍵字,不能用uchar i;/scl=0;/此句可有可無for(i=0;i<8;i+)/按位寫dat=dat<<1;/左移一位scl=0;delay_7nop();sda=CY;/psw位中的CY進位標識位,左移后最高位移入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)部存儲區(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;/此處的強制類型轉(zhuǎn)換表現(xiàn)思維考慮到了/dat左移一位,最低位為0,此

9、時與sda按位或運算就把sda數(shù)據(jù)讀到了最低位scl=0;delay_7nop();/密切相關的代碼緊接著寫,不很相關的空一格再寫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口的變換,/因為這里是外部EEPROM,要仿真芯片或者硬件的支持才能觀察結(jié)果,本程序測試無誤init();/這里初始化一下writeadd(25,0xaa);delay(50);/此處最少要delay(7);P1=readadd(25);/P1還是P2還是P3主要是看你的硬件用哪個來測試/主函數(shù)放最后是省去了函數(shù)申明,但在工程應用中建議放在最上面/這樣一眼就能看到該工程是做什么的,且功能函數(shù)本身就應該在頭文件中作申明/以便其他點C文件能方便調(diào)用,每寫一個功能函數(shù)都在頭文件中作申明,這是一個好習慣/方便其他點C文件隨時調(diào)用/-/總結(jié):/1.你的程序最初可能把scl和sda可能定反

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

溫馨提示

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

評論

0/150

提交評論