标准应该是普通51那种,弱上拉,可以输出高电平,输出高电平后也允许外部强行拉低,这种用起来比较方便,不容易发生电平冲突。推挽就是强上拉了,拉电流比较大,不允许外部拉低,只能用于输出信号不能输入。开漏是完全没有上拉能力的,不能输出高电平,但可以输出低电平,相当于对地接一个开关。高阻模式无输出能力,相当于开路,只能输入信号。
楼上回答的很详细了,我说一下个人理解的开漏输出,开漏:IO口内部上拉电阻断开。设置管脚输出为“1”时,该引脚处于开漏,也就是相当于此IO管脚和系统是断开的状态(可以理解成继电器断开状态),我见识过有些电路就通过IO开漏的特性实现电路中某些开关的功能; 设置引脚输出为“0”时,该引脚将拉低电平。I2C总线的SDA引脚就使用了开漏输出功能。在需要释放SDA总线时,只需要将SDA设置输出为“1”就可以了。