拓之

拓之

串口通信-51单片机

2024-11-26

1.串口通信

串口时一种应用十分广泛的通讯接口,串口成本低、容易使用、通串口是一种应用十分广泛的通讯信线路简单,可实现两个设备的互相通信。片机、单片机与电脑、单片机与各单片机的串口可以使单片机与单式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART(Universal Asynchronous Receiver可实现单片机的串口通信。Transmitter,通用异步收发器)

  • 简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
  • TXD与RXD要交叉连接
  • 当只需单向的数据传输时,可以直接一根通信线
  • 当电平标准不一致时,需要加电平转换芯片
1732536843790.png

1. 常见通讯接口

名称引脚定义通信方式特点
UARTTXD、RXD全双工、异步点对点通信
I²CSCL、SDA半双工、同步可挂载多个设备
SPISCLK、MOSI、MISO、CS全双工、同步可挂载多个设备
1-WireDQ半双工、异步可挂载多个设备

此外还有:CAN、USB等

  • 全双工:通信双方可以在同一时刻互相传输数据

    • 两根线,一根发,一根收
  • 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

    • 一根线,收发
  • 单工:通信只能有一方发送到另一方,不能反向传输

    • 只能由一方发向另一方,单向

  • 异步:通信双方各自约定通信速率

  • 同步:通信双方靠一根时钟线来约定通信速率

  • 总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

2. 51单片机的UART

STC89C52内部有1个UART,四种工作模式:

  • 模式0:同步移位寄存器
  • 模式1:8位UART,波特率可变(常用)
  • 模式2:9位UART,波特率固定
  • 模式3:9位UART,波特率可变
1732538834023.png

3. 串口参数及时序图

  • 波特率:串口通信的速率(发送和接收各数据位的间隔时间)
  • 检验位:用于数据验证
  • 停止位:用于数据帧间隔
1732538906270.png

4. 串口模式图

1732539111962.png

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

串口进入后会进入中断系统

1732539284200.png

5. 串口相关寄存器

1732539330588.png

C51单片机串口通信整体流程

1. 模式1流程

模式1的发送过程(白话版):

  1. 配置好串口(配置模式和波特率)
  2. 配置好定时器1(八位自动重装模式,以及初始时间),并打开定时器。发送不需要中断
  3. 发送数据(就是把一个字节的数据直接赋值给SBUF,然后循环检测TI发送标志位,检测到TI为1时发送完成,这个时候手动重置TI为0
void Uart1_Init(void)	//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x40;		//8位数据,可变波特率

	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式 8位自动重装
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
}


void uart1_sendByte(unsigned char Byte)
{
	SBUF = Byte;
	while(TI==0);
	TI=0;
}

2.发送配置说明

发送数据的时候,只需要配置串口控制寄存器SCON和串口波特率寄存器PCON

​ STC89C51RC/RD+系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
​ 串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能。

其格式如下:SCON:串行控制寄存器(可位寻址)

1732539762301.png

SM0/FE: 当PCON寄存器中的SMODO/PCON.6位为1时,该位用于错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。它必须由软件清零。

当PCON寄存器中的SMODO/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。

其中SM0、SM1按下列组合确定串行口的工作方式:

1732539895698.png

  • 配置SM0和SM1,就可以将串口配置为需要的工作模式,具体见上表

  • REN:接受控制位,1为允许接受

  • TB8/RB8:发送和接受时的第9位校验位,也就是模式2和3需要用的,模式1不需要都置0即可

  • TI和RI:为发送和接受中断标志位,必须要由软件重置为0

总结:常用模式1时,SCON配置为 0100 0000 也就是0x40

波特率选择特殊功能寄存器PCON配置

1732540686636.png

波特率计算方式见上上个表

举个例子:

我的系统晶振周期时11.0596, 设定定时器1初值以及重装值为F4也就是242, SMOD为2

先计算定时器的溢出率=11.0592/12/(256-242) = 0.0768

计算波特率=0.0768/16=0.0048MHZ=4800HZ

3. 接收配置说明

接受同样需要配置配置模式和波特率,定时器,除此之外还要配置中断函数,串口中断函数!

这里模式配置注意要把接受使能打开, 参考下面的代码,可发送可接受

#include <REGX52.H>


/**
  * @brief  UART串口初始化
  * @param  无
  * @retval 无
  */
void Uart1_Init(void)	//4800bps@11.0592MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率

	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x20;		//设置定时器模式 8位自动重装
	TL1 = 0xF4;			//设置定时初始值
	TH1 = 0xF4;			//设置定时重载值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	
	EA = 1;				// 使能总中断控制
	ES = 1;				//使能串口1中断
}


/**
  * @brief  发送一个字节数据
  * @param  unsigned char Byte 要发送的数据
  * @retval 无
  */
void Uart1_sendByte(unsigned char Byte)
{
	SBUF = Byte;
	while(TI==0);
	TI=0;
}

/*串口中断函数模板
void Uart1_Isr(void) interrupt 4 
{
	if (TI)				//检测串口1发送中断
	{
		TI = 0;			//清除串口1发送中断请求位
	}
	if (RI)				//检测串口1接收中断
	{
		P2 = SBUF;
		RI = 0;			//清除串口1接收中断请求位
	}
}
*/