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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1919|回復: 11
收起左側

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

[復制鏈接]
ID:838962 發表于 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;
  }
}


回復

使用道具 舉報

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

使用道具 舉報

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

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

        delay = 20000;
       }
        else  //這里最好不要加什么判斷,因為單片機都是死循環的,里面的值容易和后面的進行互鎖
       {
               // 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;
               }

}

回復

使用道具 舉報

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

使用道具 舉報

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

   }

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

  }

  }

}

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


回復

使用道具 舉報

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

void main()               ...

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

使用道具 舉報

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

按我后面給的那版試試,不要在else里面死鎖實時狀態。
回復

使用道具 舉報

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

已解決了,代碼如下
我把按鍵值的檢測放到while語句里面,然后加個return避免卡在死循環里。
#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;
        }       
        }
}
回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表