为什么值得单独写一篇
上拉电阻大概是初学者画第一块板子时「照抄」最多的元件——按键要加、I2C 要加、复位脚要加,但「为什么加、阻值怎么定」常常说不清。这篇用三张图把它讲透。
一、先认识反派角色:「悬空」
单片机的输入引脚阻抗极高,像一个「耳朵特别灵但立场不坚定」的听众。如果什么都不接,引脚就处于**悬空(Floating)**状态:
- 它会随机读到 0 或 1,随环境电磁噪声、你的手靠近与否而变化;
- 典型症状:没按键的时候串口乱打印、LED 随机闪烁、逻辑时对时错。
一个可以现场做的实验
把 GPIO 设为输入、什么都不接,用串口每秒打印一次电平:你会看到 0/1 完全随机。用手指摸一下引脚(或靠近电源线),读数立刻规律地变——这就是悬空引脚在「听」环境噪声。
二、上拉与下拉:给引脚一个「默认立场」
解决办法就是用一颗电阻,把引脚默认「拴」在确定的电平上:
- 上拉电阻:引脚经电阻接 VCC → 默认读 1;
- 下拉电阻:引脚经电阻接 GND → 默认读 0。
两颗电阻决定了「没人按按键时引脚是什么」,而按键(或别的器件)负责「按下去时把它拽到另一个电平」:


两张图是同一件事的镜像。实际工程里上拉用得远比下拉多,原因有三:很多芯片复位后引脚默认是「高」、N-MOS 开漏输出天然需要上拉、以及按下接地比接电源的布线更安全(避免 VCC 短路风险)。
三、阻值怎么选?10 kΩ 的由来
上拉电阻取值是两个诉求的折中:
| 阻值太小(如 100 Ω) | 阻值太大(如 10 MΩ) |
|---|---|
| 按下时 VCC→电阻→GND 直接短路,电流太大(33 mA @3.3V),发热浪费电 | 引脚「耳朵」再灵也拉不动:抗干扰差,信号上升沿被寄生电容拖得又缓又慢 |
10 kΩ 恰好落在「功耗可忽略(0.33 mA) + 抗扰足够」的舒适区,于是成了万能默认值。几个经验值:
- 按键输入:4.7 kΩ ~ 10 kΩ 随手取;
- I2C 总线:标准模式下常见 2.2 kΩ ~ 4.7 kΩ(需要更快边沿、线更长时取小);
- 低功耗设计:想再省电,可以放大到 100 kΩ,但要重新审视抗扰与速率。
四、三个经典场景
① 按键输入(上图)——默认 1,按下变 0,固件里就是「检测低电平」。注意别忘了它:如果芯片内部本来可以开上拉(STM32 的 GPIO_PULLUP),外置电阻可以省,但换芯片前要先查数据手册。
② I2C 总线——I2C 的 SDA/SCL 都是开漏输出:器件只会「拉低」,永远「放不高」。必须由总线上的一对上拉电阻把空闲电平「顶」在 3.3 V,通信才成立。I2C 上的上拉不可省略,两个引脚各一颗。
③ 复位/使能脚——复位脚(NRST)、使能(EN)脚若悬空,上电瞬间电平不定,芯片可能「抽风」。挂一颗 10 kΩ 上拉(或按手册要求下拉),让它一出生就是确定状态。
五、新手常见误区
- 「输入脚=悬空脚」:配置成输入却什么都没接,还纳闷为什么读数乱跳——先检查上拉/下拉。
- 上拉电阻取值随心所欲:220 Ω 的上拉会让按键电流飙到 15 mA;10 MΩ 的 I2C 上拉直接通信失败。按场景选,别两头走极端。
- 内部上拉与外部上拉叠加不管:两者并联会改变等效阻值(10 kΩ ∥ 10 kΩ = 5 kΩ),一般无害,但设计低功耗或高速率电路时要算一下。
- 以为下拉电路里电阻换成 0 Ω 更稳:0 Ω「下拉」= 按键永远短路到地,按下 VCC 对地短路,轻则跳闸重则烧板。
六、小结
- 悬空的输入引脚 = 随机电平发生器;上拉/下拉的使命是给引脚确定默认电平;
- 上拉 → 默认 1(工程首选),下拉 → 默认 0;
- 10 kΩ 是万能起点,I2C 用 2.2~4.7 kΩ,低功耗可到 100 kΩ;
- 看到开漏输出、复位脚、按键,脑子里就要响起「上拉」的警铃。
既然按键电路里会出现抖动(下一篇的主角)和上拉(本篇主角),把它们组合起来就是完整的实战电路,欢迎继续阅读《按键消抖:为什么按一下,却被识别成好几次?》。