单片机用一个IO口采集多个按键信号如何实现

如题所述

在设计中如果用到IO口不够用,我们肯定第一时间想到的就是通过电阻分压,根据按下不同按键,来让不同阻值的电阻接到分压电路中,然后ADC模块做电压数据读取分析对应按键按下。下文就和大家分享下单片机设计AD按键的内容。

AD按键设计硬件部分电路有两种电路形式,一种的电阻串联,您一种是电阻并联,这两种都是通过电阻分压的原理实现的,下面通过电路图一一介绍。

电阻并联型AD按键

上图有10个按键,不同按键按下,分到的电压值不同,电阻值我已经计算好了,有部分误差,但已经是算成最小误差值了,以后大家可直接使用。对应的分压依次值有0.1Vref、0.2Vref
~ 0.9Vref、0.99Vref,共10个档位。单片机ADC通过读取电路中ADCIN处的电压识别对应按键按下。

上图电阻并联型AD按键电路有一个缺点就是如果有两个按键同时按下,会有错误识别的可能出现,扛干扰差,所以并联型AD按键电路很少使用。

电阻串联型AD按键

上图中有10个按键,对应电阻值按照ADCIN处的电压分别为Vref的x/10(x=1,2,3...9,10)倍算好,使用的电阻值也已经按照最小误差定的,可直接使用。不同按键按下,ADCIN处的电压不同,单片机ADC模块读出ADC值,从而识别对应哪个按键按下。

上图中电阻使用串联的方式接在电路中,这样也就有一个电阻坏,就会影响到其他按键检测的问题。如果两个按键按下,只会识别一个靠近图中ADCIN处的按键,这样不会有像并联型AD按键电路哪有识别有误的问题存在,但是这里电阻的误差不好控制,所以我对上面电路做了改进。如下图:

这个电路的好处就是这里将串联的电阻设计成等值的形式,这样在生产时也不必买更多阻值的电阻了。具体怎么分压的相信大家一看就懂。这里只是巧妙的应用了一个1M的电阻,一个电阻和大于它很多倍(一般理解为10倍以上)的电阻并联,并联后的阻值依然可以理解为和这个电阻值相等。同样的可以将电阻并联型AD按键电路改成等阻值的,这里就不在做出解答,有兴趣的朋友可以发挥下自己的脑力看看怎么设计。

使用AD按键时有个需要注意的地方就是,按键尽量选择好些的。因为按键本身按下也是有阻值的,特别是用了久的按键,其按键接触点容易氧化,造成按键按下,有一定的按键阻值接在电路中。从而影响程序的识别,特别是我国南方较潮湿的地区,差一定的按键触电特别容易生锈氧化。所以AD按键也就存在了比单独通过读IO电平识别的按键短的寿命短的问题。所以这种按键也不是很推荐使用的。特别是按键数量越多,出现问题的数量也就越多。

AD按键程序设计

在程序设计前,首先要明白AD按键设计的原理和程序设计的思路。如果一个8位的ADC模块,要设计成10个按键,就是将8位ADC满值255等分成10份,没份之间有大约25个差值,比如一个按键按下的ADC值在25±11的位置,那么它临近的按键就是50±11的位置。对应的识别这些值,就可以识别那个按键按下了。当然为了抗干扰强,最好等分的数要少,8位的话等分最好不要超过8个按键,否则抗干扰不是很好,如果是8个按键的话每个按键的ADC差值为32,按键间的ADC差值越大,越有利于抗干扰。

AD按键程序思路:

每隔10ms(这个时间是按键抖动的滤波时间)读一次ADC按键值,根据值的范围,将对应的按键数值加到AD按键FIFO中(这里缓冲区8个字节长),如果AD按键FIFO满了,如果FIFO前4个值是0(对应按键没按下),最后2个值是相等的(对应按键按下),中间的2个值对应按键抖动时的值,不用管,相当于有20ms的抖动滤波时间,那么就人为最后这两个相等的值的对应按键按下了。

最后欢迎大家转发评论交流!觉得写的好的话就来个转发吧,让更多人知道。也欢迎大家关注我:单片机嵌入式爱好者。会有源源不断的干货分享哦!

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-06-23
单独的一个IO想要接多个按键,是无法分清到底是哪个按下抬起的。

单片机用一个IO口采集多个按键信号如何实现
上图中有10个按键,对应电阻值按照ADCIN处的电压分别为Vref的x\/10(x=1,2,3...9,10)倍算好,使用的电阻值也已经按照最小误差定的,可直接使用。不同按键按下,ADCIN处的电压不同,单片机ADC模块读出ADC值,从而识别对应哪个按键按下。上图中电阻使用串联的方式接在电路中,这样也就有一个电阻...

单片机如何用有限的I\/O口来驱动4位数码管以及四个按键(I\/O口只剩1...
可以选用按键、显示接口芯片BC7281或者ZLG7290,SPI接口或者I2C接口,最多只占用4个口线。软件模拟SPI或I2C的时序。如果不允许选用接口芯片,可以用7个段选+4个位选。选用共阳极数码管,在位选的口线上通过按键、限流电阻接电源地。分时完成数码管显示和按键识别。

6个按键4个IO口如何设计
单片机IO口如果识别更多的按键,简单的方法就是通过控制按键按下,识别电流的流向。这说可能不是很理解,下面就来介绍下,如下图按键识别电路:按键S1按下,电流是从R1流向GND的,S2按下是从R2流向GND,S3按下是从R1和R2共同流向GND。S4按下是从IO1流向IO2,也可以从IO2流向IO1,S5按下是从IO1流...

请教一个单片机io口识别两个按键的问题
不同的按键串接电阻不同 导致按键按下时I\/O口的电压不一样 从而识别出来是哪个按键。

单片机怎么实现一个开关控制八个灯按一下亮一个按八下八个灯都亮汇编...
用一个寄存器做变量就可以。假如按键是一个开个,接在P1.0,八个灯在P0,低电平灯亮 程序是这样的 MOV 30H ,#00 LOP :SETB P1.0 JNB P1.0, PRESS AJMP LOP PRESS:INC 30H MOV A,30H CJNE A,#9,L_NEXT MOV 30H,#1 L_NEXT:JNB P1.0,MOV A,30H CJNE A,#1 ,LED1...

怎么用51单片机一个IO口控制两个LED分别亮
1、新建项目,如图所示。2、添加头文件,创建延迟函数。3、创建C主函数。4、添加死循环效果。5、点亮LED灯。P1=0x7e;二进制11111110。6、添加延迟效果即可。注意事项:Proteus 自从有了单片机也就有了开发系统,随着单片机的发展开发系统也在不断发展。 keil是一种先进的单片机集成开发系统。它代表着汇编...

C51单片机用IO口做为几个按键的控制,现在想用4X4键盘控制,请问下面显示...
依次的配置IO1、2、3为110,读IO4、5,若IO4为0则SW34按下,若IO5为0则SW35按下;思路二但是我们在不知道行列式按键之前我们肯定是依次将IO口接一个按键到GND或者到VCC,然后去读IO口去判断哪个按键按下,这也是最简单的方法,但是很浪费IO口,下面这种就结合了这种简单方法和行列式的思路,实...

怎样设计四个按键的单片机按键接口电路?
直接用P0 P1 P2中的一个口的任意四个引脚接按键就好了。比如P1口。P1.0~P1.3口为01H 02H 04H(00000100) 08H.然后写各个引脚被按下,执行什么功能就行了,比如:数字在数码管显示,就查7段码就行了。

单片机的io口电流大概10ma左右,如何让一个io口控制四个并联一起的led同...
如果用PNP三极管,接法如下:电源--->三极管的发射极--->三极管的集电极--->四个限流电阻拧一起 --->四个限流电阻另一端分开,分别接四个LED正极--->四个LED负极拧到一起接地 单片机的IO口--->约680---1000欧姆的电阻--->三极管的基极.因为,当IO口为低电平时,三极管工作于开启状态,四个LED...

51单片机一个按键控制两个输出端交替产生脉冲
硬件就不说了,直接点来软件,外部中断配置好,然后在中断函数里面判断是第几次按下(用一个变量,进入一次中断变量加一,奇数表示第一次,偶数就表示第二次了,就这样循环啦),然后根据奇偶性选择引脚控制,相信延迟(要精确就用定时器,控制TRx位就行),IO口拉高拉低你应该会的 兄弟,加油^0^~...

相似回答