P0口和其它三个口的内部电路是不同的,如下图
P0口是接在两个三极管D0和D1之间的,而P1-P3口的上部是接一个电阻的。P0口的上面那个三极管D0是在进扩展存储器或扩展总线时运用MOVX指令时才会操控它的导通和截止,在不必此指令时都是截止的。在往常咱们运用如:P0_1=0 P0_1=1这些句子时操控的都是下面那个三极管D1。
咱们先假定P1口接一个74HC373,来看一看它的等效图

当AT89S51的P1口上接了74HC373后就等于接了一个负载,如上图右边。一般来说这些数字电路的输入阻抗都很大,都在几百K到上兆欧姆,而P1口内的电阻R一般在几十K以内。
如上图,当咱们宣布指令P1=0时,三极管D导通,见中心的等效图,这时P1点的电位为0。
当宣布P1=1的指令后,三极管D截止,见右边等效图,由于Rx的阻值要比R的阻值大得多,因而P1点的电位是挨近电源电压的。即高电平。
咱们再来看看P0口接负载时的图

当P0=0时,等效图是中心的,三极管D1导通,P0点的电位为0。
而当P0=1时,等效图是右边的,三极管D1截止,而上面的三极管D0始终是截止的,这样P0点就等效于悬空了,它处在不稳定状况,P0点又是RX的高阻抗输入点,很简单遭到外界和周围电路的搅扰然后直接影响到74HC373的输出状况。因而就得加上个电阻。如下图

加上电阻Rc后,电路的状况就和P1口相同了,这个电阻Rc便是上拉电阻。
但你假如仅仅为了让P0口驱动个发光管,那电路能够直接简化成下图那样。S51内部的电流最好不超越15mA,假如发光管的电压为2.2V那电阻便是(5-2.2)÷15=0.18K,也便是180欧姆。
当P0=0时P0点为低电位,发光管亮起,流过D1的电流约为15mA。
当P0=1时,P0点为悬空,但发光管和180欧电阻都是低阻抗元件,P点电位就为高电位,再说也无任何输出影响,因而这样电路是能够的。