单片机原理及应用技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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;