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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1465|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#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;
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:526108 發(fā)表于 2023-5-10 14:33 | 只看該作者
用函數(shù)指針啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:1043290 發(fā)表于 2023-5-10 15:49 | 只看該作者
不知道你要實(shí)現(xiàn)什么功能,修改While條件判斷,防止按鍵按下之后進(jìn)入死循環(huán)。

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

        delay = 20000;
       }
        else  //這里最好不要加什么判斷,因?yàn)閱纹瑱C(jī)都是死循環(huán)的,里面的值容易和后面的進(jì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ù)

使用道具 舉報(bào)

地板
ID:1043290 發(fā)表于 2023-5-10 15:51 | 只看該作者
按鍵切換建議自己標(biāo)定幾個(gè)狀態(tài)(變量),按下之后把KeyUp==1,然后用if(KeyUp==1){
回復(fù)

使用道具 舉報(bào)

5#
ID:1043290 發(fā)表于 2023-5-10 16:07 | 只看該作者
按鍵掃描的話很多例子,在網(wǎng)上可以搜搜。
比如很簡(jiǎn)單的:
定義按鍵狀態(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è)初始化和時(shí)鐘初始化***/
  While(1)
  {
    if(KEY==1)
    {
        KeyDown=1;
        delay=20000;
    }
   else
   {
     KeyDown=0;
    /*這里清零狀態(tài),等等*/

   }

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

  }

  }

}

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


回復(fù)

使用道具 舉報(bào)

6#
ID:838962 發(fā)表于 2023-5-10 16:19 | 只看該作者
huxiaolin 發(fā)表于 2023-5-10 15:49
不知道你要實(shí)現(xiàn)什么功能,修改While條件判斷,防止按鍵按下之后進(jìn)入死循環(huán)。

void main()               ...

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

使用道具 舉報(bào)

7#
ID:1043290 發(fā)表于 2023-5-10 16:29 | 只看該作者
spom 發(fā)表于 2023-5-10 16:19
做的是一個(gè)接收信號(hào)做出反應(yīng)的報(bào)警裝置,仿真上就只能使用直接連接電源做模擬了,開關(guān)部分就是信號(hào)輸入端 ...

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

使用道具 舉報(bào)

8#
ID:838962 發(fā)表于 2023-5-10 16:57 | 只看該作者
huxiaolin 發(fā)表于 2023-5-10 16:29
按我后面給的那版試試,不要在else里面死鎖實(shí)時(shí)狀態(tài)。

已解決了,代碼如下
我把按鍵值的檢測(cè)放到while語句里面,然后加個(gè)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ù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

12#
ID:161164 發(fā)表于 2023-5-11 10:35 | 只看該作者
零延時(shí),零等待



回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品麻豆 | 久久精品二区 | 亚州av | 日韩国产高清在线观看 | 国产美女在线观看 | 毛片免费在线 | 成人精品一区二区 | 欧美日产国产成人免费图片 | h视频在线播放 | 亚洲免费一 | 欧美一区二区三区四区视频 | 国产一区二区三区 | 中文字幕免费视频 | 欧美激情欧美激情在线五月 | 欧美日韩高清一区二区三区 | 一区二区免费在线 | 亚洲视频在线观看 | 天天操天天插天天干 | 国产成人综合一区二区三区 | 国产日韩欧美一区 | 国产男女猛烈无遮掩视频免费网站 | 91夜色在线观看 | 日韩视频免费看 | 九色在线视频 | 成人久久一区 | 亚洲一区中文字幕在线观看 | 91精品国产综合久久久动漫日韩 | 99re热这里只有精品视频 | 国产精品国产a级 | 精品久久亚洲 | 中文字幕 亚洲一区 | 精品99在线 | 黄色免费在线网址 | a级在线| 天天射天天操天天干 | www狠狠干 | 亚洲精品久久久一区二区三区 | 日本粉嫩一区二区三区视频 | 欧美精品福利视频 | 亚洲天堂av网 | 成人黄色在线观看 |