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(塑料双列直插式封装)
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 上拉电阻。
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
-
Dual role of Port 0 - 端口 0 也指定为 AD0–AD7,因为它可以同时用于数据和地址处理。在将 8051 连接到外部存储器时,端口 0 可以同时提供地址和数据。然后,8051 微控制器将输入复用为地址或数据,以节省引脚。
-
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
-
Vcc - 引脚 40 为芯片提供电源,其电压为 +5 V。
-
Gnd - 引脚 20 为参考接地。
-
XTAL1, XTAL2 (Pin no 18 & Pin no 19) - 8051 具有片内振荡器,但需要外部时钟才能运行。石英晶体连接在芯片的 XTAL1 和 XTAL2 引脚之间。此晶体还需要两个 30pF 的电容器来生成所需频率的信号。每个电容的一侧连接到接地。8051 IC 有多种速度,而这全都取决于石英晶体,例如,20 MHz 微控制器需要一个不超过 20 MHz 的频率的晶体。
-
RST (Pin No. 9) - 它是一个输入引脚和活动高引脚。在此引脚上施加高脉冲后,即 1,微控制器将重置并终止所有活动。此过程称为 Power-On Reset 。激活上电复位将导致寄存器中的所有值丢失。它将程序计数器设置为全 0。为了确保复位的有效输入,高脉冲必须在变低之前至少保持两个机器周期,这取决于电容值和它充电的速度。( Machine Cycle 是单个指令在执行中所需的最小频率量)。
-
EA or External Access (Pin No. 31) - 它是一个输入引脚。此引脚是一个活动低引脚;施加低脉冲后,它被激活。对于具有片内 ROM 的微控制器 (8051/52),EA (bar) 引脚连接到 Vcc。但在没有片内 ROM 的 8031 微控制器中,代码存储在外部 ROM 中,然后由微控制器提取。在这种情况下,我们必须将(引脚号 31)EA 连接到 Gnd 以表明程序代码存储在外部。
-
PSEN or Program store Enable (Pin No 29) - 这也是一个活动低引脚,即在施加低脉冲后它被激活。它是一个输出引脚,与 8031 基于(即 ROMLESS)系统中的 EA 引脚一起使用,以允许将程序代码存储在外部 ROM 中。
-
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