0°

(三)51基础:8051 UART

介绍

8051 UART
8051串行并行框图

串行通信意味着一次逐位传输数据,而在并行通信中,一次可传输的位数取决于可用于通信的数据线的数量。

两种串行通信方法是

  • 同步通信:一次在帧结构中传输批量数据
  • 异步通信:一次传输帧结构中的字节数据

8051内置UART,分别在PORT3.0和PORT3.1上有RXD(串行数据接收引脚)和TXD(串行数据发送引脚)。

异步通信

异步串行通信广泛用于面向字节的传输。

异步通信中的帧结构:

START位:它与串行通信的启动有关,它总是低。
数据位包:数据位可以是5到9位包。通常我们使用8个数据位包,它总是在START位之后发送。
STOP位:这是一位或两位。它在数据位包之后发送以指示帧结束。停止位始终为逻辑高电平。
在异步串行通信帧中,第一个START位后跟数据字节,最后一个STOP位形成一个10位帧。有时最后一位也用作奇偶校验位。

8051 UART
8051串行帧结构

8051串行帧结构

数据传输速率

数据传输速率以每秒比特(bps)为单位。在二进制系统中,它也称为波特率(每秒信号变化的数量)。支持的标准波特率为1200,2400,4800,19200,38400,57600和115200.通常,当速度不是大问题时,大多数情况下使用9600 bps。

接口标准

  • 8051串行通信具有TTL电压电平,逻辑0为0 v,逻辑1为5 V.
  • 在计算机和大多数用于串行通信的旧设备中,使用带有DB9连接器的RS232协议。RS232串行通信具有与8051串行通信不同的电压电平。即逻辑0为+3 v至+25 v,逻辑1为-3 v至-25 V.
  • 因此要与RS232协议通信,我们需要使用MAX232 IC等电压电平转换器。
  • 虽然DB9连接器中有9个引脚,但我们不需要使用所有引脚。只需要连接第二个Tx(发送),第三个Rx(接收)和第五个GND引脚。
8051 UART
8051串行接口

8051串行接口

8051 UART编程

波特率计算:

  • 为了满足标准波特率,通常使用11.0592 MHz的晶振。
  • 通常,8051将晶体频率除以12得到机器周期频率为921.6 kHz。
  • 8051的内部UART模块将该机器周期频率除以32,得到UART使用的28800 Hz频率。
  • 要实现9600的波特率,再将28800 Hz频率除以3。
  • 这是通过在模式2中使用Timer1(自动重载模式)来实现的,方法是将253置于TH1(8位寄存器)中。
  • 因此,在每3个周期后定时器将溢出,28800 Hz将被除以3 。
  • 我们可以通过将分频因子放入TH1寄存器来实现不同的波特率。
8051 UART
8051 UART编程

分频因子实现不同的波特率

8051 UART
波特率

串行通信寄存器

SBUF:串行缓冲寄存器

这是用于通过它传输或接收数据的串行通信数据寄存器。

8051 UART
8051 SBUF寄存器

SCON:串行控制寄存器

串行控制寄存器SCON用于设置串行通信操作模式。它还用于控制发送和接收操作。

8051 UART
8051 SCON寄存器

位7:6 – SM0:SM1:串行模式说明符

8051 UART

通常,模式-1(SM0 = 0,SM1 = 1)与8个数据位,1个起始位和1个停止位一起使用。

Bit 5 – SM2:用于多处理器通信

该位启用模式2和3中的多处理器通信功能。

Bit 4 – REN:接收使能

1 =接收启用

0 =接收禁用

Bit 3 – TB8:第9个发送位

这是在模式2和3(9位模式)下发送的第9位

Bit 2 – RB8:第9个接收位

这是模式2和3(9位模式)中的第9个接收位,与模式1中一样,如果SM2 = 0,则RB8保持接收到的停止位

Bit 1 – TI:发送中断标志

该位表示发送完成,并在从缓冲区发送字节后置位。通常,TI(发送中断标志)由硬件在模式0的第8位结束时设置,在其他模式下的停止位开始时由硬件设置。

Bit 0 – RI:接收中断标志

该位表示接收完成,并在接收缓冲区中的完整字节后置位。通常RI(接收中断标志)由硬件在模式0的第8位结束时的接收模式和其他模式的停止位接收时间设置。

编程步骤

  1. 在自动重新加载模式下配置定时器1。
  2. 根据所需的波特率加载TH1值,例如9600波特率设置为0xFD。(十进制-3)
  3. 使用串行模式和控制位加载SCON。例如,对于模式1和启用接收,加载0x50。
  4. 通过将TR1位设置为1来启动timer1。
  5. 在SBUF寄存器中加载传输数据。
  6. 等到轮询TI标志完全传输加载的数据。
  7. 设置TI标志后,将其清除并从步骤5开始重复以传输更多数据。

让程序8051(这里是AT89C51)在模式1下以9600波特率串行发送字符数据“test”

串行数据传输程序

#include <reg51.h>		/* Include x51 header file */

void UART_Init()
{
	TMOD = 0x20;		/* Timer 1, 8-bit auto reload mode */
	TH1 = 0xFD;		/* Load value for 9600 baud rate */
	SCON = 0x50;		/* Mode 1, reception enable */
	TR1 = 1;		/* Start timer 1 */
}

void Transmit_data(char tx_data)
{
	SBUF = tx_data;		/* Load char in SBUF register */
	while (TI==0);		/* Wait until stop bit transmit */
	TI = 0;			/* Clear TI flag */
}

void String(char *str)
{
	int i;
	for(i=0;str[i]!=0;i++)	/* Send each char of string till the NULL */
	{
		Transmit_data(str[i]);	/* Call transmit data function */
	}
}	

余下程序:

当前内容已被隐藏,您需要登录才能查看

8051串行中断

8051 UART有一个串行中断。无论何时发送或接收数据,分别激活串行中断标志TI和RI。

8051串行中断具有向量地址(0023H),如果启用了全局和串行中断,它可以跳转到ISR(中断服务程序)。

让我们看看串行通信编程中将如何使用串行中断例程。

编程步骤

  1. 将计时器1设置为自动重新加载模式。
  2. 根据所需的波特率加载TH1值,例如9600波特率负载0xFD。
  3. 使用串行模式和控制位加载SCON。例如,对于模式1并启用接收负载0x50。
  4. 通过将TR1位设置为1来启动timer1。
  5. 启用全局和串行中断位,即EA = 1且ES = 1。
  6. 现在,只要接收或发送数据,就会设置中断标志,控制器将跳转到串行ISR。
  7. 注意,TI / RI标志必须由ISR中的软件清除。

注意:对于发送和接收中断,分配相同的中断向量地址,因此当控制器跳转到ISR时,我们必须通过TI和RI位状态检查它是Tx中断还是Rx中断。

让程序8051(此处为AT89C51)在模式1中以9600波特率串行接收字符数据,并使用串行中断在端口1上发送接收数据。

在此示例中,在接收到字节后,将设置RI标志,该标志将生成串行中断。

中断后,8051将跳转到串行ISR例程。

在ISR例程中,我们将数据发送到端口1。

串行中断程序

#include <reg51.h>		/* Include x51 header file */

void Ext_int_Init()				
{
	EA  = 1;		/* Enable global interrupt */
	ES = 1;  		/* Enable serial interrupt */			
}

void UART_Init()
{
	TMOD = 0x20;		/* Timer 1, 8-bit auto reload mode */
	TH1 = 0xFD;		/* Load value for 9600 baud rate */
	SCON = 0x50;		/* Mode 1, reception enable */
	TR1 = 1;		/* Start timer 1 */
}


余下程序:

当前内容已被隐藏,您需要登录才能查看

本节课程序下载:

当前内容已被隐藏,您需要登录才能查看
当前内容已被隐藏,您需要登录才能查看
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论