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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2455|回復: 18
打印 上一主題 下一主題
收起左側

MCU暫停運行程序,等待喚醒命令

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1087674 發表于 2023-7-30 19:03 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機可不可以運行到某處暫停(休眠),然后等觸發按鍵后才繼續運行下面程序呢?不是跳轉運行其他程序,是暫停,就是什么也不做,先停一下,然后按鍵松開后才繼續
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:275826 發表于 2023-7-30 20:23 | 只看該作者
可以,低功耗模式
回復

使用道具 舉報

板凳
ID:342822 發表于 2023-7-30 20:38 | 只看該作者
運行到某處進入循環暫停,當某鍵按下跳出循環繼續向下執行。
回復

使用道具 舉報

地板
ID:525244 發表于 2023-7-30 22:08 來自手機 | 只看該作者
可以設置下降沿中斷,單片機休眠,按鍵按下,0V喚醒單片機。從休眠下一條指令開始執行!
回復

使用道具 舉報

5#
ID:468209 發表于 2023-7-30 22:18 來自手機 | 只看該作者
空閑模式  外部中斷喚醒  
回復

使用道具 舉報

6#
ID:1087674 發表于 2023-7-31 01:21 來自手機 | 只看該作者
zgrfox110 發表于 2023-7-30 22:08
可以設置下降沿中斷,單片機休眠,按鍵按下,0V喚醒單片機。從休眠下一條指令開始執行!

有沒相應的程序看看是怎樣的呢?
回復

使用道具 舉報

7#
ID:1087674 發表于 2023-7-31 01:21 來自手機 | 只看該作者
1860774xxxx 發表于 2023-7-30 22:18
空閑模式  外部中斷喚醒

有沒相應程序學下呢
回復

使用道具 舉報

8#
ID:1087674 發表于 2023-7-31 01:23 來自手機 | 只看該作者
taotie 發表于 2023-7-30 20:38
運行到某處進入循環暫停,當某鍵按下跳出循環繼續向下執行。

就是在里面空轉咯?這個可以試試。
回復

使用道具 舉報

9#
ID:468209 發表于 2023-7-31 06:51 來自手機 | 只看該作者
農民阿伯 發表于 2023-7-31 01:21
有沒相應程序學下呢

芯片手冊自己看看貝 空閑模式和掉電模式
回復

使用道具 舉報

10#
ID:883242 發表于 2023-7-31 06:51 | 只看該作者
農民阿伯 發表于 2023-7-31 01:23
就是在里面空轉咯?這個可以試試。

不可以,空轉太費電了,進入休眠狀態連時鐘都停了才能真正做到省電。
回復

使用道具 舉報

11#
ID:213173 發表于 2023-7-31 07:29 | 只看該作者
設置一個條件,當滿足條件,MCU進入休眠。當用按鍵或其它方式觸發喚醒,MCU繼續工作。給你一個示例參考
  1. //適合STC15/STC8系列,測試平臺 TX-1C 開發板
  2. //#include <STC15F2K60S2.H>
  3. #include <STC8H.H>
  4. #include "intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. sbit key  = P3^2;//S14
  8. sbit GND  = P3^4;//矩陣鍵盤P3.4模擬接地

  9. uchar Temp;
  10. uchar Key_value; //鍵值
  11. uint  keyTim;    //按鍵時長
  12. bit   flag1ms;   //1ms中斷標志
  13. bit   on_off;    //開關標志
  14. bit   allow;     //允許關機標志

  15. void Timer0Init(void)//1毫秒@11.0592MHz
  16. {
  17.         AUXR |= 0x80;                //定時器時鐘1T模式
  18.         TMOD &= 0xF0;                //設置定時器自動重載模式
  19.         TL0 = 0xCD;                        //設置定時初始值
  20.         TH0 = 0xD4;                        //設置定時初始值
  21.         TF0 = 0;                                //清除TF0標志
  22.         TR0 = 1;                                //定時器0開始計時
  23.         ET0 = 1;                                //允許T0中斷
  24. //        EA  = 1;                                //開總中斷
  25. }

  26. void key_scan()    //按鍵掃描函數
  27. {
  28.         if(flag1ms)  //1ms時間標志
  29.         {
  30.                 flag1ms = 0;//1ms時間標志清0
  31.                 if(!key && !on_off)
  32.                 {
  33.                         if(++keyTim>1000)keyTim=1001;//防止溢出

  34.                         if(keyTim==20) //大于20ms小于1s算短按
  35.                         {
  36.                                 Key_value=0x01;
  37.                         }
  38.                         if(keyTim==1000) //達到1s算長按
  39.                         {
  40.                                 Key_value|=0x10;
  41.                         }
  42.                 }
  43.                 else
  44.                 {
  45.                         keyTim=0;        //按鍵松手keyTim清0
  46.                         on_off=0;        //開關標志清0
  47.                 }
  48.         }
  49. }

  50. void key_service()//按鍵服務函數
  51. {//短按等松手響應,長按達1s不論是否松手即響應
  52.         if((keyTim==0||keyTim==1000) && Key_value!=0x00)
  53.         {
  54.                 if(Key_value==0x01)//短按任務
  55.                 {
  56.                         Temp++;
  57.                         P1=~Temp;
  58.                 }
  59.                 if(Key_value==0x11)//長按關機
  60.                 {
  61.                         allow=1;
  62.                 }
  63.                 Key_value=0x00;//任務完成后鍵值清0
  64.         }
  65. }

  66. void Shutdown()//掉電模式函數
  67. {
  68.         if(allow)
  69.         {
  70.                 P1=0xff;                //關閉LED顯示
  71.                 //關閉所有在用硬件,減小能耗
  72.                 EX0 = 1;                //打開中斷
  73.                 PCON = 0x02;//MCU進入掉電模式
  74.                 _nop_();    //掉電模式被喚醒后,首先執行此語句,然后再進入中斷服務程序
  75.                 _nop_();    //中斷服務程序執行完再接著此句繼續執行
  76.                 EX0 = 0;                //關閉中斷
  77.                 while(!key);//等待按鍵松手,防止按鍵掃描程序誤讀
  78.                 //打開所有在用硬件,恢復正常運行
  79.                 P1=~Temp;                //恢復LED顯示
  80.                 allow=0;                //清0
  81.         }
  82. }

  83. void main()
  84. {
  85.         P0M0 = 0x00;//初始化IO
  86.         P0M1 = 0x00;
  87.         P1M0 = 0x00;
  88.         P1M1 = 0x00;
  89.         P2M0 = 0x00;
  90.         P2M1 = 0x00;
  91.         P3M0 = 0x00;
  92.         P3M1 = 0x00;
  93.         P4M0 = 0x00;
  94.         P4M1 = 0x00;
  95.         P5M0 = 0x00;
  96.         P5M1 = 0x00;
  97.         P6M0 = 0x00;
  98.         P6M1 = 0x00;
  99.         P7M0 = 0x00;
  100.         P7M1 = 0x00;
  101.         GND  = 0;
  102.         IT0 = 1;//設置INT0的中斷類型為下降沿喚醒
  103. //        EX0 = 1;//使能INT0中斷
  104.         EA  = 1;//開總中斷                                                        
  105.         Timer0Init();//定時器初始化函數
  106.         while (1)
  107.         {
  108.                 key_scan();                //按鍵掃描函數
  109.                 key_service(); //按鍵服務函數
  110.                 Shutdown();                //掉電模式函數
  111.         }
  112. }
  113. //INT0中斷服務程序
  114. void exint0() interrupt 0
  115. {
  116.         on_off=1;//開關標志置1
  117. }
  118. //T0中斷服務程序
  119. void interruptTimer0() interrupt 1
  120. {
  121.         flag1ms = 1;    //1ms標志
  122. }
復制代碼
回復

使用道具 舉報

12#
ID:320306 發表于 2023-7-31 09:16 | 只看該作者
可以的,有很多方式,有些單片機低功耗的時候就停在程序那里,但是這種功耗肯定不是最低的。
回復

使用道具 舉報

13#
ID:711539 發表于 2023-7-31 09:33 | 只看該作者
  1. //方式一:
  2. void fun_Enter_LPM(void){
  3.         ADEN = 0;                                //關閉ADC使能
  4.         VREFEN = 0;                                //關閉內部參考電壓

  5.         Y_LED = 1;                                //LED燈滅

  6.     KIF = 0;                                //清按鍵中斷標志
  7.         KIE = 1;                                //使能按鍵中斷喚醒
  8.         KMSK0 = 1;                                //打開中斷喚醒 (按鍵)

  9.         LPM = 0;                                //進入IDLE0模式
  10.     RCEN = 0;                                //關狗
  11.     CLRWDT();                                //清除看門狗定時器
  12.     IDLE();                                        //
  13.     CLRWDT();                                //清除看門狗定時器
  14.     RCEN = 1;                                //開狗
  15.        
  16.         Y_LED = 0;                                //LED燈亮
  17. }

  18. //方式二:
  19. void fun_Wait_Run(void){
  20.         while(1){
  21.                 CLRWDT();                        //清除看門狗定時器
  22.                 if(X_key == 0){                //按鍵按下
  23.                         DelayXms(10);        //阻塞式延時消抖,10ms
  24.                         if(X_key == 0)        //按鍵真的按下,不是誤動作
  25.                                 break;                //跳出等待的循環,運行函數調用處之后的程序
  26.                 }
  27.         }
  28. }
復制代碼


方式一實現,休眠配合外部中斷,需要在進入休眠前使能外部中斷
方式二實現,直接調用函數

51黑.png (36.81 KB, 下載次數: 78)

51黑.png
回復

使用道具 舉報

14#
ID:1087674 發表于 2023-7-31 11:30 來自手機 | 只看該作者
菜鳥yc 發表于 2023-7-31 09:33
方式一實現,休眠配合外部中斷,需要在進入休眠前使能外部中斷
方式二實現,直接調用函數

看不懂,還是方法二適合我,慢慢學。請問下,方式二中,如果我是按鍵釋放時跳出循環,語句 if(X_key == 0) 改為if(X_KEY==1)就可以嗎?
回復

使用道具 舉報

15#
ID:1087948 發表于 2023-7-31 12:40 | 只看該作者
是的,單片機可以做到這一點。你可以使用中斷來實現這個功能。

在你想要暫停的地方,你可以讓單片機進入休眠模式或者無限循環等待,然后設置一個按鍵觸發的中斷。當按鍵被按下時,中斷會被觸發,然后單片機就會從休眠狀態喚醒或者跳出無限循環,繼續執行下面的程序。

以下是一個簡單的示例代碼(基于STM32):

c
#include "stm32f1xx_hal.h"

void EXTI0_IRQHandler(void)
{
  /* 確認中斷標志 */
  if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
   
    /* 在這里添加按鍵按下后需要執行的代碼 */
  }
}

int main(void)
{
  /* 初始化和配置代碼... */

  while(1)
  {
    /* 在這里添加主循環代碼... */
   
    /* 想要暫停的地方 */
    __WFI(); // 進入休眠模式,等待中斷喚醒
   
    /* 按鍵被按下,中斷被觸發,單片機喚醒,繼續執行下面的代碼... */
  }
}
在這個示例中,__WFI()函數使單片機進入休眠模式,等待任何中斷來喚醒它。當按鍵被按下時,EXTI0中斷被觸發,然后單片機就會被喚醒,繼續執行__WFI()之后的代碼。

請注意,這只是一個基本的示例,實際的代碼可能需要根據你的具體需求進行修改。例如,你可能需要配置GPIO為輸入模式,并啟用相應的中斷;你也可能需要在中斷處理程序中添加一些去抖動的代碼等。
回復

使用道具 舉報

16#
ID:396024 發表于 2023-7-31 16:44 來自手機 | 只看該作者
可以,有的單片機有sleep命令。
回復

使用道具 舉報

17#
ID:57657 發表于 2023-7-31 18:29 | 只看該作者
進入掉電模式晶振停止震蕩,可由外部中斷或復位喚醒。
回復

使用道具 舉報

18#
ID:1087674 發表于 2023-8-1 12:59 | 只看該作者
菜鳥yc 發表于 2023-7-31 09:33
方式一實現,休眠配合外部中斷,需要在進入休眠前使能外部中斷
方式二實現,直接調用函數

能否幫我修改一下,特別是那個看門狗程序,不會弄。
#include"intrins.h"
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sfr P5 =0xC8;//P5地址
sbit key  = P5^4;
sbit led  = P5^5;

/***********************200ms延時函數*****************************/
void Delay200ms()                //@12.000MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 10;
        j = 31;
        k = 147;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

/***********************10ms延時函數*****************************/
void Delay10ms()                //@12.000MHz
{
        unsigned char data i, j;

        i = 20;
        j = 113;
        do
        {
                while (--j);
        } while (--i);
}

/***********************等待剎車松開函數*****************************/
void fun_Wait_Run(void)
{
        while(1)
        {
                CLRWDT();                     //清除看門狗定時器
                if(key == 1)                  //按鍵松開
                {                           
                        Delay10ms();         //阻塞式延時消抖,10ms
                     if(key == 1)          //按鍵真的松開,不是誤動作
                     {        
                          break;          //跳出等待的循環,運行函數調用處之后的程序
                     }
                 }
        }
}

/******************主程序**********************/
void main()
{
        while(1)
         {
                 if(key == 0)                     //剎車
                 {
                    Delay10ms();                   //延時消抖,10ms
                    if(key == 0)
                     {                             //真剎車。
                        led = 0;                     //輸出低電平。
                        Delay200ms();                //輸出延時。
                      }
                   fun_Wait_Run;                  //等待松開手剎
                  }
                 if(key == 1)                      //松開手剎
                 {
                    Delay10ms();                 //延時消抖,10ms
                    if(key == 0)                 //真松開手剎。
                     {
                        led = 0;                 //輸出低電平。
                        Delay200ms();             //輸出延時。
                        led = 0;                  //再次輸出低電平。
                        Delay200ms();
                      }
                  }
         }
}
回復

使用道具 舉報

19#
ID:1087674 發表于 2023-8-3 11:55 | 只看該作者
自己頂上去,求助高手給弄下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级毛片精品完整视频版 | 国产欧美日韩综合精品一区二区 | 国产精品激情小视频 | 国产亚洲精品a | 麻豆视频在线免费看 | 国产精品99久久久久久动医院 | 国产在线视频在线观看 | 中文字幕高清av | 精品国产乱码久久久久久蜜退臀 | 成人国内精品久久久久一区 | 中文字幕av在线 | 精品国产欧美 | 精品欧美黑人一区二区三区 | 国产视频在线一区二区 | 日本视频在线播放 | 91成人免费| 久久久久国产精品午夜一区 | 婷婷在线网站 | 在线欧美视频 | 高清视频一区二区三区 | 国产精品久久久久久久久久 | 男女网站免费观看 | 大陆一级毛片免费视频观看 | 在线观看成人免费视频 | 欧洲视频一区 | 一区二区三区国产精品 | 久久国产一区 | 视频在线日韩 | 国产免费av网 | 国产激情网站 | 91av在线视频观看 | 日本精品久久久一区二区三区 | 欧美视频一区二区三区 | 狠狠干五月天 | 福利片在线观看 | 天天玩天天操天天干 | 亚洲免费视频网站 | 欧美精品成人一区二区三区四区 | 精品美女 | 欧美日韩在线看 | 欧洲性生活视频 |