找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4372|回复: 9
打印 上一主题 下一主题
收起左侧

STC单片机掉电中断的写法

  [复制链接]
跳转到指定楼层
楼主
ID:624769 发表于 2021-10-8 21:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现有不少人还不会用STC的掉电中断,这里就抛砖引玉一下。很多STC的单片机,都内带ELVD 掉电中断,只要利用好这个中断,不需要增加额外的硬件,就能在掉电的瞬间把需要保存的设置存储到单片机自带的伪Eeprom 中,中断部分代码如下,根据每个人实际情况修改。

  1. void        PowerLost()        interrupt 6
  2. {
  3.         unsigned char i;
  4.         EA        = 0;                //关闭所有中断
  5. //        P0Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  6.         P1Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  7. //        P2Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  8.         P3Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  9. //        P4Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  10.         P5Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  11. //        P6Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗
  12. //        P7Mode        = HHHH_HHHH;        //切换到高阻模式,关闭所有IO的输出,降低功耗

  13.         IAP_CMD                = 0x02;                   //Eeprom 操作模式切换到 写
  14.         IAP_ADDRH        = (Saving_ADDR & 0x0f);        //定义重要参数储存地址 Saving_ADDR 的低4位保存Eeprom 的高位地址
  15.         IAP_ADDRL        = (Saving_ADDR & 0xf0);        //定义重要参数储存地址 Saving_ADDR 的高4位保存Eeprom 的低位地址
  16.         for(i=0; i<16; i++)                //保存系统重要参数到Eeprom
  17.         {
  18.                 IAP_DATA        = System_Setting[i];
  19.                 IAP_TRIG        = 0x5A;
  20.                 IAP_TRIG        = 0xA5;
  21.                 IAP_ADDRL++;
  22.         }
  23.         while((PCON & 0x20) != 0)        //复查掉电标志
  24.         {
  25.                 PCON &= 0xDF;                //清除掉电标志
  26.                 _nop_();               
  27.                 _nop_();                //坐等掉电
  28.         }
  29.         IAP_CONTR        = 0x20;                //发现是误报,重启单片机,恢复正常工作
  30. }
复制代码

关于这个中断,由于Eeprom 地址是在开机的时候,就准备好的,所以,中断中不用再次准备,这也是为什么发现是误报的时候,选择重启恢复工作的原因之一,不然还要再计算一次地址,设置一次端口模式。基本上,掉电中断只需要做这些事,值得一提的是,掉电标志位,开机后默认是1,所以在开掉电中断ELVD = 1; 之前,要先清掉电标志位,PCON &= 0xDF;  同时,如果要像我一样,掉电中断中用极简写法,那么,一定要Eeprom地址全都计算完毕之后,才开掉电中断。

以上,希望可以帮到大家。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏20 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:881715 发表于 2021-10-8 23:40 来自手机 | 只看该作者
有用 多谢您赐教,多谢多谢
回复

使用道具 举报

板凳
ID:965189 发表于 2022-6-5 22:37 | 只看该作者
我之前试过不成功可能是没有及时关闭所有输出。找时间试试这个。
回复

使用道具 举报

地板
ID:398219 发表于 2022-6-16 14:47 | 只看该作者
STC90C514AD有这个功能吗
回复

使用道具 举报

5#
ID:1108581 发表于 2024-1-10 21:15 | 只看该作者
代码写的非常好,清晰明了
回复

使用道具 举报

6#
ID:1115340 发表于 2024-4-3 23:14 | 只看该作者
想问一下大佬,为啥我按照你的代码写了,但还是触发不到低压中断呢?我已经初始化EA=1;
     ELVD=1;了
回复

使用道具 举报

7#
ID:1115340 发表于 2024-4-3 23:14 | 只看该作者
低压检测电压有要求吗,还是要加一个大电容来增加断电时间
回复

使用道具 举报

8#
ID:378108 发表于 2024-4-5 10:36 | 只看该作者
STC 掉电中断,最关键的一点是,要事先擦除flash,中断里只写入很短的数据,写完以后可以点一个功率比较大的设备,把电快速消耗光,调试的时候可以不写入,只点灯,看灯亮的时间
回复

使用道具 举报

9#
ID:1117545 发表于 2024-4-20 23:38 来自手机 | 只看该作者
zhxzhx 发表于 2024-4-5 10:36
STC 掉电中断,最关键的一点是,要事先擦除flash,中断里只写入很短的数据,写完以后可以点一个功率比较大的设 ...

你说的对,我一般是上电读完数据就立即擦除EEPROM数据,等断电中断的时候只需要写入数据就行了,不会在擦除EEPROM扇区上浪费时间
回复

使用道具 举报

10#
ID:1117545 发表于 2024-4-20 23:40 来自手机 | 只看该作者
宁远133 发表于 2024-4-3 23:14
低压检测电压有要求吗,还是要加一个大电容来增加断电时间

事先擦除EEPROM扇区,低压中断里只包含清标志位和写入数据的语句
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表