标题: STC单片机掉电中断的写法 [打印本页]

作者: 188610329    时间: 2021-10-8 21:55
标题: STC单片机掉电中断的写法
发现有不少人还不会用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地址全都计算完毕之后,才开掉电中断。

以上,希望可以帮到大家。
作者: 创造生活    时间: 2021-10-8 23:40
有用 多谢您赐教,多谢多谢
作者: 君工创    时间: 2022-6-5 22:37
我之前试过不成功可能是没有及时关闭所有输出。找时间试试这个。
作者: herui2128    时间: 2022-6-16 14:47
STC90C514AD有这个功能吗
作者: tt2016    时间: 2024-1-10 21:15
代码写的非常好,清晰明了
作者: 宁远133    时间: 2024-4-3 23:14
想问一下大佬,为啥我按照你的代码写了,但还是触发不到低压中断呢?我已经初始化EA=1;
     ELVD=1;了
作者: 宁远133    时间: 2024-4-3 23:14
低压检测电压有要求吗,还是要加一个大电容来增加断电时间
作者: zhxzhx    时间: 2024-4-5 10:36
STC 掉电中断,最关键的一点是,要事先擦除flash,中断里只写入很短的数据,写完以后可以点一个功率比较大的设备,把电快速消耗光,调试的时候可以不写入,只点灯,看灯亮的时间
作者: 2089223272    时间: 2024-4-20 23:38
zhxzhx 发表于 2024-4-5 10:36
STC 掉电中断,最关键的一点是,要事先擦除flash,中断里只写入很短的数据,写完以后可以点一个功率比较大的设 ...

你说的对,我一般是上电读完数据就立即擦除EEPROM数据,等断电中断的时候只需要写入数据就行了,不会在擦除EEPROM扇区上浪费时间
作者: 2089223272    时间: 2024-4-20 23:40
宁远133 发表于 2024-4-3 23:14
低压检测电压有要求吗,还是要加一个大电容来增加断电时间

事先擦除EEPROM扇区,低压中断里只包含清标志位和写入数据的语句
作者: waj163    时间: 2024-5-31 21:37
多谢!学习了!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1