单片机在掉电瞬间将数据存入EEPROM的方法

单片机在掉电瞬间将数据存入EEPROM的方法


  • 文章内容来自于:https://tech.hqew.com/news_1123789

在单片机的应用中,一些需要高速处理且掉电后需要保存的数据多放在单片机片内RAM中,采用备用电池保存RAM中的数据。备用电池使用期限有限,存储的数据易受干扰,可靠性低。将数据存在E2PROM中可靠性较高。如果数据量较小(10个字节以内),则可采用在掉电瞬间靠电容储能将需要保存的数据存入E2PROM的方法。在单片机系统中,常用X25045来存储数据。

  • 在单片机的应用中,一些需要高速处理且掉电后需要保存的数据多放在单片机片内RAM中,采用备用电池保存RAM中的数据。备用电池使用期限有限,存储的数据易受干扰,可靠性低。将数据存在E2PROM中可靠性较高。如果数据量较小(10个字节以内),则可采用在掉电瞬间靠电容储能将需要保存的数据存入E2PROM的方法。
      在单片机系统中,常用X25045来存储数据。89C2051和X25045的耗电量都比较低,当稳压电源的滤波电容在3000μF 以上时,一检测到掉电立即关掉耗电量较大的输出,则电容的储能可以保证单片机在系统掉电后继续工作40ms以上。X25045的存储时间为2ms/字节,50Hz交流电压掉电可在20ms内检测到,因此可以将10个字节的数据存入X25045。这样,在单片机的正常运行期间数据存储在内部RAM中,存取速度快,掉电后数据存入E2PROM中,数据保存的可靠性高,系统电路简单、成本低。

1. 硬件电路及原理

由于电容的储能只能保证单片机在掉电后40ms内正常工作,掉电检测电路必须在尽可能短的时间内准确地检测到掉电。将50Hz的交流电压转换为50Hz占空比约为50%的脉冲信号,单片机检测50Hz脉冲,如果脉冲停止则判断为掉电,立即转入掉电处理程序。
  硬件电路如图1所示。220V 交流电经过变压器TI,输出9V交流电,通过1kΩ电阻R2接到光耦D1的输入端。当交流电正半周A、B两点间的电压大于光耦的导通电压时,光耦导通,经过74LS14整形反相后输出一个高电平到单片机;当A、B两点间的电压小于光耦的导通电压时,74LS14输出一个低电平到单片机,输入到单片机的是一个占空比略小于50%的脉冲信号,高电平的脉冲宽度在5~10ms之间。将扫描周期定为5ms,可以保证用最短的时间准确地检测到掉电(如图2所示)。单片机每隔5ms读入一次I/O口的状态,如果连续四次都为低电平,则判为掉电,转入掉电处理子程序。

2. 软件设计

程序中设定 定时器每隔5ms产生一次定时中断,在定时中断程序中读取输入脉冲的状态,对读到输入为低电平的次数进行计数,如果连续四次为低电平,置掉电标志为1。在主循环中查询掉电标志,如果有掉电标志则进入掉电处理子程序。在掉电处理子程序中,首先关掉显示等耗电较大的设备,然后调用E2PROM 存储子程序,把要存储的数据存入E2PROM中,最后让程序进入死循环,防止程序因对E2PROM反复存储而引起错误。当供电恢复后,上电复位电路可以让程序从头开始运行。如果供电在短时间(100ms)内恢复,则上电复位电路失去作用,看门狗电路会使单片机复位,程序从头开始运行。
根据上述方法,读者可以很容易地编制出掉电检测和数据存储程序。

3. 总结

本方法适用于10个字节以内的数据的掉电保存,特别是需要高速计数,计数值需要频繁更新,并且停电后不需要计数的场合。与用备用电池保存数据的方式相比,这种方法不需要电池,而且数据保存在E2PROM中不易受外界干扰,数据保存的可靠性高,系统简单、可靠性高。与常用的在E2PROM中存取数据的方法相比,数据存储的速度快,可以对频率较高的脉冲计数,不受E2PROM存储寿命的限制。掉电检测准确率高,数据存储的可靠性与E2PROM相当。
  笔者用此方法设计的施工用卷扬机转数计数器在现场使用已经一年以上,没有出现过数据丢失的现象。
  - 电路原理图
在这里插入图片描述

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
51单片机断电保存数据一般有两种方法: 1. 使用EEPROM存储数据 EEPROM是一种非易失性存储器,它可以在51单片机断电时保存数据。在51单片机中,使用EEPROM保存数据可以通过IAP(In-Application Programming)方式实现。具体代码如下: ``` #include <reg51.h> // 定义EEPROM数据存储地址 #define EEPROM_ADDR 0x1000 // 写EEPROM数据函数 void WriteEEPROM(unsigned int addr, unsigned char dat) { // 关闭中断 EA = 0; // 写使能 IAP_CONTR = 0x82; // 设置地址和数据 IAP_ADDRH = (unsigned char)(addr >> 8); IAP_ADDRL = (unsigned char)addr; IAP_DATA = dat; // 执行写操作 IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; // 开启中断 EA = 1; } // 读EEPROM数据函数 unsigned char ReadEEPROM(unsigned int addr) { // 关闭中断 EA = 0; // 读使能 IAP_CONTR = 0x81; // 设置地址 IAP_ADDRH = (unsigned char)(addr >> 8); IAP_ADDRL = (unsigned char)addr; // 执行读操作 IAP_TRIG = 0x5A; IAP_TRIG = 0xA5; // 开启中断 EA = 1; // 返回读取的数据 return IAP_DATA; } void main() { unsigned char data = 0x55; // 写数据EEPROM WriteEEPROM(EEPROM_ADDR, data); // 从EEPROM读取数据 data = ReadEEPROM(EEPROM_ADDR); // 延时等待EEPROM写入完成 delay(10); // 重启单片机 EA = 0; SWRST = 1; } ``` 2. 使用外部SRAM存储数据 外部SRAM是一种非易失性存储器,它可以在51单片机断电时保存数据。在51单片机中,使用外部SRAM保存数据需要先初始化SRAM的地址和数据线,然后才能进行读写操作。具体代码如下: ``` #include <reg51.h> // 定义SRAM地址 #define SRAM_ADDR 0x8000 // 初始化SRAM函数 void InitSRAM() { // 关闭中断 EA = 0; // 设置SRAM地址和数据线 AUXR |= 0x0C; // 开启中断 EA = 1; } // 写SRAM数据函数 void WriteSRAM(unsigned int addr, unsigned char dat) { // 关闭中断 EA = 0; // 设置SRAM地址和数据 ES = 0; *(unsigned char __xdata *)(addr + SRAM_ADDR) = dat; ES = 1; // 开启中断 EA = 1; } // 读SRAM数据函数 unsigned char ReadSRAM(unsigned int addr) { unsigned char dat = 0; // 关闭中断 EA = 0; // 读取SRAM数据 ES = 0; dat = *(unsigned char __xdata *)(addr + SRAM_ADDR); ES = 1; // 开启中断 EA = 1; // 返回读取的数据 return dat; } void main() { unsigned char data = 0x55; // 初始化SRAM InitSRAM(); // 写数据到SRAM WriteSRAM(0, data); // 从SRAM读取数据 data = ReadSRAM(0); // 延时等待SRAM写入完成 delay(10); // 重启单片机 EA = 0; SWRST = 1; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值