
2.5 MCS-51单片机I/O接口
MCS-51单片机内部有4个8位的并行I/O口P0、P1、P2和P3。这4个接口既可以作为输入接口,也可以作为输出接口;可按字节方式(8位)来处理数据,也可以按位方式(1位)使用。
在无片外扩展存储器的系统中,这4个I/O口都可以作为通用I/O口使用;在有片外扩展存储器的系统中,P2口送出高8位地址,P0口分时送出低8位地址和8位数据信号。下面分别介绍这4个I/O口。
1.P0口
P0口是一个8位漏极开路型双向I/O端口,P0口某一位的内部结构图如图2-6所示。它由一个输出D锁存器、两个三态数据输入缓冲器(1门、2门)、一个输出驱动电路(场效应管T1和T2)和一个控制电路(与门、非门及转换开关MUX)组成。图中的控制信号C决定转换开关MUX的位置:当C=0时,MUX拨向下方,P0口作为通用I/O口使用;当C=1时,MUX拨向上方,P0口作为地址/数据总线使用。

图2-6 P0口某一位内部结构图
1)P0口作为通用I/O口使用
(1)P0口作为输出口。
P0口作为输出口使用时,由D锁存器和场效应管驱动电路构成数据输出通路。CPU发来的控制信号C为0,封锁了与门,此时MUX与锁存器的反相输出端接通,与门输出为0,T1截止,T2处于漏极开路状态。内部数据总线的数据在“写锁存器”信号的作用下,由D端进入锁存器,取反后出现在输出端Q-,再经过T2反向,则P0.X引脚上的数据就是内部总线的数据。由于T2为漏极开路输出,故此时必须外接上拉电阻,才能得到有效的输出高电平。P0口作为输出口使用时其驱动能力是4个I/O口中最强的,能驱动8个TTL。
注意:上拉电阻的作用简单来说就是把电平拉高,通常用4.7~10k的电阻接到 VCC电源上,如图2-6中虚线所示。下拉电阻的作用则是把电平拉低,电阻接到GND地线上。
(2)P0口作为输入口。
P0口作为输入口使用时,输入数据信号分为“读引脚”和“读锁存器”两种方式,由两个输入三态缓冲器(1门、2门)控制,使用时应注意区分。
① 方式1——读引脚:所谓读引脚,就是读芯片引脚的状态,这时使用下方的数据缓冲器(2门),由“读引脚”信号把缓冲器(2门)打开,把P0.X引脚上的数据从缓冲器通过内部数据总线读进来。
注意:在读引脚时,为避免锁存器为“0”状态时对引脚读入的干扰,必须先向电路中的D锁存器写入1,使T2截止,P0.X引脚处于悬浮状态而成为高阻抗输入,此时读入的引脚信号才正确。
② 方式2——读锁存器:所谓读锁存器,就是通过上方的数据缓冲器(1门)读锁存器Q端的状态。读锁存器是为了适应对I/O端口进行“读—改—写”操作语句的需要,如下面的C51语句:
P0=P0&0xf0; //将P0口的低4位引脚清零输出
该语句执行时,分为“读—改—写”三步。首先读入P0口锁存器中的数据,然后与0xf0进行“逻辑与”操作,最后将所读入数据的低4位清零,再把结果送回P0口。对于这类“读—改—写”语句,不直接读引脚而读锁存器是为了避免可能出现的错误。因为在端口已处于输出状态的情况下,如果端口的负载恰好是一个晶体管的基极,则导通了的PN结会把端口引脚下的高电平拉低,这样直接读引脚就会把本来的“1”误读为“0”。但若从锁存器Q端读,就能避免这样的错误,得到正确的数据。
2)P0口作为地址/数据线使用
若要进行单片机系统的扩展,在访问外部程序和数据存储器时,P0口作为分时转换的地址(低8位)/数据线,对访问期间内部的上拉电阻起作用。
MUX将地址/数据线与T2接通,同时与门输出有效。若地址/数据线为1,则T1导通, T2截止,P0口输出为1;反之T1截止,T2导通,P0口输出为0。当数据从P0口输入时,读引脚使三态缓冲器2门打开,端口上的数据经缓冲器2门直接送到内部总线。
3)P0口小结
(1)P0口既可作为地址/数据总线使用,也可作为通用I/O口使用。当P0口作为地址/数据线使用时,就不能再作为通用I/O口使用了。
(2)P0口作为输出口使用时,由于T1截止,其为漏极开路输出,必须外接上拉电阻,才能得到有效高电平输出。
(3)P0口作为输入口读引脚时,应先向锁存器写1,使T2截止,这样才不影响输入信号的正确读入。
2.P1口
P1口是一个带有内部上拉电阻的8位准双向I/O端口,输出时可驱动4个TTL。P1口某一位的内部结构图如图2-7所示。
P1口是准双向口,仅能作为通用I/O口使用。由图2-7可知,在其输出端接有上拉电阻,故可以直接输出而无须外接上拉电阻。同P0口一样,当其作为输入口时,必须先向锁存器写1,使场效应管T截止。

图2-7 P1口某一位内部结构图
3.P2口
P2口是一个带有内部上拉电阻的8位准双向I/O端口,输出时可驱动4个TTL。P2口某一位的内部结构图如图2-8所示。

图2-8 P2口某一位内部结构图
与P0口相同,图中的控制信号C决定转换开关MUX的位置:当C=0时,MUX拨向下方,P2口为通用I/O口;当控制信号C=1时,MUX拨向上方,P2口作为地址总线使用。在实际应用中,P2口通常作为高8位地址总线使用。
4.P3口
P3口是一个带有内部上拉电阻的8位准双向I/O端口,输出时可驱动4个TTL。P3口某一位的内部结构图如图2-9所示。

图2-9 P3口某一位内部结构图
P3口作为通用I/O口时,第二输出功能信号W=1,P3口的每一位都可定义为输入或输出,其工作原理同P1口类似。除此之外P3端口还用于第二专门功能,如表2-3所示。在实际应用电路中,P3口的第二功能显得更为重要。
表2-3 P3口第二功能

注意:
①对于MCS-51单片机(CHMOS),端口只能提供几毫安的输出电流,故当其作为输出口去驱动一个普通晶体管的基极时,应在端口与晶体管基极间串联一个电阻,以限制高电平输出时的电流。
② 为提高单片机端口带负载的能力,通常在端口和外接负载之间增加一个缓冲驱动器,如74LS245、74LS06或74LS07等芯片。