如何用STC89C52RC内部的EEPROM实现记忆功能
来源:网络收集 点击: 时间:2024-05-29首先是编写程序,EEPROM的操作顺序如下:
1.擦除EEPROM
2.写EEPROM
3.读EEPROM
打开keil开发环境(我用是keil4)建一个工程,编写程序用按键输入控制LED等的亮灭情况键k1是led1亮,k2是led1和led2亮。
2/3以下是我在知道上看到的一个程序,几乎都是照着他这个这么来的。
链接:https://zhidao.baidu.com/question/300757952.html
源码:若找不到头文件,可以在网上搜,下载。
#include STC89C52RC.H
#include intrins.h
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit K1 = P3^2; //按钮1
sbit K2 = P3^3; //按钮2
void cc(uint addr);
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
uchar V;
V = dcx(0x2002); // 开机读取EEPROM区2002h数据,还原关电前LED的亮灭状况
if(V == 2) {LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
xcx(0x2002,2); // 对EEPROM区2002h写入2
}
if(!K2)
{
while(!K2);
LED1=0;LED2=0;
cc(0x2000); // 擦除第1个扇区(2000h~21FFh)
xcx(0x2002,6); // 对EEPROM区2002h写入6
}
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:擦除某一扇区(每个扇区512字节)
入口:addr = 某一扇区首地址
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(uint addr)
{
// 0x83(晶振5M) 0x82(晶振10M) 0x81(晶振20M) 0x80(晶振40M)
ISP_CONTR = 0x81; // 打开 IAP 功能(ISPEN(ISP_CONTR.7)=1:允许编程改变Flash, 设置 Flash 操作等待时间。
ISP_CMD = 0x03; // 用户可以对Data Flash/EEPROM区进行扇区擦除
ISP_ADDRL = addr; // ISP/IAP操作时的地址寄存器低八位,
ISP_ADDRH = addr8; // ISP/IAP操作时的地址寄存器高八位。
EA =0;
ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1时,对ISP_TRIG先写入46h,
ISP_TRIG = 0xB9; // 再写入B9h,ISP/IAP命令才会生效。
_nop_();
Q0(); // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:写一字节
入口:addr = 扇区单元地址 , dat = 待写入数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(uint addr,uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; // 用户可以对Data Flash/EEPROM区进行字节编程
ISP_ADDRL = addr;
ISP_ADDRH = addr8;
ISP_DATA = dat; // 数据进ISP_DATA
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
Q0(); // 关闭ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:读一字节
入口:addr = 扇区单元地址
出口:dat = 读出的数据
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar dcx(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用户可以对Data Flash/EEPROM区进行字节读
ISP_ADDRL = addr;
ISP_ADDRH = addr8;
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA; // 取出数据
Q0(); // 关闭ISP/IAP
return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:关闭ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
ISP_CONTR = 0; // 关闭IAP功能
ISP_CMD = 0; // 待机模式,无ISP操作
ISP_TRIG = 0; // 关闭IAP功能, 清与ISP有关的特殊功能寄存器
}

程序编译成功后利用STC-ISP下载编译好的hex 文件,下载好程序后led1和led2都不亮,关闭电源重开,两等不亮;按下k1,led1亮,led2不亮,关闭电源重开led1亮,led2不亮;按下k2,两灯亮,关闭电源重,两灯亮;说明测试成功。所以用此法可以实现记忆功能。


版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.1haoku.cn/art_854728.html