1、单片机原理与接口应用( 8051输入输出端口结构 ) MCS518051输入输出端口结构 (慨述) 80 51单片机有四个 8位并行 I/O端口,记作 P0、 P1、 P2和 P3。每个端口都是 8位准双向口,共占 32根引脚。每一 条 I/O线都能独立地用作输入或输出。 每个端口都包括一个锁存器 (即特殊功能寄存器 P0P3) , 一个输出驱动器和输入缓冲器,作为输出时数据可以锁存,作输入时数据可以缓冲,但这四个通道的功能不完全相同。 在无片外扩展存储器的系统中,这四个端口的每一位都可以作为准双向通用 I O端口使用。在具有片外扩展存储器系统中, P2口送出高 8位地址 P0口为双向总线,分
2、时送出低 8位地址和数据的输入输出。 8051单片机四个 I ()端口的电路设计非常巧妙,熟悉 I O端口逻辑电路,不但有利于正确合理地使用端口。而且会对设计单片机外围逻辑电路有所启发。一、 P0口的结构: 结构:一个输出锁存器;二个三态输入缓冲器输出驱动电路及控制电路组成其工作状态受 : 控制电路与门 、反相器 转换开关 MUX控制。 当 CPU使控制线 C 0, 开关 MUX连接 输 出锁存器 , P0口为通用 I O 口,当 C 1时,开关投向反相器 的输出端,P0口分时作为地址数据总线使用。 P0口的某一位的结构图 (一 )P0口作为一般 I O口使用 当 8051组成的系统无外扩存储
3、器、 CPU对片内存储器和 I O口读写时,内部硬件自动使控制线 C 0。 开关 MUX处于图示位置,它把输出级 (T2)与锁存器的端接通;因与门 输出为 0,输出级中的上拉场效应管 T1处于截止状态,因此,输出级是漏极开路的开漏电路。这时 P0口可作一般 I O口用。1、 P0口用作输出口 一般的数据输出情况 :当 CPU执行输出指令时,写脉冲加在 D锁存器的 CP上,这样与内部总线相连的 D端的数据取反后就出现在端口,又经输出级 FFT(T2)反相,在 P0端口上出现的数据正好是内部总线的数据。读 P0口 D锁存器: 8051有几条输出指令功能特别强,属于 “读一修改 写 ”指令。例如,执
4、行 条 “ANL P0, A”指令的过程是:不直接读引脚上的数据,而是 CPU先读 P0口 D锁存器中的数据,当 “读锁存器 ”信号有效三态缓冲器 开通,Q端数据送入内部总线和累加器 A中的数据进行 “逻辑与 ”操作,结果送问 P0端口锁存器。此时,锁存器的内容 (Q端状态 )和引脚是 致的。 2 P0口作输入口 图中的缓冲器 用于 CPU直接读端口数据。当执行一条由端口输入的指令时, “读引脚 ”脉冲把该二态缓冲器 打开,这样,端口上的数据经过缓冲器 读入到内部总线。这类操作由数据传送指令实现。 从图中还可看出,在读入端口引脚数据时由于输出驱动FET(T2)并接在引脚上,如果 FET(T2)
5、导通就会将输入的高电平拉成低电平,以致于产生误读。在端口进行输入操作前,应先向端口锁存器写入 “l”, 也就是使锁存器 0,因为控制线 C 0, 因此 T1和 T2全截止,引脚处于悬浮状态,可作高阻抗输入。这就是所谓的准双向口的含义。(二 ) P0口作为地址数据总线使用 CPU对片外存储器读写,由内部硬件自动使控制线 C l, 开关 MUX拨向反相器 输出端。这时 P0口可作地址数据总线分时使用,分为两种情况。 P0口用作输出地址 /数据总线:在扩展系统中, 种是以 P0口引脚输出低 8位地址或数据信息。 MUX开关把CPU内部地址数据线经反向器 与驱动场效应管FET(T2)栅极接通。从图上可
6、以看到,上下两个 FET处于反相,构成推拉式的输出电路 (T1导通时上拉,T2导通时下拉 ),大大增加了负载能力。 另一种情况是由 P0口输入数据。这种情况是在 “读引脚 ”信号有效时打开输入缓冲器 使数据进入内部总线。总结:P0既可作 般 I O端口用使用,又可作地址数据总线使用。 I/O输出时,输出级属开漏电路,必须外接上拉电阻,才有高电平输出;作 I O输入时,必须先向对应的锁存器写入 “1”,使 FET(T2)截止,不影响输入电平。当 P0口被地址数据总线占用时,就无法再作 I O口使用了。 二、 P1口 P1口也是一个准双向口:作通用 I O口使用。其电路结构见图,输出驱动部分与P0口不同内部有上拉负载电阻与电源相连。实质上电阻是两个场效应管 FET并在 起, 个 FET为负载管,其电阻固定;另一个 FET可工作在导通或截止两种状态,使其总电阻值变化近似为 0或阻值很大两种情况。当阻值近似为 0时、可将引脚快速上拉至高电平;当阻值很大时, Pl口为高阻输入状态。 当 P1口输出高电平时、能向外提供拉电流负载,所以不必再接上拉电阻,在端口用作输入时,也必须先向对应的锁存器写入 “1”,使 FET截止。由于片内负载电阻较大,约 20一 40k, 所以不会对输入的数据产生影响。