張紅軍 賀州學(xué)院數(shù)學(xué)與計(jì)算機(jī)學(xué)院
在我國(guó)常見(jiàn)的單片機(jī)控制電路設(shè)計(jì)中,由于機(jī)械的特殊性導(dǎo)致其在投產(chǎn)中并不能夠達(dá)到理想的效果。在電路設(shè)計(jì)預(yù)期效果中,其想要達(dá)到按鍵按下則點(diǎn)位遍地,按鍵釋放則點(diǎn)位變高,如圖1所示。但是在實(shí)際操作中,通常是機(jī)械按鍵按下后經(jīng)過(guò)多次高低電位的變化后才變成持續(xù)穩(wěn)定的低電壓,按鍵經(jīng)過(guò)多次釋放后才能夠慢慢恢復(fù)到想要的穩(wěn)定高電壓。當(dāng)這個(gè)變化過(guò)程必然經(jīng)過(guò)高低壓的震動(dòng),因此我們將這個(gè)過(guò)程稱(chēng)之為抖動(dòng)。抖動(dòng)時(shí)間通常為6-12ms,在設(shè)計(jì)時(shí)取值為8ms。也正是因?yàn)槎秳?dòng)的產(chǎn)生,所以雖然只按了一次鍵,但是實(shí)際上機(jī)器已經(jīng)接收了多次按鍵。如果使用單片機(jī)控制按鍵+1電路,如果不消除抖動(dòng),則數(shù)碼管的顯示次數(shù)會(huì)非常多,進(jìn)而導(dǎo)致數(shù)碼管顯示數(shù)據(jù)出現(xiàn)抖動(dòng)現(xiàn)象。如果噪音的干擾較為嚴(yán)重,及時(shí)沒(méi)有人為操作,也會(huì)使單片機(jī)因?yàn)楦蓴_噪音的出現(xiàn)而自動(dòng)運(yùn)行,進(jìn)而造成操作失誤現(xiàn)象的產(chǎn)生。這種失誤將會(huì)造成非常大的瞬時(shí),所以在消抖程序中加入抗干擾程序是必須要進(jìn)行的程序。本文以單片機(jī)按鍵+1的電路為例子,敘述C語(yǔ)言抗干擾消抖的程序設(shè)計(jì)。
圖1 理想波形圖
消除抖動(dòng)的方式有兩種,一種是硬件,另一種是軟件。其中,硬件消除抖動(dòng)的方式也分為RS硬件消抖、電容濾波消抖、中斷法消抖三種形式。硬件消除抖動(dòng)可以編寫(xiě)消抖程序,并將其運(yùn)用到元件、電路板、成本等環(huán)節(jié)中,就可以實(shí)現(xiàn)消抖。通過(guò)軟件消抖可以借助高低電平變化來(lái)實(shí)現(xiàn)。以下是具體的消抖程序介紹:
硬件消抖就是將抖動(dòng)消除在信號(hào)輸入之前,這樣就可以節(jié)省資源,提高系統(tǒng)對(duì)于信號(hào)的感知力。
運(yùn)用兩個(gè)與非門(mén)構(gòu)成一個(gè)RS硬件,再利用其記憶作用消除抖動(dòng)對(duì)于及其的作用力。當(dāng)開(kāi)關(guān)每切換一次,輸出端就進(jìn)行一次操作,進(jìn)而消除抖動(dòng)的影響。
1.1.2 電容濾波消抖
使用RS鎖存器進(jìn)行消抖,只能夠在單刀雙擲開(kāi)關(guān)中取得良好的效果。在當(dāng)前常用的鍵盤(pán)中,常常是兩個(gè)接線端的按鍵。針對(duì)這一按鍵的特征,可以將電容并聯(lián)到案件中,利用平波的方式進(jìn)行調(diào)整,從而消除脈沖波。
1.1.3 中斷法消抖
每個(gè)案件都需要與外部中斷口相連接,當(dāng)對(duì)按鍵進(jìn)行按動(dòng)時(shí),可以引起單片機(jī)的中斷,進(jìn)而消除抖動(dòng)。這種方法可以不用在主程序中進(jìn)行查詢,只需要中斷之后再處理相應(yīng)的問(wèn)題即可。缺點(diǎn)就是單片機(jī)的中斷是非常有價(jià)值的,一旦發(fā)生中斷將會(huì)導(dǎo)致數(shù)據(jù)丟失,因此當(dāng)前對(duì)于這種消抖方法比較少用。
有上述可知,如果采用硬件消抖的方式對(duì)單片機(jī)進(jìn)行消抖,則N個(gè)按鍵就必須要進(jìn)行N個(gè)防抖程序設(shè)計(jì)。所以,當(dāng)按鍵比較多的時(shí)候,硬件防抖程序?qū)o(wú)法進(jìn)行操作,這也暴露出了硬件消抖的弊端。在這種情況下,可以選取軟件的方式進(jìn)行防抖。軟件消抖是采用降低鍵盤(pán)輸入端口的接收信號(hào)頻率,從而將高頻抖動(dòng)變化成低頻抖動(dòng),一旦發(fā)現(xiàn)案件閉合,就進(jìn)行8s的延時(shí),讓前一個(gè)抖動(dòng)小時(shí)候則再一次進(jìn)入檢測(cè)的狀態(tài),如果仍在閉合狀態(tài),則確認(rèn)是否有按鍵按下。當(dāng)按鍵釋放后再進(jìn)行8s的延時(shí),當(dāng)抖動(dòng)全部消失后轉(zhuǎn)入處理程序。一般程序代碼如下所示:
如果程序是if(v==0)的狀態(tài)則證明按鍵發(fā)生了變化,繼續(xù)進(jìn)行下一步驟
在程序出現(xiàn)delay的狀態(tài)時(shí)經(jīng)歷8s延時(shí),經(jīng)歷按鍵抖動(dòng)
當(dāng)if(v==0)時(shí)進(jìn)行第二次檢測(cè)按鍵狀態(tài)
然后執(zhí)行下面程序
結(jié)束
可以通過(guò)QR1的數(shù)值判斷按鍵是否經(jīng)歷過(guò)按下或是釋放。QR1;在延時(shí)8s后按下抖動(dòng)期后再次判斷,如果QR=0則是人為操作,如果QR≠0則證明其他原因干擾導(dǎo)致的。因此在程序流程設(shè)計(jì)中,可以按照如下步驟來(lái)設(shè)計(jì):
第一步設(shè)立為開(kāi)始,按鍵是否按下,如果是延時(shí)8s,若不是返回。延時(shí)8s后進(jìn)行第二次的按鍵是否按下檢查,如果是則繼續(xù),如果不是則返回到第一步。當(dāng)?shù)诙螜z查后進(jìn)行按鍵是否釋放的檢查,如若是,則延時(shí)8s,如果否則返回第二次按鍵是否按下的檢查中。當(dāng)延時(shí)8s后檢查按鍵是否釋放,如若是進(jìn)行接下來(lái)的按鍵是否釋放檢查;如若不是則返回上億步按鍵是否釋放的檢查中。如若按鍵已經(jīng)全部釋放則進(jìn)行執(zhí)行功能程序段的檢查,最后結(jié)束。
在C語(yǔ)言下的抗干擾消抖按鍵程序電路設(shè)計(jì)中,充分考慮了消抖按鍵程序的實(shí)際使用情況,并針對(duì)抗干擾程序的運(yùn)行等問(wèn)題對(duì)于電路設(shè)計(jì)進(jìn)行了適當(dāng)?shù)恼{(diào)整,具體電路設(shè)計(jì)圖如下所示:
圖3 電路設(shè)計(jì)圖
可以通過(guò)上述的電路設(shè)計(jì)和流程設(shè)計(jì),設(shè)定抗干擾消抖按鍵程序如下所示:
綜上所述,只要將執(zhí)行功能程序段的設(shè)計(jì)稍微改動(dòng)一下,就可以將原本的按鍵釋放后數(shù)碼顯示管顯示,改變?yōu)榘存I按下后數(shù)碼顯示管顯示。同理,將本程序稍微改動(dòng)一下,也可以將+1的電路變?yōu)?1的電路。
[1] 印健健. 基于C語(yǔ)言的抗干擾消抖按鍵程序設(shè)計(jì)[J]. 數(shù)字技術(shù)與應(yīng)用, 2015,10(8):185-186
[2] 程佳佳. 基于VHDL的按鍵消抖程序設(shè)計(jì)[J]. 科教導(dǎo)刊:電子版, 2017,7(24):222-223
[3] 楊張利. 按鍵消抖程序設(shè)計(jì)在單片機(jī)中的運(yùn)用[J]. 科技致富向?qū)? 2014,1(20):267-268
[4] 侯玉寶, 陳忠平, 鄔書(shū)躍. 51單片機(jī)C語(yǔ)言程序設(shè)計(jì)經(jīng)典實(shí)例[M]. 電子工業(yè)出版社, 2016,2(7):00012-00015