STC89C52单片机内部EEPROM程序
2020-07-18 来源:51hei
实验外部存储期间不方便 看了内部有2K的数据
代码如下 .C文件可直接移植
#include #include #define Read 0x01 //读指令 #define Write 0x02 //写指令 #define Erase 0x03 //擦除指令 #define ENABLE_IAP 0x81 //速度20Mhz //操作完成一次之后 进入待机模式 等待下一次命令 无ISP操作 void ISP_IAP_disable(void) { ISP_CONTR = 0x00; ISP_CMD = 0x00; ISP_TRIG = 0x00; } //读一个字节 addr是读的地址 unsigned char ReadEeProm(unsigned int addr) { unsigned char dat; ISP_CONTR = ENABLE_IAP; ISP_CMD = Read; ISP_ADDRH = (unsigned char)(addr>>8); ISP_ADDRL = (unsigned char)addr; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); ISP_IAP_disable(); dat = ISP_DATA; return dat; } //擦除一个扇区的内容 addr擦除扇区的地址 void EraseEeProm(unsigned int addr) { ISP_CONTR = ENABLE_IAP; ISP_CMD = Erase; ISP_ADDRH = (unsigned char)(addr>>8); ISP_ADDRL = (unsigned char)addr; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); ISP_IAP_disable(); } //写一个字节的内容 addr地址 dat待写入数据 void WriteEeProm(unsigned int addr,unsigned char dat) { //EraseEeProm(addr); //一个字节需要先擦除这个扇区 ISP_CONTR = ENABLE_IAP; ISP_CMD = Write; ISP_ADDRH = (unsigned char)(addr>>8); ISP_ADDRL = (unsigned char)addr; ISP_DATA = dat; ISP_TRIG = 0x46; ISP_TRIG = 0xB9; _nop_(); ISP_IAP_disable(); } //连续读多个字节 *str存储读到数据缓冲区 addr从哪个地址开始读 len读多少个字节 void Reading(unsigned char *str,unsigned int addr,unsigned char len) { while(len--) { *str++ = ReadEeProm(addr++); } } void ValToString(unsigned char *str,unsigned int dat) { unsigned char len = 0; //计算当前转换到多少 unsigned char buf[5]; do{ buf[len] = dat%10 + '0'; dat /=10; len++; }while(dat>0); while(len--) { *str++ = buf[len]; } *str = '