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

標題: 單片機如何進行按鈕抬起瞬間的防抖? [打印本頁]

作者: zx929747216    時間: 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. }
復制代碼

作者: zx929747216    時間: 2019-5-6 16:55
有時候會連續加兩個數,應該是抬起瞬間有反應,按下的防抖處理好了,抬起的不知道怎么處理了
作者: lindage12315    時間: 2019-5-6 18:21
加個延時程序?
作者: murphey    時間: 2019-5-6 18:24
按鈕兩端并個電容?
作者: lindage12315    時間: 2019-5-6 18:40
加一個電容,這是比較普遍的應用
作者: 1qdeuuu000    時間: 2019-5-6 18:42
延時消抖,然后等待手抬起
作者: 1qdeuuu000    時間: 2019-5-6 18:49
延時消抖,然后等待手抬起例如:
if(key==0)
{   
    delay();
    while(!key);
}     進入外部中斷也能這樣,按下鍵不松手時顯示可能會出問題,松開就好了。
作者: 有緣人    時間: 2019-5-6 21:26
標題: RE: 單片機如何進行按鈕抬起瞬間的防抖?
消除方法有兩種:軟件除抖和硬件除抖,其中硬件除抖是應用了電容對高頻信號短路的原理。
軟件除抖是檢測出鍵閉合后執行一個延時程序,產生5ms~10ms的延時,讓前沿抖動消失后再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認為真正有鍵按下。

作者: ymw6240    時間: 2019-5-6 21:58
首先:硬件設計上必須要求在入口處并一個104電容。
然后:用示波器多抓幾次按鍵按下和抬起的波形,找到按下和抬起的按鍵的干擾波形的寬度。
最后:程序再延時讀取按鍵值,延時時間為:干擾波寬度*1.5,其中1.5可以視具體情況調整。
作者: hnxtlxx    時間: 2019-5-7 09:47
加電容好些,在按鍵兩端并聯零點一到零點零一微法的無極性電容,千萬別別用電解電容,因為電解電容漏電大,要用mkp之類的薄膜電容,嚴禁并電解電容。
作者: yzwzfyz    時間: 2019-5-7 11:09
消抖不分上下沿:
例如:
每間隔4ms檢測一次,連續8次檢測結果一樣,則可判定為穩定。
作者: zx929747216    時間: 2019-5-7 13:49
yzwzfyz 發表于 2019-5-7 11:09
消抖不分上下沿:
例如:
每間隔4ms檢測一次,連續8次檢測結果一樣,則可判定為穩定。

我現在用的就是這種,定時器里檢測5毫秒一直是按下狀態就+1
作者: yzwzfyz    時間: 2019-5-8 14:20
這樣也只是可以知道狀態穩定了。
穩定了,有以下幾種狀態況,需要你進行一下甄別:
1、一直未按。
2、按下了還未松開。
3、松開后的穩定(與1同類,需要你區分)。
……
這是難點!!有技巧,自己想想。(提示:將各種可能情況做標記,進行分析。)
作者: fujinzhan    時間: 2019-5-8 17:06
改善硬件
作者: 南柯一夢    時間: 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;
        要執行的程序
}               

*/


作者: a854377332    時間: 2019-5-9 16:38
延時消抖
   if(S1==0) {
            Delay10ms();
             if(S1==0) {      
                //要做的事
            }
}
作者: TIANYUS    時間: 2019-5-9 21:29
一個是用延時消抖,另一個就是用外部中斷
作者: 鄭漢松    時間: 2019-5-10 00:13
延時消抖有時候不管用,這時候要用暴力消抖
if(key==0)
{
while(!key);
……
}




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲精品中文字幕在线观看 | 99精品在线观看 | 四虎永久免费在线 | 欧美日韩国产在线观看 | 国产激情第一页 | 伊人色综合久久天天五月婷 | 不卡欧美 | 日本精品视频一区二区三区四区 | 国产精品久久久 | 99热精品在线观看 | 精品视频免费在线 | 久久久婷 | 日韩欧美一区在线 | 在线91| www.亚洲一区二区三区 | 97在线观视频免费观看 | 在线观看国产精品一区二区 | 久久99精品久久久久蜜桃tv | 日韩免费网站 | av片免费 | 日本三级全黄三级三级三级口周 | 亚洲一区二区三区视频 | 国产精品久久久久久久久久尿 | 伊人网伊人| 国产一级片 | 日本超碰 | 国产一区二区三区精品久久久 | 日日操视频 | 久久久久亚洲精品国产 | 精品福利一区二区三区 | 国产精品a免费一区久久电影 | 亚洲免费精品 | 国产一级一级毛片 | 国产亚洲高清视频 | 老头搡老女人毛片视频在线看 | 色视频免费 | 精品三级在线观看 | 久久小视频 | 天堂久 | 中文字幕一区二区三区乱码图片 | 日韩成人免费视频 |