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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機如何進行按鈕抬起瞬間的防抖?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:430774 發表于 2019-5-6 16:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "reg52.h"                        
  2. typedef unsigned int u16;          //對數據類型進行聲明定義
  3. typedef unsigned char u8;

  4. sbit LSA=P2^2;
  5. sbit LSB=P2^3;
  6. sbit LSC=P2^4;
  7. sbit beep=P1^5;           
  8. sbit k=P3^2;
  9. u16 a,b,c;
  10. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11.                                         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
  12. u8 mb[2];
  13.         static u8 h;
  14. /*******************************************************************************
  15. * 函 數 名         : delay
  16. * 函數功能                   : 延時函數,i=1時,大約延時10us
  17. *******************************************************************************/
  18. void delay(u16 j)
  19. {
  20.         while(j--);        
  21. }

  22. /*******************************************************************************
  23. * 函 數 名       : main
  24. * 函數功能                 : 主函數
  25. * 輸    入       : 無
  26. * 輸    出             : 無
  27. *******************************************************************************/
  28. void zhongduan()
  29. {
  30.          IT0=1;//下降沿有效
  31.          EX0=1;  // 哪個外部中斷有效
  32.           TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。

  33.         TH0=0XFC;        //給定時器賦初值,定時1ms
  34.         TL0=0X18;        
  35.         ET0=1;//打開定時器0中斷允許
  36.         EA=1;//打開總中斷
  37.         
  38.         b=0,c=0,beep=0,h=0;
  39. }


  40. void Timer0() interrupt 1
  41. {
  42.         static u16 h;
  43.         TH0=0XFC;        //給定時器賦初值,定時1ms
  44.         TL0=0X18;
  45.         EX0=0;
  46.         h++;
  47.         if(h==8)
  48.         {
  49.          b=1;
  50.          c++;
  51.         }        
  52.         if(h==300)
  53.         {        
  54.    h=0;               
  55.    EX0=1;
  56.          TR0=0;                                
  57.         }        
  58. }


  59. void zhong() interrupt 0
  60. {
  61.          EX0=0;
  62.          TR0=1;
  63.          
  64. }


  65. void DigDisplay()
  66. {
  67.         u8 i;
  68.         for(i=0;i<2;i++)
  69.         {
  70.                 switch(i)         //位選,選擇點亮的數碼管,
  71.                 {
  72.                         case(0):
  73.                                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  74.                         case(1):
  75.                                 LSA=1;LSB=0;LSC=0; break;//顯示第1位        
  76.                 }
  77.                 P0=smgduan[mb[i]];//發送段碼
  78.                 delay(1); //間隔一段時間掃描        
  79.                 P0=0x00;//消隱
  80.         }
  81. }
  82. void fengmingqi()
  83. {
  84.         
  85. if(b==1)
  86.         {
  87.                 for(a=0;a<100;a++)
  88.                 {
  89.                         beep=~beep;
  90.                   delay(10);                        
  91.                 }        
  92.                 b=0;            //延時大約100us   通過修改此延時時間達到不同的發聲效果        
  93.   }

  94. }        


  95. void main()
  96. {        
  97.         zhongduan();
  98.         
  99.         while(1)
  100. {        
  101.           fengmingqi();
  102.       mb[0]=c%10;           //秒表個位
  103.             mb[1]=c/10;           //秒表十位  
  104.                  DigDisplay();   
  105. }
  106. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:430774 發表于 2019-5-6 16:55 | 只看該作者
有時候會連續加兩個數,應該是抬起瞬間有反應,按下的防抖處理好了,抬起的不知道怎么處理了
回復

使用道具 舉報

板凳
ID:528454 發表于 2019-5-6 18:21 | 只看該作者
加個延時程序?
回復

使用道具 舉報

地板
ID:503191 發表于 2019-5-6 18:24 | 只看該作者
按鈕兩端并個電容?
回復

使用道具 舉報

5#
ID:528454 發表于 2019-5-6 18:40 | 只看該作者
加一個電容,這是比較普遍的應用
回復

使用道具 舉報

6#
ID:528677 發表于 2019-5-6 18:42 | 只看該作者
延時消抖,然后等待手抬起
回復

使用道具 舉報

7#
ID:528677 發表于 2019-5-6 18:49 | 只看該作者
延時消抖,然后等待手抬起例如:
if(key==0)
{   
    delay();
    while(!key);
}     進入外部中斷也能這樣,按下鍵不松手時顯示可能會出問題,松開就好了。
回復

使用道具 舉報

8#
ID:528642 發表于 2019-5-6 21:26 | 只看該作者

RE: 單片機如何進行按鈕抬起瞬間的防抖?

消除方法有兩種:軟件除抖和硬件除抖,其中硬件除抖是應用了電容對高頻信號短路的原理。
軟件除抖是檢測出鍵閉合后執行一個延時程序,產生5ms~10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認為真正有鍵按下。
回復

使用道具 舉報

9#
ID:486487 發表于 2019-5-6 21:58 | 只看該作者
首先:硬件設計上必須要求在入口處并一個104電容。
然后:用示波器多抓幾次按鍵按下和抬起的波形,找到按下和抬起的按鍵的干擾波形的寬度。
最后:程序再延時讀取按鍵值,延時時間為:干擾波寬度*1.5,其中1.5可以視具體情況調整。
回復

使用道具 舉報

10#
ID:529213 發表于 2019-5-7 09:47 來自手機 | 只看該作者
加電容好些,在按鍵兩端并聯零點一到零點零一微法的無極性電容,千萬別別用電解電容,因為電解電容漏電大,要用mkp之類的薄膜電容,嚴禁并電解電容。
回復

使用道具 舉報

11#
ID:123289 發表于 2019-5-7 11:09 | 只看該作者
消抖不分上下沿:
例如:
每間隔4ms檢測一次,連續8次檢測結果一樣,則可判定為穩定。
回復

使用道具 舉報

12#
ID:430774 發表于 2019-5-7 13:49 | 只看該作者
yzwzfyz 發表于 2019-5-7 11:09
消抖不分上下沿:
例如:
每間隔4ms檢測一次,連續8次檢測結果一樣,則可判定為穩定。

我現在用的就是這種,定時器里檢測5毫秒一直是按下狀態就+1
回復

使用道具 舉報

13#
ID:123289 發表于 2019-5-8 14:20 | 只看該作者
這樣也只是可以知道狀態穩定了。
穩定了,有以下幾種狀態況,需要你進行一下甄別:
1、一直未按。
2、按下了還未松開。
3、松開后的穩定(與1同類,需要你區分)。
……
這是難點。∮屑记桑约合胂。(提示:將各種可能情況做標記,進行分析。)
回復

使用道具 舉報

14#
ID:530796 發表于 2019-5-8 17:06 | 只看該作者
改善硬件
回復

使用道具 舉報

15#
ID:162317 發表于 2019-5-9 09:52 | 只看該作者
unsigned char key_ret = 0;//外部文件調用需申明 extern unsigned char key_ret;

unsigned char Key_Scan(void)
{
static unsigned char key_num = 0;
static unsigned char del_count,tim_count;
static bit key_flag = 0;
/////////////////////////////////////////////////////
if(KEY==1) key_ret = 0;       
if(KEY==0) /*判斷是否有鍵按下可以是多個按鍵,例:if((KEY1==0)||(KEY2==0)||(KEY3==0))*/
   {
          if(++del_count>25)/*計數消抖(一般放在中斷里,計數完大于20ms即可)*/
          {
            del_count = 0;
                  if(++tim_count>25)/*長按識別*/
                   {
                                        key_flag = 0;/*短按無效*/
                                        tim_count = 25;/*鎖定長按*/
                                        switch(key_num)
                                                {
                                                 case 1:key_ret = 2;break;
                                                }                   
                        }                       
                 else/*短按有效*/
                   {
                          key_flag = 1;/*短按標志位*/
                          if(KEY==0) { key_num = 1;}/*一下用于識別按鍵*/                
                       
                    }        
                }       
        }                                           
        else/*松手之后*/
          {
                        tim_count = 0;
                        del_count = 0;
                        if(key_flag)/*松手*/
                                {
                                        key_flag = 0;
                                        switch(key_num)
                                                {
                                                case 1:key_ret = 1;break;
                                                }  
                                }                                        
          }                                               
        return key_ret;
                                        }
///////使用方法//
/*                                       
if(key_ret==1)
{
        key_ret=0;
        要執行的程序
}               

*/

回復

使用道具 舉報

16#
ID:531713 發表于 2019-5-9 16:38 | 只看該作者
延時消抖
   if(S1==0) {
            Delay10ms();
             if(S1==0) {      
                //要做的事
            }
}
回復

使用道具 舉報

17#
ID:505065 發表于 2019-5-9 21:29 | 只看該作者
一個是用延時消抖,另一個就是用外部中斷
回復

使用道具 舉報

18#
ID:514901 發表于 2019-5-10 00:13 | 只看該作者
延時消抖有時候不管用,這時候要用暴力消抖
if(key==0)
{
while(!key);
……
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美亚洲国产日韩 | 国产精品一区二区久久久久 | 亚洲av毛片成人精品 | 精品一区二区三区不卡 | 在线观看国产视频 | 天天操综合网站 | www.久久久.com | 欧美中文字幕 | www.亚洲免费 | 一区二区国产精品 | 男人天堂视频在线观看 | 久久99久久98精品免观看软件 | 亚洲乱码一区二区三区在线观看 | 色在线免费视频 | 国产精品亚洲综合 | 亚洲精品久久久久avwww潮水 | 欧美精品日韩精品 | 久久久久久久国产 | 色婷婷av一区二区三区软件 | 国产乱码精品一区二区三区中文 | 欧美精品一区三区 | 国产精品1区2区 | 亚洲欧美日韩久久 | 精品国产一区二区三区久久狼黑人 | 日本成人在线免费视频 | 久久久99国产精品免费 | 国内精品视频在线观看 | 91亚洲精品久久久电影 | 亚洲三级在线 | 免费观看www7722午夜电影 | 亚洲欧美高清 | 国产精品99久久久久久www | 欧美成年网站 | 日本中文在线视频 | 国产免费一二三区 | 国产福利视频导航 | www国产成人免费观看视频,深夜成人网 | 国产精品视频免费观看 | 91色视频在线观看 | 亚洲精品视频免费 | 91一区二区三区 |