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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2369|回復: 19
收起左側

按鍵加減為什么會出現兩次1 附單片機程序

[復制鏈接]
ID:302293 發表于 2023-5-24 11:22 | 顯示全部樓層 |閱讀模式
/********************************************************************
* 文件名  : 獨立按鍵.c
* 描述    :  該程序實現獨立按鍵去控制 LED燈 的亮滅,并講訴了對按鍵的處理方法。
                         獨立按鍵相應的IO口平時為高電平,一旦按鍵按下,單片機便檢測到低電平。
                         按下P3.2,P0.0口對應的LED亮滅交替變化。
                         按下P3.3,P0.1口對應的LED亮滅交替變化。
                         按下P3.4,P0.2口對應的LED亮滅交替變化。
* 創建人  : 東流,2009年8月27日
* 版本號  : 1.0
***********************************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define u8 unsigned char
sbit KEY1 = P3^2;   
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;

sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sfr P4 =0Xe8;
sbit P4_0 = P4^0;
u8 cost=0;
/********************************************************************
* 名稱 : Delay()
* 功能 : 延時,延時時間為 10ms * del
* 輸入 : del
* 輸出 : 無
***********************************************************************/
void Delay(uint del)
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<1827; j++)   
        ;
}

/********************************************************************
* 名稱 : Delay()
* 功能 : 實現按鍵功能,當按鍵按下時,相應的LED亮滅交替
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void KEY()
{
        if(KEY1==0 || KEY2==0 || KEY3==0)        
        {
//                Delay(2);                            //20毫秒軟件防抖
                if(KEY1 == 0)
                {
                Delay(2);
                 P4_0  = 0 ;                //LED顯示取反
             cost++;                  
         SBUF= cost;
                 while(!TI);TI=0;
                }
if(KEY2 == 0)
                {                        
                P4_0 = 1;
                cost--;
                         SBUF= cost;
                           while(!TI);TI=0;
                }
                else
                {                        
                        LED3 = !LED3;
                }
                Delay(50);                        //延時0.5秒再進行下次按鍵的檢測
        }        
}

/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void InitUART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
//              // TMOD: timer 1, mode 2, 8-bit 重裝
    TMOD |= 0x21;    //T1方式2、T0方式1
        TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
    TL1 = 0xFD;      //波特率
        TR1   = 1;                  // TR1:  timer 1 打開                        
    IE |= 0x92;      //開啟中斷
        EA    = 1;                  //打開總中斷
//    ES    = 1;                  //打開串口中斷
}                           

  初始時按鍵按下,計數器出現兩次1,或者不累加是什么問題?


/********************************************************************
* 名稱 : Main()
* 功能 : 實現按鍵控制LED的亮滅
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main(void)
{
        
        InitUART();
        while(1)
        {
                 KEY();
        }
}

捕獲.PNG
回復

使用道具 舉報

ID:526543 發表于 2023-5-24 12:29 | 顯示全部樓層
可能是由于按鍵的按下動作引起了按鍵的抖動
回復

使用道具 舉報

ID:302293 發表于 2023-5-24 15:51 | 顯示全部樓層
123456ZXC1 發表于 2023-5-24 12:29
可能是由于按鍵的按下動作引起了按鍵的抖動

但是后面再按就沒有抖動了,只是初始時有這樣的情況
回復

使用道具 舉報

ID:1079614 發表于 2023-5-24 17:22 | 顯示全部樓層
按鍵1的消抖再判斷之后的里面的那個延時去掉看看還有沒有
回復

使用道具 舉報

ID:1079614 發表于 2023-5-24 17:23 | 顯示全部樓層
sr861126 發表于 2023-5-24 15:51
但是后面再按就沒有抖動了,只是初始時有這樣的情況

按鍵1消抖后里面的延時去掉看看還有沒有
回復

使用道具 舉報

ID:202023 發表于 2023-5-24 18:41 | 顯示全部樓層
你這程序是沒copy全,還是就是這樣, SBUF,TI,都沒看到定義。難到不會報錯。另建議key,不要用p3.2,P3.3,p3.4.因為這幾個IO有第二功能,在用這幾個io時就有可能和其他沖突,程序肯定不會報錯,但可能會有莫名奇妙的問題產生。
回復

使用道具 舉報

ID:213173 發表于 2023-5-24 21:18 | 顯示全部樓層
描述與按鍵代碼不一致,你這代碼近乎長短按,短按響應一次,長按每隔0.5秒重復響應。延時消抖被注釋掉了,移放在不恰當的位置。
回復

使用道具 舉報

ID:624769 發表于 2023-5-24 22:21 | 顯示全部樓層
和按鍵抖動無關, 如果抖動了, 發送前 肯定會 ++ 或者 -- 一次, 絕對有別的代碼,  所謂的 發兩次1 是要發 2 的時候被 -1 了,  看你那個  5 后面  發了個3 就知道, 肯定有個地方在  - cost
回復

使用道具 舉報

ID:302293 發表于 2023-5-25 07:56 | 顯示全部樓層
188610329 發表于 2023-5-24 22:21
和按鍵抖動無關, 如果抖動了, 發送前 肯定會 ++ 或者 -- 一次, 絕對有別的代碼,  所謂的 發兩次1 是要發 2  ...

別人的地方沒有--,初始時是0,按理說按一次就加1,但是按了2次才加1,后面按就正常按一次加1
回復

使用道具 舉報

ID:302293 發表于 2023-5-25 08:28 | 顯示全部樓層
188610329 發表于 2023-5-24 22:21
和按鍵抖動無關, 如果抖動了, 發送前 肯定會 ++ 或者 -- 一次, 絕對有別的代碼,  所謂的 發兩次1 是要發 2  ...

  按一次,抖動了出現了兩個“1”
捕獲.PNG
回復

使用道具 舉報

ID:302293 發表于 2023-5-25 08:43 | 顯示全部樓層
huaruolong 發表于 2023-5-24 18:41
你這程序是沒copy全,還是就是這樣, SBUF,TI,都沒看到定義。難到不會報錯。另建議key,不要用p3.2,P3.3 ...

沒有關系,還是抖動的問題
回復

使用道具 舉報

ID:302293 發表于 2023-5-25 08:45 | 顯示全部樓層
123456ZXC1 發表于 2023-5-24 12:29
可能是由于按鍵的按下動作引起了按鍵的抖動

是抖動,剛上電按下出現抖動,后面按就沒有抖動了
回復

使用道具 舉報

ID:302293 發表于 2023-5-25 08:59 | 顯示全部樓層
sr861126 發表于 2023-5-25 08:43
沒有關系,還是抖動的問題

為什么消不掉呢
回復

使用道具 舉報

ID:302293 發表于 2023-5-25 10:11 | 顯示全部樓層
A-set 發表于 2023-5-24 17:23
按鍵1消抖后里面的延時去掉看看還有沒有

去掉延時是一樣de
回復

使用道具 舉報

ID:384109 發表于 2023-5-25 10:28 | 顯示全部樓層
找個例程看看防抖怎么做吧,暫時看是防抖沒做好,或者說沒做防抖
回復

使用道具 舉報

ID:330059 發表于 2023-5-25 20:01 | 顯示全部樓層
按鍵代碼需要做消抖處理
回復

使用道具 舉報

ID:624769 發表于 2023-5-26 00:05 | 顯示全部樓層
sr861126 發表于 2023-5-25 08:28
按一次,抖動了出現了兩個“1”

你明白抖動的意思么?
按你的代碼,如果按鍵抖動,應該按一次后,連續發出 01,02  甚至還有 03
但是,你是發兩次  01, 說明,運行了兩次  SBUF = cost, 卻沒有運行兩次 cost++,所以和抖動沒有任何關系。
回復

使用道具 舉報

ID:213173 發表于 2023-5-26 08:47 | 顯示全部樓層
188610329 發表于 2023-5-26 00:05
你明白抖動的意思么?
按你的代碼,如果按鍵抖動,應該按一次后,連續發出 01,02  甚至還有 03
但是, ...

同意17樓意見,雖然樓主按鍵代碼寫得......,但問題核心不在于此。在于串口初始化函數被胡亂開啟中斷。眾所周知,T1作為波特率發生器就得禁止定時器1中斷。否則就可能發生不可預測的錯誤。按如下設置問題迎刃而解。
void InitUART(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數據,可變波特率
        TMOD |= 0x20;                //設置定時器模式
        TL1 = 0xFD;                //設置定時初始值
        TH1 = 0xFD;                //設置定時重載值
        ET1 = 0;                //禁止定時器1中斷
        TR1 = 1;                //定時器1開始計時
}
回復

使用道具 舉報

ID:45879 發表于 2023-5-26 09:23 | 顯示全部樓層
沒細看程序,完按鍵,記得檢測按鍵松開
回復

使用道具 舉報

ID:1079863 發表于 2023-5-26 14:26 | 顯示全部樓層
按鍵加減時出現兩次1的情況通常是由于按鍵抖動引起的。按鍵抖動是指在按下或釋放按鍵時,由于機械性質或電氣接觸不穩定等原因,導致按鍵信號在短時間內多次切換狀態。這種抖動可能會導致單片機在檢測按鍵狀態時誤認為按鍵被按下了兩次。  為了解決按鍵抖動問題,可以在軟件中使用適當的按鍵消抖算法。一種常用的按鍵消抖方法是使用軟件延時和狀態判斷的組合。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天躁人人躁人人躁狂躁 | 99国产精品99久久久久久粉嫩 | 欧美黄色精品 | 中文一区二区 | 爱爱视频在线观看 | 亚洲成人一区 | 欧美高清免费 | 六月成人网 | 野狼在线社区2017入口 | 在线三级网址 | 中国黄色在线视频 | 亚洲不卡在线观看 | 国产成人精品久久久 | 一级黄色毛片 | 成人在线视频免费观看 | 成人做爰www免费看视频网站 | 国产日韩欧美在线 | 日韩欧美国产精品一区 | 久久一区视频 | 日韩av在线播 | 久久蜜桃av一区二区天堂 | 成人欧美一区二区三区1314 | a国产视频 | 日本在线免费看最新的电影 | 中文一区二区 | 精品欧美二区 | 欧美综合精品 | 日韩一二区| 欧美性网站 | 中文天堂在线一区 | 久久99精品久久久97夜夜嗨 | 96国产精品久久久久aⅴ四区 | 黄色国产视频 | 久久精品亚洲 | 在线观看中文字幕视频 | 成人深夜小视频 | 亚洲欧美综合精品另类天天更新 | 欧美成人精品在线观看 | 日韩和的一区二区 | 91秦先生艺校小琴 | 亚洲一区二区久久 |