久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5933|回復: 2
收起左側

基于狀態機的51單片機獨立按鍵檢測與消抖思路

[復制鏈接]
ID:435124 發表于 2018-11-28 17:33 | 顯示全部樓層 |閱讀模式
狀態機的按鍵檢測思路2
先回顧一下定義:
狀態機有如下性質
按鍵狀態機發生狀態遷移的條件
如何準確檢測條件是否發生并進行狀態遷移
確保狀態機能穩定地進行遷移
按鍵消抖的原理:狀態切換
按鍵操作觸發的時機

先回顧一下定義:
按鍵從未按下到按下,再到彈起,可以視為一個有4個狀態的有限狀態機。  分別是未按下、前沿抖動、按下、后沿抖動。  
即按鍵只在這4個狀態間進行遷移,而且是當條件滿足時按一定的順序進行遷移:  未按下­­(條件1)­>前沿抖動­­(條件2)­>按下­­(條件3)­>后沿抖動­­(條件4)­>未按下  當且僅當條件成立時,才進行狀態的遷移,當條件不成立時,狀態機會保持當前狀態不變。

狀態機有如下性質

1.狀態機會在條件滿足時發生狀態轉移,由于每個狀態會持續一段時間,而我們需要按鍵是理想的,即我們需要一個瞬間的按鍵事件,而不是連續的按鍵事件。  
總結:  
(1)當狀態轉移條件成立時,要進行狀態的遷移。
(2)狀態轉移是瞬間的,所以我們把某個狀態轉移當成按鍵來用。
(3)未進行狀態轉移時,狀態機會保持之前的狀態。


按鍵狀態機發生狀態遷移的條件

0.png

即如何對狀態機的遷移條件進行準確判定。  
如何準確檢測條件是否發生并進行狀態遷移
注意:按鍵的初始狀態是未按下
//在定義時將按鍵狀態初始化為未按下
unsigned char KEY_Status = NOPRESS;

(1)條件1:前沿抖動開始  
從未按下狀態到前沿抖動開始這一事件發生,電平為由1變為0  
即在未按下狀態下,突然檢測到低電平,就說明遷移條件成立了,立即把狀態遷移到前沿抖動,或執行其他操作。
//KEY_Status == NOPRESS && KEY_Value == 0,等價于條件1成立
if (NOPRESS ==  KEY_Status && 0 == KEY_Value)
{
KEY_Status = PRESHAKE; //執行狀態遷移
timer(); //設置一個10ms定時器,用定時器溢出事件來模擬前沿抖動結束事件。
}

(2)條件2:前沿抖動結束  
從前沿抖動狀態到前沿抖動結束這一事件發生,有大約10毫秒的時間,雖然沒有具體的事件,但可以用定時器中斷來模擬前沿抖動結束事件。在前沿抖動的狀態下,一旦定時器中斷,就說明遷移條件成立了,立即把狀態遷移至按下,或執行其他操作。

  1. //若PRESHAKE == KEY_Status && 1 == TF1 則條件2成立
  2. if (PRESHAKE == KEY_Status && 1 == TF1)
  3. {
  4. KEY_Status = PRESS; //執行狀態遷移
  5. TF = 0; //清除溢出標志
  6. TR1 = 0; //關閉定時器
  7. }
復制代碼

(3)條件3:后沿抖動開始  
從按下狀態到后沿抖動開始這一事件發生,電平由0變1,即只要在按下狀態中檢測到電平為1,就認為遷移條件成立了,立即把狀態遷移至后沿抖動。
  1. //KEY_Status == PRESS && KEY_Value == 1則條件3成立
  2. if (PRESS == KEY_Status && 1 == KEY_Value)
  3. {
  4. KEY_Status = TAILSHAKE; //執行狀態遷移
  5. n++; //執行想要的操作
  6. timer(); //用定時器溢出來模擬后沿抖動結束事件
  7. }
復制代碼
(4)條件4:后沿抖動結束  
從后沿抖動狀態到后沿抖動結束這一事件發生,雖然沒有具體的事件,但是歷時是確定的,基本在10ms左右,可以通過定時器溢出來模擬后沿抖動結束事件。一旦定時器溢出(或者定時器中斷發生),就說明遷移條件成立了,立即把狀態遷移至未按下。

//TF1 == 1即后沿抖動結束標志。
//要在此時關閉定時器,防止重復判斷。
if (1 == TF1)
{
KEY_Status = NOPRESS;
TF1 = 0; //清除溢出標志
TR1 = 0; //關閉定時器
}

確保狀態機能穩定地進行遷移

如果狀態能穩定的遷移,也就是說如果我們能對狀態發生遷移的條件進行準確判斷,
狀態機就會實現穩定的遷移。就可以在此基礎上進行其他操作,不用擔心狀態機的狀態界定錯誤,因為狀態機是可以穩定遷移的。  
所以關鍵是對狀態發生遷移的條件進行準確判定,從而使各個狀態不發生交叉,即穩定遷移。  
要反復檢查上面我們對狀態機遷移條件界定是否準確。直到確定是準確的,就可以在此基礎上做點別的事情了。  
可以在心中模擬程序執行來驗證思路是否正確。

按鍵消抖的原理:狀態切換

(按鍵)狀態機中,由于狀態的切換是通過判定條件來進行的,一旦條件成立,狀態就瞬間切換了,每個狀態會持續一段時間,在此期間循環可能會執行多次,但由于狀態切換的條件不滿足,所以不會進入if語句中操作。所以如果把任何狀態切換到下一狀態的瞬間當成按鍵事件,那么按鍵就只會被檢測到一次,這就是按鍵消抖的原理。

按鍵操作觸發的時機

實際測試發現,把對按鍵事件的響應操作放在后沿抖動開始時(即狀態機由按下狀態遷
移到后沿抖動狀態的瞬間)效果比較不錯,不會顯得太敏感也不會顯得很遲鈍。

完整的pdf格式文檔51黑下載地址:
狀態機的51單片機獨立按鍵檢測與消抖思路.pdf (382.78 KB, 下載次數: 64)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

無效樓層,該帖已經被刪除
ID:295805 發表于 2020-1-19 10:58 | 顯示全部樓層
樓主寫的不錯。有道理
回復

使用道具 舉報

ID:59300 發表于 2023-9-8 13:35 | 顯示全部樓層
值得學習的文章
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品91 | 久久九七 | 日韩av一区二区在线观看 | 久草视频在线播放 | 激情a | 欧美性video| 成人在线免费观看 | 羞羞的视频在线 | 91麻豆精品国产91久久久更新资源速度超快 | 天堂网avav| 国产1区 | 伊人天堂网 | 成人一区二区三区在线 | 香蕉超碰 | 国产成人免费视频网站视频社区 | 国产精品免费一区二区三区 | 中文字幕第一页在线 | 日韩欧美不卡 | 亚洲视频一区在线观看 | 男女又爽又黄视频 | 国产在线精品一区二区三区 | 欧美高清一区 | 色综合99 | 97精品超碰一区二区三区 | 成人午夜在线观看 | 99久久婷婷国产综合精品电影 | 色妹子综合网 | 这里有精品| 免费在线观看av的网站 | 久久精品这里精品 | 国产欧美精品一区二区色综合朱莉 | 久久免费国产 | 成人午夜在线 | 欧美精选一区二区 | 精品欧美激情在线观看 | 国产永久免费 | 日本精a在线观看 | 亚洲一区二区三区免费视频 | 日韩高清一区 | 女同久久 | 亚洲欧美日韩一区 |