1.5 独立按键实验
学习目标:掌握按键输入检测、消抖处理,实现按键控制 LED 点亮/熄灭。
实验原理
独立按键电路
独立按键一端接 I/O 口,另一端接地(低电平有效)。未按下时 I/O 被内部上拉电阻拉高(读 1),按下时接地(读 0)。
VCC
│
[R 上拉 10K]
│
├─── P3.0 (读按键状态)
│
[按键]
│
GND51 单片机 P3 口内部有上拉电阻,可省略外部上拉;P1 口也需内部上拉。若用 P0 口则必须外接上拉电阻。
按键抖动
机械按键按下/释放瞬间,触点会因弹跳产生抖动(约 5~20ms),导致电平不稳定:
按下瞬间:
┌─┐ ┌─┐
│ │ │ │ ← 抖动(弹跳)
─┘ └─┘ └───────── 稳定低电平消抖方法(软件):
- 检测到按键按下
- 延时约 10ms(跳过抖动期)
- 再次检测确认仍按下
- 确认有效,执行处理
程序设计
单按键控制 LED
c
/****************************************************
* 实验名称:独立按键控制 LED
* 功能:按下按键 LED 点亮,松开熄灭
****************************************************/
#include <reg51.h>
sbit KEY = P3^0; // 按键接 P3.0
sbit LED = P1^0; // LED 接 P1.0
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 120; j > 0; j--);
}
void main(void)
{
while (1)
{
if (KEY == 0) // 检测到按下
{
delay(10); // 延时消抖
if (KEY == 0) // 确认仍按下
{
LED = 0; // 点亮 LED
while (KEY == 0); // 等待松开(防重复触发)
}
}
else
{
LED = 1; // 松开熄灭
}
}
}按键翻转 LED(每按一次翻转一次)
c
/****************************************************
* 实验名称:按键翻转 LED
* 功能:每按一次按键,LED 状态翻转一次
****************************************************/
#include <reg51.h>
sbit KEY = P3^0;
sbit LED = P1^0;
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 120; j > 0; j--);
}
void main(void)
{
while (1)
{
if (KEY == 0)
{
delay(10); // 消抖
if (KEY == 0)
{
while (KEY == 0); // 等待松开
delay(10); // 松开消抖
LED = ~LED; // 翻转状态
}
}
}
}关键知识点
| 知识点 | 说明 |
|---|---|
| 上拉电阻 | 保证未按下时 I/O 为高电平 |
| 低电平有效 | 按下接地,读 0 |
| 软件消抖 | 延时后二次确认,消除机械抖动 |
| 等待松开 | while(KEY==0) 防止一次按下触发多次 |
消抖流程对比
无消抖:按下 → 立即响应 → 可能触发多次(抖动误判)
有消抖:按下 → 延时10ms → 确认 → 响应一次常见问题
Q1:按键没反应?
- 检查按键是否接对引脚
- 检查上拉电阻是否接好(P0 口必须外接上拉)
Q2:按一次触发多次?
- 抖动未消除,加延时消抖
- 缺少"等待松开"逻辑
Q3:按键电平反了?
- 检查按键是接 VCC 还是 GND
- 若接 VCC(高电平有效),判断条件改为
if(KEY==1)
实验任务
- 用按键控制 LED 亮灭(按住亮、松开灭)
- 每按一次 LED 翻转一次
- 扩展:4 个按键分别控制 4 颗 LED
考核点 / 验收标准
| 考核项 | 验收标准 | 分值 |
|---|---|---|
| 按键电路 | 按键输入电路连接正确(上拉 + 接地) | 25 |
| 消抖处理 | 正确实现软件消抖,按键响应稳定 | 30 |
| 按键控制 | 实现按键控制 LED 亮灭或翻转 | 30 |
| 扩展能力 | 能用 4 个按键分别控制 4 颗 LED | 15 |
实操要求:现场演示按键翻转 LED,验证单次触发无抖动误判。