2.4 I/O端口
MCS-51单片机具有4个8位准双向并行端口(P0~P3),共32根I/O口线。每一根I/O口线都能独立地用做输入或输出。这4个端口是单片机与外部设备进行信息(数据、地址、控制信号)交换的输入或输出通道。
2.4.1 端口结构
8051的4个端口的内部结构如图2-7所示。
图2-7 8051的4个端口的内部结构
每个端口都是双向的I/O口。端口的每一位都有一个锁存器,一个输出驱动器(场效应三极管)和一个输入数据缓冲器。其中,锁存器为D触发器。在CPU控制下,可对端口P0~P3进行读/写操作或对引脚进行读操作。
P0口和P2口的结构中,有一个2选1转换器MU×,如图2-7(a)、(c)所示。访问外部存储器时,通过MU×将端口驱动器与地址或内部地址/数据线连接起来(开关向上或向右打),而对于通常的I/O传送,输出驱动器通过D锁存器与内部总线连接(开关相下或向左打)。
在4个并行I/O端口中,P0口最多可以推动8个LSTTL门,即输出电流不大于800μA。其余3个I/O口是准双向I/O口,只能推动4个LSTTL门。
2.4.2 端口功能
1.P0口
P0口是一个三态双向口,可作为地址/数据分时复用口,也可作为通用I/O接口。
在单片机需要外扩程序存储器、数据存储器、并行I/O接口时,通常作为16位地址总线的低8位和8位数据总线信号端口。当P0口作为地址/数据分时复用总线时,可分为两种情况:一种是从P0口输出地址或数据,另一种是从P0口输入数据。由于是分时使用,用ALE地址锁存信号将低8位地址锁存在与P0口相连接的外部8位锁存器中,形成16位地址信号的低8位,然后P0口再作为数据口使用。
P0口作为通用I/O口使用时,是准双向口。其特点是在输入数据时,应先把口置1(写1),此时锁存器的Q端为0,使输出的两个场效应管V1、V2均截止,引脚处于悬浮状态,才可作为高阻输入。
2.P1口
P1口是专门供用户使用的I/O口,是准双向口。输出端无需接上拉电阻。P1口只有通用I/O接口一种功能(对于51子系列)。
3.P2口
P2口也是准双向口。但一般作为扩展系统的地址总线,输出高8位地址。与P0口一起组成16地址总线,供系统扩展时使用。如果没有系统扩展,P2口也可以作为用户I/O线使用,其工作原理与P1相同,负载能力也与P1口相同。
4.P3口
P3口是双功能口,也是准双向口。P3口除作为通用I/O口外,还有第二种功能,作为第一功能使用时,P3口的结构与操作与P1口相同。P3口作为第二功能时为串行口、外部中断、定时器工作,如表2-4所示。
表2-4 P3口第二功能
2.4.3 端口输入/输出方式
从图2-7(a)、(b)、(c)、(d)可以看出,P1口、P2口、P3口的内部结构和P0口稍有不同。P1口、P2口、P3口内部有上拉电阻,P0口没有,所以P0口单独作为I/O口用时,由于输出电路是漏极开路,必须外接上拉电阻。
1.输出方式
4个端口均可以作为通用的输出口使用。例如:
ORL P0,#DATA; MOV P1,A; AND P2,A; MOV P3,30H;
这些指令的执行过程分成“读—修改—写”3步,先将P0~P3口的数据读入CPU,在ALU中进行运算,运算结果再送回P0~P3口。执行“读—修改—写”类指令时,CPU是通过三态门2读回锁存器Q端的数据来代表引脚状态的。如果直接通过三态门1从引脚读回数据,有时会发生错误。例如,用一根口线去驱动一个晶体管的基极,当向此口线输出1时,锁存器Q=1,V2导通驱动晶体管。当晶体管导通后,引脚上的电平被拉到低电平(0.7V)。因而,若从引脚直接读回数据,原为1的状态会被错读为0,所以要从锁存器Q端读取数据。
2.输入方式
(1)读端口数据
读端口数据是将端口锁存器中数据读入。例如:
ORL R0,P0; MOV A,P1; AND A,P2; MOV 40H,P3;
(2)读引脚
当端口作为输入时,必须通过指令将端口的位锁存器置1,以关闭输出驱动场效应管。这时P1口、P2口、P3口的引脚由内部上拉电阻拉为高电平,同样也可以由外部信号拉为低电平。例如,如果位锁存器原来的状态为0,则通过反相器加到场效应管栅极的信号为1,使该管导通,对地呈低阻状态,它会使从引脚输入的高电平信号受到影响而变低,可能使读入的引脚信号出错。这种通过固定的上拉电阻而将引脚拉为高电平的端口结构,称为“准双向口”,即不是真正的双向口(非高阻输入状态)。在进行读引脚的操作时应按下列方法编程。
MOV P2,#0FFH; MOV A,P2; MOV P0,A;