Embedded Systems 简明教程

Embedded Systems - I/O Programming

在 8051 中,I/O 操作使用四个端口和 40 个引脚完成。以下引脚图显示了 40 个引脚的详细信息。I/O 操作端口预留 32 个引脚,每个端口有 8 个引脚。其他 8 个引脚指定为 Vcc、GND、XTAL1、XTAL2、RST、EA(条形)、ALE/PROG(条形)和 PSEN(条形)。

它是 40 针 PDIP(塑料双列直插式封装)

pin diagram

Note - 在 DIP 封装中,你可以通过 IC 中间的切口识别第一个引脚和最后一个引脚。第一个引脚位于此切口标记的左侧,最后一个引脚(即本例中的第 40 个引脚)位于切口标记的右侧。

I/O Ports and their Functions

四个端口 P0、P1、P2 和 P3 各使用 8 个引脚,使其成为 8 位端口。复位后,所有端口都配置为输入,可立即用作输入端口。当第一个 0 写入端口时,它将变为输出。要重新配置它为输入,必须向端口发送 1。

Port 0 (Pin No 32 – Pin No 39)

它有 8 个引脚(32 到 39)。它可以用于输入或输出。与 P1、P2 和 P3 端口不同,我们通常将 P0 连接到 10K-ohm 上拉电阻,以便用作输入或输出端口,因为它是一个开漏输出。

它还指定为 AD0-AD7,允许它同时用作地址和数据。对于 8031(即无 ROM 芯片),当我们需要访问外部 ROM 时,P0 将同时用于地址和数据总线。ALE(引脚号 31)指示 P0 具有地址或数据。当 ALE = 0 时,它提供数据 D0-D7,但当 ALE = 1 时,它具有地址 A0-A7。如果没有外部存储器连接,则必须将 P0 外部连接到 10K-ohm 上拉电阻。

port0
MOV A,#0FFH  ;(comments: A=FFH(Hexadecimal  i.e. A=1111 1111)

MOV P0,A     ;(Port0 have 1's on every pin so that it works as Input)

Port 1 (Pin 1 through 8)

它是一个 8 位端口(第 1 至 8 个引脚),可以作为输入或输出使用。它不需要上拉电阻,因为它们已经内部连接。复位后,端口 1 配置为输入端口。以下代码可用于向端口 1 发送 55H 和 AAH 的交替值。

;Toggle all bits of continuously
MOV     A,#55
BACK:

MOV     P2,A
ACALL   DELAY
CPL     A      ;complement(invert) reg. A
SJMP    BACK

如果端口 1 配置为用作输出端口,那么要再次用作输入端口,请对它进行编程,方法是像以下代码一样向它的所有位写入 1。

;Toggle all bits of continuously

MOV     A ,#0FFH    ;A = FF hex
MOV     P1,A        ;Make P1 an input port
MOV     A,P1        ;get data from P1
MOV     R7,A        ;save it in Reg R7
ACALL   DELAY       ;wait

MOV     A,P1        ;get another data from P1
MOV     R6,A        ;save it in R6
ACALL   DELAY       ;wait

MOV     A,P1        ;get another data from P1
MOV     R5,A        ;save it in R5

Port 2 (Pins 21 through 28)

端口 2 共占用 8 个引脚(第 21 至 28 个引脚),可用于输入和输出操作。就像 P1(端口 1)一样,P2 也不需要外部上拉电阻,因为它们已经内部连接。它必须与 P0 一起使用,以便为外部存储器提供 16 位地址。因此,它也指定为 (A0–A7),如引脚图所示。当 8051 连接到外部存储器时,它为 16 位地址的高 8 位提供路径,并且不能用作 I/O。复位后,端口 2 配置为输入端口。以下代码可用于向端口 2 发送 55H 和 AAH 的交替值。

;Toggle all bits of continuously
MOV     A,#55
BACK:
MOV     P2,A
ACALL   DELAY
CPL     A         ; complement(invert) reg. A
SJMP    BACK

如果端口 2 配置为用作输出端口,那么要再次用作输入端口,请对它进行编程,方法是像以下代码一样向它的所有位写入 1。

;Get a byte from P2 and send it to P1
MOV    A,#0FFH    ;A = FF hex
MOV    P2,A       ;make P2 an input port
BACK:
MOV    A,P2       ;get data from P2
MOV    P1,A       ;send it to Port 1
SJMP   BACK       ;keep doing that

Port 3 (Pins 10 through 17)

它也是 8 位的,可以用作输入/输出。此端口提供一些非常重要的信号。P3.0 和 P3.1 分别是 RxD(接收器)和 TxD(发送器),并共同用于串行通信。P3.2 和 P3.3 引脚用于外部中断。P3.4 和 P3.5 分别用于计时器 T0 和 T1。P3.6 和 P3.7 是写(WR)和读(RD)引脚。这些是低电平有效引脚,这意味着当向它们提供 0 时它们将变为活动状态,并且它们用于向基于 8031 的系统中的外部 ROM 提供读写操作。

P3 Bit

Function

Pin

P3.0

RxD

10

P3.1

TxD

11

P3.2

Complement of INT0

12

P3.3

INT1

13

P3.4

T0

14

P3.5

T1

15

P3.6

WR

16

P3.7

Complement of RD

17

Dual Role of Port 0 and Port 2

  1. Dual role of Port 0 - 端口 0 也指定为 AD0–AD7,因为它可以同时用于数据和地址处理。在将 8051 连接到外部存储器时,端口 0 可以同时提供地址和数据。然后,8051 微控制器将输入复用为地址或数据,以节省引脚。

  2. Dual role of Port 2 - 除了用作 I/O,端口 P2 还可用于与端口 0 一起为外部存储器提供 16 位地址总线。端口 P2 也指定为 (A8– A15),而端口 0 通过 A0–A7 提供低 8 位。换句话说,我们可以说当 8051 连接到外部存储器(ROM)时,最大可达 64 KB,这是通过 16 位地址总线实现的,因为我们知道 216 = 64 KB。Port2 用于 16 位地址的高 8 位,不能用于 I/O,这是寻址任何外部 ROM 程序代码的方式。

Hardware Connection of Pins

  1. Vcc - 引脚 40 为芯片提供电源,其电压为 +5 V。

  2. Gnd - 引脚 20 为参考接地。

  3. XTAL1, XTAL2 (Pin no 18 & Pin no 19) - 8051 具有片内振荡器,但需要外部时钟才能运行。石英晶体连接在芯片的 XTAL1 和 XTAL2 引脚之间。此晶体还需要两个 30pF 的电容器来生成所需频率的信号。每个电容的一侧连接到接地。8051 IC 有多种速度,而这全都取决于石英晶体,例如,20 MHz 微控制器需要一个不超过 20 MHz 的频率的晶体。

xtal
  1. RST (Pin No. 9) - 它是一个输入引脚和活动高引脚。在此引脚上施加高脉冲后,即 1,微控制器将重置并终止所有活动。此过程称为 Power-On Reset 。激活上电复位将导致寄存器中的所有值丢失。它将程序计数器设置为全 0。为了确保复位的有效输入,高脉冲必须在变低之前至少保持两个机器周期,这取决于电容值和它充电的速度。( Machine Cycle 是单个指令在执行中所需的最小频率量)。

  2. EA or External Access (Pin No. 31) - 它是一个输入引脚。此引脚是一个活动低引脚;施加低脉冲后,它被激活。对于具有片内 ROM 的微控制器 (8051/52),EA (bar) 引脚连接到 Vcc。但在没有片内 ROM 的 8031 微控制器中,代码存储在外部 ROM 中,然后由微控制器提取。在这种情况下,我们必须将(引脚号 31)EA 连接到 Gnd 以表明程序代码存储在外部。

rst
  1. PSEN or Program store Enable (Pin No 29) - 这也是一个活动低引脚,即在施加低脉冲后它被激活。它是一个输出引脚,与 8031 基于(即 ROMLESS)系统中的 EA 引脚一起使用,以允许将程序代码存储在外部 ROM 中。

  2. ALE or (Address Latch Enable) - 这是一个输出引脚,为活动高。它专门用于 8031 IC 以将其连接到外部存储器。它可以在决定 P0 引脚将用作地址总线还是数据总线时使用。当 ALE = 1 时,P0 引脚作为数据总线工作,而当 ALE = 0 时,P0 引脚作为地址总线工作。

I/O Ports and Bit Addressability

这是在编写 8051 代码时对 8051 使用最广泛的功能。有时我们只需要访问端口的 1 或 2 位,而不是整个 8 位。8051 提供了访问端口的各个位的能力。

在以单比特方式访问端口时,我们使用语法“SETB X. Y”,其中 X 是端口号 (0 到 3),Y 是数据位 D0-D7 的位号 (0 到 7),其中 D0 是 LSB,而 D7 是 MSB。例如,“SETB P1.5”设置端口 1 的高电平位 5。

以下代码展示了我们如何连续切换位 P1.2。

AGAIN:
SETB    P1.2
ACALL   DELAY
CLR     P1.2
ACALL   DELAY
SJMP    AGAIN

Single-Bit Instructions

Instructions

Function

SETB bit

设置位 (bit = 1)

CLR bit

清除位 (bit = 0)

CPL bit

对位求补 (bit = NOT bit)

JB bit, target

如果位 = 1,则跳转到目标 (jump if bit)

JNB bit, target

如果位 = 0,则跳转到目标 (jump if no bit)

JBC bit, target

如果位 = 1,则跳转到目标,清除位 (jump if bit, then clear)