51单片机内部EEPROM读写
#include <reg52.h> #include <intrins.h> //定义类型,方便代码移植 typedef unsigned char UINT8; typedef unsigned int UINT16; typedef unsigned long UINT32; typedef char INT8; typedef int INT16; typedef long INT32; static UINT8 i=0; /* 定义寄存器 ISP */ sfr ISP_DATA= 0xe2; // Flash数据寄存器 sfr ISP_ADDRH= 0xe3;// Flash高字节地址寄存器 sfr ISP_ADDRL= 0xe4;// Flash低字节地址寄存器 sfr ISP_CMD= 0xe5;// Flash命令模式寄存器 sfr ISP_TRIG= 0xe6;// Flash命令触发寄存器 sfr ISP_CONTR= 0xe7;// ISP/IAP 控制寄存器 #define NOP() _nop_() #define EEPROM_START_ADDRESS 0X2000 #define LED_PORT P2 //微秒级延时 void DelayNus(UINT16 t) { UINT16 d=0; d=t; do { NOP(); }while(--d > 0); } //毫秒级延时 void DelayNms(UINT16 t) { do { DelayNus(1000); }while(--t > 0); } //EEPROM使能 void EEPROMEnable(void) { ISP_CONTR=0x81;//使能并设置好等待时间 } //EEPROM禁用 void EEPROMDisable(void) { ISP_CONTR=0x00;//禁止EEPROM ISP_CMD = 0X00;//无ISP操作 ISP_TRIG = 0X00;//清零 ISP_ADDRH = 0X00;//清零 ISP_ADDRL = 0X00;//清零 } //eeprom 设置读写地址(相对地址) void EEPROMSetAddress(UINT16 addr) { addr+=EEPROM_START_ADDRESS;//初始化地址 ISP_ADDRH=(UINT8)(addr>>8);//设置读写地址高字节 ISP_ADDRL=(UINT8) addr; //设置读写地址低字节 } //EEPROM启动 void EEPROMStart(void) { ISP_TRIG=0x46; ISP_TRIG=0xB9; } //EEPROM读取单个字节 UINT8 EEPROMReadByte(UINT16 addr) { ISP_DATA=0X00; ISP_CMD=0X01; EEPROMEnable(); EEPROMSetAddress(addr); EEPROMStart(); DelayNus(10);//读取一个字节需要10us EEPROMDisable(); return (ISP_DATA); } //EEPROM写入单个字节 UINT8 EEPROMWriteByte(UINT16 addr,UINT8 byte) { EEPROMEnable(); ISP_CMD=0X02; EEPROMSetAddress(addr); ISP_DATA=byte; EEPROMStart(); DelayNus(60); EEPROMDisable(); } //EEPROM扇区擦除 UINT8 EEPROMSectorErase(UINT16 addr) { ISP_CMD=0X03; EEPROMEnable(); EEPROMSetAddress(addr); EEPROMStart(); DelayNus(10);// EEPROMDisable(); } void main(void) { EEPROMSectorErase(0); EEPROMWriteByte(0,0x0f); i=EEPROMReadByte(0); LED_PORT = i; while(1); }
现象: