龔松顯,王殷廷,張愛(ài)民
(總參通信訓(xùn)練基地,宣化075100)
在單片機(jī)控制系統(tǒng)中,對(duì)按鍵操作進(jìn)行去抖動(dòng)處理,是整個(gè)系統(tǒng)設(shè)計(jì)中必須考慮的一個(gè)重要問(wèn)題。目前常用的去鍵抖動(dòng)設(shè)計(jì)方法與對(duì)應(yīng)的硬件環(huán)境結(jié)合較為緊密,考慮到單片機(jī)硬件種類(lèi)繁多,此實(shí)現(xiàn)方法可移植性差。文章通過(guò)使用定時(shí)器中斷,在軟件程序中實(shí)現(xiàn)了對(duì)按鍵抖動(dòng)的處理,程序代碼可以在不同的單片機(jī)硬件環(huán)境中快速移植,縮短了項(xiàng)目開(kāi)發(fā)的周期,增加項(xiàng)目的靈活性。
單片機(jī)應(yīng)用系統(tǒng)中的按鍵通常為機(jī)械彈性開(kāi)關(guān),由于機(jī)械觸點(diǎn)的彈性作用,其在實(shí)際的閉合及斷開(kāi)瞬間,常常會(huì)產(chǎn)生如圖1所示的一連串電壓的抖動(dòng)[1]。對(duì)按鍵處理的重要環(huán)節(jié)就是去抖動(dòng),即去除鍵按下和抬起瞬間的電壓抖動(dòng)問(wèn)題。如果對(duì)抖動(dòng)不做任何處理,則會(huì)引起程序的誤操作,對(duì)整個(gè)系統(tǒng)產(chǎn)生較大的負(fù)面影響。
圖1 按鍵電壓抖動(dòng)波形
對(duì)于常用的8051單片機(jī),如果使用的是下降沿觸發(fā)中斷的工作方式,則在電壓低于0.7V時(shí)會(huì)產(chǎn)生一次觸發(fā)。在圖1中,如果A點(diǎn)的電壓高于0.7V,則在鍵按下的過(guò)程中會(huì)觸發(fā)單片機(jī)產(chǎn)生兩次中斷。在鍵釋放的階段,如果B點(diǎn)的電壓高于0.7V,而C點(diǎn)電壓低于0.7V,同樣會(huì)觸發(fā)單片機(jī)產(chǎn)生兩次中斷。按鍵抖動(dòng)的時(shí)間長(zhǎng)短與按鍵的機(jī)械特性、操作人員的按鍵動(dòng)作和習(xí)慣有關(guān),一般而言,認(rèn)為抖動(dòng)的時(shí)間大概為5~10ms。按鍵抖動(dòng)會(huì)導(dǎo)致一次按鍵被誤判為多次,為了確保對(duì)按鍵動(dòng)作的正確處理,必須去除按鍵抖動(dòng)。
按鍵抖動(dòng)的硬件消除方法有很多,如R-S去抖、積分型去抖、翻轉(zhuǎn)式去抖等[2],其設(shè)計(jì)原理在大量論文及書(shū)籍中均有介紹,這里不再贅述。硬件實(shí)現(xiàn)的方法只適合按鍵數(shù)目比較少、對(duì)項(xiàng)目要求比較高的情況。在實(shí)際的項(xiàng)目中,考慮到電路的復(fù)雜程度以及成本、體積等問(wèn)題,常用的方法是軟件去抖動(dòng)[3],其思路是:在按鍵處理程序中首先執(zhí)行一個(gè)延時(shí)函數(shù)產(chǎn)生5~10ms的延時(shí),在前沿抖動(dòng)消失后檢測(cè)按鍵的狀態(tài),如果保持閉合狀態(tài)電平,則認(rèn)為真正有按鍵被按下。當(dāng)檢測(cè)到按鍵釋放后同樣進(jìn)行延時(shí)處理,讓后沿抖動(dòng)消失后才轉(zhuǎn)入該鍵的處理代碼。以外部中斷的按鍵為例,代碼的一種C語(yǔ)言實(shí)現(xiàn)如下[4-5]:
采用以上軟件去抖動(dòng)的方法存在以下兩個(gè)問(wèn)題:
①在代碼實(shí)現(xiàn)中,延時(shí)子函數(shù)空循環(huán),消耗了單片機(jī)CPU的時(shí)間,造成資源的浪費(fèi),程序的效率不高。
②代碼的可移植性不高。按鍵抖動(dòng)的時(shí)間取決于按鍵的機(jī)械特性,按鍵開(kāi)關(guān)的抖動(dòng)波形、抖動(dòng)次數(shù)、抖動(dòng)時(shí)間都是隨機(jī)的,不同的按鍵抖動(dòng)時(shí)間不同;不同的操作者按鍵動(dòng)作習(xí)慣也會(huì)導(dǎo)致抖動(dòng)的時(shí)間不同。綜合考慮以上因素,如果單片機(jī)系統(tǒng)的硬件有變化,或者代碼有移植的需求,則在新的硬件環(huán)境中必須對(duì)延時(shí)子函數(shù)進(jìn)行調(diào)試,找出適合該硬件系統(tǒng)的延時(shí)時(shí)間,而這將增加程序調(diào)試的時(shí)間成本,不利于在不同硬件系統(tǒng)中進(jìn)行快速移植。
結(jié)合系統(tǒng)設(shè)計(jì)時(shí)對(duì)正常按鍵頻率的考慮,比如最快0.5s按鍵一次,可以在程序中使用定時(shí)器來(lái)控制按鍵抖動(dòng)。具體的思路是:在軟件中定義一個(gè)全局變量,設(shè)定其初始值為0。當(dāng)按鍵中斷處理程序被調(diào)用時(shí),首先讀取該全局變量的值。如果變量值為0,即此時(shí)是第一次檢測(cè)按鍵抖動(dòng),將該變量置為1,同時(shí)啟動(dòng)定時(shí)器并進(jìn)行按鍵事件的處理;如果由于按鍵抖動(dòng)導(dǎo)致按鍵中斷處理程序被重復(fù)調(diào)用時(shí),在該全局變量的值為1的情況下就跳過(guò)按鍵事件處理代碼。另一方面,在定時(shí)器的中斷處理程序中,經(jīng)過(guò)設(shè)定的時(shí)間后將該全局變量重置為0,保證程序?qū)ο乱淮伟存I的正確處理。程序的流程圖如圖2所示。
圖2 程序流程圖
采取以上處理方法,雖然按鍵抖動(dòng)會(huì)導(dǎo)致中斷處理程序被反復(fù)調(diào)用,但在定時(shí)器設(shè)定的時(shí)間內(nèi),中斷程序?qū)嵸|(zhì)上只處理第一次按鍵事件,避免了對(duì)按鍵事件的重復(fù)處理以及使用延時(shí)子函數(shù)造成的空循環(huán),提高了CPU的執(zhí)行效率。當(dāng)工程的硬件環(huán)境有變動(dòng)時(shí),根據(jù)項(xiàng)目對(duì)按鍵使用的要求,開(kāi)發(fā)人員只需根據(jù)具體情況更改定時(shí)器的預(yù)設(shè)值即可,程序的其他部分保持不變,這樣就提高了程序的可移植性。程序框架的一種C語(yǔ)言實(shí)現(xiàn)如下:
筆者在工程項(xiàng)目中驗(yàn)證了該設(shè)計(jì)方法實(shí)際可行,具有較好的靈活性和可移植性,對(duì)于類(lèi)似的單片機(jī)去抖程序的開(kāi)發(fā)具有一定的借鑒意義。
[1] 曾旖,奚大順,李向陽(yáng).按鍵開(kāi)關(guān)的抖動(dòng)與消除方法[J] .電子世界,2005(9):55-56.
[2] 方龍,肖獻(xiàn)保,李威.關(guān)于消除按鍵機(jī)械抖動(dòng)的研究[J] .廣西輕工業(yè)計(jì)算機(jī)與技術(shù),2008,1(1):92-105.
[3] 肖廣安.一種軟件去除鍵抖動(dòng)的方法[J] .單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2001(7):63-65.
[4] 王為青,程國(guó)鋼.單片機(jī)Keil C51應(yīng)用開(kāi)發(fā)技術(shù)[M] .北京:人民郵電出版社,2007.
[5] 劉文濤.MCS-51單片機(jī)培訓(xùn)教程[M] .北京:電子工業(yè)出版社,2005.
單片機(jī)與嵌入式系統(tǒng)應(yīng)用2014年1期