一行代码,为什么能点亮 LED?|单片机动画课 01

课程插图

不买开发板,不接线。先看懂一件最基础的事:我们在电脑里写的一行代码,怎么就能让一盏灯亮起来?

digitalWrite(8, HIGH);

这行代码不是在“制造光”,也不是在给 LED 传一句“请亮起来”。它改变的是单片机一个引脚的输出状态。之后发生的事情,就进入了电路的世界。

这篇用 3 张循环动画,把这条链路拆开。

所有动画均为原理示意,不是芯片仿真或真机实测。动作已放慢;电压切换、电流和发光过程经过简化。

先约定一条电路

为了不被不同开发板的接法绕晕,这一课只讨论下面的情况:

输出引脚 → 限流电阻 → LED 阳极 → LED 阴极 → GND。

单片机已经正常供电,LED 极性正确,电阻选择合适,相关引脚已经配置成输出。示例中的 8 指 Arduino Uno R3 的数字引脚 D8;它不是所有 ESP32、Blue Pill 都能照搬的引脚编号。

你暂时不需要接这条电路,只需要记住:灯的一端由引脚控制,另一端通向 GND。 GND 是电路的共同参考点和供电回路的一部分,不是“把电流倒进大地”。

动画一:代码先改变引脚,灯才跟着改变

动画一:代码、GPIO 电平与 LED 状态同步变化

GPIO 可以先理解为“能由程序控制或读取的引脚”。

当它被设置成输出时,程序可以让它输出高电平或低电平:

这里的“高”和“低”是相对电平,不是跨开发板统一的电压数值,也不是“强电”和“弱电”。实际输出还受电路负载影响。

动画里的“写入 1 / 写入 0”,表示设置逻辑输出状态,不是在给整个引脚编号或者整块芯片写一个数字。

在我们约定的电路中,引脚输出高电平时,可以为 LED 提供足够的正向电压,灯就亮了;输出低电平时,灯熄灭。

动画二:真正让 LED 发光的是电流

动画二:GPIO 输出级切换与 LED 电流路径

为了便于理解,动画把芯片的输出级画成一个能切换方向的开关:

输出 HIGH 时,引脚通过内部输出电路连接到供电一侧。传统电流方向是从供电经输出级、限流电阻和 LED,流向 GND,再通过供电回路返回。

LED 中有合适的正向电流流过,就会发光。能量来自板子的电源,代码只是改变了控制状态。

输出 LOW 时,引脚被驱动到接近 GND。此时 LED 两端没有足够的正向电压,因此熄灭。注意,这并不是把引脚“拔掉”或变成悬空。

图里的开关是功能模型,真实芯片用晶体管等电路实现;橙色箭头表示传统电流方向,移动圆点只是帮助观察路径,不表示电子的运动方向或真实传播速度。

中间那只电阻也不是装饰。它负责限制电流,保护 LED 和引脚。 GPIO 不是可以任意带负载的电源接口。本课先理解作用,后面再讲如何结合供电电压、LED 参数和引脚规格选择电阻。

还少了一个前提:让这个引脚负责“输出”

如果想让 D8 控制我们约定的外接 LED,需要先配置引脚方向:

void setup() {
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
}

void loop() {
}

pinMode(8, OUTPUT) 可以理解为:“让 D8 负责输出电平。”

接下来,digitalWrite(8, HIGH) 才是在这个前提下设置输出状态。不能跳过前提,把这行函数理解成对任何模式的引脚都直接“开灯”。

这段程序还有一个值得观察的地方:loop() 里什么也没写。只要没有后续代码、复位或外设配置改变这个输出,已经设置好的状态仍然保持。

它不需要每隔一会儿重新喊一次“亮”。

动画三:程序在等待,灯为什么还亮着?

动画三:代码执行位置、输出波形和 LED 状态

让灯一亮一灭,只需要交替改变输出,中间留出等待时间:

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

void loop() {
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);
delay(1000);
}

看动画中高亮的代码行:

  1. 执行 HIGH 后,输出变高,LED 亮。
  2. 进入第一个 delay(1000),当前程序流程等待约 1 秒,输出继续保持高电平。
  3. 执行 LOW 后,输出变低,LED 灭。
  4. 再等待约 1 秒,然后进入下一轮。

下方阶梯线表示引脚电平随时间变化。它不是电流的路径,也不是实测波形。动画把写入操作画成容易观察的步骤,实际这些操作通常比一秒的等待短得多。

等待不会自动把输出清零。 delay() 也不等于让整颗芯片完全停止工作;这一课只看它对当前这段程序流程的影响。

一个小问题:HIGH 一定代表灯亮吗?

不一定。

这篇能得到“HIGH 亮、LOW 灭”,是因为我们一开始约定了 LED 接到 GND 的电路。

如果换成另一种接法,让 LED 经电阻接到供电,而引脚负责把电流引向 GND,就可能变成 LOW 亮、HIGH 灭。板载 LED 还可能经过其他驱动电路。

所以,比记住“HIGH 就是开灯”更有用的是:看引脚改变后,电路有没有形成合适的电流通路。

留一个预测题

还是本课的电路。如果把程序中这句删掉:

digitalWrite(8, LOW);

两次等待都保留,LED 会怎样?

答案:第一次输出 HIGH 后,它会持续亮着。 因为等待不会把输出变低,后续也没有其他操作改变这个状态。

这一课先记住三件事:代码设置状态,引脚改变电平,电路中的电流让 LED 发光。

下一课,我们把方向反过来:按钮明明没按,引脚为什么还会乱跳? 从这里开始理解输入、悬空和上拉电阻。


资料依据:Arduino 官方 Blink 教程 · digitalWrite 参考 · 数字引脚说明

本篇为 GitStar 原创原理动画课程。文中程序用于说明控制逻辑,未声称本轮完成硬件测试。

发现更多好玩的开源项目

专注 Arduino、开源硬件、端侧 AI 和值得收藏的开发者工具。

课程插图

长按二维码关注「GitStar」

所有动画为教学原理示意,非芯片仿真、非硬件实测。网页发布:2026-09-21。