为什么值得单独写一篇

上拉电阻大概是初学者画第一块板子时「照抄」最多的元件——按键要加、I2C 要加、复位脚要加,但「为什么加、阻值怎么定」常常说不清。这篇用三张图把它讲透。

一、先认识反派角色:「悬空」

单片机的输入引脚阻抗极高,像一个「耳朵特别灵但立场不坚定」的听众。如果什么都不接,引脚就处于**悬空(Floating)**状态:

  • 它会随机读到 0 或 1,随环境电磁噪声、你的手靠近与否而变化;
  • 典型症状:没按键的时候串口乱打印、LED 随机闪烁、逻辑时对时错。

一个可以现场做的实验

把 GPIO 设为输入、什么都不接,用串口每秒打印一次电平:你会看到 0/1 完全随机。用手指摸一下引脚(或靠近电源线),读数立刻规律地变——这就是悬空引脚在「听」环境噪声。

二、上拉与下拉:给引脚一个「默认立场」

解决办法就是用一颗电阻,把引脚默认「拴」在确定的电平上:

  • 上拉电阻:引脚经电阻接 VCC → 默认读 1
  • 下拉电阻:引脚经电阻接 GND → 默认读 0

两颗电阻决定了「没人按按键时引脚是什么」,而按键(或别的器件)负责「按下去时把它拽到另一个电平」:

上拉电阻按键电路:未按下为 1,按下为 0

下拉电阻按键电路:未按下为 0,按下为 1

两张图是同一件事的镜像。实际工程里上拉用得远比下拉多,原因有三:很多芯片复位后引脚默认是「高」、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Ω 上拉(或按手册要求下拉),让它一出生就是确定状态。

五、新手常见误区

  1. 「输入脚=悬空脚」:配置成输入却什么都没接,还纳闷为什么读数乱跳——先检查上拉/下拉。
  2. 上拉电阻取值随心所欲:220 Ω 的上拉会让按键电流飙到 15 mA;10 MΩ 的 I2C 上拉直接通信失败。按场景选,别两头走极端。
  3. 内部上拉与外部上拉叠加不管:两者并联会改变等效阻值(10 kΩ ∥ 10 kΩ = 5 kΩ),一般无害,但设计低功耗或高速率电路时要算一下。
  4. 以为下拉电路里电阻换成 0 Ω 更稳:0 Ω「下拉」= 按键永远短路到地,按下 VCC 对地短路,轻则跳闸重则烧板。

六、小结

  • 悬空的输入引脚 = 随机电平发生器;上拉/下拉的使命是给引脚确定默认电平
  • 上拉 → 默认 1(工程首选),下拉 → 默认 0;
  • 10 kΩ 是万能起点,I2C 用 2.2~4.7 kΩ,低功耗可到 100 kΩ;
  • 看到开漏输出、复位脚、按键,脑子里就要响起「上拉」的警铃。

既然按键电路里会出现抖动(下一篇的主角)和上拉(本篇主角),把它们组合起来就是完整的实战电路,欢迎继续阅读《按键消抖:为什么按一下,却被识别成好几次?》