找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機一個按鍵立馬控制呼吸燈亮滅,為什么中斷服務(wù)程序里面不能執(zhí)行掉電模式?

[復(fù)制鏈接]
ID:863657 發(fā)表于 2022-10-20 09:36 | 顯示全部樓層 |閱讀模式
void main()
{
Timer0Init;
while(1)
        {
                PWM_huxi ();
  }
}

void T0 () interrupt 1
{
        TL0 = 0xCD;                //設(shè)置定時初值
        TH0 = 0xD4;                //設(shè)置定時初值
        num++;
        if(num==10)   //10ms
                {
               
         
         if(!K1)
         {
                  Delayms(20);
                 if(!K1)
                 {
                  
                  while(!K1);
            INT_CLKO |= 0x40; //打開INT4 外部中斷 喚醒功能
                        num=0;
                        PCON=0X02;//進入掉電模式
                        Delayms(5);
                  
                 }
         }
         else num=0;
}
}
void Int4()  interrupt 16
{
        
                INT_CLKO &= 0xBF;        //中斷清零
                        EA=0;
        IAP_CONTR=0X20; //直接復(fù)位程序重新執(zhí)行
        
        }

回復(fù)

使用道具 舉報

ID:198189 發(fā)表于 2022-10-20 09:57 | 顯示全部樓層
當(dāng)它運行到10毫秒時,你的按鍵要正好按下,請問你的手速有這么快嗎?還是說你以什么方法實現(xiàn)的?如果你的“!K1”是人工操作的,這個要進入掉電模式就和你中獎的幾乎也差不多了。
回復(fù)

使用道具 舉報

ID:863657 發(fā)表于 2022-10-20 10:04 | 顯示全部樓層
xia20 發(fā)表于 2022-10-20 09:57
當(dāng)它運行到10毫秒時,你的按鍵要正好按下,請問你的手速有這么快嗎?還是說你以什么方法實現(xiàn)的?如果你的“ ...

人工按得,想法是 相當(dāng)于是每10ms 掃描一次按鍵狀態(tài),好像怎么改時間中斷服務(wù)函數(shù)里 都進不去 掉電
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-10-20 10:11 | 顯示全部樓層
既然,啥都沒有所有都靠猜,那就瞎猜一下,你的K1  剛好接在 P3.0,
回復(fù)

使用道具 舉報

ID:863657 發(fā)表于 2022-10-20 10:20 來自手機 | 顯示全部樓層
188610329 發(fā)表于 2022-10-20 10:11
既然,啥都沒有所有都靠猜,那就瞎猜一下,你的K1  剛好接在 P3.0,

是的 就是p3.0,掉電模式放主函數(shù)里就可以掉電,但是不能立即掉電,得等呼吸燈跑完,
放中斷里想著應(yīng)該可以立即掉電了吧又不能執(zhí)行
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-10-20 10:39 | 顯示全部樓層
zhaomin253 發(fā)表于 2022-10-20 10:20
是的 就是p3.0,掉電模式放主函數(shù)里就可以掉電,但是不能立即掉電,得等呼吸燈跑完,
放中斷里想著應(yīng)該 ...

按鍵按下,又抬起后, (你要想穩(wěn)定工作,必須抬起后。!)設(shè)置一個標(biāo)志, 比如 Poweroff = 1;
PWM函數(shù),中檢測到  if(Poweroff)  break;   跳出PWM函數(shù)。
最后,主函數(shù)中,
if(Poweroff)
{
   Poweroff  = 0;
   PCON      = 0x02;
}
回復(fù)

使用道具 舉報

ID:384109 發(fā)表于 2022-10-20 10:41 | 顯示全部樓層
按鍵釋放后再掉電
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-10-20 14:50 | 顯示全部樓層
不能在中斷函數(shù)中進入掉電模式
掉電模式喚醒過程:在掉電模式執(zhí)行之后,被中斷觸發(fā),程序馬上進入中斷
如果在中斷模式中進入掉電模式:中斷本身還沒有返回,你就在當(dāng)前模式進入了掉電模式,等到你再按下按鍵,又一次進入中斷,而之前的中斷并沒有返回
整個過程都斷套了.......至于會出什么問題,不知道,也不重要,你只要知道單片機亂了就行了
回復(fù)

使用道具 舉報

ID:863657 發(fā)表于 2022-10-20 15:25 | 顯示全部樓層
Y_G_G 發(fā)表于 2022-10-20 14:50
不能在中斷函數(shù)中進入掉電模式
掉電模式喚醒過程:在掉電模式執(zhí)行之后,被中斷觸發(fā),程序馬上進入中斷
如果 ...

哦原來如此,受教了,請問下,
那不用中斷,如何才能控制一個程序在運行中途突然關(guān)機呢,(不切斷電源,只軟關(guān)斷,比如一個信號),
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-10-20 16:26 | 顯示全部樓層
zhaomin253 發(fā)表于 2022-10-20 15:25
哦原來如此,受教了,請問下,
那不用中斷,如何才能控制一個程序在運行中途突然關(guān)機呢,(不切斷電源, ...

用標(biāo)志位,不要用1ms以上的delay
回復(fù)

使用道具 舉報

ID:863657 發(fā)表于 2022-10-20 16:56 | 顯示全部樓層
lkc8210 發(fā)表于 2022-10-20 16:26
用標(biāo)志位,不要用1ms以上的delay

請問 標(biāo)志位是需要用 if判斷的么,如果程序已經(jīng)在一個if 語句里執(zhí)行了,這時候標(biāo)志位變化了,那還是得等到當(dāng)前if語句執(zhí)行完才能判斷 標(biāo)志位變化的if吧
回復(fù)

使用道具 舉報

ID:863657 發(fā)表于 2022-10-20 17:25 來自手機 | 顯示全部樓層
lkc8210 發(fā)表于 2022-10-20 16:26
用標(biāo)志位,不要用1ms以上的delay

好像明白了,每執(zhí)行一段程序就判斷一下標(biāo)志位,這樣就可以比較快的關(guān)機了
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2022-10-20 19:08 | 顯示全部樓層
zhaomin253 發(fā)表于 2022-10-20 15:25
哦原來如此,受教了,請問下,
那不用中斷,如何才能控制一個程序在運行中途突然關(guān)機呢,(不切斷電源, ...

參考一下:
sbit        KEY=P3^2;                //按鍵開關(guān)
bit                ON;                                //開機狀態(tài)標(biāo)志位
unsigned char        time_10ms=0x00;        //按鍵10mS延時變

while(1)
        {                                                                                                                                                
                if((time_10ms>=5)&&KEY)                                        //按鍵沒有按下,50mS進行一次處理
                {
                        if(!key_press)
                       {
                           ON=!ON;                                        //按鍵有效按下就開/關(guān)機
                           key_press=0;
                        }
                        if(!ON&&!key_press)                                                  //ON標(biāo)志位補清除,按鍵已經(jīng)處理,關(guān)機
                        {
                                PCON=0x02;                                                        //進入掉電模式
                                _nop_();_nop_();_nop_();_nop_();        //4個空指令
                                Mcu_Awaken();                                                  //單片機喚醒,自己可以寫一些自己需要的功能                       
                        }
                        time_10ms=0x00;                                                        //清除時間
                }       
        }

void Int0_isr() interrupt 0        //外部中斷0
{       
        key_press=1;                          //按下按鍵
        time_10ms=0x00;                          //從最后一次退出中斷開始計時
        IE0=0;
}

void T0_isr() interrupt        1
{
        if(time_10ms<250)time_10ms++;        //每10mS,time_10ms++一次
}
time_10ms是定時器中斷中++的全局變量.按鍵按下就清除
key_press是一個標(biāo)示,按鍵中斷按下就標(biāo)志,隨便按鍵怎么抖動,中斷只做這兩件事
主程序中的相關(guān)程序執(zhí)行,永遠是在if((time_10ms>=5)&&KEY)        這個條件下才會被執(zhí)行的,這就是一個去抖動的效果



回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2022-10-21 08:46 | 顯示全部樓層
只問一個問題:
在中斷服務(wù)程序中,執(zhí)行了【掉電模式】之后。如何喚醒呢?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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