欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2645|回復(fù): 12
收起左側(cè)

關(guān)于STC8掉電喚醒只能執(zhí)行兩次,之后就死機(jī)無法喚醒?

[復(fù)制鏈接]
ID:1047058 發(fā)表于 2022-10-9 14:35 | 顯示全部樓層 |閱讀模式
使用外部中斷1進(jìn)行掉電喚醒操作,代碼如下。但是在實際實驗操作時,大部分情況是長按按鍵進(jìn)入掉電狀態(tài),喚醒兩次后就無法繼續(xù)工作,一直保持在休眠狀態(tài),必須上電復(fù)位才可以。(上電--掉電--喚醒--掉電--喚醒--掉電--再也喚不醒)
但是有時候又可以喚醒到6次左右。
懷疑過是按鍵的問題,但是已經(jīng)更換了電容確保靈敏度足夠,只能從代碼這里入手了。
已善用搜索,相關(guān)問題都查閱過,但是初學(xué)者還是有些迷茫,斗膽請教,希望各位指點!
//=======================單片機(jī)主程序=============================
  1. void main()
  2. {
  3.                 exint1Init() ;

  4.                 while(1)
  5.                 {
  6.                          KeyWorking() ;
  7.                          if( KeyWorking() == 1) //一個長按識別關(guān)機(jī)的標(biāo)志,由此進(jìn)入掉電狀態(tài)
  8.                          {
  9.                                   EA  = 1;
  10.                                   EX1 = 0 ;                                                 //關(guān)閉INT1中斷
  11.                                   IT1 = 1;
  12.                                   PCON |= 0x02;            //MCU進(jìn)入掉電模式
  13.                                   _nop_();            //掉電模式被喚醒后,首先執(zhí)行此語句,然后再進(jìn)入中斷服務(wù)程序
  14.                                   _nop_();
  15.                                   _nop_() ;
  16.                                   _nop_() ;
  17.                                   _nop_() ;
  18.                                   _nop_() ;
  19.                          }        
  20.                 }
  21. }
復(fù)制代碼


  1. //-----------------------------------------
  2. //中斷INT1初始化程序
  3. void exint1Init()
  4. {               
  5.                 EA = 1;
  6.                 IT1 = 1;         //設(shè)置INT1的中斷類型為僅下降沿,下降沿喚醒
  7.                 EX1 = 1;             //使能INT1中斷

  8. }

  9. //-----------------------------------------
  10. //中斷INT1服務(wù)程序
  11. void exint1() interrupt 2     //INT1中斷入口
  12. {
  13.           EX1  = 0;
  14.           P3^2 = !P3^2;             //將測試口取反
  15.           INT1 = 0;                    //保存INT1口的狀態(tài), INT1=0(下降沿); INT1=1(上升沿)
  16.           PCON = 0x00 ;
  17.           EX1 = 1 ;
  18. }
復(fù)制代碼

回復(fù)

使用道具 舉報

ID:879348 發(fā)表于 2022-10-9 17:03 | 顯示全部樓層
為何要在中斷里休眠?沒有這樣寫程序的
回復(fù)

使用道具 舉報

ID:1047058 發(fā)表于 2022-10-9 17:22 | 顯示全部樓層
wufa1986 發(fā)表于 2022-10-9 17:03
為何要在中斷里休眠?沒有這樣寫程序的

那是需要把中斷服務(wù)函數(shù)里的拎出來寫一個休眠函數(shù),然后在主函數(shù)調(diào)用嗎?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-10-9 20:32 | 顯示全部樓層
樓主為什么把代碼寫成這樣,STC8有現(xiàn)成的官方示例。
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-10-9 22:36 | 顯示全部樓層
//中斷INT1初始化程序
void exint1Init()
{               
                EA = 1;
                IT1 = 1;         //設(shè)置INT1的中斷類型為僅下降沿,下降沿喚醒
                EX1 = 1;             //使能INT1中斷

}

void main()
{
                exint1Init() ;

                while(1)
                {
                         KeyWorking() ;
                         if( KeyWorking() == 1) //一個長按識別關(guān)機(jī)的標(biāo)志,由此進(jìn)入掉電狀態(tài)
                         {
                                  EA  = 1;
//                                  EX1 = 0 ;                                                 //關(guān)閉INT1中斷
                                  IT1 = 1;
                                  PCON |= 0x02;            //MCU進(jìn)入掉電模式
                                  _nop_();            //掉電模式被喚醒后,首先執(zhí)行此語句,然后再進(jìn)入中斷服務(wù)程序
                                  _nop_();
                                  _nop_() ;
                                  _nop_() ;
                                  _nop_() ;
                                  _nop_() ;
                         }        
                }
}

void exint1() interrupt 2     //INT1中斷入口
{
//          EX1  = 0;
          P3^2 = !P3^2;             //將測試口取反
//          INT1 = 0;                    //保存INT1口的狀態(tài), INT1=0(下降沿); INT1=1(上升沿)
//          PCON = 0x00 ;
//          EX1 = 1 ;

}
回復(fù)

使用道具 舉報

ID:879348 發(fā)表于 2022-10-10 08:19 | 顯示全部樓層
Arouw 發(fā)表于 2022-10-9 17:22
那是需要把中斷服務(wù)函數(shù)里的拎出來寫一個休眠函數(shù),然后在主函數(shù)調(diào)用嗎?

不要在中斷操作PCON
回復(fù)

使用道具 舉報

ID:1047058 發(fā)表于 2022-10-10 08:25 | 顯示全部樓層
wulin 發(fā)表于 2022-10-9 20:32
樓主為什么把代碼寫成這樣,STC8有現(xiàn)成的官方示例。

是因為這個是繼承前輩的代碼,功能不止這一個,所以不敢貿(mào)然改,而且我對stc8也不熟。。。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-10-10 08:44 | 顯示全部樓層
5#已經(jīng)給出正解的方法了
不要在中斷中關(guān)閉中斷
不要在中斷中操作PCON
不要在中斷中更改中斷的相關(guān)設(shè)置
這些,都要在中斷程序外執(zhí)行
可以在退出中斷之前加一條 IE1 = 0;
中斷觸發(fā)按鍵要有防抖
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2022-10-10 09:26 | 顯示全部樓層
告訴你原因:
進(jìn)入中斷的中斷程序(響應(yīng)中斷)有以下條件,缺一不可:
1、中斷被允許(你已做到了)。
2、中斷源動作(你已做到了)。
3、沒有更高級或同級的中斷正在響應(yīng)進(jìn)行中(你只做到了一次,這是關(guān)鍵):
復(fù)位時,所有中斷被清除,你可以進(jìn)來。
進(jìn)來后,你沒有退出,也即一直處理中斷服務(wù)程序進(jìn)行中,如何能再響應(yīng)新的中斷呢?
原因是:同級中斷(本中斷)未退出,不再接受新的本中斷!!!
回復(fù)

使用道具 舉報

ID:1034262 發(fā)表于 2022-10-10 14:29 | 顯示全部樓層
建議直接測試STC ISP里的范例程序。
回復(fù)

使用道具 舉報

ID:1047058 發(fā)表于 2022-10-11 10:16 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-10-10 09:26
告訴你原因:
進(jìn)入中斷的中斷程序(響應(yīng)中斷)有以下條件,缺一不可:
1、中斷被允許(你已做到了)。

按照您說的我嘗試了很多次,但是還是有一些疑問:中斷要在哪里退出呢?是長按喚醒模塊退出還是長按掉電模塊,還是寫在主函數(shù)里?我每個地方都嘗試了EX1=0可還是不行。

而且,為什么會出現(xiàn)同樣的程序同樣的操作,有時候可以正常喚醒多次,有時候甚至一次都不行呢,難道是硬件的問題嗎?
回復(fù)

使用道具 舉報

ID:1047058 發(fā)表于 2022-10-11 10:47 | 顯示全部樓層
各位好,這個問題已經(jīng)解決了。原來是前輩的代碼里已經(jīng)寫了關(guān)機(jī)模塊,不需要我再次使用掉電喚醒,兩個沖突了,注釋掉相關(guān)的掉電喚醒模塊后就可以正常開關(guān)機(jī)使用了。非常感謝各位大佬的分享和幫助,以后我一定認(rèn)真閱讀代碼理解完畢后再動手去寫!

再次謝謝各位,受益良多,對于掉電喚醒部分我也有所收獲,打算利用手頭的單片機(jī)板子下載STC的官方示例代碼進(jìn)一步學(xué)習(xí)。
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2022-10-11 13:12 | 顯示全部樓層
CPU是以RETI指令,來確定中斷程序退出的。
而C語言是以函數(shù)結(jié)束,來確定中斷程序退出的。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表