找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10831|回復: 26
打印 上一主題 下一主題
收起左側(cè)

如何讓單片機按鍵檢測更靈敏?

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:191022 發(fā)表于 2017-4-25 09:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
在做單片機按鍵程序的時候,靈敏度和效率難以取舍,各位大俠們,有沒有更好的方法呢?

#include <REGX51.H>
#include <intrins.h>

//獨立鍵盤.無按鍵動作時其返回值num_key=0,否則返回按鍵號num_key
extern unsigned char keyboard_self()
{
        unsigned char num_key=0;//按鍵號
        unsigned char temp=0;//用于讀取P2線上按鍵值
        static unsigned char temp_code=0;//保存按鍵值
        static unsigned char num_check=0;//低電平有效次數(shù)
        static unsigned char key_flag=0;//按鍵有效標識

        temp=P2&0xF0;//讀取P2線數(shù)據(jù)

        if(temp!=0xF0)//低電平判斷
        {
                num_check++;
                if(num_check==10)//連續(xù)10次(10ms)低電平有效,則認為按鍵有效
                {
                        key_flag=1;//使能按鍵有效標識
                        temp_code=temp;//保存按鍵值
                }
        }
        else//松手時判斷
        {
                num_check=0;

                if(key_flag==1)//按鍵有效
                {
                        key_flag=0;

                        switch(temp_code)//讀取按鍵號
                        {
                                case 0xE0: num_key=1;  P1=0xf0;
                                           break;
                                case 0xD0: num_key=2;  P1=0x0f;
                                           break;
                                case 0xB0: num_key=3;  P1=0xaa;
                                           break;
                                case 0x70: num_key=4;  P1=0xff;
                                           break;
                        }
                }
        }

        return(num_key);
}

void main()
{
        while(1)
        {
                keyboard_self();
        }
}



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

使用道具 舉報

來自 2#
ID:283954 發(fā)表于 2022-4-2 16:58 | 只看該作者
看了很多抗抖動的討論,想說幾句,這些抗抖動的例子都只是停留在原理的解說,在實際應(yīng)用時就是另一回事,必須看應(yīng)用時按鈕的實際用途。

一個按鈕被按下,單片機一定能被檢測到,如果需要在其他程序被用來處理事件,就SETB一個位做識別,然后離開,根本無需抗抖動,因為大多數(shù)程序完成事件處理后回來,早就過了抖動期。如果處理事件的程序事件太短,可以用這個SETB的位跳過按鈕檢測程序,等事件處理程序完成處理事件,把被SETB的位CLR掉,自然就會運行按鈕檢測程序,這樣就不會發(fā)生按一次鈕而多次觸發(fā)的問題。如果希望按下鈕后確保按鈕必須放開,則在檢測到按下后,進入檢測放開的程序,不斷循環(huán),直到按鈕被放開,但這就浪費單片機的時間了。

這說明在真實應(yīng)用的中,抗抖動程序是很少用到的,教材只是教你原理。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:191022 發(fā)表于 2017-4-25 09:45 | 只看該作者
請各位大俠們多多指點
回復

使用道具 舉報

地板
ID:130231 發(fā)表于 2017-4-25 13:27 | 只看該作者
要有消抖函數(shù)
回復

使用道具 舉報

5#
ID:138155 發(fā)表于 2017-4-25 15:33 | 只看該作者
太靈敏容易誤動作 一般加消抖程序
回復

使用道具 舉報

6#
ID:114924 發(fā)表于 2017-4-25 15:48 | 只看該作者
如果你C寫的不好,可以增加一個RC電路一顆4.7K電阻一顆104電容即可
回復

使用道具 舉報

7#
ID:193502 發(fā)表于 2017-4-25 17:34 | 只看該作者
用消抖或者中斷吧
回復

使用道具 舉報

8#
ID:187614 發(fā)表于 2017-4-25 18:32 | 只看該作者
鍵盤操作在ms級,靈敏度根據(jù)自己設(shè)計需要吧,也可以增加硬件設(shè)計;效率高就需要中斷方式。
回復

使用道具 舉報

9#
ID:7485 發(fā)表于 2017-4-25 18:39 | 只看該作者
按鍵消抖只是毫秒級的,不至于影響什么效率吧?如果不加消抖或消抖時間短,容易產(chǎn)生誤動作。
即便是使用中斷,也要防止誤動作。
只要鍵沒問題,也不存在靈敏度的問題。
回復

使用道具 舉報

10#
ID:111634 發(fā)表于 2017-4-25 21:12 | 只看該作者
本帖最后由 zl2168 于 2017-4-25 21:19 編輯

按鍵抖動一般是5~10ms,有少數(shù)超過10ms。手指按動按鍵最快50~100ms。因此,按鍵消抖不會影響按鍵動作靈敏度,影響按鍵動作靈敏度的是程序編制,程序中按鍵掃描實時性才會影響按鍵動作靈敏度。





以上摘自張志良編著《80C51單片機實用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于學習51單片機原理,程序(雙解c和匯編)語句條條有注解,便于閱讀理解,便于自學。






回復

使用道具 舉報

11#
ID:112693 發(fā)表于 2017-4-27 11:53 | 只看該作者
延時去抖最簡單,最好開關(guān)并聯(lián)104電容
回復

使用道具 舉報

12#
ID:148552 發(fā)表于 2017-4-28 13:54 | 只看該作者
硬件去抖就靈敏了,軟件優(yōu)化只是輔助作用
回復

使用道具 舉報

13#
ID:190583 發(fā)表于 2017-4-28 16:47 | 只看該作者
硬件去做。軟件輔助
回復

使用道具 舉報

14#
ID:194618 發(fā)表于 2017-4-28 18:27 | 只看該作者
加個延時函數(shù)進行消抖,一般10ms
回復

使用道具 舉報

15#
ID:108302 發(fā)表于 2017-4-28 22:15 | 只看該作者
使用中斷
回復

使用道具 舉報

16#
ID:197448 發(fā)表于 2017-5-6 19:32 | 只看該作者
我也在找這資料...
回復

使用道具 舉報

17#
ID:191929 發(fā)表于 2017-5-6 20:13 | 只看該作者
按鍵一般要消抖,延時個5~~20ms
回復

使用道具 舉報

18#
ID:43128 發(fā)表于 2017-5-7 14:23 | 只看該作者
可以加電容
回復

使用道具 舉報

19#
ID:798954 發(fā)表于 2020-8-16 11:37 | 只看該作者
我覺得中斷時最靈敏的,其次就是用一個定時器,然后每個一段時間掃描一下按鍵,32中的滴答定時器就是不錯的選擇
回復

使用道具 舉報

20#
ID:730009 發(fā)表于 2022-3-31 21:27 | 只看該作者
可以用系統(tǒng)rtx
回復

使用道具 舉報

21#
ID:971289 發(fā)表于 2022-4-1 08:17 | 只看該作者
只追求按鍵靈敏度就用中斷,如果想提高按鍵穩(wěn)定性就用硬件去抖。
回復

使用道具 舉報

22#
ID:1014820 發(fā)表于 2022-4-1 11:14 | 只看該作者

電容怎么選擇的
回復

使用道具 舉報

23#
ID:1014855 發(fā)表于 2022-4-1 13:30 | 只看該作者
要加消抖,可以利用延時函數(shù)消除抖動
回復

使用道具 舉報

24#
ID:264021 發(fā)表于 2022-4-1 19:14 | 只看該作者
沒有消抖程序,加個20MS的按鍵延時,就搞定
回復

使用道具 舉報

25#
ID:842688 發(fā)表于 2022-4-2 01:37 | 只看該作者
寫個奇偶校驗 沒記錯的話《手把手教你51單片機》這本書就有講到
回復

使用道具 舉報

26#
ID:933803 發(fā)表于 2022-4-3 16:41 | 只看該作者
使用消抖中斷方式
回復

使用道具 舉報

27#
ID:990881 發(fā)表于 2022-4-4 08:42 | 只看該作者

估一下延時時間,RC延時
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表