单片机的 GPIO 一般会有: 输入 输出 模式,输入模式有输入上拉,下拉或高阻 输出模式有推挽,开漏。 51 单片机还有准双向模式。 输入模式 上拉,下拉都比较好理解。比如按键输入时,将口线设置为输入上拉,这样就按键可以不上拉。输入上拉模式一般上拉电流很小,通常情况为数百微安,如果上拉电流不合适,外围电路就得单独考虑上拉问题。 输出模式常用推挽输出,当输出高电平时,可以源出电流,输出低电平时,可以源入电流。 比如点亮一个 LED 灯,使用低电平点亮,使用推挽输出,如果 LED 灯被上拉到 5V , 3.3V 系统上,为高时, LED 有可能仍然会亮。只是比为低时亮度小一点。这种情况下,如果将输出改为 OD , LED 就可以正常亮灭。 另一个例子, GPIO 模拟 I ² C 总线。 SCL 线可以设置为推挽输出,没问题。但 SDA 是双向的,读取数据时或读 ACK 时,需要改变端口方向。比如 SDA 输出为 PP 高,从器件异步 ACK 拉低,端口会输出大电流。如果 SDA 线改成 OD 输出,则无此问题。当需要输入时,不需要改变端口方向,只需要将端口输出置高即可。总线上不会有异常电流。 51 单片机的准双向模式就更神奇了,可以与 OD 输出类比,但不需要外接上拉电阻(加了也无妨)。 输出为高时,在开始的 2 个 CPU 时钟为强上拉,保证动态特性,随后变成弱上拉。此时如果外部输入为高,则保持弱上拉,可以读入稳定的高。如果外部输入为低,端口变成极弱上拉,能读入低。当输出为低的时候,强下拉到低。需要注意的是,外部输入的电流不要过大,不然端口电流过大,可能会 latch up 。