【嵌入式成长2】STC89C51独立按键|电平读取、软件消抖、触摸按键实战
2026/8/20 9:24:08 网站建设 项目流程

一、按键应用场景

按键是单片机最基础的人机交互输入设备。生活中轻触开关、微动开关、电容触摸按键、光栅传感器,都属于输入开关类器件。
开发板上的独立按键,本质就是机械轻触开关,按下导通,松开断开。

二、按键硬件原理

轻触按键可以理解为可手动控制的导线:按下两根导线接通,松开导线断开

上拉按键电路解析

  • 按键松开: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:单通道触摸检测芯片,宽电压、低功耗,大量用于消费电子产品替代机械按键。

六、本章小结

  1. 独立按键硬件:上拉电阻电路,松开高电平,按下低电平。
  2. 机械按键存在5‑10ms抖动,必须做消抖处理,否则会误触发
  3. 软件消抖主流做法:检测电平→延时10ms→再次确认电平。
  4. while(key==0)等待按键释放,实现一次按下只执行一次逻辑。
  5. 电容触摸按键输出电平信号,单片机代码和机械按键完全兼容。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询