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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 29678|回復: 15
打印 上一主題 下一主題
收起左側

51單片機按鍵消抖方法介紹

  [復制鏈接]
跳轉到指定樓層
樓主
ID:591559 發表于 2019-8-11 09:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
由于在單片機在應用系統中,更多的會用到獨立鍵盤,加之兩者的檢測原理基本相似,所以這一節里我主要講解獨立鍵盤的檢測原理及程序實現的方法。
1、 按鍵的檢測原理
按鍵與單片機的連接如圖5所示,按鍵的一端與地相連,另一端直接與單片機的I/O口相連。此時我們在程序中先給I/O口賦值高電平,然后不斷的檢測I/O口電平的變化。當按鍵沒有被按下時,此I/O口的電平一直為高;當按鍵被按下時,由于按鍵的另一端直接與地相連,相當于低電平,此時我們從I/O口讀出的即為高電平,程序一旦檢測到I/O口由高電平變為低電平時,說明按鍵被按下,此時馬上執行相應的動作,這就是按鍵檢測的原理。

圖5 按鍵與單片機連接圖
2、 按鍵的抖動與消除
由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,與單片機I/O口相接的一端的電壓會出現相應的變化,如圖6所示。
圖6 按鍵按下時電壓的變化情況
從圖6中我們可以看出,實際的電壓波形在按下松手的時候都會出現一定的抖動,經過實驗知道,這個一時間大概在5-10ms。所在在做單片機與按鍵相關的系統時必須考慮消抖的環節。按鍵消抖的方法有兩種,一個是硬件方法   一個是軟件的方法,而從節約成本和盡量簡化硬件電路的角度出發,一般是采用在程序中加上消抖的方法實現,通常是采用延時的方法。具體的作法是:
檢測出鍵閉合后執行一個延時程序,產生5ms~10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認為真正有鍵按下。當檢測到按鍵釋放后,也要給5ms~10ms的延時,待后沿抖動消失后才能轉入該鍵的處理程序。后面會結合到程序進行講解。
下面我寫一個簡單的程序,功能為:當一個鍵按下時,讓一個發光二極管發光,我們先看下按鍵模塊在實驗板上的原理圖,如圖7和圖8所示。
圖7 發光二極管模塊原理圖
圖8 按鍵模塊原理圖
例1 按鍵檢測程序
//功能:當按下S8鍵時,L1燈發光,松手后,L1燈熄滅。相應程序如例1.
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit D1=P1^0;
sbit S1=P3^4;

void main()
{
       P3=0xff;
       while(1)
       {
             if(S1==0)  //第一次檢測按鍵是否按下
delay(20);  //消除按下時的抖動
if(S1==0)  //再次確定是否按下狀態
{
                 D1=0;   //如果是按下狀態,執行操作     
    while(!S1);    //檢測是否是按鍵彈起
                 delay(20);    //消除松開時的抖動
}
              else
                     D1=1;           
       }
}

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:598462 發表于 2019-8-12 09:33 | 只看該作者
不錯的技巧,學習了
回復

使用道具 舉報

板凳
ID:109646 發表于 2019-8-12 09:55 | 只看該作者
這種程序在實際應用中,最好不要用
回復

使用道具 舉報

地板
ID:208849 發表于 2019-8-12 14:47 | 只看該作者
用delay真的可以嗎?
回復

使用道具 舉報

5#
ID:370779 發表于 2019-8-30 17:24 | 只看該作者
較大的程序使用過多的delay,會占用單片機大量時間,建議采用定時器中斷或狀態機來消除抖動。
回復

使用道具 舉報

6#
ID:600919 發表于 2019-8-30 21:28 | 只看該作者
使用延時會導致輸出信號的頻率不穩定,之前用過
回復

使用道具 舉報

7#
ID:605321 發表于 2019-8-30 22:43 | 只看該作者
謝謝!
回復

使用道具 舉報

8#
ID:605321 發表于 2019-8-30 22:44 | 只看該作者
非常感謝分享!
回復

使用道具 舉報

9#
ID:385637 發表于 2019-8-31 10:53 | 只看該作者
新手都是這樣教的用delay,做多幾個項目就感覺這樣延時的弊端了
回復

使用道具 舉報

10#
ID:415088 發表于 2019-11-8 12:13 | 只看該作者
你的while()檢測在實際項目中是不行的,浪費CPU
回復

使用道具 舉報

11#
ID:472300 發表于 2020-8-15 14:50 | 只看該作者
duanyazhou 發表于 2019-8-12 09:55
這種程序在實際應用中,最好不要用

你好,能給說下原因么。是因為耽誤主程序循環時間么
回復

使用道具 舉報

12#
ID:808286 發表于 2020-8-16 14:58 | 只看該作者
奔兒霸 發表于 2020-8-15 14:50
你好,能給說下原因么。是因為耽誤主程序循環時間么

我也在學習51單片機 delay在實際工程中是不適用的 我記得是使用delay的話 其他狀態會受影響,就是如果程序中間加了這種 delay 延時操作后,很可能某一事件發生了,但是我們程序還在進行 delay 延時操作中,當這個事件發生完了,程序還在 delay 操作中,當我們 delay 完事再去檢查的時候,已經晚了,已經檢測不到那個事件了。
我用的方法是位檢測,也是軟件檢測,就是對按鍵不斷地掃描 當八位全是1/0時,表示按鍵的彈起/按下。
回復

使用道具 舉報

13#
ID:66287 發表于 2020-8-18 08:36 | 只看該作者
作為了解按鍵原理,程序可以用。但實際工程中不能使用delay(),程序傻傻的等待,什么正事干不了。建議用狀態機方式,準確高效。
回復

使用道具 舉報

14#
ID:887235 發表于 2021-3-2 14:33 | 只看該作者
初學者表示學到了,謝謝樓主分享,也感謝評論中的前輩們的回復。
回復

使用道具 舉報

15#
ID:1080941 發表于 2023-5-30 18:00 | 只看該作者
初學者表示學到了,謝謝樓主分享,也感謝評論中的前輩們的回復。
回復

使用道具 舉報

16#
ID:140489 發表于 2023-5-31 08:19 | 只看該作者
這種程序在開發板上玩玩就行了,不要用到項目中去
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久精品免费看国产高清 | 久久国 | 国产精品久久7777777 | 国产一区二区三区在线看 | 欧美一级在线视频 | 欧美一区二区三区久久精品 | 欧美一级电影免费观看 | 奇米影视77| 国产一区二区视频在线 | 亚洲精品性视频 | 国产成人免费视频 | 亚洲精品福利在线 | 亚洲一二三区不卡 | 九九伦理片 | 国产精品美女久久久久久免费 | 精品乱码一区二区 | 日本亚洲精品 | 好姑娘高清在线观看电影 | 国产在线小视频 | 亚洲成人av在线播放 | 婷婷久久五月天 | 二区在线视频 | 精品一级电影 | 五月综合激情婷婷 | 国产精品无码永久免费888 | 91av在线电影 | 欧美国产精品 | 99亚洲精品 | 中文字幕精品视频在线观看 | 亚洲视频在线看 | 欧美a v在线 | 久久精品一级 | 欧美一区二区在线免费观看 | www性色 | 婷婷色综合 | 亚洲一区二区三区在线观看免费 | 午夜精品久久久久久久久久久久久 | 国内精品久久久久久 | 国产一区亚洲 | 国产精品一区二区在线播放 | 色婷婷在线视频 |