新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于單片機按鍵的抖動與消抖

關(guān)于單片機按鍵的抖動與消抖

作者: 時間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
單片機的程序中,如果涉及到按鍵,一般都會看到幾行注釋著“消抖”的代碼。
比如下面這一段:

if((KeyV|0xc3)==0xff){//無鍵按下
return 0;
}
mDelay(10);//延時,去鍵抖
KeyV=P3;
if((KeyV|0xc3)==0xff){//無鍵按下
return 0;
}

關(guān)于其作用與目的,有如下解釋:
按鍵在按下時會產(chǎn)生電平的變化,通常是由高電平變?yōu)榈碗娖?,而且這一過程也不是瞬間完成的,按鍵按下之后,電平會有一段不穩(wěn)定變化的時間。一般情況下,我們的程序讀取這個電平變化并做相關(guān)的動作。但由于機械按鍵的局限性,當系統(tǒng)受到外力而產(chǎn)生抖動或其它動作時,也可能使系統(tǒng)內(nèi)部產(chǎn)生電平變化(通常這種變化持續(xù)的時間非常短),這種現(xiàn)象稱之為按鍵的“抖動”。
這種“抖動”顯然不是我們期望出現(xiàn)的,一旦程序中沒有針對它進行特殊處理,這種隱患很可能導(dǎo)致系統(tǒng)執(zhí)行我們不希望出現(xiàn)的動作。進而可能釀成一場悲劇。避免按鍵“抖動”的操作就稱之為“消抖”。
目前,單片機的消抖主要分為軟件消抖和硬件消抖。
其中,軟件消抖增加軟件資源,但不增加硬件成本;硬件消抖反之。
現(xiàn)在普遍采用的是軟件消抖的方式。

軟件消抖具體的操作思路是:
當監(jiān)聽到按鍵被按下時,不立刻執(zhí)行相關(guān)的操作,而進行一定時間的延時(通常是50ms),之后再次檢測按鍵是否被按下,如果此時按鍵仍然被按下,則判定按鍵確實被按下了(因為不論是異常情況導(dǎo)致的抖動還是正常情況下按鍵被按下產(chǎn)生的電平變化都會在這一段時間內(nèi)過去,緊接著的電平將會是穩(wěn)定的),然后進行按鍵被按下之后所需要的操作,否則判定按鍵未被按下,繼續(xù)監(jiān)聽按鍵狀態(tài)。
實際上,以上所說的軟件消抖的方法在真正的軟件中應(yīng)用的不多,只是在練習(xí)的時候使用。真正的應(yīng)用上,會在可能產(chǎn)生抖動的那一段時間內(nèi)等間隔多次監(jiān)聽按鍵狀態(tài)(電流狀態(tài)),等到數(shù)次(可以是連續(xù)5次)電流平穩(wěn)了才確定按鍵被按下。按鍵被放開時采取同樣操作。這樣才不會產(chǎn)生誤差,例如在延時的時候出現(xiàn)按鍵按下并放卡的情況會被漏過。

硬件消抖的思路則是采用相關(guān)手段去除最初產(chǎn)生的那不穩(wěn)定的電平變化,只輸出后面穩(wěn)定的電平。
具體的實現(xiàn)方法有以下兩種:

法1:
用10K的上拉電阻與按鍵串聯(lián),然后按鍵并聯(lián)一個去抖電容用以消除按鍵的機械抖動。電容的計算方法如下:電容的容值是根據(jù)機械按鍵的觸點抖動頻率而定,一般機械按鍵的抖動頻率為100Hz左右,當按鍵閉合抖動時接觸時間在毫秒級,根據(jù)電容放電的時間t=0.7×√RCR=10K,C選0.1μF,電容的充放電時間約20ms,大于抖動時間,可將抖動濾除掉。通常電容C選取0.01μF~1μF.

法2:
在鍵數(shù)較少時可用硬件方法消除按鍵抖動。下圖所示的RS觸發(fā)器為常用的硬件去抖。


圖中兩個“與非”門構(gòu)成一個RS觸發(fā)器。當按鍵未按下時,輸出為1;當按鍵按下時,輸出為0.此時即使用按鍵的機械性能,使按鍵因彈性抖動而產(chǎn)生瞬時斷開(抖動跳開B),按鍵不返回原始狀態(tài)A,雙穩(wěn)態(tài)電路的狀態(tài)不改變,輸出保持為0,不會產(chǎn)生抖動的波形。也就是說,即使B點的電壓波形是抖動的,但經(jīng)雙穩(wěn)態(tài)電路之后,其輸出為正規(guī)的矩形波。這一點通過分析RS觸發(fā)器的工作過程很容易得到驗證。



關(guān)鍵詞: 單片機按鍵抖動與消

評論


技術(shù)專區(qū)

關(guān)閉