单片机 LED 与点阵控制

同一套 LED 控制思想在 51、STM32、Arduino 上的三种写法:流水灯、呼吸灯与点阵显示,适合嵌入式入门。

场景:嵌入式入门 技术栈:C / Keil / STM32 HAL / Arduino 来源:GitHub 参考

项目简介

LED 控制是单片机的 Hello World。掌握 IO 口输出、定时器延时、PWM 调光,就等于掌握了嵌入式开发的地基。以下三份代码对应三种主流平台,可直接烧录验证。

代码示例:51 单片机流水灯

c
#include <REGX52.H>

void delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++)
        for (j = 0; j < 120; j++);
}

void main() {
    unsigned char led = 0xFE;   // 1111 1110,P0.0 点亮
    while (1) {
        P0 = led;               // 输出到 P0 口
        delay(200);
        led = (led << 1) | 0x01;
        if (led == 0xFF) led = 0xFE;  // 循环回起点
    }
}

代码示例:Arduino 呼吸灯(PWM)

cpp
const int ledPin = 9;  // 支持 PWM 的引脚

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  for (int v = 0; v <= 255; v++) {   // 由暗到亮
    analogWrite(ledPin, v);
    delay(6);
  }
  for (int v = 255; v >= 0; v--) {   // 由亮到暗
    analogWrite(ledPin, v);
    delay(6);
  }
}

代码示例:STM32 HAL 点亮 LED

c
/* 假设 LED 接在 PB1,低电平点亮 */
#include "main.h"

void toggle_led(void) {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}

void main(void) {
    HAL_Init();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef io = {0};
    io.Pin = GPIO_PIN_1;
    io.Mode = GPIO_MODE_OUTPUT_PP;
    io.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &io);

    while (1) {
        toggle_led();
        HAL_Delay(500);   // 500ms 闪烁
    }
}

操作步骤

  1. 51 版:Keil 建工程选 AT89C52,编译后烧录到开发板 P0 口观察流水灯。
  2. Arduino 版:LED 正极接 D9(串联 220Ω 电阻),上传后即可看到呼吸效果。
  3. STM32 版:STM32CubeMX 初始化 PB1 为输出,生成工程后替换 main 循环体。

来源参考

GitHub 关键词:51-led-flowarduino-breathing-ledstm32-hal-examples(链接可替换为实际仓库地址)。