永发信息网

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

答案:2  悬赏:20  手机版
解决时间 2021-03-29 08:14
请教51单片机内部EEPROM的应用
最佳答案
如果说的是STC的内部EEPROM的话,可以参考其数据手册来使用。
全部回答

不知道你用的是那种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功能
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
商标一个反R+B太阳镜是什么品牌
道德与法治英雄救美惹麻烦的李峰
DNF 如何区分各种民问题,贫民、难民、平民、
一个圆柱形水池,从里面量底面直径是4米 池深1
正视图和俯视图均为半圆,俯视图为正方形。这
正方形的内角和是多少
请问常平新世纪的老板是谁
人人都能续家谱吗
这是什么篆体
单选题植物细胞和动物细胞有丝分裂的共同点是
水波为什么不是横波?
毛笔字古诗28字怎样与
格哈德·里希特的创作特点
三星 SM961 某宝买会买到假货吗
2017年下半年英语pets3考试在济南考的口试过
推荐资讯
安徽有哪些名菜
日完逼为什么好累呀
Excel 如何去除异常数值再计算
40多天hcg 值一万多是男孩还是女孩 宝宝知道
新鲜鸡纵怎样保鲜
小王大学毕业后,根据自己学习的专业知识,开
打工好还是养牛好
办公五笔怎么打
小区内撞车,不懂理赔流程,求助论
请问带窗户的防盗门好用吗?
东2017东台真的成为地级市了吗
AI 工具栏中点击矩形工具,为什么不会弹出其他
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?