欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機C語言按鍵功能切換有問題,沒法實現(xiàn)兩種功能的多次切換

[復(fù)制鏈接]
ID:838962 發(fā)表于 2023-5-10 11:49 | 顯示全部樓層 |閱讀模式
#include <reg51.h>        

sbit led = P1^0;        
sbit speaker= P1^1;
sbit key = P2^1;


void main()               
{
        key = a;
        if(key == 1)
        {
        unsigned int delay;
        while(1){        
                led = 1;        
                speaker = 0;
                delay = 20000;
                while(delay--);               
                led = 0;
    speaker = 1;               
                delay = 20000;
                while(delay--);        
        }        
        }
        else
        {
                led = 0;
                speaker = 0;
  }
}


回復(fù)

使用道具 舉報

ID:526108 發(fā)表于 2023-5-10 14:33 | 顯示全部樓層
用函數(shù)指針啊
回復(fù)

使用道具 舉報

ID:1043290 發(fā)表于 2023-5-10 15:49 | 顯示全部樓層
不知道你要實現(xiàn)什么功能,修改While條件判斷,防止按鍵按下之后進入死循環(huán)。

void main()               
{
        key = a;
        if(key == 1)
        {
        unsigned int delay;
        led = 1;  

        delay = 20000;
       }
        else  //這里最好不要加什么判斷,因為單片機都是死循環(huán)的,里面的值容易和后面的進行互鎖
       {
               // led = 0;  
               // speaker = 0;
  }
        while(led ){
                speaker = 0;
                while(delay--);
       if(delay==0)
        {
            speaker=1;
            led=0;
            delay = 20000;
               }

               }

      while(speaker )
  {

while(delay--);
       if(delay==0)
            speaker=0;
               }

}

回復(fù)

使用道具 舉報

ID:1043290 發(fā)表于 2023-5-10 15:51 | 顯示全部樓層
按鍵切換建議自己標(biāo)定幾個狀態(tài)(變量),按下之后把KeyUp==1,然后用if(KeyUp==1){
回復(fù)

使用道具 舉報

ID:1043290 發(fā)表于 2023-5-10 16:07 | 顯示全部樓層
按鍵掃描的話很多例子,在網(wǎng)上可以搜搜。
比如很簡單的:
定義按鍵狀態(tài):
u8 KeyUp=0;
u8 KeyDown=0;
假設(shè)需要觸發(fā)按鈕:
int Main()
{
unsigned int delay=20000;
sbit led = P1^0;        
sbit speaker= P1^1;
sbit key = P2^1;
  /***這里是外設(shè)初始化和時鐘初始化***/
  While(1)
  {
    if(KEY==1)
    {
        KeyDown=1;
        delay=20000;
    }
   else
   {
     KeyDown=0;
    /*這里清零狀態(tài),等等*/

   }

//執(zhí)行按鍵按下的動作
  if(KEY==1&KeyDown==1)//一般這里增加消抖會好點
  {
     //這里添加要用的代碼,比如設(shè)置動作等等
    led=1;點燈
    speaker = 0;
    //延時;
   While(delay--);
  //關(guān)燈
    led=0;點燈    speaker = 1;
    delay=20000;
    While(delay--);

  }

  }

}

以上邏輯用在死等延時,不死等延時的話重新考慮狀態(tài)即可;


回復(fù)

使用道具 舉報

ID:838962 發(fā)表于 2023-5-10 16:19 | 顯示全部樓層
huxiaolin 發(fā)表于 2023-5-10 15:49
不知道你要實現(xiàn)什么功能,修改While條件判斷,防止按鍵按下之后進入死循環(huán)。

void main()               ...

做的是一個接收信號做出反應(yīng)的報警裝置,仿真上就只能使用直接連接電源做模擬了,開關(guān)部分就是信號輸入端,開關(guān)按下就是有故障,要求是正常情況下無反應(yīng),開關(guān)按下led閃爍,斷開就還原成初始態(tài)。沒要求具體使用什么傳感器,仿真的模擬上就是直接給高電平,所以也不需要消抖那些。
回復(fù)

使用道具 舉報

ID:1043290 發(fā)表于 2023-5-10 16:29 | 顯示全部樓層
spom 發(fā)表于 2023-5-10 16:19
做的是一個接收信號做出反應(yīng)的報警裝置,仿真上就只能使用直接連接電源做模擬了,開關(guān)部分就是信號輸入端 ...

按我后面給的那版試試,不要在else里面死鎖實時狀態(tài)。
回復(fù)

使用道具 舉報

ID:838962 發(fā)表于 2023-5-10 16:57 | 顯示全部樓層
huxiaolin 發(fā)表于 2023-5-10 16:29
按我后面給的那版試試,不要在else里面死鎖實時狀態(tài)。

已解決了,代碼如下
我把按鍵值的檢測放到while語句里面,然后加個return避免卡在死循環(huán)里。
#include <reg51.h>       
#define uchar unsigned char
#define uint unsigned int

sbit led = P1^0;       
sbit speaker= P1^1;
sbit key = P2^1;


void main()               
{
        key=0;
        led=0;
        speaker=0;
        {
        unsigned int delay;
        while(1){       
                if(key == 1)
                {
                led = 1;       
                speaker = 0;
                delay = 20000;
                while(delay--);               
                led = 0;
    speaker = 1;               
                delay = 20000;
                while(delay--);       
                }
                return;
        }       
        }
}
回復(fù)

使用道具 舉報

ID:1043290 發(fā)表于 2023-5-10 17:11 | 顯示全部樓層
spom 發(fā)表于 2023-5-10 16:57
已解決了,代碼如下
我把按鍵值的檢測放到while語句里面,然后加個return避免卡在死循環(huán)里。
#include  ...

嗯嗯,裸機的話上電是循環(huán)執(zhí)行的,在While里面。你之前那種,初始化IO外設(shè)都沒執(zhí)行完,if是做不了判斷的。基本就死機了。然后哪個return我沒搞懂吶,加了的話應(yīng)該也沒啥用,單片機主函數(shù)沒有用到返回值的,應(yīng)該不用的
回復(fù)

使用道具 舉報

ID:838962 發(fā)表于 2023-5-10 19:47 | 顯示全部樓層
huxiaolin 發(fā)表于 2023-5-10 17:11
嗯嗯,裸機的話上電是循環(huán)執(zhí)行的,在While里面。你之前那種,初始化IO外設(shè)都沒執(zhí)行完,if是做不了判斷的 ...

沒return的話程序會卡在循環(huán)里面,因為考慮到?jīng)]收到信號(開關(guān)斷開)的時候要恢復(fù)初始狀態(tài),如果說手動復(fù)位的話在題目的要求上感覺不太合理。甚至說可以手動復(fù)位的話最開始的那串代碼就已經(jīng)能用了。
回復(fù)

使用道具 舉報

ID:838962 發(fā)表于 2023-5-10 19:50 | 顯示全部樓層
huxiaolin 發(fā)表于 2023-5-10 17:11
嗯嗯,裸機的話上電是循環(huán)執(zhí)行的,在While里面。你之前那種,初始化IO外設(shè)都沒執(zhí)行完,if是做不了判斷的 ...

最開始只考慮到閃爍的部分,那時候的想法是P2^!端口有兩個狀態(tài)嘛,一個低電平就是正常情況下,高電平就是工作狀態(tài),然后0態(tài)即初始態(tài)就是else部分,
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2023-5-11 10:35 | 顯示全部樓層
零延時,零等待
2023-05-11_103357.png


回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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