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

QQ登錄

只需一步,快速開始

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

51單片機(jī)按鍵消抖方法介紹

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:591559 發(fā)表于 2019-8-11 09:52 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
由于在單片機(jī)在應(yīng)用系統(tǒng)中,更多的會(huì)用到獨(dú)立鍵盤,加之兩者的檢測(cè)原理基本相似,所以這一節(jié)里我主要講解獨(dú)立鍵盤的檢測(cè)原理及程序?qū)崿F(xiàn)的方法。
1、 按鍵的檢測(cè)原理
按鍵與單片機(jī)的連接如圖5所示,按鍵的一端與地相連,另一端直接與單片機(jī)的I/O口相連。此時(shí)我們?cè)诔绦蛑邢冉oI/O口賦值高電平,然后不斷的檢測(cè)I/O口電平的變化。當(dāng)按鍵沒有被按下時(shí),此I/O口的電平一直為高;當(dāng)按鍵被按下時(shí),由于按鍵的另一端直接與地相連,相當(dāng)于低電平,此時(shí)我們從I/O口讀出的即為高電平,程序一旦檢測(cè)到I/O口由高電平變?yōu)榈碗娖綍r(shí),說明按鍵被按下,此時(shí)馬上執(zhí)行相應(yīng)的動(dòng)作,這就是按鍵檢測(cè)的原理。

圖5 按鍵與單片機(jī)連接圖
2、 按鍵的抖動(dòng)與消除
由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng),與單片機(jī)I/O口相接的一端的電壓會(huì)出現(xiàn)相應(yīng)的變化,如圖6所示。
圖6 按鍵按下時(shí)電壓的變化情況
從圖6中我們可以看出,實(shí)際的電壓波形在按下松手的時(shí)候都會(huì)出現(xiàn)一定的抖動(dòng),經(jīng)過實(shí)驗(yàn)知道,這個(gè)一時(shí)間大概在5-10ms。所在在做單片機(jī)與按鍵相關(guān)的系統(tǒng)時(shí)必須考慮消抖的環(huán)節(jié)。按鍵消抖的方法有兩種,一個(gè)是硬件方法   一個(gè)是軟件的方法,而從節(jié)約成本和盡量簡(jiǎn)化硬件電路的角度出發(fā),一般是采用在程序中加上消抖的方法實(shí)現(xiàn),通常是采用延時(shí)的方法。具體的作法是:
檢測(cè)出鍵閉合后執(zhí)行一個(gè)延時(shí)程序,產(chǎn)生5ms~10ms的延時(shí),讓前沿抖動(dòng)消失后再一次檢測(cè)鍵的狀態(tài),如果仍保持閉合狀態(tài)電平,則確認(rèn)為真正有鍵按下。當(dāng)檢測(cè)到按鍵釋放后,也要給5ms~10ms的延時(shí),待后沿抖動(dòng)消失后才能轉(zhuǎn)入該鍵的處理程序。后面會(huì)結(jié)合到程序進(jìn)行講解。
下面我寫一個(gè)簡(jiǎn)單的程序,功能為:當(dāng)一個(gè)鍵按下時(shí),讓一個(gè)發(fā)光二極管發(fā)光,我們先看下按鍵模塊在實(shí)驗(yàn)板上的原理圖,如圖7和圖8所示。
圖7 發(fā)光二極管模塊原理圖
圖8 按鍵模塊原理圖
例1 按鍵檢測(cè)程序
//功能:當(dāng)按下S8鍵時(shí),L1燈發(fā)光,松手后,L1燈熄滅。相應(yīng)程序如例1.
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit D1=P1^0;
sbit S1=P3^4;

void main()
{
       P3=0xff;
       while(1)
       {
             if(S1==0)  //第一次檢測(cè)按鍵是否按下
delay(20);  //消除按下時(shí)的抖動(dòng)
if(S1==0)  //再次確定是否按下狀態(tài)
{
                 D1=0;   //如果是按下狀態(tài),執(zhí)行操作     
    while(!S1);    //檢測(cè)是否是按鍵彈起
                 delay(20);    //消除松開時(shí)的抖動(dòng)
}
              else
                     D1=1;           
       }
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:598462 發(fā)表于 2019-8-12 09:33 | 只看該作者
不錯(cuò)的技巧,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:109646 發(fā)表于 2019-8-12 09:55 | 只看該作者
這種程序在實(shí)際應(yīng)用中,最好不要用
回復(fù)

使用道具 舉報(bào)

地板
ID:208849 發(fā)表于 2019-8-12 14:47 | 只看該作者
用delay真的可以嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:370779 發(fā)表于 2019-8-30 17:24 | 只看該作者
較大的程序使用過多的delay,會(huì)占用單片機(jī)大量時(shí)間,建議采用定時(shí)器中斷或狀態(tài)機(jī)來消除抖動(dòng)。
回復(fù)

使用道具 舉報(bào)

6#
ID:600919 發(fā)表于 2019-8-30 21:28 | 只看該作者
使用延時(shí)會(huì)導(dǎo)致輸出信號(hào)的頻率不穩(wěn)定,之前用過
回復(fù)

使用道具 舉報(bào)

7#
ID:605321 發(fā)表于 2019-8-30 22:43 | 只看該作者
謝謝!
回復(fù)

使用道具 舉報(bào)

8#
ID:605321 發(fā)表于 2019-8-30 22:44 | 只看該作者
非常感謝分享!
回復(fù)

使用道具 舉報(bào)

9#
ID:385637 發(fā)表于 2019-8-31 10:53 | 只看該作者
新手都是這樣教的用delay,做多幾個(gè)項(xiàng)目就感覺這樣延時(shí)的弊端了
回復(fù)

使用道具 舉報(bào)

10#
ID:415088 發(fā)表于 2019-11-8 12:13 | 只看該作者
你的while()檢測(cè)在實(shí)際項(xiàng)目中是不行的,浪費(fèi)CPU
回復(fù)

使用道具 舉報(bào)

11#
ID:472300 發(fā)表于 2020-8-15 14:50 | 只看該作者
duanyazhou 發(fā)表于 2019-8-12 09:55
這種程序在實(shí)際應(yīng)用中,最好不要用

你好,能給說下原因么。是因?yàn)榈⒄`主程序循環(huán)時(shí)間么
回復(fù)

使用道具 舉報(bào)

12#
ID:808286 發(fā)表于 2020-8-16 14:58 | 只看該作者
奔兒霸 發(fā)表于 2020-8-15 14:50
你好,能給說下原因么。是因?yàn)榈⒄`主程序循環(huán)時(shí)間么

我也在學(xué)習(xí)51單片機(jī) delay在實(shí)際工程中是不適用的 我記得是使用delay的話 其他狀態(tài)會(huì)受影響,就是如果程序中間加了這種 delay 延時(shí)操作后,很可能某一事件發(fā)生了,但是我們程序還在進(jìn)行 delay 延時(shí)操作中,當(dāng)這個(gè)事件發(fā)生完了,程序還在 delay 操作中,當(dāng)我們 delay 完事再去檢查的時(shí)候,已經(jīng)晚了,已經(jīng)檢測(cè)不到那個(gè)事件了。
我用的方法是位檢測(cè),也是軟件檢測(cè),就是對(duì)按鍵不斷地掃描 當(dāng)八位全是1/0時(shí),表示按鍵的彈起/按下。
回復(fù)

使用道具 舉報(bào)

13#
ID:66287 發(fā)表于 2020-8-18 08:36 | 只看該作者
作為了解按鍵原理,程序可以用。但實(shí)際工程中不能使用delay(),程序傻傻的等待,什么正事干不了。建議用狀態(tài)機(jī)方式,準(zhǔn)確高效。
回復(fù)

使用道具 舉報(bào)

14#
ID:887235 發(fā)表于 2021-3-2 14:33 | 只看該作者
初學(xué)者表示學(xué)到了,謝謝樓主分享,也感謝評(píng)論中的前輩們的回復(fù)。
回復(fù)

使用道具 舉報(bào)

15#
ID:1080941 發(fā)表于 2023-5-30 18:00 | 只看該作者
初學(xué)者表示學(xué)到了,謝謝樓主分享,也感謝評(píng)論中的前輩們的回復(fù)。
回復(fù)

使用道具 舉報(bào)

16#
ID:140489 發(fā)表于 2023-5-31 08:19 | 只看該作者
這種程序在開發(fā)板上玩玩就行了,不要用到項(xiàng)目中去
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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