标题: 单片机按键受干扰问题,如何消除 [打印本页]

作者: 李冬    时间: 2022-9-2 12:00
标题: 单片机按键受干扰问题,如何消除
开关管在工作的时候,测按键上的波形有干扰, 使单片机误认为按键按下。如何消除干扰

636531524234531250.jpg (18.34 KB, 下载次数: 93)

636531524234531250.jpg

作者: xxxevery    时间: 2022-9-2 14:05
才玩单片机吧,单片机的按键输入都需要采用硬件消抖或软件消抖处理,一般用软件消抖居多,方法也比较多具体自己百度一下吧
作者: szb314    时间: 2022-9-2 15:58
加一个10k上拉电阻,另外程序里可以处理干扰信号
作者: 帅包    时间: 2022-9-2 16:13
单片机按键口上的限流电阻、上拉电阻、滤波电容呢?一个都没有,这个按键的的走线相当于一个天线在那边被拉低太正常了,如果有其他原因导致无法防止这些元件,也可以用软件滤波啊,就是窄脉冲不认,宽脉冲才认
作者: coody_sz    时间: 2022-9-2 16:23
如果是有规律的干扰,则多次读键滤除,读键间隔尽量远离干扰的周期。或者,使用小电阻上拉,比如用1K电阻上拉。

找出干扰原因并排除干扰是治本的方法。能干扰到读按键的话,则别的信号会更容易收到干扰。
作者: npn    时间: 2022-9-2 16:26
  1. #include "STC15.h"
  2. unsigned char key_ms = 0;   //按键按住时间毫秒 最大255 按住+1,松开清0
  3. sbit skey = P3^ 2;          //按键,低电平按下 (未消抖)
  4. bit key;                    //按键,低电平按下 (已消抖)
  5. sbit led = P3^3;            //LED,低电平点亮
  6. void InitTimer0() {
  7.     TMOD = 0x01;
  8.     TH0 = 0x0FC;
  9.     TL0 = 0x18;
  10.     EA = 1;
  11.     ET0 = 1;
  12.     TR0 = 1;
  13. }

  14. void main(){
  15.     InitTimer0();
  16.     while(1){
  17.         if(!key){
  18.             led = !led;
  19.             while(!key);
  20.         }
  21.     }
  22. }

  23. void Timer0Interrupt() interrupt 1 {        //12Mhz@1ms 定时器中断
  24.     TH0 = 0xFC;
  25.     TL0 = 0x18;
  26.     if(skey){       //按键松开
  27.         key_ms = 0; //松开清0
  28.     } else {        //按键按下
  29.         if(key_ms != 0xFF){     //没加满
  30.             key_ms++;   //按住+1
  31.         }
  32.     }
  33.     key = !(key_ms >= 25);       //25毫秒消抖,脉冲干扰需小于25毫秒
  34. }
复制代码

作者: yzwzfyz    时间: 2022-9-2 17:09
线上加阻容过滤一下。
作者: 一事无成    时间: 2022-9-2 18:13
软件消抖或硬件消抖,软件消抖延时再检测,硬件消抖加电容
作者: XLinliY.Zhang    时间: 2022-9-2 18:14
1、经典104电容
2、判断按钮按下的时间是否达标
作者: 最后一个夏天1    时间: 2022-9-2 19:21
一般是检测到按键按下后给个延时在判断是否真的按下
作者: starsphere    时间: 2022-9-2 23:27
延时到抖动结束后再检测是否按下,或者是用定时器定时检测按键状态




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1