8051单片机I/O端口结构与原理
1. P1端口
P1口是一个8位双向并行I/O口,每位的内部结构如图1.1所示,P1口由8组这样的结构组成。
1.1 P1口作为输出口
当CPU执行写端口指令时,在指令执行期间,“写锁存器”脉冲信号出现,数据经内部总线送入锁存器。
向P1.X写“0”时(例如P1.0 = 0)时,数据“0”经内部总线送入锁存器,锁存器的反相输出端
Q
‾
\overline{\text{Q}}
Q为“1”,场效应管VT导通,引脚与GND连接,引脚向外部电路输出低电平,即“0”,如图1.2所示。
向P1.X写“1”时(例如P1.0 = 1)时, 数据“1”经内部总线送入锁存器,锁存器的反相输出端 Q ‾ \overline{\text{Q}} Q为“0”,场效应管VT截止,引脚与GND断开连接,引脚利用内部上拉电阻向外部电路输出高电平,即“1”,如图1.3所示。
1.2 P1口作为输入口
当CPU执行读端口指令时(例如a = P1.0),内部硬件自动使“读引脚”信号有效,输入缓冲器2导通,引脚上的数据经输入缓冲器2送入内部总线,此为读引脚,如图1.4所示。在读引脚之前,需先向P1.X写“1”,使锁存器反相输出端
Q
‾
\overline{\text{Q}}
Q为0,场效应管VT截止,断开引脚与GND的连接,否则读到的引脚状态都为低电平,即“0”,从而引起误读。如果引脚没有连接外部电路(即悬空),由于引脚连接内部上拉电阻,此时读到的引脚状态为高电平,即“1”。
当CPU执行“读-修改-写”端口指令时(即将读到的值进行修改后再写回,例如 P1.0 = ~ P1.0),在执行其中的读操作期间,内部硬件自动使“读锁存器”信号有效,输入缓冲器1导通,锁存器输出端Q上的数据经输入缓冲器1送入内部总线,此为读锁存器,如图1.5所示。
读引脚还是读锁存器,CPU会根据具体执行的指令自行进行判断。
2. P2端口
P2口是一个8位双向并行I/O口,每位的内部结构如图2.1所示,P2口由8组这样的结构组成。P2口有两种用途:通用I/O口、地址总线。P2口作为通用I/0口使用时,硬件自动使“控制”线为“0”,使多路开关MUX拨向锁存器的输出端Q。
2.1 P2口作为输出口
当CPU执行写端口指令时,在指令执行期间,“写锁存器”脉冲信号出现,数据经内部总线送入锁存器。
向P2.X写“0”时(例如P2.0 = 0),数据“0”经内部总线送入锁存器,锁存器的输出端Q为“0”,经非门后输出为“1”,场效应管VT导通,引脚与GND连接,引脚向外部电路输出低电平,即“0”,如图2.2所示。
向P2.X写“1”时(例如P2.0 = 1),数据“1”经内部总线送入锁存器,锁存器的输出端Q为“1”,经非门后输出为“0”,场效应管VT截止,断开引脚与GND的连接,引脚利用内部上拉电阻向外部电路输出高电平,即“1”,如图2.3所示。
2.2 P2口作为输入口
P2口作为输入口使用时工作方式与P1口类似。
2.3 P2口作为地址总线
单片机芯片外接存储器时,P2口引脚与存储器相连。P2口作为地址总线,在CPU访问外部存储器时用于输出高8位地址信息。
CPU执行访问外部存储器的指令时,内部硬件自动使“控制”线为“1”,使多路开关MUX拨向地址线,如图2.4所示。当“地址”线输出“0”时,引脚输出“0”;当“地址”线输出“1”时,引脚输出“1”。
3. P3端口
P3口是一个8位双向并行I/O口,每位的内部结构如图3.1所示,输入缓冲器3一直处于导通状态,P3口由8组这样的结构组成。P3口有两种用途:通用I/O口、第二功能。
3.1 P3口作为通用I/0口
P3口作为通用I/0口使用时,硬件自动使“第二功能输出”为“1”,与非门的输出状态完全由锁存器输出端Q的状态决定,Q为“0”时,与非门输出为“1”,Q为“1”时,与非门输出为“0”。P3口作为通用I/0口使用时工作方式与P1口类似。
3.2 P3口作为第二功能
P3口的每位都有对应的第二功能,如表3.1所示,有些位作为第二功能输出,比如P3.1作为串行输出TXD,有些位作为第二功能输入,比如P3.0作为串行输入RXD。
(1)作为第二功能输出
P3.X作为第二功能输出使用时,需先向其写“1”,使锁存器的输出端Q为“1”,这样与非门的输出状态完全由“第二功能输出”的状态决定,“第二功能输出”为“0”时,与非门输出为“1”,“第二功能输出”为“1”时,与非门输出为“0”。
例如:P3.1作为第二功能TXD,当TXD输出“0”时,与非门输出“1”,使场效应管VT导通,引脚与GND连接,引脚向外部电路输出低电平,即“0”;当TXD输出“1”时,与非门输出“0”,场效应管VT截止,引脚与GND断开连接,引脚利用内部上拉电阻向外部电路输出高电平,即“1”,如图3.2所示。
(2)作为第二功能输入
P3.X作为第二功能输入使用时,需先向其写“1”,使锁存器的输出端Q为“1”,与非门输出为“0”,场
效应管VT截止,断开引脚与GND的连接,否则“第二功能输入”都为“0”。
例如:P3.0作为第二功能RXD,外部电路通过引脚输入“0”时,RXD为“0”;外部电路通过引脚输入“1时,RXD为“1”,如图3.3所示。
4. P0端口
P0口是一个8位双向并行I/O口,每位的结构如图4.1所示,即P0口由8组这样的结构组成。P0口有两种用途:通用I/O口;地址/数据总线。P0口作为通用I/0口使用时,硬件自动使“控制”线为“0”,使多路开关MUX拨向锁存器的反相输出端 Q ‾ \overline{\text{Q}} Q,同时与门被锁定输出“0”,场效应管VT0截止。
4.1 P0口作为输出口
P0口作为输出口时,属于漏级开路输出,引脚只能输出低电平或高阻状态。当VT1导通时,引脚与GND连接,引脚输出低电平;当VT1截止时,引脚与GND断开连接,处于高阻状态,因此P0口要输出高电平,需要在外部电路加上拉电阻。
当CPU执行写指令时,在指令执行期间,“写锁存器”脉冲信号出现,数据经内部总线送入锁存器。向P0.X写 “0”时(例如P0.0 = 0),数据“0”经内部总线送入锁存器,锁存器的反相输出端
Q
‾
\overline{\text{Q}}
Q为“1”,场效应管VT1导通,引脚与GND连接,引脚向外部电路输出低电平,即“0”,如图4.2所示。
向P0.X写 “1”时(例如P0.0 = 1),数据“1”经内部总线送入锁存器,锁存器的反相输出端 Q ‾ \overline{\text{Q}} Q为“0”,场效应管VT1截止,引脚与GND断开连接,由于外部电路加了上拉电阻,引脚利用外部上拉电阻输出高电平,即“1”,如图4.3所示。

4.2 P0口作为输入口
当CPU执行读端口指令时(例如a = P0.0),内部硬件自动使“读引脚”信号有效,输入缓冲器2导通,引脚上的数据经输入缓冲器2送入内部总线,此为读引脚,如图4.4所示。在读引脚之前,需先写“1”,使锁存器反相输出端 Q ‾ \overline{\text{Q}} Q为0,场效应管VT截止,断开引脚与GND的连接,否则读到的引脚状态都为低电平,即“0”,从而引起误读。
当CPU执行“读-修改-写”端口指令时(即将读到的值进行修改后再写回,例如 P0.0 = ~ P0.0),在执行其中的读操作期间,内部硬件自动使“读锁存器”信号有效,输入缓冲器1导通,锁存器输出端Q上的数据经输入缓冲器1送入内部总线,此为读锁存器,如图4.5所示。
4.2 P0口作为地址/数据总线
单片机芯片外接存储器时,将P0口引脚与存储器连接。P0口作为地址/数据总线,在CPU访问外部存储器时用于输出数据信息以及低8位地址信息。
CPU执行访问外部存储器的指令时,内部硬件自动使“控制”线为“1”,多路开关MUX拨向非门输出端。上下两个场效应管VT0、VT1处于反向,构成了推拉式的输出电路,其负载能力大大增强。
当“地址/数据”输出“0”时,与门输出“0”,场效应管VT0截止,非门输出“1”,场效应管VT1导通,引脚与GND连接,引脚输出低电平,即“0”,如图4.6所示。
当“地址/数据”输出“1”时,与门输出“1”,场效应管VT0导通,非门输出“0”,场效应管VT1截止,引脚与GND断开连接,引脚输出高电平,即“1”,如图4.7所示。
CPU写外部存储器时,P0口先输出低8位地址信息(高8位地址信息由P2口输出),再输出数据信息。CPU读外部存储器时,P0口输出低8位地址信息后(高8位地址信息由P2口输出),P0口作为输入口使用,从引脚处读取外部储存器输出的数据信息。