嵌入式系统 - I/O 编程

  • 简述

    在 8051 中,I/O 操作是使用四个端口和 40 个引脚完成的。以下引脚图显示了 40 个引脚的详细信息。I/O 操作端口预留 32 个引脚,每个端口有 8 个引脚。其他8个管脚被指定为V CC,GND,XTAL1,XTAL2,RST,EA(bar),ALE / PROG(bar),和PSEN(bar)。
    它是一个 40 针 PDIP(塑料双列直插式封装)
    引脚图
    Note− 在 DIP 封装中,您可以通过 IC 中间的切口识别第一个引脚和最后一个引脚。第一个引脚位于此切割标记的左侧,最后一个引脚(即本例中的40引脚)位于切割标记的右侧。
  • I/O 端口及其功能

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

    端口 0(引脚编号 32 – 引脚编号 39)

    它有 8 个引脚(32 到 39)。它可用于输入或输出。与 P1、P2 和 P3 端口不同,我们通常将 P0 连接到 10K 欧姆的上拉电阻,将其用作输入或输出端口,即开漏。
    它也被指定为 AD0-AD7,允许它用作地址和数据。对于8031(即无ROM芯片),当我们需要访问外部ROM时,P0将同时用于地址和数据总线。ALE(引脚号 31)指示 P0 是否有地址或数据。当ALE = 0时,它提供数据D0-D7,但当ALE = 1时,它有地址A0-A7。如果没有可用的外部存储器连接,P0 必须在外部连接到一个 10K 欧姆的上拉电阻。
    端口 0 图
    
    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)
    

    端口 1(引脚 1 到 8)

    它是一个 8 位端口(引脚 1 到 8),可用作输入或输出。它不需要上拉电阻,因为它们已经在内部连接。复位后,端口 1 被配置为输入端口。以下代码可用于将 55H 和 AAH 的交替值发送到端口 1。
    
    ;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
    

    端口 2(引脚 21 到 28)

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

    端口 3(引脚 10 到 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位 函数 Pin
    P3.0 RxD 10
    P3.1 < TxD 11
    P3.2 < INT0 的补码 12
    P3.3 < INT1 13
    P3.4 < 时间 14
    P3.5 < T1 15
    P3.6 < WR 16
    P3.7 < RD的补充 17
  • 端口 0 和端口 2 的双重角色

    • Dual role of Port 0− 端口 0 也指定为 AD0–AD7,因为它可用于数据和地址处理。将 8051 连接到外部存储器时,端口 0 可以提供地址和数据。8051 微控制器然后将输入多路复用为地址或数据以节省引脚。
    • Dual role of Port 2− 除了作为 I/O 使用外,P2 端口还与 Port 0 一起为外部存储器提供 16 位地址总线。P2 端口也被指定为 (A8-A15),而 Port 0 提供低 8 位通过A0-A7。换句话说,我们可以说当 8051 连接到外部存储器 (ROM) 时,最大可达 64KB,这可以通过 16 位地址总线实现,因为我们知道 216 = 64KB。Port2 用于 16 位地址的高 8 位,不能用于 I/O,这是外部 ROM 的任何程序代码的寻址方式。
  • 引脚的硬件连接

    • Vcc − 引脚 40 为芯片提供电源,电压为 +5 V。
    • Gnd − 引脚 20 为参考提供接地。
    • XTAL1, XTAL2 (Pin no 18 & Pin no 19)− 8051 有片内振荡器,但需要外部时钟来运行。石英晶体连接在芯片的 XTAL1 和 XTAL2 引脚之间。该晶体还需要两个 30pF 的电容器来生成所需频率的信号。每个电容器的一侧接地。8051 IC 有多种速度可供选择,这一切都取决于这种石英晶体,例如,20 MHz 微控制器需要频率不超过 20 MHz 的晶体。
    XTAL1、XTAL2示意图
    • RST (Pin No. 9)− 它是一个输入引脚和高电平有效引脚。在此引脚上施加高脉冲后,即 1,微控制器将复位并终止所有活动。这个过程被称为Power-On Reset. 激活上电复位将导致寄存器中的所有值丢失。它会将程序计数器设置为全 0。为确保复位的有效输入,高脉冲必须至少保持两个机器周期的高电平,然后才能变低,这取决于电容器值和充电速率。(Machine Cycle 是单个指令在执行中所需的最小频率)。
    • EA or External Access (Pin No. 31)− 它是一个输入引脚。该引脚是低电平有效引脚;施加低脉冲后,它会被激活。在具有片上ROM微控制器(8051/52)的情况下,EA(巴)销连接到V CC。但是在没有片上 ROM 的 8031 微控制器中,代码存储在外部 ROM 中,然后由微控制器提取。在这种情况下,我们必须将(引脚号 31)EA 连接到 Gnd,以指示程序代码存储在外部。
    RST、EA图
    • 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 端口和位寻址能力

    在为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
    
  • 单位指令

    指示 功能
    SETB 位 设置位(位 = 1)
    CLR位 清除位(位 = 0)
    CPL位 对位进行补码(位 = NOT 位)
    JB 位,目标 如果位 = 1 则跳转到目标(如果位则跳转)
    JNB 位,目标 如果位 = 0 则跳转到目标(如果没有位则跳转)
    JBC 位,目标 如果位 = 1,则跳转到目标,清除位(如果位跳转,则清除)