標題: STC單片機掉電中斷的寫法 [打印本頁]

作者: 188610329    時間: 2021-10-8 21:55
標題: STC單片機掉電中斷的寫法
發(fā)現(xiàn)有不少人還不會用STC的掉電中斷,這里就拋磚引玉一下。很多STC的單片機,都內(nèi)帶ELVD 掉電中斷,只要利用好這個中斷,不需要增加額外的硬件,就能在掉電的瞬間把需要保存的設置存儲到單片機自帶的偽Eeprom 中,中斷部分代碼如下,根據(jù)每個人實際情況修改。

  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);        //定義重要參數(shù)儲存地址 Saving_ADDR 的低4位保存Eeprom 的高位地址
  15.         IAP_ADDRL        = (Saving_ADDR & 0xf0);        //定義重要參數(shù)儲存地址 Saving_ADDR 的高4位保存Eeprom 的低位地址
  16.         for(i=0; i<16; i++)                //保存系統(tǒng)重要參數(shù)到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;                //發(fā)現(xiàn)是誤報,重啟單片機,恢復正常工作
  30. }
復制代碼

關于這個中斷,由于Eeprom 地址是在開機的時候,就準備好的,所以,中斷中不用再次準備,這也是為什么發(fā)現(xiàn)是誤報的時候,選擇重啟恢復工作的原因之一,不然還要再計算一次地址,設置一次端口模式;旧,掉電中斷只需要做這些事,值得一提的是,掉電標志位,開機后默認是1,所以在開掉電中斷ELVD = 1; 之前,要先清掉電標志位,PCON &= 0xDF;  同時,如果要像我一樣,掉電中斷中用極簡寫法,那么,一定要Eeprom地址全都計算完畢之后,才開掉電中斷。

以上,希望可以幫到大家。
作者: 創(chuàng)造生活    時間: 2021-10-8 23:40
有用 多謝您賜教,多謝多謝
作者: 君工創(chuàng)    時間: 2022-6-5 22:37
我之前試過不成功可能是沒有及時關閉所有輸出。找時間試試這個。
作者: herui2128    時間: 2022-6-16 14:47
STC90C514AD有這個功能嗎
作者: tt2016    時間: 2024-1-10 21:15
代碼寫的非常好,清晰明了
作者: 寧遠133    時間: 2024-4-3 23:14
想問一下大佬,為啥我按照你的代碼寫了,但還是觸發(fā)不到低壓中斷呢?我已經(jīng)初始化EA=1;
     ELVD=1;了
作者: 寧遠133    時間: 2024-4-3 23:14
低壓檢測電壓有要求嗎,還是要加一個大電容來增加斷電時間
作者: zhxzhx    時間: 2024-4-5 10:36
STC 掉電中斷,最關鍵的一點是,要事先擦除flash,中斷里只寫入很短的數(shù)據(jù),寫完以后可以點一個功率比較大的設備,把電快速消耗光,調(diào)試的時候可以不寫入,只點燈,看燈亮的時間
作者: 2089223272    時間: 2024-4-20 23:38
zhxzhx 發(fā)表于 2024-4-5 10:36
STC 掉電中斷,最關鍵的一點是,要事先擦除flash,中斷里只寫入很短的數(shù)據(jù),寫完以后可以點一個功率比較大的設 ...

你說的對,我一般是上電讀完數(shù)據(jù)就立即擦除EEPROM數(shù)據(jù),等斷電中斷的時候只需要寫入數(shù)據(jù)就行了,不會在擦除EEPROM扇區(qū)上浪費時間
作者: 2089223272    時間: 2024-4-20 23:40
寧遠133 發(fā)表于 2024-4-3 23:14
低壓檢測電壓有要求嗎,還是要加一個大電容來增加斷電時間

事先擦除EEPROM扇區(qū),低壓中斷里只包含清標志位和寫入數(shù)據(jù)的語句
作者: waj163    時間: 2024-5-31 21:37
多謝!學習了!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1