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

標題: MCU暫停運行程序,等待喚醒命令 [打印本頁]

作者: 農民阿伯    時間: 2023-7-30 19:03
標題: MCU暫停運行程序,等待喚醒命令
單片機可不可以運行到某處暫停(休眠),然后等觸發(fā)按鍵后才繼續(xù)運行下面程序呢?不是跳轉運行其他程序,是暫停,就是什么也不做,先停一下,然后按鍵松開后才繼續(xù)
作者: tyrl800    時間: 2023-7-30 20:23
可以,低功耗模式
作者: taotie    時間: 2023-7-30 20:38
運行到某處進入循環(huán)暫停,當某鍵按下跳出循環(huán)繼續(xù)向下執(zhí)行。
作者: zgrfox110    時間: 2023-7-30 22:08
可以設置下降沿中斷,單片機休眠,按鍵按下,0V喚醒單片機。從休眠下一條指令開始執(zhí)行!
作者: 1860774xxxx    時間: 2023-7-30 22:18
空閑模式  外部中斷喚醒  
作者: 農民阿伯    時間: 2023-7-31 01:21
zgrfox110 發(fā)表于 2023-7-30 22:08
可以設置下降沿中斷,單片機休眠,按鍵按下,0V喚醒單片機。從休眠下一條指令開始執(zhí)行!

有沒相應的程序看看是怎樣的呢?
作者: 農民阿伯    時間: 2023-7-31 01:21
1860774xxxx 發(fā)表于 2023-7-30 22:18
空閑模式  外部中斷喚醒

有沒相應程序學下呢
作者: 農民阿伯    時間: 2023-7-31 01:23
taotie 發(fā)表于 2023-7-30 20:38
運行到某處進入循環(huán)暫停,當某鍵按下跳出循環(huán)繼續(xù)向下執(zhí)行。

就是在里面空轉咯?這個可以試試。
作者: 1860774xxxx    時間: 2023-7-31 06:51
農民阿伯 發(fā)表于 2023-7-31 01:21
有沒相應程序學下呢

芯片手冊自己看看貝 空閑模式和掉電模式
作者: Hephaestus    時間: 2023-7-31 06:51
農民阿伯 發(fā)表于 2023-7-31 01:23
就是在里面空轉咯?這個可以試試。

不可以,空轉太費電了,進入休眠狀態(tài)連時鐘都停了才能真正做到省電。
作者: wulin    時間: 2023-7-31 07:29
設置一個條件,當滿足條件,MCU進入休眠。當用按鍵或其它方式觸發(fā)喚醒,MCU繼續(xù)工作。給你一個示例參考
  1. //適合STC15/STC8系列,測試平臺 TX-1C 開發(fā)板
  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()    //按鍵掃描函數(shù)
  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()//按鍵服務函數(shù)
  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()//掉電模式函數(shù)
  67. {
  68.         if(allow)
  69.         {
  70.                 P1=0xff;                //關閉LED顯示
  71.                 //關閉所有在用硬件,減小能耗
  72.                 EX0 = 1;                //打開中斷
  73.                 PCON = 0x02;//MCU進入掉電模式
  74.                 _nop_();    //掉電模式被喚醒后,首先執(zhí)行此語句,然后再進入中斷服務程序
  75.                 _nop_();    //中斷服務程序執(zhí)行完再接著此句繼續(xù)執(zhí)行
  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();//定時器初始化函數(shù)
  106.         while (1)
  107.         {
  108.                 key_scan();                //按鍵掃描函數(shù)
  109.                 key_service(); //按鍵服務函數(shù)
  110.                 Shutdown();                //掉電模式函數(shù)
  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. }
復制代碼

作者: zsyzdx    時間: 2023-7-31 09:16
可以的,有很多方式,有些單片機低功耗的時候就停在程序那里,但是這種功耗肯定不是最低的。
作者: 菜鳥yc    時間: 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;                //跳出等待的循環(huán),運行函數(shù)調用處之后的程序
  26.                 }
  27.         }
  28. }
復制代碼


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

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

51黑.png

作者: 農民阿伯    時間: 2023-7-31 11:30
菜鳥yc 發(fā)表于 2023-7-31 09:33
方式一實現(xiàn),休眠配合外部中斷,需要在進入休眠前使能外部中斷
方式二實現(xiàn),直接調用函數(shù)

看不懂,還是方法二適合我,慢慢學。請問下,方式二中,如果我是按鍵釋放時跳出循環(huán),語句 if(X_key == 0) 改為if(X_KEY==1)就可以嗎?
作者: liyonghua111    時間: 2023-7-31 12:40
是的,單片機可以做到這一點。你可以使用中斷來實現(xiàn)這個功能。

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

以下是一個簡單的示例代碼(基于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);
   
    /* 在這里添加按鍵按下后需要執(zhí)行的代碼 */
  }
}

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

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

請注意,這只是一個基本的示例,實際的代碼可能需要根據(jù)你的具體需求進行修改。例如,你可能需要配置GPIO為輸入模式,并啟用相應的中斷;你也可能需要在中斷處理程序中添加一些去抖動的代碼等。
作者: smmj    時間: 2023-7-31 16:44
可以,有的單片機有sleep命令。
作者: npn    時間: 2023-7-31 18:29
進入掉電模式晶振停止震蕩,可由外部中斷或復位喚醒。
作者: 農民阿伯    時間: 2023-8-1 12:59
菜鳥yc 發(fā)表于 2023-7-31 09:33
方式一實現(xiàn),休眠配合外部中斷,需要在進入休眠前使能外部中斷
方式二實現(xiàn),直接調用函數(shù)

能否幫我修改一下,特別是那個看門狗程序,不會弄。
#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延時函數(shù)*****************************/
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延時函數(shù)*****************************/
void Delay10ms()                //@12.000MHz
{
        unsigned char data i, j;

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

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

/******************主程序**********************/
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();
                      }
                  }
         }
}
作者: 農民阿伯    時間: 2023-8-3 11:55
自己頂上去,求助高手給弄下




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩精品视频在线播放 | 欧美福利 | 91精品麻豆日日躁夜夜躁 | 自拍 亚洲 欧美 老师 丝袜 | 美女精品一区 | 男人天堂国产 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 韩日一区二区三区 | v片网站 | 成人深夜小视频 | 欧美日韩久久 | 成人动慢 | 九九九视频在线 | 中文成人在线 | 国产九一精品 | 欧美色综合 | 91一区二区三区 | 99久久国产综合精品麻豆 | 欧美lesbianxxxxhd视频社区 | www.午夜 | 久久丁香 | 欧美视频在线一区 | 成人在线中文字幕 | 欧美一级在线视频 | 久久精品69| 国产精品一区二区电影 | 欧美亚洲综合久久 | 久久精品欧美一区二区三区不卡 | 日本免费在线 | 久久精品国产v日韩v亚洲 | 成人国产精品久久久 | 国产综合精品 | 欧美日韩不卡合集视频 | 九九热在线视频观看这里只有精品 | 特黄特色大片免费视频观看 | 国产精品亚洲精品日韩已方 | 久久蜜桃av | jⅰzz亚洲| 成人久久网| 国产99久久精品一区二区永久免费 | av福利网站|