当前位置:首页 > 天道酬勤 > 正文内容

51单片机按键与显示电路设计(单片机接按键)

张世龙2021年12月21日 23:58天道酬勤1220

在设计中使用IO端口不够的情况下,我们首先通过电阻分压,按不同的键,将不同电阻值的电阻连接到分压电路,然后单片机的ADC模块进行电压数据的读取分析,按对应的键让我给大家展示一下单片机设计AD按钮的内容。

用AD键设计硬件部分的电路有电阻串联和电阻并联两种电路形式。 两者都是通过电阻分压原理实现的。 以下用电路图进行说明,给出案例程序的参考。

电阻并联型AD按键

电阻并联型AD按钮

上图有10个按钮。 每按一次按钮,分配的电压值就不同。 电阻值已经计算了。 虽然有一部分误差,但已经计算成了最小误差值。 今后大家可以直接使用。 对应的分压值按照0.1Vref、0.2Vref ~ 0.9Vref、0.99Vref的顺序有10个等级。 单片机ADC根据读取电路ADCIN中的电压来识别对应按钮的按下。

上图的电阻并联型AD按钮电路具有如果同时按下两个按钮,则有可能发生错误识别,抗干扰能力强的缺点,因此很少使用并联型AD按钮电路。

电阻串联型AD按键

串联线AD按钮

上图有10个按钮,对应的电阻值是ADCIN下的电压分别按Vref的x/10(x=1、2、3…9、10 )倍计算,使用的电阻值也由最小误差决定,可以直接使用。 按键按下后,ADCIN上的电压不同,单片机的ADC模块读取ADC值,识别与哪个按键按下对应。

上图的电阻通过串联连接与电路连接,因此如果一个电阻损坏,还会影响其他钥匙的检测。 按下两个键后,只识别出一个接近图中ADCIN的键,所以不像并联型AD键电路那样存在识别错误的问题,但是这里很难抑制电阻的误差,所以对上述电路进行了改进。 下图:

等效电阻串联型AD按钮

该电路的优点是,在这里将串联的电阻设计为等值的形状,从而在生产时无需购买电阻值高的电阻。 具体是如何分压的我想大家也能看到,这里只是巧妙地应用了1M的电阻。 一个电阻和比它大好几倍(一般理解为10倍以上)的电阻并联,并联后的电阻值可以理解为仍然等于这个电阻值。 同样地,也可以将电阻并联型AD按钮电路变更为等规,但在此不进行解答。 有兴趣的人看看发挥自己的脑力如何设计。

使用AD按钮时有需要注意的地方。 请尽量选择更多的按钮。 由于按钮本身也有电阻值,特别是长时间使用按钮时,该按钮的接触点容易氧化,按钮被按下,一定的按钮电阻值就会连接到电路上。 因此,会影响程序的识别,特别是在中国南方潮湿的地区,有点坏的按钮触点特别容易生锈氧化。 因此,还存在AD按钮的寿命比单独在读取IO等级识别的按钮短的问题。 所以,也不太推荐这样的按钮。 特别是按钮越多,问题的数量也就越多。

AD按键编程

在做编程之前,首先要了解AD键设计的原理和编程思路。 假设8位ADC模块设计为10个密钥,则将8位ADC全值255分成10等分,每个值之间约有25个差值。 例如,如果一个键按下的ADC值在2511的位置,则其旁边的键就在5011的位置。 的值,可以识别按下了哪个键。 当然,为了抗干扰,等分的数量减少比较好。 8位的话等分最好不要超过8个。 不那样的话,对噪音不好。 8个键的话,每个键的ADC差为32,键间的ADC差越大,越有利于噪声。

AD按钮程序的想法:

键控滤波器的原理

每10毫秒读取一次ADC键的值,根据值的范围,将对应的键的值加到AD键FIFO上。 这里缓冲区长度为8字节。 如果AD键FIFO已满,则如果FIFO的前四个值为0 (未按相应的键),则最后两个值相等() ) ) ) ) ) ) ) ) ) ) 652

从unsignedcharucreadfromadfifo (unsigned char * pdata ) /密钥fifo缓冲区将密钥值数据读入参数变量指针pdata,根据对应的数值发出密钥事件,将LED

{

无符号字符UC结果=0;

//

if( (ucAdResult[(sucAdKeyHead+2) % (AD_RESULT_BUFFER_LENTH)] == 0) ){ // if( (ucAdResult[(sucAdKeyHead+4) % (AD_RESULT_BUFFER_LENTH)] != 0) ){ // if( (ucAdResult[(sucAdKeyHead+4) % (AD_RESULT_BUFFER_LENTH)] == \ // ucAdResult[(sucAdKeyHead+5) % (AD_RESULT_BUFFER_LENTH)]) ){ // ucResult = ucAdResult[(sucAdKeyHead+5) % (AD_RESULT_BUFFER_LENTH)]; // if( (ucAdResult[sucAdKeyHead] == 0) && (ucAdResult[sucAdKeyTail] != 0) ){ // if( ucAdResult[sucAdKeyTail] == \ // ucAdResult[(sucAdKeyHead+2) & (AD_RESULT_BUFFER_LENTH-1)] ){ if( (ucAdResult[sucAdKeyHead] == 0) && \ (ucAdResult[(sucAdKeyHead+4) & (AD_RESULT_BUFFER_LENTH-1)] != 0) ){ if( ucAdResult[sucAdKeyTail] == \ ucAdResult[(sucAdKeyHead+6) & (AD_RESULT_BUFFER_LENTH-1)] ){ ucResult = ucAdResult[sucAdKeyTail]; vKeyResultHandle(ucResult);//key值处理 *pData = ucResult; vInitAdFifo(); return ucResult; } else return 0; } else return 0; }
unsigned char ucWriteToAdFifo(unsigned short usKeyAdValue) { if(usKeyAdValue < KEY_DEFAULT_AD_MAX_VALUE){ ucKeyNum = 0; } else if((usKeyAdValue<KEY1_AD_MAX_VALUE) && (usKeyAdValue>KEY1_AD_MIN_VALUE)){ ucKeyNum = 1; } else if((usKeyAdValue<KEY2_AD_MAX_VALUE) && (usKeyAdValue>KEY2_AD_MIN_VALUE)){ ucKeyNum = 2; } else if((usKeyAdValue<KEY3_AD_MAX_VALUE) && (usKeyAdValue>KEY3_AD_MIN_VALUE)){ ucKeyNum = 3; } else if((usKeyAdValue<KEY4_AD_MAX_VALUE) && (usKeyAdValue>KEY4_AD_MIN_VALUE)){ ucKeyNum = 4; } else if((usKeyAdValue<KEY5_AD_MAX_VALUE) && (usKeyAdValue>KEY5_AD_MIN_VALUE)){ ucKeyNum = 5; } else if(usKeyAdValue>KEY6_AD_MIN_VALUE){ ucKeyNum = 6; } else { } if(((sucAdKeyTail+1) & (AD_RESULT_BUFFER_LENTH-1)) == sucAdKeyHead) {//存满 ucAdResult[sucAdKeyHead] = ucKeyNum; sucAdKeyTail = sucAdKeyHead; sucAdKeyHead = (sucAdKeyHead + 1) & (AD_RESULT_BUFFER_LENTH-1); return 1; } else {//没存满 ucAdResult[sucAdKeyTail] = ucKeyNum; sucAdKeyTail = (sucAdKeyTail + 1) & (AD_RESULT_BUFFER_LENTH-1); return 0; } }
void vAdKeyScan(void){ unsigned char i =0; if(ucReadKeyFlag >= 15){ //每15ms扫描一次按键值并更新显示 if(ucWriteToAdFifo(usGetAdcValue(KEYADCCHANNEL))){//如果读到按键的值,填到按键ADC缓冲满 if(ucReadFromAdFifo(&i)){//如果读到有效按键值,更新指示灯显示值 // if(ucReadFromAdFifo(&ucKeyEvent)){//如果读到有效按键值,更新指示灯显示值 // vLedShow();//更新按键显示 } } ucReadKeyFlag = 0;//清读按键ADC值标志 } } void vInitAdFifo(void) { unsigned char i = 0; sucAdKeyTail = 0; sucAdKeyHead = 0; for(i=0;i<AD_RESULT_BUFFER_LENTH;i++){ ucAdResult[i] = 0; } }

最后欢迎大家转发评论交流!如果大家觉得我写的好就来个转发吧,分享给更多爱技术的人。也欢迎大家关注我的头条号:单片机嵌入式爱好者。会有源源不断的干货分享,能真正快速帮大家解决实际工作中遇到的问题哦!

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26669.html

标签: 单片机电阻
分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。