2. 按键控制LED亮灭

任务说明

本案例实现一个最小按键控制LED系统:按下按键时LED点亮,松开按键时LED熄灭。核心目标是掌握GPIO输入模式配置、按键状态读取以及软件消抖处理。使用STC89C52单片机(12MHz晶振)作为目标平台,代码基于标准8051内核,可直接移植至其他兼容芯片。

硬件连接

  • LED正极经1kΩ限流电阻接VCC(5V),负极接P1.0引脚——低电平点亮
  • 按键一端接P3.2引脚(INT0),另一端接GND——按下为低电平
  • P3.2内部无上拉,需启用内部上拉电阻(STC89C52默认准双向口已带上拉)
STC89C52 P1.0 → LED P3.2 ← KEY P1.0 P3.2 LED 1kΩ VCC(5V) KEY GND 内部上拉

代码实现


#include <reg52.h>

sbit LED = P1^0;    // LED接P1.0,低电平点亮
sbit KEY = P3^2;    // 按键接P3.2,按下为低电平

/* 软件延时约10ms(12MHz晶振) */
void delay_10ms(void)
{
    unsigned char i, j;
    for (i = 0; i < 20; i++)
        for (j = 0; j < 250; j++);
}

/* 按键消抖并读取状态:返回1表示按下,0表示未按下 */
unsigned char key_pressed(void)
{
    if (KEY == 0)          // 第一次检测到低电平
    {
        delay_10ms();      // 延时跳过机械抖动
        if (KEY == 0)      // 再次确认仍为低电平
            return 1;
    }
    return 0;
}

void main(void)
{
    while (1)
    {
        if (key_pressed())
        {
            LED = 0;       // 点亮LED
            while (KEY == 0);  // 等待按键释放,防止连续触发
        }
        else
        {
            LED = 1;       // 熄灭LED
        }
    }
}

编译与烧录

使用Keil C51创建工程,选择芯片型号STC89C52,将上述代码保存为main.c加入工程编译生成HEX文件。使用STC-ISP软件通过串口将HEX文件烧录至单片机。

验证方法

  1. 按原理图连接电路,确认LED负极接P1.0,按键一端接P3.2、另一端接GND
  2. 上电后观察LED初始状态应为熄灭
  3. 按下按键并保持,LED应点亮;松开按键,LED应熄灭
  4. 快速连续按动按键,LED状态应跟随按键动作稳定切换,无闪烁或误触发

判定标准:按键按下时LED稳定点亮,松开后LED稳定熄灭,且快速按动时无抖动导致的异常闪烁,即视为功能通过。