欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5927|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:435124 發(fā)表于 2018-11-28 17:33 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
狀態(tài)機的按鍵檢測思路2
先回顧一下定義:
狀態(tài)機有如下性質(zhì)
按鍵狀態(tài)機發(fā)生狀態(tài)遷移的條件
如何準(zhǔn)確檢測條件是否發(fā)生并進(jìn)行狀態(tài)遷移
確保狀態(tài)機能穩(wěn)定地進(jìn)行遷移
按鍵消抖的原理:狀態(tài)切換
按鍵操作觸發(fā)的時機

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

狀態(tài)機有如下性質(zhì)

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


按鍵狀態(tài)機發(fā)生狀態(tài)遷移的條件



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

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

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

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

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

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

確保狀態(tài)機能穩(wěn)定地進(jìn)行遷移

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

按鍵消抖的原理:狀態(tài)切換

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

按鍵操作觸發(fā)的時機

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

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


評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:295805 發(fā)表于 2020-1-19 10:58 | 只看該作者
樓主寫的不錯。有道理
回復(fù)

使用道具 舉報

板凳
ID:59300 發(fā)表于 2023-9-8 13:35 | 只看該作者
值得學(xué)習(xí)的文章
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表