永发信息网

请教51单片机内部EEPROM的应用

答案:2  悬赏:20  手机版
解决时间 2021-03-29 08:14
  • 提问者网友:活着好累
  • 2021-03-28 14:43
请教51单片机内部EEPROM的应用
最佳答案
  • 五星知识达人网友:英雄的欲望
  • 2021-03-28 15:49
如果说的是STC的内部EEPROM的话,可以参考其数据手册来使用。
全部回答
  • 1楼网友:慢性怪人
  • 2021-03-28 16:37

不知道你用的是那种51单片机,我就当是STC89C51系列的了。
这问题涉及方面还挺多,这样一一回答还真不好弄,我给你几个方向看看能不能帮到你。
参考手册(附件我以上传)第9章。
官方已给了例程,你可以参考一下,最下面我给你,我已复制在下面。
注意扇区问题(分区,地址,擦除时间等)
存储前要先擦除扇区
下面示例一下基本使用

num = byte_read(0x2000); //读取EEPROM中地址0x2000数据,赋值给num
SectorErase(0x2000);       //擦除第1扇区
byte_write(0x2000, num);   //将num数据写入EPROM地址0x2000中



# include 
# include 
# define RdCommand    0x01     //定义ISP的操作命令
# define PrgCommand   0x02
# define EraseCommand 0x03
# define WaitTime     0x01      //定义CPU的等待时间 @11.0592MHz
# define Error 1
# define Ok 0
sfr ISP_DATA  = 0xE2;  //寄存器申明
sfr ISP_ADDRH = 0xE3;
sfr ISP_ADDRL = 0xE4;
sfr ISP_CMD   = 0xE5;
sfr ISP_TRIG  = 0xE6;
sfr ISP_CONTR = 0xE7;
void ISP_IAP_enable(void)  // 打开 ISP,IAP 功能
{
EA = 0; // 关中断 
ISP_CONTR   =  ISP_CONTR & 0x18;       // 0001,1000
ISP_CONTR   = ISP_CONTR | WaitTime; // 写入硬件延时
ISP_CONTR   = ISP_CONTR | 0x80;       // ISPEN=1
}
void ISP_IAP_disable(void)  // 关闭 ISP,IAP 功能
{
ISP_CONTR = ISP_CONTR & 0x7F; // ISPEN = 0
ISP_TRIG = 0x00;
EA =   1;    // 开中断
}
void ISPgoon(void) // 公用的触发代码
{
ISP_IAP_enable(); // 打开 ISP,IAP 功能
ISP_TRIG = 0x46;// 触发ISP_IAP命令字节1
ISP_TRIG = 0xB9;// 触发ISP_IAP命令字节2
_nop_();  // 延时一个机器周期
}
unsigned char byte_read(unsigned int byte_addr) // 读字节
{
ISP_ADDRH   =   (unsigned char)(byte_addr >> 8);       // 地址赋值
ISP_ADDRL   =   (unsigned char)(byte_addr & 0x00FF);
ISP_CMD     =   ISP_CMD & 0xF8;   // 清除低3位
ISP_CMD     =   ISP_CMD | RdCommand;      // 写入读命令
ISPgoon();                    // 触发执行
ISP_IAP_disable();                    // 关闭ISP,IAP功能
return (ISP_DATA);                         // 返回读到的数据
}
void SectorErase(unsigned int sector_addr)  //扇区擦除
{
// unsigned int iSectorAddr;
// iSectorAddr  =  (sector_addr & 0xFE00);              // 取扇区地址 
// ISP_ADDRH    =  (unsigned char)(iSectorAddr >> 8);
// ISP_ADDRL    =  0x00;
ISP_ADDRH    =  (unsigned char)(sector_addr >> 8);  // 取扇区地址高8位 
ISP_ADDRL    =  (unsigned char)sector_addr;  // 取扇区地址低8位
ISP_CMD      =  ISP_CMD & 0xF8; // 清空低3位 
ISP_CMD      =  ISP_CMD | EraseCommand; // 擦除命令3 
ISPgoon();    // 触发执行
ISP_IAP_disable();  // 关闭ISP,IAP功能
}
void byte_write(unsigned int byte_addr, unsigned char original_data) // 写字节
{
ISP_ADDRH   = (unsigned char)(byte_addr >> 8);      // 取地址
ISP_ADDRL   = (unsigned char)(byte_addr & 0x00FF);
ISP_CMD     =   ISP_CMD & 0xF8;            // 清低3位
ISP_CMD     =   ISP_CMD | PrgCommand;           // 写命令2
ISP_DATA    =   original_data; // 写入数据准备
ISPgoon();// 触发执行
ISP_IAP_disable();// 关闭IAP功能
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯