<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

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

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

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

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

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


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



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>