如何用STC89C52RC内部的EEPROM实现记忆功能

2025-09-28 00:42:01

1、首先是编写程序,EEPROM的操作顺序如下:

  1.擦除EEPROM

  2.写EEPROM

  3.读EEPROM

打开keil开发环境(我用是keil4)建一个工程,编写程序用按键输入控制LED等的亮灭情况键k1是led1亮,k2是led1和led2亮。

2、 以下是我在知道上看到的一个程序,几乎都是照着他这个这么来的。

  链接: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 = addr>>8;      // 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 = addr>>8;      

    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 = addr>>8;      

    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有关的特殊功能寄存器 

}

如何用STC89C52RC内部的EEPROM实现记忆功能

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

如何用STC89C52RC内部的EEPROM实现记忆功能

如何用STC89C52RC内部的EEPROM实现记忆功能

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢