在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)按鍵去抖動(dòng)的方法

CHANBAEK ? 來源:科創(chuàng)追夢者 ? 作者:謝士金 ? 2023-11-02 15:16 ? 次閱讀

在使用按鍵時(shí),我們想按一次按鍵,但在實(shí)際中卻經(jīng)常發(fā)現(xiàn)我們要的”一次“,實(shí)際上去并不是”一次“而可能是多次。為什么呢?這是因?yàn)椋覀兪褂玫?a href="http://www.xsypw.cn/v/tag/1472/" target="_blank">機(jī)械按鍵,在我們按下時(shí),并非只是接觸一次,因?yàn)榇嬖跈C(jī)械抖動(dòng),導(dǎo)致接觸多次。因此,按鍵檢測去抖動(dòng)就很有必要了。下面,我就向大家介紹按鍵去抖動(dòng)的方法。

一、STC15W408AS按鍵電路

圖片

二、按鍵按下和松開時(shí)的波形

下面的圖形中顯示的是按鍵按下和松開時(shí)的理想狀態(tài)和實(shí)際狀態(tài)。

圖片

三、按鍵去抖動(dòng)方法

理想波形:沒有按下為高電平,按下之后為低電平,松開之后又為高電平。

實(shí)際波形:按下之后,存在機(jī)械抖動(dòng),需要過一段時(shí)間才會(huì)穩(wěn)定成低電平,然后,松開時(shí)又會(huì)產(chǎn)生機(jī)械抖動(dòng)。機(jī)械式按鍵在按下或者釋放時(shí),由于機(jī)械彈性的影響,通常會(huì)伴隨有一定的時(shí)間觸電機(jī)械抖動(dòng),然后其觸電才穩(wěn)定下來。在觸點(diǎn)抖動(dòng)期間檢測按鍵的通與斷,可能會(huì)導(dǎo)致錯(cuò)誤,也就是有可能被認(rèn)為進(jìn)行了多次操作,這種情況是不允許出現(xiàn)的。

因此,在單片機(jī)檢測鍵盤是否按下都要加上去抖動(dòng)操作,按鍵少時(shí),可采用硬件消抖,按鍵較多時(shí),采用軟件消抖。

我們在編寫單片機(jī)的按鍵檢測程序時(shí),一般在檢測按下時(shí)加入去抖動(dòng)延時(shí)(10~20ms即可),也就是當(dāng)檢測到按鍵輸入口是低電平時(shí),延時(shí)20MS再檢測一次按鍵的狀態(tài)是不是還是低電平。如果還是低電平,則認(rèn)為按鍵被真正按下一次。

四、按鍵檢測去抖動(dòng)關(guān)鍵代碼

if(!GetKey_High()) //如果檢測到按鍵低電平

{

        Delay20ms(); //延時(shí)20MS

        if(!GetKey_High()) //如果還是檢測到按鍵低電平

        {

            bKeyDown=TRUE; //確認(rèn)按鍵已按下

            mNum++; //按鍵次數(shù)加1

        }

        while(!GetKey_High()); //等待按鍵松開

}



* //1MS定時(shí)中斷函數(shù)Timer0_ISR()

void Timer0_ISR (void) interrupt 1

{

        if(mDelay >0)//如果mDelay >0

        {

             mDelay--; //則中斷到來時(shí),mDelay減1

        }

}



* //20MS延時(shí)函數(shù)Delay20ms()

void Delay20ms(void)

{

        mDelay=20;            //設(shè)置mDelay的值為20

        while(mDelay >0);    //等待mDelay在中斷中減到0

}



* //500MS延時(shí)函數(shù)Delay500ms()

void Delay500ms(void)

{

        mDelay=500;

        while(mDelay >0);

}

五、本例完整源程序

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)      // 1 T模式

#define BIT0 0x01

#define BIT1 0x02

#define BIT2 0x04

#define BIT3 0x08

#define BIT4 0x10

#define BIT5 0x20

#define BIT6 0x40

#define BIT7 0x80



#define TRUE 1

#define FALSE 0



#define Pin_LED P32

#define Pin_LED_M1 P3M1

#define Pin_LED_M0 P3M0

#define Pin_LED_BIT BIT2

#define PinLed_High() Pin_LED=1

#define PinLed_Low() Pin_LED=0

#define Pin_KEY P12

#define Pin_KEY_M1 P1M1

#define Pin_KEY_M0 P1M0

#define Pin_KEY_BIT BIT2

#define GetKey_High() Pin_KEY==1

#define BOOL unsigned char

#define UINT unsigned int



void PinLED_DirOut(void);

void PinKEY_DirIn(void);

void Timer0_Init(void);

void Delay20ms(void);

void Delay500ms(void);

void LedFlash(UINT num);



BOOL bKeyDown=FALSE;

UINT mDelay=0;

UINT mNum=0;



void main(void)

{

        PinKEY_DirIn();

        PinLED_DirOut();

        PinLed_High();

        Timer0_Init();

        while(TRUE)

        {

            if(!GetKey_High())

            {

                Delay20ms();

                if(!GetKey_High())

                {

                      mNum++;

                      bKeyDown=TRUE;

                 }



               while(!GetKey_High());

           }



          if(bKeyDown)

          {

              bKeyDown=FALSE;

              LedFlash(mNum);         

          }

     }    

}



void PinKEY_DirIn(void)

{

        Pin_KEY_M1 &=~Pin_KEY_BIT;

        Pin_KEY_M0 &=~Pin_KEY_BIT;   

}



void PinLED_DirOut(void)

{

        Pin_LED_M1 &=~Pin_LED_BIT;

        Pin_LED_M0 |=Pin_LED_BIT; 

}



void Timer0_Init(void)

{

        AUXR |= 0x80;         //定時(shí)器0為1T模式

        TMOD = 0x00;          //設(shè)置定時(shí)器為模式0(16位自動(dòng)重裝載)

        TL0 = T1MS;           //初始化計(jì)時(shí)值

        TH0 = T1MS > > 8;

        TR0 = 1;              //定時(shí)器0開始計(jì)時(shí)

        ET0 = 1;              //使能定時(shí)器0中斷

        EA = 1;

}



// 1ms

void Timer0_ISR (void) interrupt 1

{

        if(mDelay >0)

        {

              mDelay--;

        }    

}



void Delay20ms(void)

{

        mDelay=20;

        while(mDelay >0);

}



void Delay500ms(void)

{

        mDelay=500;

        while(mDelay >0);

}



//為了方便檢驗(yàn)效果,我寫了下面這個(gè)LED閃動(dòng)函數(shù),第1次按下,LED閃動(dòng)1次,第2次按下,LED閃動(dòng)2次,依次類推。

void LedFlash(UINT num)

{

        UINT i;

        for(i=0;i< num;i++)

        {

               PinLed_Low();

               Delay500ms();

               PinLed_High();

               Delay500ms();

        }

}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6037

    文章

    44558

    瀏覽量

    635233
  • 去抖動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6343
  • 按鍵電路
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    21774
  • 按鍵檢測
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    4836
收藏 人收藏

    評論

    相關(guān)推薦

    單片機(jī)按鍵設(shè)計(jì)的方法,這幾個(gè)方案不錯(cuò)

    單片機(jī)按鍵設(shè)計(jì)的四個(gè)方案詳解在單片機(jī)系統(tǒng)里,按鍵是常見的輸入設(shè)備,在本文江介紹幾種按鍵硬件、軟件設(shè)計(jì)方面的技
    的頭像 發(fā)表于 01-06 07:05 ?1w次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>設(shè)計(jì)的<b class='flag-5'>方法</b>,這幾個(gè)方案不錯(cuò)

    單片機(jī)如何消除按鍵抖動(dòng)

    單片機(jī)如何消除按鍵抖動(dòng)
    發(fā)表于 10-21 09:29

    單片機(jī)按鍵檢測程序分享

    單片機(jī)按鍵檢測程序(定時(shí)器法消抖)相信大家在初學(xué)51單片機(jī)的時(shí)候按鍵檢測為了消抖都會(huì)加一些空循環(huán)做軟件延時(shí)。這樣做可是浪費(fèi)了CPU的不少資源。對于51這種低端
    發(fā)表于 12-03 07:23

    如何消除按鍵抖動(dòng)的影響

    按鍵抖動(dòng):在機(jī)械按鍵的觸點(diǎn)閉合和斷開時(shí),都會(huì)產(chǎn)生抖動(dòng),為了保證系統(tǒng)能正確識別按鍵的開關(guān),就必須對按鍵
    發(fā)表于 01-17 07:46

    STM32單片機(jī)按鍵消抖和FPGA按鍵消抖的相關(guān)資料分享

    寫在前面:STM32單片機(jī)按鍵消抖和FPGA按鍵消抖大全按鍵抖:由上圖可以看出理想波形與實(shí)際波形之間是有區(qū)別的,實(shí)際波形在按下和釋放的瞬間
    發(fā)表于 01-18 06:39

    單片機(jī)按鍵產(chǎn)生的抖動(dòng)是方波還是尖刺?

    單片機(jī) 按鍵產(chǎn)生的抖動(dòng)是方波還是尖刺
    發(fā)表于 11-08 07:03

    單片機(jī)按鍵處理總結(jié)——含程序詳解

    講述幾種常用的按鍵的應(yīng)用及程序處理方法,幫助大家掌握單片機(jī)處理按鍵方法
    發(fā)表于 11-10 10:55 ?11次下載

    單片機(jī)按鍵抖動(dòng)程序解析

    通常按鍵所用的開關(guān)都是機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上就穩(wěn)定的接通,在斷開時(shí)也不會(huì)一下子徹底斷開,而是在閉合和斷開的瞬間伴隨了一連串的抖動(dòng)
    發(fā)表于 11-15 14:45 ?2.7w次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b><b class='flag-5'>去</b><b class='flag-5'>抖動(dòng)</b>程序解析

    單片機(jī)按鍵防抖子程序詳情解說

    要解決單片機(jī)按鍵抖動(dòng)問題,首先要了解被鍵的類型,按鍵有觸點(diǎn)式和非觸點(diǎn)式兩種,單片機(jī)中應(yīng)用的- 一般是由機(jī)械觸點(diǎn)構(gòu)成的。在下圖中,當(dāng)開關(guān)未被按
    發(fā)表于 11-15 15:16 ?1.1w次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>防抖子程序詳情解說

    STM單片機(jī)中的按鍵消抖和FPGA消抖

    閉合的時(shí)間超過了 20ms。因此單片機(jī)在檢測鍵盤是否按下時(shí)都要加上去抖動(dòng)操作,有專用的抖動(dòng)電路,也有專門的
    的頭像 發(fā)表于 11-30 17:39 ?2729次閱讀

    單片機(jī)按鍵使用程序 (51單片機(jī)

    單片機(jī)獨(dú)立按鍵使用程序 (51單片機(jī))獨(dú)立按鍵單片機(jī)中很重要的一個(gè)器件,在這篇文章里,通過這個(gè)用獨(dú)立
    發(fā)表于 11-11 18:36 ?108次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>使用程序 (51<b class='flag-5'>單片機(jī)</b>)

    單片機(jī)按鍵檢測程序(定時(shí)器法消抖)

    單片機(jī)按鍵檢測程序(定時(shí)器法消抖)相信大家在初學(xué)51單片機(jī)的時(shí)候按鍵檢測為了消抖都會(huì)加一些空循環(huán)做軟件延時(shí)。這樣做可是浪費(fèi)了CPU的不少資源。對于51這種低端
    發(fā)表于 11-23 17:51 ?5次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>檢測程序(定時(shí)器法消抖)

    單片機(jī)學(xué)習(xí)-矩陣按鍵

    目錄矩陣按鍵介紹檢測方法C51例程歡迎加QQ及郵件交流矩陣按鍵介紹 獨(dú)立鍵盤與單片機(jī)連接時(shí),每一個(gè)按鍵都需要
    發(fā)表于 12-31 19:37 ?15次下載
    <b class='flag-5'>單片機(jī)</b>學(xué)習(xí)-矩陣<b class='flag-5'>按鍵</b>

    單片機(jī)零基礎(chǔ)入門(7):按鍵消抖--獨(dú)立按鍵按下點(diǎn)亮LED燈,松開LED燈滅--解決獨(dú)立按鍵抖動(dòng)的問題

    單片機(jī)零基礎(chǔ)入門(7):解決獨(dú)立按鍵抖動(dòng)的問題一、按鍵抖動(dòng)的原因二、解決按鍵
    發(fā)表于 01-17 11:05 ?6次下載
    <b class='flag-5'>單片機(jī)</b>零基礎(chǔ)入門(7):<b class='flag-5'>按鍵</b>消抖--獨(dú)立<b class='flag-5'>按鍵</b>按下點(diǎn)亮LED燈,松開LED燈滅--解決獨(dú)立<b class='flag-5'>按鍵</b><b class='flag-5'>抖動(dòng)</b>的問題

    STM32F407 按鍵抖動(dòng) 延時(shí)消抖

    按鍵抖動(dòng):在機(jī)械按鍵的觸點(diǎn)閉合和斷開時(shí),都會(huì)產(chǎn)生抖動(dòng),為了保證系統(tǒng)能正確識別按鍵的開關(guān),就必須對按鍵
    發(fā)表于 01-18 10:30 ?4次下載
    STM32F407 <b class='flag-5'>按鍵</b><b class='flag-5'>抖動(dòng)</b> 延時(shí)消抖
    主站蜘蛛池模板: video欧美性精品| 黄色视网站| 免费在线h视频| 午夜爽爽视频| 国产主播在线观看| 精品在线一区二区三区| 热re66久久精品国产99热| 色婷婷777| 永久在线免费| 5252a我爱haose01亚洲| 四虎最新网| 97人人插| 一区二区三区影视| 日本色网址| 手机在线免费观看视频| 黄网站在线观看永久免费| 免费一级做a爰片久久毛片| 天堂网www在线| 国产精品免费久久久免费| 久青草视频免费视频播放线路1| 视频在线精品| 成人a视频| 国产色av| 欧美性猛交xxxx乱大交高清| 色www| 天天操婷婷| 国产美女一级视频| 国产做a爰片久久毛片| 钻石午夜影院| 青草视频久久| 精品视频在线视频| 天堂资源在线种子资源| 4虎最新地址| 嗯!啊!使劲用力在线观看| 韩国在线a免费观看网站| 在线免费观看色片| 青草青青视频| 国产1024一区二区你懂的| 五月天婷婷在线视频| 天天摸夜夜爽| 亚洲国产婷婷综合在线精品|