一、按键应用场景
按键是单片机最基础的人机交互输入设备。生活中轻触开关、微动开关、电容触摸按键、光栅传感器,都属于输入开关类器件。
开发板上的独立按键,本质就是机械轻触开关,按下导通,松开断开。
二、按键硬件原理
轻触按键可以理解为可手动控制的导线:按下两根导线接通,松开导线断开。
上拉按键电路解析
- 按键松开:IO引脚被上拉电阻接到VCC,IO为高电平(1)
- 按键按下:按键把引脚连接GND,IO为低电平(0)
单片机通过读取IO引脚电平,就能够判断按键是否按下。
电平概念(TTL电路 3.3V系统)
- 高电平:2.4V ~3.3V,代码中用
1表示 - 低电平:0V ~0.8V,代码中用
0表示
三、开发板硬件资源
本开发板一共有3颗独立机械按键:
- KEY1 → P3.7
- KEY2 → P3.6
- KEY3 → P3.5
电路采用4.7K上拉电阻,增加ESD保护二极管,防止静电损坏单片机IO。
最简单按键代码(未消抖)
功能:按下按键,翻转LED状态,LED接P2.7
#include<reg52.h>sbit led1=P2^7;sbit key1=P3^7;voidmain(){while(1){//检测按键低电平,代表按键按下if(key1==0){led1=~led1;//翻转LED电平}}}⚠️直接运行该代码会出现BUG:按一次按键,LED会多次翻转。这就是机械按键抖动导致。
四、按键抖动与软件消抖
机械按键金属触点存在弹性,按下、松开瞬间电平会反复跳变,这个现象叫按键抖动。
抖动持续时间一般5‑10ms。单片机运行速度极快,会把一次按键识别成多次按下。
解决方法:软件延时消抖
检测到按键低电平之后,延时10ms,再次读取IO电平;如果依旧是低电平,才确认按键真实按下。
基础消抖版本
#include<reg52.h>sbit led1=P2^7;sbit key1=P3^7;//毫秒延时函数 @12MHz晶振voiddelay_ms(unsignedintxms){unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}}voidmain(){while(1){if(key1==0){delay_ms(10);//延时跳过抖动if(key1==0){//再次确认按键状态led1=~led1;delay_ms(1000);}}}}优化版本:增加等待按键释放
上面代码存在问题:如果手一直按住按键,会反复触发。增加while(key1==0);等待按键松开,按下一次只执行一次动作。
拓展:开发板还带有电容触摸按键,QC引脚接到P4.3,需要手动定义P4寄存器地址。
#include<reg52.h>sfr P4=0xe8;//手动定义P4口寄存器,reg52.h默认没有定义P4sbit led1=P2^7;sbit key1=P4^3;//触摸按键QC输出引脚//毫秒延时函数 @12MHz晶振voiddelay_ms(unsignedintxms){unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}}voidmain(){while(1){if(key1==0){delay_ms(10);//软件消抖if(key1==0){led1=~led1;//翻转LEDwhile(key1==0);//阻塞等待按键释放}}}}五、电容触摸按键原理拓展
传统机械按键依靠金属触点导通;电容触摸按键依靠感应电容变化。
PCB上留有触摸PAD焊盘,人体手指靠近时,手指与大地形成额外感应电容,总电容发生变化。触摸检测芯片(PT2041A)检测电容变化后输出电平信号给单片机。
对于51单片机,触摸按键输出引脚和普通机械按键用法完全一致:只需要读取IO口电平,同样需要软件消抖。不需要复杂算法,代码和机械按键通用。
PT2041A:单通道触摸检测芯片,宽电压、低功耗,大量用于消费电子产品替代机械按键。
六、本章小结
- 独立按键硬件:上拉电阻电路,松开高电平,按下低电平。
- 机械按键存在5‑10ms抖动,必须做消抖处理,否则会误触发。
- 软件消抖主流做法:检测电平→延时10ms→再次确认电平。
while(key==0)等待按键释放,实现一次按下只执行一次逻辑。- 电容触摸按键输出电平信号,单片机代码和机械按键完全兼容。