单片机 LED 与点阵控制
同一套 LED 控制思想在 51、STM32、Arduino 上的三种写法:流水灯、呼吸灯与点阵显示,适合嵌入式入门。
项目简介
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 闪烁
}
}操作步骤
- 51 版:Keil 建工程选 AT89C52,编译后烧录到开发板 P0 口观察流水灯。
- Arduino 版:LED 正极接 D9(串联 220Ω 电阻),上传后即可看到呼吸效果。
- STM32 版:STM32CubeMX 初始化 PB1 为输出,生成工程后替换 main 循环体。
来源参考
GitHub 关键词:51-led-flow、arduino-breathing-led、stm32-hal-examples(链接可替换为实际仓库地址)。