📜  嵌入式系统-I / O编程

📅  最后修改于: 2021-01-07 05:45:15             🧑  作者: Mango


在8051中,使用四个端口和40个引脚进行I / O操作。以下引脚图显示了40个引脚的详细信息。 I / O操作端口保留32个引脚,每个端口有8个引脚。其他8个引脚分别指定为V cc ,GND,XTAL1,XTAL2,RST,EA(bar),ALE / PROG(bar)和PSEN(bar)。

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

PIN图

–在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 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

端口0和端口2的双重作用

  • 端口0的双重作用-端口0也被指定为AD0–AD7,因为它既可以用于数据也可以用于地址处理。将8051连接到外部存储器时,端口0可以提供地址和数据。然后8051微控制器将输入复用为地址或数据,以节省引脚。

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

引脚的硬件连接

  • V cc-引脚40为芯片提供电源,并且为+5 V.

  • Gnd −引脚20为参考提供接地。

  • XTAL1,XTAL2(第18号引脚和第19号引脚) − 8051具有片上振荡器,但需要外部时钟来运行。石英晶体连接在芯片的XTAL1和XTAL2引脚之间。该晶体还需要两个30pF的电容器来产生所需频率的信号。每个电容器的一侧接地。 8051 IC有各种不同的速度,并且都取决于此石英晶体,例如,一个20 MHz的微控制器需要频率不超过20 MHz的晶体。

XTAL1,XTAL2图

  • RST(9号引脚) -它是输入引脚和高电平有效引脚。在此引脚上施加高脉冲即1时,微控制器将复位并终止所有活动。此过程称为上电复位。激活上电复位将导致寄存器中的所有值丢失。它将程序计数器设置为全0。为了确保有效的复位输入,高电平脉冲必须至少在两个机器周期内保持高电平,然后才允许其变为低电平,这取决于电容器的值及其充电速率。 (机器周期是一条指令执行所需的最小频率)。

  • EA或外部访问(引脚号31) -它是输入引脚。该引脚为低电平有效引脚。施加低脉冲后,它将被激活。如果微控制器(8051/52)具有片上ROM,则EA(bar)引脚连接到V cc 。但是,在没有片上ROM的8031微控制器中,代码存储在外部ROM中,然后由微控制器获取。在这种情况下,我们必须将(31号插针)EA连接到Gnd,以指示程序代码存储在外部。

RST,EA图

  • PSEN或程序存储使能(29号引脚) -这也是一个低电平有效引脚,即在施加低电平脉冲后被激活。它是一个输出引脚,与基于8031(即ROMLESS)的系统中的EA引脚一起使用,可以将程序代码存储在外部ROM中。

  • ALE或(地址锁存使能) -这是输出引脚,高电平有效。特别适用于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

一位指令

Instructions Function
SETB bit Set the bit (bit = 1)
CLR bit clear the bit (bit = 0)
CPL bit complement the bit (bit = NOT bit)
JB bit, target jump to target if bit = 1 (jump if bit)
JNB bit, target jump to target if bit = 0 (jump if no bit)
JBC bit, target jump to target if bit = 1, clear bit (jump if bit, then clear)