Skip to content

1.5 独立按键实验 ​

学习目标:掌握按键输入检测、消抖处理,实现按键控制 LED 点亮/熄灭。

实验原理 ​

独立按键电路 ​

独立按键一端接 I/O 口,另一端接地(低电平有效)。未按下时 I/O 被内部上拉电阻拉高(读 1),按下时接地(读 0)。

VCC
 │
[R 上拉 10K]
 │
 ├─── P3.0 (读按键状态)
 │
[按键]
 │
GND

51 单片机 P3 口内部有上拉电阻,可省略外部上拉;P1 口也需内部上拉。若用 P0 口则必须外接上拉电阻。

按键抖动 ​

机械按键按下/释放瞬间,触点会因弹跳产生抖动(约 5~20ms),导致电平不稳定:

按下瞬间:
 ┌─┐ ┌─┐
 │ │ │ │   ← 抖动(弹跳)
─┘ └─┘ └───────── 稳定低电平

消抖方法(软件):

  1. 检测到按键按下
  2. 延时约 10ms(跳过抖动期)
  3. 再次检测确认仍按下
  4. 确认有效,执行处理

程序设计 ​

单按键控制 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)

实验任务 ​

  1. 用按键控制 LED 亮灭(按住亮、松开灭)
  2. 每按一次 LED 翻转一次
  3. 扩展:4 个按键分别控制 4 颗 LED

考核点 / 验收标准 ​

考核项验收标准分值
按键电路按键输入电路连接正确(上拉 + 接地)25
消抖处理正确实现软件消抖,按键响应稳定30
按键控制实现按键控制 LED 亮灭或翻转30
扩展能力能用 4 个按键分别控制 4 颗 LED15

实操要求:现场演示按键翻转 LED,验证单次触发无抖动误判。

aioteer · 物联网专业课程群

💬AI 伴学配置