久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2018|回復: 5
收起左側

遇到了一個奇怪的單片機程序問題,百思不得其解

[復制鏈接]
ID:686513 發表于 2023-5-19 09:55 | 顯示全部樓層 |閱讀模式
sbit unit = P1^0;   //P1.0為外部中斷口(接菜單鍵)。我想實現:開機時按此鍵為菜單切換鍵,長按時休眠,休眠后再短按一下開機。 目前可以實現開機時菜單切換,自動休眠后再短按一下開機,但長按給Low_Power =101;按理論上應該可以進入休眠,但是休眠瞬間又復位開機了。如果把這句 Power_Down_F = 0;        放在掉電模式STOP2后,可以實現菜單切換,長按時休眠,但休眠后短按開機又出現了以下幾個問題:1.自動休眠后需按兩次才能開機,(休眠后電流為:15uA,按下第一次電流升到1到2mA但不開機,按下第二次才能開機)2.長按按鍵休眠后待機電流為1-2mA(休眠電流應該為:15uA,沒有完全休眠),這時只需按下一次會開機。

目前我的思路是借鑒論壇里 “家用廚房電子秤” 的休眠程序 :原程序中沒有長按關機功能,只是自動休眠前把外部中斷打開,按下接外部中斷的開關觸發中斷退出休眠。和之前WULIN老師說的方法類似,“利用單片機休眠功能即可解決。初次上電自動開機,P1.0作為普通按鍵使用,短按切換菜單,長按執行菜單下不同任務。只要再加一項菜單,長按打開外部中斷,執行睡眠即可關機。在睡眠狀態由外部觸發喚醒,關閉外部中斷,恢復P1.0作為普通按鍵使用。”
以下是按照上面的思路我寫的。
//休眠 ---------------------------------------------------------------------------------------------                                                
  if(XmCnt==1)                                        //XmCnt為定時器500mS到標志,即500mS檢測一下是否進來休眠
                {
     if(md1==0&&press<50)                            //如果md1==0&&press<50休眠
                                 
                          {
                                 Low_Power ++;        
                                }        
      else
                          {                        
                                 Low_Power = 0;        
                          }        
                 }

if(Low_Power > 100)             //50S休眠
                {
                        IT1=1;               //使能INT1下降沿中斷                        
                        EX1=1;               //使能INT1中斷

                       ET0=0;                    //關閉定時器0
                       ET1=0;                    //關閉定時器1                                
        WD_DIS                  // 看門狗關閉
                                                
//--配置IO模式 (確保不漏電)
                        P0M0 = 0x00; P0M1 = 0xff;
                        P1M0 = 0x00; P1M1 = 0xfe;      //P1.0為外部中斷口
                        P2M0 = 0x00; P2M1 = 0xff;
                        P3M0 = 0x00; P3M1 = 0xff;
                        P4M0 = 0x00; P4M1 = 0xff;
                                       
                        P0 = 0x00;
                        P1 = 0x01;             //P1.0為外部中斷口
                        P2 = 0x2E;             //p2.1 p2.2 p2.3 p2.5低電平驅動四個數碼管的COM口
                        P3 = 0x00;
                        P4 = 0x00;
                         Power_Down_F = 0;        
                        
                                 _nop_();
                                        PCON |= 0x10;                        //進入掉電模式STOP2
                                 _nop_();                        
                                       
         //-- 關機 : 等待外部中斷喚醒 ---         
                                while(1)
                                {
                                        if(Power_Down_F)                                                        
                                        PCON        = 0x0C;                 //喚醒                                                        
                                }        
                   }        
   }
}

void EX_Int1 (void) interrupt 2       //INT1
{         
Power_Down_F = 1 ;
}

按鍵為低層和應該用層掃描識別
void key_Service()       //應用層
{                          
  switch(Key_Scan())      //key_Scan()  為底層 返回鍵值                                                     
    {               
      case 2:   if(Setflag == 1){ KeyNum=0; E2prom_Read_user();T1Cnt=0; SSCnt=0; keyflag=0; Setflag=0;}  else {KeyNum=0; wnd++; if(wnd>2) wnd=0; E2prom_write_user();}     break;     //短按P1.0 鍵值為2     菜單窗口wnd切換
          -
          -
          -
        case 22:     KeyNum=0;  Low_Power = 101;         E2prom_write_user();   Setflag = 1;     break;      //長按P1.0 鍵值為22  這里給 Low_Power = 101;  進入上面的休眠部分,即   if(Low_Power > 100)    。            
        }
}                          




回復

使用道具 舉報

ID:123289 發表于 2023-5-19 15:15 | 顯示全部樓層
【開機時】:需要定義一個標記B_ON,來識別當前狀態是不是開機狀態。
【按此鍵為菜單切換鍵,長按時休眠】:需要定義一個標記B_LONG,來識別長按與普通按。
【休眠后】:需要定義一個標記B_SLEEP,來識別當前狀態是不是休眠中。
組合B_ON、B_LONG、B_SLEEP就可以達成你的需要,要點是如何決定這三個變量的0、1:
1、B_ON:開機時通過檢查指定人RAM中不是不是特定的冷起動碼,來修改B_ON值;或當你執行關機時,修改B_ON值,以便于下次識別開機;其它方法。
2、B_LONG:通過對按鍵按下的時間識別。
3、B_SLEEP:在進行休眠前、后修改。
要點:識別使用標記后,復位各標記。
回復

使用道具 舉報

ID:57657 發表于 2023-5-19 18:16 | 顯示全部樓層
樓主用的什么型號? 并不是所有IO口都可以外部中斷。
回復

使用道具 舉報

ID:213173 發表于 2023-5-25 15:53 | 顯示全部樓層
芯易德的MCU沒有用過,既然是51的那就差不多,把管腳定義改一下就應該能用。這個示例是按STC15編寫的,也適用于STC8系列。消除按鍵外部中斷喚醒后誤讀按鍵的缺陷,實際就是加電正常工作,按鍵正常操作。當長按達1秒MCU睡眠。再按按鍵不論長短都能喚醒,但必須松手后才能進入正常工作狀態,避免按鍵掃描函數誤將外部中斷喚醒當做正常操作。其實就加了一個識別標志。這個按鍵掃描函數只寫了1個鍵,實際可以用于N個鍵的長短按。 一鍵開關機(掉電喚醒).rar (12.49 KB, 下載次數: 9)
回復

使用道具 舉報

ID:146507 發表于 2023-7-10 16:47 | 顯示全部樓層
你是不是長按關機沒有判斷IO口松開就進入休眠程序了,然后IO口又是低電平喚醒,所以會不斷的開機
回復

使用道具 舉報

ID:111463 發表于 2023-7-10 16:54 | 顯示全部樓層
1. 要注意該單片機從休眠喚醒后是會復位還是在之前程序中接著運行
2. 要做好程序的健壯性,避免多次喚醒或重復進入中斷
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利视频一区二区 | 国产精品精品视频一区二区三区 | 日本天天操| 91 久久 | 国产精品久久久久久吹潮 | 91社区视频 | 国产一级在线观看 | 国产精品久久久久久久久久久久 | 国产三级精品三级在线观看四季网 | 久久亚洲欧美日韩精品专区 | 久久99精品久久久久久狂牛 | 亚洲成人精品在线 | 国产乱码久久久 | 国产高清精品一区二区三区 | 中文av网站 | 国产三级国产精品 | 一区二区影视 | 玖玖在线精品 | 久草青青草 | 中文字幕在线一区 | 日韩成人在线看 | 国产伦精品一区二区三区高清 | 久久久精品影院 | 久久精品一区二区 | 天天射美女 | 成人黄色在线 | 少妇一区二区三区 | 欧美国产一区二区 | 97精品超碰一区二区三区 | 成人免费在线播放 | 亚洲精品一区二区三区 | 午夜黄色| 请别相信他免费喜剧电影在线观看 | 国产激情精品一区二区三区 | 国产美女自拍视频 | 国产精品久久av | 亚洲精品日韩在线 | 网站黄色在线 | 国产精品自拍视频网站 | 手机日韩 | 国产精品69毛片高清亚洲 |