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

不买开发板,不接线。先看懂一件最基础的事:我们在电脑里写的一行代码,怎么就能让一盏灯亮起来?
digitalWrite(8, HIGH);
这行代码不是在“制造光”,也不是在给 LED 传一句“请亮起来”。它改变的是单片机一个引脚的输出状态。之后发生的事情,就进入了电路的世界。
这篇用 3 张循环动画,把这条链路拆开。
所有动画均为原理示意,不是芯片仿真或真机实测。动作已放慢;电压切换、电流和发光过程经过简化。
先约定一条电路
为了不被不同开发板的接法绕晕,这一课只讨论下面的情况:
输出引脚 → 限流电阻 → LED 阳极 → LED 阴极 → GND。
单片机已经正常供电,LED 极性正确,电阻选择合适,相关引脚已经配置成输出。示例中的 8 指 Arduino Uno R3 的数字引脚 D8;它不是所有 ESP32、Blue Pill 都能照搬的引脚编号。
你暂时不需要接这条电路,只需要记住:灯的一端由引脚控制,另一端通向 GND。 GND 是电路的共同参考点和供电回路的一部分,不是“把电流倒进大地”。
动画一:代码先改变引脚,灯才跟着改变

GPIO 可以先理解为“能由程序控制或读取的引脚”。
当它被设置成输出时,程序可以让它输出高电平或低电平:
HIGH:高电平,输出电压接近该芯片的 I/O 供电电压。LOW:低电平,输出电压接近 GND。
这里的“高”和“低”是相对电平,不是跨开发板统一的电压数值,也不是“强电”和“弱电”。实际输出还受电路负载影响。
动画里的“写入 1 / 写入 0”,表示设置逻辑输出状态,不是在给整个引脚编号或者整块芯片写一个数字。
在我们约定的电路中,引脚输出高电平时,可以为 LED 提供足够的正向电压,灯就亮了;输出低电平时,灯熄灭。
动画二:真正让 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() 里什么也没写。只要没有后续代码、复位或外设配置改变这个输出,已经设置好的状态仍然保持。
它不需要每隔一会儿重新喊一次“亮”。
动画三:程序在等待,灯为什么还亮着?

让灯一亮一灭,只需要交替改变输出,中间留出等待时间:
void setup() {
pinMode(8, OUTPUT);
}
void loop() {
digitalWrite(8, HIGH);
delay(1000);
digitalWrite(8, LOW);
delay(1000);
}
看动画中高亮的代码行:
- 执行
HIGH后,输出变高,LED 亮。 - 进入第一个
delay(1000),当前程序流程等待约 1 秒,输出继续保持高电平。 - 执行
LOW后,输出变低,LED 灭。 - 再等待约 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。