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

2020-12-08 小亮談電氣

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

按鍵在按下和抬起時,都會出現短暫的抖動,稱之為前沿抖動和後沿抖動,他們持續的時間大致在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被連續執行動作。我們怎麼才能讓這種情況不發生呢?這就需要我們不僅檢測按鍵按下,還需要檢測按鍵彈起,只有按鍵彈起我們才允許它執行下一步,這樣就能按下一次,抬起手,才會停止,保證了操作的準確。

執行流程如下:

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

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

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

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

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

相關焦點

  • 自學單片機第七篇:基礎知識--物理<電學部分>
    自學單片機第一篇:用材準備自學單片機第二篇:硬體準備自學單片機第三篇:keil軟體自學單片機第四篇:proteus pro軟體那麼多自學單片機,為什麼最後很多都放棄了?
  • 碰撞開關(按鈕傳感器)消抖秘籍第一招
    消抖?你看到這個標題是不是有點懵?為什麼要消抖?我們先看一個實例,你就會感覺抖動的威力了。先把測試神器拿出來,在一個Aruduino UNO主板(為了方便,用上了擴展板)的3號數字管腳上外接了一個按鈕傳感器(碰撞開關),如圖1所示:
  • 自學單片機第十四篇下:操作2——運算方法
    當然還有很多的運算方法,我們先介紹這幾個,接下來的程序中會使用到,如果有什麼疑問可以返回這篇文章查看以下,當然,要是有更好的建議或想法,歡迎留言或私信給我。往期文章:自學單片機第十四篇上:操作2——總線輸出
  • 一個簡單的按鍵去抖延時程序
    按鍵去抖,一般採用普通延時,如if((GPIOC->IDR & 0x01)== 0){ delay_ms(20); if(GPIOC-
  • 自學單片機知識積累:為什麼要加頭文件include?
    自學單片機第十二篇番外:首次測試——軟體仿真自學單片機第十二篇下:首次測試設備——硬體自學單片機第十二篇上:首次測試設備——軟體測試
  • 自學單片機第五十二篇:定時器
    我們在試用單片機時,總有些時間需要對某些步驟進行適當的延時,一般的,都是用了延時函數,通過之前的使用,發現延時函數簡單實用,但是有一點需要知道的是,延時函數,我們並不能很好的保證時間的準確度,只能儘可能的大致估算出時間範圍,對於一些要求不嚴格的延時,是沒有問題的,但是如果我需要一個精確的1秒或者1分鐘延時,怎麼辦?反覆通過軟體去測量?
  • 自學單片機第五十六篇:定時器問題回答
    從原來的進入中斷執行程序,到現在的,我們在主程序中,來執行這些操作,這樣就可以把中斷變成一個函數外的程序了,像是延時一樣,不過不用引用,只用判斷TF0就可以了,把TF0當成一個延時來用就好。而且很精確的延時。
  • 《開心消消樂》姊妹篇《消消樂海濱假日》正式上架
    《開心消消樂》的姊妹篇《消消樂海濱假日》正式登陸移動平臺,遊戲以藍天碧海為背景,將玩家帶入一個歡樂的海濱樂園之中,在這裡你可以捕捉魚群、漫步(微博)沙灘,當然還有可口的飲品等著各位。作為《開心消消樂》的姊妹篇,《消消樂海濱假日》帶著新鮮的體驗和滿滿的誠意跟您見面啦,讓消除遊戲再次風靡!
  • 邢臺市第二十二中學2020年公開招聘見習教師公告
    教師招聘邢臺市第二十二中學2020年公開招聘見習教師公告 邢臺市第二十二中學是一所公辦初級中學, 2015年初由上級部門批准為邢臺市高校畢業生就業見習基地 五、報名方式及時間 1.填寫邢臺市第二十二中學高校畢業生就業見習申請表(見附件1,點擊最下方「閱讀原文」獲取&34;的下載地址,或者閱覽器地址欄中輸入百度網盤地址https://pan.baidu.com/s/1Wo7yZ5qfkQtY-dutrET-gw,提取碼:zwvz),填寫完整後發送到電子郵箱:xt22zhong@126.com
  • 抖抖抖抖抖抖抖抖抖抖抖抖抖抖抖起來了!
    又到一年肥宅好時節但是今年卻發生了全國高校迷惑行為 比如在華東理工大學校園裡無論是教室還是圖書館抖見了人一言不合就抖無論是一個人還是一群人抖莫不是動圖卡了吧?明明就是90後輔導員喊你一起來抖抖抖最近這樣一段魔(sha)性(diao)的抖肩舞在各大高校校園刷屏了
  • 全國高校公益街拍—【第二十二站:大連工業大學】
    全國高校公益街拍活動— 第二十二站 —
  • 溫州市第二十二中學校歌MV
    > 2002年,溫州市第二十二中學於楊府山麓、甌江之濱應運而生。學校草創,急須弘揚精神,形成合力。校歌創作遂為二十二中師生之文化大事。經數月,聚師生智慧,融雁山甌水精華;揚學校精神,彰校園青春氣息之校歌呱呱墜地。
  • 揚帆起航 放飛夢想——福州第二十二中學畢業典禮
    7月23日上午福州第二十二中學舉行了2020屆畢業典禮,校領導及初三全體師生齊聚校園,回首往昔,展望未來,為同學們送上最美好的祝福。福州第二十二中學教務處2020年7月23日來源:福建省福州第二十二中學01
  • 單片機延時方法小結
    實現延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。2 軟體延時與時間計算在很多情況下,定時器/計數器經常被用作其他用途,這時候就只能用軟體方法延時。下面介紹幾種軟體延時的方法。
  • 石家莊市第二十二中學抗擊新冠病毒在行動
    石家莊市第二十二中學主動作為,積極響應教育行政部門的要求。根據長安區教育局疫情防控的統一部署,學校領導班子統一指揮,各部門協作聯動,共同確保疫情防控工作落到實處。學校積極落實市教育局「停課不停學」的要求,第一時間成立以校長蘇薈芳、副校長王發成為組織領導,教學處主任、各年級主任、網絡中心為成員的疫情防控期間教學工作小組,迅速制定出《石家莊市第二十二中學高中部疫情防控期間教學工作預案》,並在《預案》指導下開展各項工作。
  • 關於延時噴劑如何選擇的釋疑問
    什麼是延時噴劑我這裡就不再解釋了,相信過來看這篇文章的網友都是清楚它是幹什麼用的。今天我主要解釋的是如何選擇一款適合自己的延時噴劑,這也是一個困惑廣大網友很大的問題。首先我們要了解延時噴劑的類型,目前市場上主流的延時噴劑大概分為以下兩類:純化學製劑。多為酒精和脫敏類麻醉劑混合而成。這類噴劑在使用過程中都會有酒精的味道。價格呢也一般在幾十到一百不等,屬於低端的噴劑。純植物提取製劑。
  • 單片機兩大延時方法總結
    實現延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高CPU的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用循環體進行。2 、軟體延時與時間計算在很多情況下,定時器/計數器經常被用作其他用途,這時候就只能用軟體方法延時。下面介紹幾種軟體延時的方法。
  • 自學單片機知識積累:STC89C51
    而1到4個機器周期,就是一個指令周期,就是說處理一個指令所用的時間,這就是我們之前用加減法去作延時函數的原因。每處理一個指令就消耗一定時間,反覆處理,就消耗大量時間,相當於延時了。如果程序或設備出現問題,就需要重啟設備,復位電路也有兩類,上電自動復位和手動復位。多數我們會做好上電復位,防止出錯。