通过前面几节对场效应管、逻辑门等内容的铺垫后,我们来看看AT89S51单片机的P0、P1、P2、P3口的结构是怎么样的。了解单片机的I/O口结构,可以帮助设计外设与单片机的接口,同时对有关I/O口的操作有更深入的认识。
如图5-17所示为AT89S51单片机的P1口结构,其中“管脚P1.x”代表P1.0~P1.7中任意一个管脚。P1口主要由D锁存器、两个缓冲器、场效应管、内部上拉电阻等组成。在“写锁存器”信号的控制下,锁存器的输出端 Q 与输入端 D 的信号相同,而输出端 与 D 的信号相反。
当程序让该I/O口输出1时,“内部总线”会出现1,当“写锁存器”信号到来时,输出端 Q 就输出1, 输出0。于是FET(场效应管)截止,于是“管脚P1.x”因电阻的上拉也输出1;当程序让该I/O口输出0时,“内部总线”会出现的0使 ,于是FET导通,“管脚P1.x”接地而呈现0。
如果I/O口作为输入时,与“管脚P1.x”相连的外设使该管脚出现1或0,程序控制“读管脚”使能缓冲器,则“管脚P1.x”的状态就通过缓冲器进入“内部总线”上,指令就可接收到“内部总线”上的数据了。
图5-17 P1口结构
P3口结构稍微复杂一些(见图5-18),这是因为它有表5-2所示的第二功能,所以它比P1口多出了“第二功能输入线”和“第二功能输出线”。“第二功能输出线”与锁存器的输出端 Q 通过一个与非门和FET的G极连接。这样,如果“内部总线”=1时,与非门的输出端与“第二功能输出线”相反。比如“第二功能输出线”=1,FET的G极为0,所以FET截止,“管脚P3.x”=1。
当P3口作第二功能输入时,“管脚P3.x”上的信号通过一个缓冲器出现在“第二功能输入线”,程序只要把这个信号读走即得到第二功能的输入数据。
图5-18 P3口结构
P0中多出了一个模拟开关,这个开关由一个“内部控制信号”控制,选通P0口所要交换的是一般I/O口数据或是访问外部存储器的地址/数据。由于P0口是没有内部上拉电阻的,所以它作为一般I/O口使用时需要添加外部上拉电阻(见图5-3)。不过在访问外部存储器时上拉FET(受与门控制的FET)会导通而不需要再添加外部上拉电阻。
图5-19 P0口结构
P2口由于在访问外部存储器时作为高位地址使用,所以它与P0口结构相似。它也由“内部控制信号”控制模拟开关的切换,从而实现P2口的功能转换。只不过P2口具有内部上拉电阻,在作为一般I/O口使用时不需要外部再添加。
图5-20 P2口结构
从以上4个I/O口的结构图中得知,P1、P2、P3具有内部中断上拉电阻,而P0口只有一个开漏结构(场效应管D极(漏极)开路结构)。在应用I/O口需要注意如下4点内容:
· 每一个I/O口都可以独立地作为输入或输出口使用,但P0和P2在访问外部存储器时作为地址/数据总线,此时它们将不能再作为I/O口使用。
· AT89S51单片机复位时每一个I/O口的“内部总线”=1,如果随后程序使“内部总线”=0,那么当I/O口作为输入时,必须通过程序(如程序5-1)通过输出1使FET截止,这样从“管脚Px.x”输入的信号才能在“读管脚”信号的帮助下被正确读走。
· P1、P2、P3因为内部上拉电阻而被称为“准双向口”。在作为输入时,上拉电阻将“管脚Px.x”拉高并在外设输入低电平时向外输出电流。
· P0口没有内部上拉电阻,是一个真正的双向口。作为输入时因开漏结构而浮地。