大家好,今天小编关注到一个比较有意思的话题,就是关于两个单片机io连接的问题,于是小编就整理了1个相关介绍两个单片机io连接的解答,让我们一起看看吧。
单片机用一个IO口采集多个按键信号,如何实现?
目前以我的能力是实现不了的。计算机到了底层就是用高低电平表示0和1,所以1个IO口接收了一个高电平信号是很难区分是哪个按键给的电平信号。这也是为啥所有单片机一个IO口只接一个传感器的原因。如果想要实现那么你就需要从3.3V到5V中间根据自己的需要去设计不同按键的电平信号,然后通过区分电平信号来达到区分按键的目的。这是一种方法。另外一种方法就是PWM。通过控制脉冲信号来为每个按键进行编码,也能区分。PWM可能还简单些,第一种方法稍显复杂。
一个IO口检测多个按键肯定是可以实现的,下面简单举几个例子,为大家指点一下思路。
使用普通的I/O口检测多个按键
通常我们使用按键检测的时候,一般都是一个I/O口检测一个按键,比如:
M×N阵矩阵式按键至少也需(M+N)个I/O口,比如4×4共16个按键的矩阵共需8个I/O口。
那么一个I/O口可不可以实现检测多个按键呢?其实是可以的,硬件电路设计复杂,值不值得这么做。比如通过检测占空比来区分不同的按键,每个按键后面做硬件防抖处理后再加555定时器组成的电路。或者类似于串行通讯的方式,比如第一个按键按下输出1个脉冲,第二个按键按下输出两个脉冲,第三个按下输出3个脉冲等,这种按键后端电路处理更复杂。
使用单片机的一个ADC采样口检测多个按键
使用ADC检测多个按键时,按键之间的电压间隔最好相近,而且范围较宽,这样设计误差会更小一些。
比如以5个按键为例,ADC检测电压范围为0~5V,那么在设计电路时各按键之间的电压间隔应大约为5V/5=1V。
上图为本人设计的电路图,S1按下电压为0V;S2按下电压约为0.97V;S3按下电压为2.03V;S4按下电压约为2.94V;S5按下电压约为3.99V。软件处理时只要设置±0.1V的检测范围宽度即可。
以上是本人的观点,大家有什么想法,欢迎一起讨论。
在设计中如果用到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的抖动滤波时间,那么就人为最后这两个相等的值的对应按键按下了。
最后欢迎大家转发评论交流!觉得写的好的话就来个转发吧,让更多人知道。也欢迎大家关注我的头条号:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!
使用模数转换(ADC)的特点就可以实现单片机用一个I/O采集多个按键信号。
一、单片机的I/O口检测按键简说
我们知道,一般情况下单片机的一个I/O口作为普通I/O口的话,只能检测识别一个按键。
日常设计中,如果碰到按键数量较多的话,会采用行列式键盘,例如最常见的4X4矩阵键盘,这样可以实现用8个I/O口检测16个按键。
还有就是键盘接口,典型的是我们计算机上用的键盘,其采用PS/2接口,现在一般计算机上用的是USB接口的键盘。
另外还有使用串口或者IIC、SPI接口的键盘芯片,这些使用常见的串口、IIC、SPI通信协议实现。
但是这些都一个以上的I/O口,不是真正的用多个按键。
那么有没有更简单的办法,使用更少的I/O口资源检测更多的按键呢?
二、基于模数转换的AD键盘
我们知道按键检测实际上是检测连接按键的端口的高低电平值,在单个I/O口检测单个按键时,只是简单的判断连接按键的端口的电平是高电平(+5V)还是低电平(0V)。那么是否可以通过电平的微小变化来检测按键是否被按下呢?
下图为一个A/D键盘的原理图,从图中可以看出,当不同的按键被按下时,ADC端点处的电压不同,通过判断不同的电压值就可以判断出是那个按键被按下。
对于具有AD转换功能的单片机来说,直接接到一个AD通道即可。对于没有AD转换功能的单片机,可采用一个AD转换模块。
对于这种按键,有以下缺点:
1、对于同一点处的电压值,A/D多次采样的结果不可能完全相同。
2)、电阻的误差。电阻值由于电阻的精度和环境温度的原因,误差较大,所以A/D键盘各个按键点的分压不准确。
3)、为尽量减少误差,可以采取增加电阻精度、增加温度补偿等方法,另外在软件处理时候要注意消除按键抖动等因素,还要对实际转换值和标准值给出误差补偿。
4)、如果按键按下,经过A/D转换,若实际转换值在允许误差范围之内(需要实际测量各点电压,并计算各点电压平均值),则认为按键按下,否则程序不响应。
5)、实际试验过程中,还要考虑电阻的累积误差,选用精度越高的电阻,可分辨的按键数目越多。
到此,以上就是小编对于两个单片机io连接的问题就介绍到这了,希望介绍关于两个单片机io连接的1点解答对大家有用。