51單片機EEPROM的讀寫_第1頁
51單片機EEPROM的讀寫_第2頁
51單片機EEPROM的讀寫_第3頁
51單片機EEPROM的讀寫_第4頁
51單片機EEPROM的讀寫_第5頁
全文預覽已結束

下載本文檔

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

文檔簡介

1、STC單片機的內部EEPROM是用DATAFLASH模擬出來的,不是真正的EEPROM存儲器,不能用普通的方法來操作下面是一些注意點:1.字節(jié)寫之前要先將這個字節(jié)所在扇區(qū)的其它有效數(shù)據(jù)讀取到RAM暫存(這步不是必須的)2.暫存完之后再對整個扇區(qū)(512字節(jié))進行擦除操作,擦拭完后,整個扇區(qū)每個地址中數(shù)據(jù)都變成0xFF3.將欲寫入的N個字節(jié)數(shù)據(jù),用字節(jié)寫函數(shù)寫入EEPROM4.將暫存到RAM的其它有用的EEPROM值再用字節(jié)寫函數(shù)寫回EEPROM5.STC用FLASH模擬出來的EEPROM的字節(jié)寫功能只能將1變成0,而不能將0變成1, 只有扇區(qū)擦除后數(shù)據(jù)才是全1, 例如:在地址0x21f0處第1

2、次寫,第2次寫,讀出結果是這2個值的相與10010 所以如果一個地址處的值不是0xff時寫入新的數(shù)據(jù)是不對的,要先執(zhí)行扇區(qū)擦除,變?yōu)?xff, 對于單個字節(jié)的寫入,我們可以先檢查該地址處的數(shù)據(jù)是否為0xff,是的話就不用擦除扇區(qū)了-STC89C52單片機內部EEPROM 的讀寫過程1 配置ISP_CONTR寄存器,使能第7位ISPEN,讓ISP_IAP功能生效,并配置低3位的等待時間2 寫指令: 讀/寫/擦除扇區(qū) 這3個命令3 賦值: ISP_ADDRH和ISP_ADDRL的地址值4 關閉總中斷EA,因為下面要寫的2個觸發(fā)指令必須是連續(xù)操作的,不能被中斷5 執(zhí)行公用的 ISP_IAP 觸發(fā)指令

3、,觸發(fā)后讀寫操作才能進行6 打開中斷 EA,關閉ISP_IAP功能:清相關寄存器#include my51.h/*定義命令字節(jié)*/ #define read_cmd 0x01 /字節(jié)讀數(shù)據(jù)命令 #define wirte_cmd 0x02 /字節(jié)編程數(shù)據(jù)命令 #define erase_cmd 0x03 /扇區(qū)擦除數(shù)據(jù)命令 /*特殊功能寄存器聲明*/ sfr ISP_DATA = 0xe2; sfr ISP_ADDRH = 0xe3; sfr ISP_ADDRL = 0xe4; sfr ISP_CMD = 0xe5; sfr ISP_TRIG = 0xe6; sfr ISP_CONTR = 0

4、xe7;/*定義Flash 操作等待時間及允許IAP/ISP/EEPROM 操作的常數(shù)*/#define enable_waitTime 0x80 /系統(tǒng)工作時鐘30MHz 時,對IAP_CONTR 寄存器設置此值/#define enable_waitTime 0x81 /系統(tǒng)工作時鐘24MHz 時,對IAP_CONTR 寄存器設置此值/#define enable_waitTime 0x82 /系統(tǒng)工作時鐘20MHz 時,對IAP_CONTR 寄存器設置此值#define enable_waitTime 0x83 /系統(tǒng)工作時鐘12MHz 時,對IAP_CONTR 寄存器設置此值/#def

5、ine enable_waitTime 0x84 /系統(tǒng)工作時鐘 8); /送地址高字節(jié) ISP_ADDRL = (u8)(beginAddr & 0x00ff); /送地址低字節(jié)ISP_IAP_trigger();/觸發(fā)beginAddr+;/地址+*pBuf+ = ISP_DATA;/將數(shù)據(jù)保存到接收緩沖區(qū)ISP_IAP_disable();/關閉ISP_IAP功能 void ISP_IAP_writeData(u16 beginAddr,u8* pDat,u16 dataSize) /寫數(shù)據(jù) ISP_CONTR = enable_waitTime; /開啟ISP_IAP,并送等待時間 I

6、SP_CMD = wirte_cmd; /送字節(jié)編程命令字while(dataSize-) ISP_ADDRH = (u8)(beginAddr 8); /送地址高字節(jié) ISP_ADDRL = (u8)(beginAddr & 0x00ff); /送地址低字節(jié) ISP_DATA = *pDat+; /送數(shù)據(jù) beginAddr+; ISP_IAP_trigger(); /觸發(fā) ISP_IAP_disable(); /關閉 void ISP_IAP_sectorErase(u16 sectorAddr) /扇區(qū)擦除 ISP_CONTR = enable_waitTime; /開啟ISP_IAP;

7、并送等待時間 ISP_CMD = erase_cmd; /送扇區(qū)擦除命令字 ISP_ADDRH = (u8)(sectorAddr 8); /送地址高字節(jié) ISP_ADDRL = (u8)(sectorAddr & 0X00FF); /送地址低字節(jié) ISP_IAP_trigger(); /觸發(fā) ISP_IAP_disable(); /關閉ISP_IAP功能 void main() /測試 u8 buf3=0; /接收數(shù)據(jù)緩沖區(qū)u8 dat5=b(),b(1001),b(1),b(1011),b(1110);/我寫成二進制是為觀察led燈 ISP_IAP_sectorErase(0x2000);

8、 /扇區(qū)擦除,一塊512字節(jié) ISP_IAP_writeData(0x21f0,dat,sizeof(dat); /寫EEPROM ISP_IAP_readData(0x21f0,buf,sizeof(buf); /讀取P1=buf2;/在地址0x21f0處第1次寫,第2次寫,讀出結果是這2個值的相與10010 while(1); /所以如果一個地址處的值不是0xff時寫入新的數(shù)據(jù)是不對的,要先擦除為0xff #ifndef _MY51_H#define _MY51_H#include /#include #include #include #include mytype.h/*二進制輸入宏*

9、/#ifndef _LongToBin_#define _LongToBin_#define LongToBin(n) ( (n 21) & 0x80) | (n 18) & 0x40) | (n 15) & 0x20) | (n 12) & 0x10) | (n 9) & 0x08) | (n 6) & 0x04) | (n 3) & 0x02) | (n ) & 0x01) )#define bin(n) LongToBin(0x#n#l)#define BIN(n) bin(n)#define B(n) bin(n)#define b(n) bin(n) #endif/*單個數(shù)據(jù)位的置位宏*/#ifndef _BIT_#define _BIT_ #define BIT(n) (1n)#define bit(n) BIT(n)#endif#define high1 /高電平#define low0 /低電平#define led P1 /燈總線控制sbit led0=P10; /8個led燈,陰極送低電平點亮sbit led1=P11;sbit led2=P12;sbit led3=P13;sbit led4=P14;sbit led5=P15;sbit led6=P1

溫馨提示

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

評論

0/150

提交評論