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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2734|回復: 13
收起左側

單片機系統的暫停與恢復問題

[復制鏈接]
ID:811381 發表于 2022-5-16 21:24 | 顯示全部樓層 |閱讀模式
我想做個系統,要求單片機在任意時刻,按下按鍵系統暫停,再次按下按鍵的時候恢復繼續執行。我用了2種方法都有問題。
方法一:中斷和按鍵用的同一個引腳(部分程序,中斷開啟在初始化中做了)
bit temp;
sbit key=P3^2;
void int0() interrupt 0
{
       temp=1;
       while(temp==1)
       {
               if(key==0)
              {
                      delay(10);
                      if(key==0)
                     {
                            temp=0;
                            while(key==0);
                     }
              }
       }
}
方法二:掉電模式
void int0() interrupt 0      
{   
        uint x=0;
        IT0=0;
        EX0=0;
        while(k1==0)
        {
                x++;
                delay(10);
                if(x>=1000)
                {
                         PCON=0;
                }                  
        }
        if(x<1000)
        {
                IT0=1;
                EX0=1;
                PCON=0x02;
                delay(10);
        }              
}
回復

使用道具 舉報

ID:811381 發表于 2022-5-16 21:43 | 顯示全部樓層
方法二是參考的其他朋友的程序
回復

使用道具 舉報

ID:123289 發表于 2022-5-17 10:28 | 顯示全部樓層
做個奇偶控制器,為奇CPU進行休眠,為偶CPU退出休眠。
奇偶控制器的奇偶,由按鍵產生中斷的奇偶次數控制。
回復

使用道具 舉報

ID:584814 發表于 2022-5-17 13:47 | 顯示全部樓層
什么問題呢 ? 是按下鍵后沒人送茶么 ?
回復

使用道具 舉報

ID:624769 發表于 2022-5-17 13:54 | 顯示全部樓層
單片機, 是不存在暫停的, 要起到看上去"暫停"的效果, 要么讓他 在一個地方 傻跑, 要么休眠。你的兩個思路都對,但是代碼都有問題。

方法一:中斷和按鍵用的同一個引腳(部分程序,中斷開啟在初始化中做了)
注意: IT0 =1
sbit key=P3^2;
void int0() interrupt 0
{

       unsigned char i;
       while((IE0) || (!key))
       {
               IE0 = 0;
               i = 200;
               while(--i);
       }  //消抖 & 釋放按鍵
       while(!IE0);        //暫停現象
       while((IE0) || (!key))
       {
               IE0 = 0;
               i = 200;
               while(--i);
       }  //消抖 & 釋放按鍵
}


方法二:掉電模式    注意: IT0 =1
由于,STC15系列,部分機型 中斷中用PCON = 0x02; 會有意外,所以,掉電模式最好配合主程序使用。

bit Pause_Stats;
sbit key=P3^2;


void int0() interrupt 0      //必須要有
{   

               EX0 = 0;   //關中斷
}

void main()
{
       unsigned char i;
     IT0 = 1;
     EX0 = 0;   //關中斷
     EA  = 1;
  while(1)
  {
         if(IE0)
         {
               while((IE0) || (!key))
              {
                       IE0 = 0;
                       i = 200;
                       while(--i);
               }  //消抖 & 釋放按鍵
                EX0 = 1;     //開中斷
                 PCON=0x02;      //休眠           
                _nop_();
                _nop_();
                while((IE0) || (!key))
               {
                       IE0 = 0;
                       i = 200;
                       while(--i);
                }  //消抖 & 釋放按鍵
           }
}
回復

使用道具 舉報

ID:811381 發表于 2022-5-17 16:06 | 顯示全部樓層
188610329 發表于 2022-5-17 13:54
單片機, 是不存在暫停的, 要起到看上去"暫停"的效果, 要么讓他 在一個地方 傻跑, 要么休眠。你的兩個思路都 ...

謝謝,我研究下
回復

使用道具 舉報

ID:811381 發表于 2022-5-25 14:18 | 顯示全部樓層
188610329 發表于 2022-5-17 13:54
單片機, 是不存在暫停的, 要起到看上去"暫停"的效果, 要么讓他 在一個地方 傻跑, 要么休眠。你的兩個思路都 ...

您好,您的方法一,進入中斷后標志位不是自動清零的么?為什么還要手動IE0=0呢?然后當IE0=0時就原地等待,那么再次按下按鍵時,怎么退出中斷返回繼續執行的呢?沒太懂,您的程序我驗證了,就是沒太明白您的設計思想
回復

使用道具 舉報

ID:811381 發表于 2022-5-25 14:28 | 顯示全部樓層
188610329 發表于 2022-5-17 13:54
單片機, 是不存在暫停的, 要起到看上去"暫停"的效果, 要么讓他 在一個地方 傻跑, 要么休眠。你的兩個思路都 ...

請教您下,方法二中, 中斷喚醒的時候自動對PCON清零么?不需要手動對PCON清零么?
回復

使用道具 舉報

ID:624769 發表于 2022-5-25 14:30 | 顯示全部樓層
的事發生的 發表于 2022-5-25 14:18
您好,您的方法一,進入中斷后標志位不是自動清零的么?為什么還要手動IE0=0呢?然后當IE0=0時就原地等待 ...

是的,IE0 會自動清0,但是98%以上的按鍵會有 “抖動” 所以 IE0 會又被置1,所以手動 清IE0 ,以及 判斷IE0 都是為了一個目的,那就是“消抖”, 大多數牽涉到按鍵的代碼,如果能確保 按鍵 不會有 “抖動”, 那么,代碼都會簡潔的多。
回復

使用道具 舉報

ID:624769 發表于 2022-5-25 14:35 | 顯示全部樓層
的事發生的 發表于 2022-5-25 14:28
請教您下,方法二中, 中斷喚醒的時候自動對PCON清零么?不需要手動對PCON清零么?

PCON = 0x02; 即給 PCON.1   位 置1 這個動作,只有1瞬間,作用是讓單片機休眠,但是,PCON.1 永遠不會變成1, 即任何時候,你讀 PCON.1 得到的 都是0, 所以,不存在給 PCON.1 清零的問題。
回復

使用道具 舉報

ID:811381 發表于 2022-5-26 17:54 | 顯示全部樓層
188610329 發表于 2022-5-25 14:30
是的,IE0 會自動清0,但是98%以上的按鍵會有 “抖動” 所以 IE0 會又被置1,所以手動 清IE0 ,以及 判斷I ...

中斷中while(!IE0);這條語句是等待 ,就死到中斷里面了,再次按下按鍵,IE0還是為零,怎么實現的再次按下按鍵跳出中斷返回繼續執行程序的呢?
回復

使用道具 舉報

ID:811381 發表于 2022-5-26 17:55 | 顯示全部樓層
明白了,非常感謝您的解惑
回復

使用道具 舉報

ID:624769 發表于 2022-5-26 20:02 | 顯示全部樓層
的事發生的 發表于 2022-5-26 17:54
中斷中while(!IE0);這條語句是等待 ,就死到中斷里面了,再次按下按鍵,IE0還是為零,怎么實現的再次按下 ...

=>中斷中while(!IE0);這條語句是等待 ,就死到中斷里面了,再次按下按鍵,IE0還是為零,怎么實現的再次按下按鍵跳出中斷返回繼續執行程序的呢?
程序死在 while(!IE0);  達到你要的“暫停”效果,直到你再次按下按鍵后,打破這個死循環,然后進行后面的消抖后,跳出中斷。程序恢復運行。
回復

使用道具 舉報

ID:811381 發表于 2022-5-27 16:55 | 顯示全部樓層
188610329 發表于 2022-5-26 20:02
=>中斷中while(!IE0);這條語句是等待 ,就死到中斷里面了,再次按下按鍵,IE0還是為零,怎么實現的再次按 ...

哦,我以為第一次進入中斷暫停死到里面了,下次按鍵打斷中斷,進去后IE0仍為0,還退不出來中斷。看起來是我對具體的過程理解有誤,非常感謝您的解惑
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品视频在线观看 | 日韩午夜| 天天看夜夜 | 在线看片网站 | 91精品国产乱码久久久久久久久 | 色婷婷精品 | 国产精品免费一区二区三区四区 | 日本高清不卡视频 | 精品久久久久久久久久久院品网 | 国产高清视频在线 | 免费看a | 精品一区二区三区四区外站 | 天天综合国产 | 五月婷婷在线视频 | 天天久| 一区二区三区在线免费观看视频 | 国产亚洲精品精品国产亚洲综合 | 天天夜夜人人 | 免费骚视频 | 九九久久精品 | 久久精品国产亚洲a | 91精品国产91久久久久久丝袜 | 久久久国产精品一区 | 免费久久精品视频 | 亚洲欧美日韩系列 | 亚洲精品视频免费 | 婷婷五月色综合香五月 | 午夜欧美a级理论片915影院 | 精品久久久一区二区 | 国产免费一区二区 | 久久久久亚洲精品中文字幕 | 日本黄色免费视频 | 成人福利在线视频 | 国产精品一区二区三区在线 | av免费观看在线 | 一区二区三区视频在线观看 | 欧美精品二区 | 男女羞羞视频免费看 | 精品一区二区三区日本 | 日韩一二三区视频 | 色一级片|