文档收藏网

首页 » 正文内容 » 51单片机EEPROM的读写

51单片机EEPROM的读写

时间:2023-03-20 03:57:24  热度:0°C
STC 单片机的内部 EEPROM 是用 DATAFLASH 模拟出来的 不是真正的 EEPROM 存储 器 不能用普通的方法来操作 下面是一些注意点 1 字节写之前要先将这个字节所在扇区的其它有效数据读取到 RAM 暂存 这步不是必须的 2 暂存完之后再对整个扇区 512 字节 进行擦除操作 擦拭完后 整个扇区每个地址中数据 都变成 0 xFF 3 将欲写入的 N 个字节数据 用字节写函数写入 EEPROM 4 将暂存到 RAM 的其它有用的 EEPROM 值再用字节写函数写回 EEPROM 5 STC 用 FLASH 模拟出来的 EEPROM 的字节写功能只能将 1 变成 0 而不能将 0 变成 1 只有扇区擦除后数据才是全 1 例如 在地址 0 x21f0 处第 1 次写 11010110 第 2 次写 111010 读出结果是这 2 个值的相 与 10010 所以如果一个地址处的值不是 0 xff 时写入新的数据是不对的 要先执行扇区擦除 变为 0 xff 对于单个字节的写入 我们可以先检查该地址处的数据是否为 0 xff 是的话就不用擦除 扇区了 STC89C52 单片机内部 EEPROM 的读写过程 1 配置 ISP CONTR 寄存器 使能第 7 位 ISPEN 让 ISP IAP 功能生效 并配置低 3 位的等 待时间 2 写指令 读 写 擦除扇区 这 3 个命令 3 赋值 ISP ADDRH 和 ISP ADDRL 的地址值 4 关闭总中断 EA 因为下面要写的 2 个触发指令必须是连续操作的 不能被中断 5 执行公用的 ISP IAP 触发指令 触发后读写操作才能进行 6 打开中断 EA 关闭 ISP IAP 功能 清相关寄存器 include my51 h 定义命令字节 define read cmd 0 x01 字节读数据命令 define wirte cmd 0 x02 字节编程数据命令 define erase cmd 0 x03 扇区擦除数据命令 特殊功能寄存器声明 sfr ISP DATA 0 xe2 sfr ISP ADDRH 0 xe3 sfr ISP ADDRL 0 xe4 sfr ISP CMD 0 xe5 sfr ISP TRIG 0 xe6 sfr ISP CONTR 0 xe7 定义 Flash 操作等待时间及允许 IAP ISP EEPROM 操作的常数 define enable waitTime 0 x80 系统工作时钟 30MHz 时 对 IAP CONTR 寄存器设置此 值 define enable waitTime 0 x81 系统工作时钟 24MHz 时 对 IAP CONTR 寄存器设置此 值 define enable waitTime 0 x82 系统工作时钟 20MHz 时 对 IAP CONTR 寄存器设置此 值 define enable waitTime 0 x83 系统工作时钟 12MHz 时 对 IAP CONTR 寄存器设置此值 define enable waitTime 0 x84 系统工作时钟 8 送地址高字节 ISP ADDRL u8 beginAddr 送地址低字节 ISP IAP trigger 触发 beginAddr 地址 pBuf ISP DATA 将数据保存到接收缓冲区 ISP IAP disable 关闭 ISP IAP 功能 void ISP IAP writeData u16 beginAddr u8 pDat u16 dataSize 写数据 ISP CONTR enable waitTime 开启 ISP IAP 并送等待时间 ISP CMD wirte cmd 送字节编程命令字 while dataSize ISP ADDRH u8 beginAddr 8 送地址高字节 ISP ADDRL u8 beginAddr 送地址低字节 ISP DATA pDat 送数据 beginAddr ISP IAP trigger 触发 ISP IAP disable 关闭 void ISP IAP sectorErase u16 sectorAddr 扇区擦除 ISP CONTR enable waitTime 开启 ISP IAP 并送等待时间 ISP CMD erase cmd 送扇区擦除命令字 ISP ADDRH u8 sectorAddr 8 送地址高字节 ISP ADDRL u8 sectorAddr 送地址低字节 ISP IAP trigger 触发 ISP IAP disable 关闭 ISP IAP 功能 void main 测试 u8 buf 3 0 接收数据缓冲区 u8 dat 5 b 111010 b 1001 b 1 b 1011 b 1110 我写成二进制是为观察 led 灯 ISP IAP sectorErase 0 x2000 扇区擦除 一块 512 字节 ISP IAP writeData 0 x21f0 dat sizeof dat 写 EEPROM ISP IAP readData 0 x21f0 buf sizeof buf 读取 P1 buf 2 在地址 0 x21f0 处第 1 次写 11010110 第 2 次写 111010 读出结果是这 2 个值 的相与 10010 while 1 所以如果一个地址处的值不是 0 xff 时写入新的数据是不对的 要先擦除为 0 xff ifndef MY51 H define MY51 H include include include include include mytype h 二进制输入宏 ifndef LongToBin define LongToBin define LongToBin n n 21 8 个 led 灯 ***极送低电平点亮 sbit led1 P1 1 sbit led2 P1 2 sbit led3 P1 3 sbit led4 P1 4 sbit led5 P1 5 sbit led6 P1 6 sbit led7 P1 7
温馨提示:
1. 文档收藏网仅展示《51单片机EEPROM的读写》的部分公开内容,版权归原著者或相关公司所有。
2. 文档内容来源于互联网免费公开的渠道,若文档所含内容侵犯了您的版权或隐私,请通知我们立即删除。
3. 当前页面地址:https://doc.bogoing.com/doc/4f90fe702431c0c4.html 复制内容请保留相关链接。