自學單片機第二十二篇:延時消抖

2020-12-14 小亮談電氣

按鍵的延時消抖是初學單片機的必經之路,因為只要是機械開關所傳遞的信號,都會存在波動,有時這些波動是「致命」的,所以消除其影響就是一門手藝了。硬體消抖有其優點,同樣的也有不方便的地方,開發成本高,操作難度大,可移植性差。軟體消抖就相對較好些,新手即可操作,延時消抖,並非消抖的最終最優方法,但好在簡單易懂,我們先認識消抖的方法和目的。

按鍵在按下和抬起時,都會出現短暫的抖動,稱之為前沿抖動和後沿抖動,他們持續的時間大致在5-10毫秒,鍵穩定時間會在100毫秒以上,就人的操作速度來看,鍵穩定的時間不會低於100毫秒,因為,1秒十次的操作,估計手都受不了。除非科幻世界或武俠世界的人。

既然抖動時間基本不變,那麼,我們就有這樣一種方法,當按鍵出現第一個電位變化,假設是高電位轉變成低電位,那麼我們就延時一段時間,設置10毫秒,10毫秒以後,我們再次判斷此時的電位狀態,是否是低電位,如果是低電位,那麼就認為按鍵按下了,如果是高電位,就認為按鍵是抖動。從低電位變成高電位也是一樣。

我們就是用延時來,把抖動的時間空過去了,這樣就不用擔心抖動產生的電位頻繁變化了。接下來,我們看下程序如何寫。

按流程來,基本上就能寫出來,程序分為兩大塊,一個是主函數,處理開關狀態,一個是延時函數。

我們先定義一個開關,然後我又聲明了一個位變量,其實這個位變量在這裡可以不用,不過習慣如此,對採集來的數據我習慣讓其保存在特定的變量中,這樣方便後期使用,以防自己改變變量值,造成埠的電位隨之改變。

主函數中,先把開關採集埠置1,這是讀取數據的前提條件,然後把需要採集的io的狀態轉移給中間變量,接著判斷此時中間變量是否為零,也就是按鍵是否按下,如果沒有按下,那就跳出,繼續賦值,接著判斷,直到判斷為零,進入語句中,先延時一段時間,讓抖動空過去,延時結束,再判斷一次,由於此時程序還沒走出去,所以中間變量的值也沒有實時切換,我們此時要判斷按鍵實時狀態是否為零,就需要判斷埠的實際值,當key10為零,就說明按鍵確實處於按下狀態,這就可以執行,移位指令。

需要說明,如果使用函數,在調用時,只需寫出函數名即可。但是在程序最開始位置,需要聲明函數,聲明時,要寫全,尤其是返回值的類型和變量名,不能省略。可以把函數直接複製到前方,然後加一個冒號即可。

程序看完,我們仿真一下測試下程序是否執行。

這是之前我們使用的仿真電路,直接使用就好。我沒有改變工程文件,所以無需重新導入可執行文件,程序會直接讀取我保存好的新的可執行文件,文件名沒有改變。

這是軟體的初始狀態,所有埠都是高電位,我們按下P10.

按鍵隨著按下,可以穩定的響應,我們再通過實際電路測試一下。

測試發現,我按下按鍵,還沒鬆手,就已經流水般的熄滅了5個燈了,什麼情況?

我們可以看程序的這裡

keybuff=key10; //賦值

if(keybuff==0) //判斷開關是否按下

{

delay(50); //延時一段時間

if(key10==0) //再次判斷開關是否按下

{

P3=P3>>1; //P3左移一位

}

}

從這一段可以看出,只要我能滿足keybuff為零,key10為零,那麼程序就會在延時結束再次進入程序,如此循環,就造成了,按鍵按下,P3被連續執行動作。我們怎麼才能讓這種情況不發生呢?這就需要我們不僅檢測按鍵按下,還需要檢測按鍵彈起,只有按鍵彈起我們才允許它執行下一步,這樣就能按下一次,抬起手,才會停止,保證了操作的準確。

執行流程如下:

判斷按鍵按下》按鍵按下》延時》判斷按鍵按下》按鍵按下》執行動作》判斷按鍵抬起》按鍵抬起》結束。

我們再次測試,此時發現,按下後,不鬆開,按鍵不再連續動作,但是鬆開按鍵後,原本熄滅的小燈又點亮了,我們梳理程序,可以發現,是不存在錯誤的,流程也沒有問題。其實這就涉及我們的硬體了,我們使用軟體仿真時,這些問題都是沒有的,但硬體跟仿真的區別就在這裡,在單片機中,如果我們沒有規定執行下一步的位置,單片機就會在流程走完後,隨機進入我們無法控制的流程,這在專業中稱之為跑飛。為了防止跑飛,我們一般會在結束添加循環語句,讓程序停止在我們設定的位置,這樣就不會有問題了。

此處我們需要連續監測按鍵狀態,所以就讓程序不斷的循環判斷按鍵即可。

再次測試,一切就按照程序執行了,動作也正常了。

這就是為什麼我們之前的測試程序,都會在主函數中添加循環的作用。通過這個示例,也是告訴大家,仿真只是學習的方法,最終目的還是要在實際的硬體上進行。不然你永遠不知道自己的程序能不能完成真正的功能,設計不能光紙上談兵哦。

相關焦點

  • 自學單片機第二十二篇:延時消抖
    按鍵的延時消抖是初學單片機的必經之路,因為只要是機械開關所傳遞的信號,都會存在波動,有時這些波動是"致命"的,所以消除其影響就是一門手藝了。硬體消抖有其優點,同樣的也有不方便的地方,開發成本高,操作難度大,可移植性差。軟體消抖就相對較好些,新手即可操作,延時消抖,並非消抖的最終最優方法,但好在簡單易懂,我們先認識消抖的方法和目的。
  • 自學單片機第二十二篇:按鍵消抖的重要性
    硬體消抖:1,使用RS觸發器電路消抖,想來不是專業也學不會,就不搞了。2,使用RC積分電路消抖,聽起來很專業,其實就是用電容和電阻組合來消除按鍵抖動的高頻波形,屬於濾波電路,這個好整,但是不好算,也不適合目前的我們。
  • 自學單片機第二十七篇:矩陣按鍵的硬體測試
    前幾篇我們也對硬體進行了測試,我們可以發現,仿真沒有問題,但是凡是按鍵開關,在實際應用中,都會出現按鍵按下響應不穩定的情況,我們稱之為抖動,在實際應用中,抖動的問題,是一定存在的,無論電路優化的多麼完美,那麼我們在現在這個階段,如何處理呢,依然是採用軟體延時消抖大法。
  • Arduino碰撞開關(按鈕傳感器)消抖秘籍第二招
    按鍵消抖通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由於機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產生這種現象而作的措施就是按鍵消抖。抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms。這是一個很重要的時間參數,在很多場合都要用到。
  • 碰撞開關(按鈕傳感器)消抖秘籍第一招
    消抖?你看到這個標題是不是有點懵?為什麼要消抖?我們先看一個實例,你就會感覺抖動的威力了。網絡上各路大神提供了N種方法,我逐一進行了試驗,本著服務初學者的原則,我這先提供最簡單的辦法,那就是延時,沒錯,讓程序先短路一下(中斷),或者說讓Arduino UNO暫停一下快速奔跑的腳步,等一下我這慢騰騰的手速,我們來看程序(圖3)。
  • 自學單片機第十篇:基礎知識--萬用表的使用
    #自學單片機##自學單片機第九篇:基礎知識--計算機基礎操作自學單片機第八篇:基礎知識--C語言基礎自學單片機第七篇:基礎知識--物理<電學部分>
  • 自學單片機第九篇:基礎知識--計算機基礎操作
    #自學單片機#往期文章自學單片機第八篇:基礎知識--C語言基礎自學單片機第五篇:TSC-ISP軟體自學單片機第四篇:proteus pro軟體
  • 自學單片機第十二篇上:首次測試設備——軟體測試
    由於準備比較多,講得儘可能詳細,所以分為兩篇,上篇是軟體測試,下篇是硬體測試。所有材料:1,安裝軟體的電腦,至少安裝了keil和ISP,keil用於編輯程序,ISP用於把程序下載到單片機中。沒有這兩個,我們即使首次測試成功,接下來的學習也會很艱難。
  • 自學單片機第二十八篇:標準化有什麼好處
    但是使用中,更多的是沒有標準可以尋找的,例如我們寫延時函數用的:delay();寫小燈輸出用的led,寫按鍵掃描用的key();這些都是可以自己制定的。個人建議,可以是有首字母全拼,尾字母縮寫,例:延時》YanS,消抖》XiaoD,按鍵處理》AnJCL。當然只是個人建議,重要的是要有自己的套路,這樣才不會迷失在自己的代碼中。對於一些通用的代碼,我們還是儘量採用大家都明白的名稱,例如延時,儘量採用delay,這樣,你在借鑑別人程序時,方便自己去理解。
  • 自學單片機第二十九篇:標準鍵盤的應用
    掃描流程依然是,先分行置零,然後對讀到的鍵值進行消抖,接著判斷鍵值是否標準,然後依據鍵值做出動作。由於我們沒有學習中斷,所以就簡單些的應用來說明問題。使用兩種同種類的鍵盤來分別展示。這裡將消抖放在了主函數中,是為了看起來更加清楚,方便了解其工作原理,如果想要簡潔一些,可以將消抖部分,放在按鍵處理函數中。不影響按鍵掃描。按鍵處理函數中的P0輸出,是我隨機寫的,沒有實際含義,主要是讓不同的按鍵按下顯示不同的現象,用於判斷按鍵是否正常被掃描到了。
  • 自學單片機第三十二篇:光線可調檯燈上篇
    例如delay就是一個延時函數,多數同學在書寫時,都會使用delay來代表延時函數,當然也有同學使用yanshi來直接用的,沒有問題,怎麼寫完全看自己。不過代碼如果還需要交到隊友手裡的話,最好還是約定好名稱的定義規則,以免造成代碼寫好了,卻讀起來很困難。最後一行就是一個延時函數的聲明,記著,函數有返回值得需要在聲明中加上,不能省略。
  • 自學單片機第五十九篇:按鍵的短按和長按
    在按鍵的消抖上使用了延時函數,不用增加難度,滿足實際使用即可。接著是仿真下,看下運行情況。首先是上電後狀態。所有埠均處於初始狀態,屬於高電位,由於位選針腳需要觸發才會置地,所以此時也是高電位。接著快速單擊下按鍵,時間在一秒內,看下狀態。一格分度值是0.5秒,可以看出,我按下按鍵的時間是0.8秒左右,所以,第一個數碼管點亮,同時輸出0。
  • 自學單片機第十三篇下:單點交通燈
    今天這篇文章,我們來通過一個僅靠延時函數,來實現下交通燈。這裡會讓大家先熟悉下正常的函數如何使用。我們之前的延時函數其實有些粗糙了,不過能達到要求也就無所謂了。首先看下函數的形式。不止是延時函數,很多程序結構,我們都可以寫出函數的形式,然後在主函數中完成調用即可,有利於閱讀,也有利於修改。上圖的函數,我就不演示仿真了,想看的可以自己寫過後,通過下載或軟體進行仿真,現象是一樣的。這篇我們主要是實現交通信號燈。
  • 自學單片機第十一篇:基礎知識--電工常識
    自學單片機第十篇:基礎知識--萬用表的使用
  • 自學單片機第五十二篇:定時器
    我們在試用單片機時,總有些時間需要對某些步驟進行適當的延時,一般的,都是用了延時函數,通過之前的使用,發現延時函數簡單實用,但是有一點需要知道的是,延時函數,我們並不能很好的保證時間的準確度,只能儘可能的大致估算出時間範圍,對於一些要求不嚴格的延時,是沒有問題的,但是如果我需要一個精確的1秒或者1分鐘延時,怎麼辦?反覆通過軟體去測量?
  • 寧波涉豐巢櫃投訴暴增8成 市消保委倡議:暫停延時收費
    中國寧波網記者 劉挺「豐巢」快遞櫃與消費者服務糾紛事件引發社會高度關注,今天,記者從寧波市消保委快遞服務消費評議會上了解到這樣三組數據:2019.1.1-2019.12.31,寧波12345政務服務熱線中心共接到快遞投訴1235件,其中豐巢(蜂巢)快遞櫃投訴15件;
  • 自學單片機第十四篇中:流水燈
    然後再給以一定時間的延時,就會看到流水燈了。如果我們不賦初值0xfe會出現什麼情況?就會出現,移位產生一個0,在或運算時就會被重新置1,如此循環,就進入不到第二個LED,也就不會出現流水燈了。可以自己嘗試下。
  • 自學單片機知識積累:按鍵開關
    因為信號的讀取中,不僅有按鍵開關,還有些比如浮球測液位,限位開關測位置,都會存在一些臨界狀態,類似於抖動,所以學習消抖很有必要。不過關於消抖的程序,會在以後開關輸入讀取中介紹。
  • 亞太電信組織無線工作組第二十二次會議順利閉幕
    2017年9月25日至29日,亞太電信組織(APT)無線工作組第二十二次會議(AWG-22)在韓國釜山召開。會議就24GHz以上5G新增頻率、6GHz以下IMT頻率亞太使用方案、鐵路車地無線通信、智能交通、物聯網、無線充電、公共安全和減災、無線電監測等內容進行了討論。
  • 用手機拍延時,這麼拍才炫酷!
    我今天推薦的這個小物品就非常適合於延時、車流、微距的使用場合。價格不貴,但是很實用。花草樹木隨著四季的更替瘋狂變化生長,那就是延時攝影。幾乎每臺手機都自帶延時攝影這個功能,也就是說,每個人都可以拍出簡單粗暴、炫酷大氣的延時攝影作品!延時攝影怎麼拍?拍攝延時視頻,前期的準備必不可少。