C51实现串口通信


木易
原创
发布时间: 2025-06-11 10:02:13 | 阅读数 0收藏数 0评论数 0
封面
要在51单片机上实现每隔一秒与电脑通过串口通信一次,可以采用如下方法:首先初始化串口设置波特率,并使能串口中断或轮询查询方式处理数据收发。然后设定一个定时器中断,每秒触发一次,作为发送数据的时间基准。在主循环中准备要发送的数据,并在定时中断触发时通过串口发送给电脑。

准备工作:

材料:

材料名称
数量
备注
C51单片机
1
1

串口介绍

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

常用通信接口


名称

引脚定义

通信方式

特点

UAERT

TXD、RXD

全双工、异步

点对点

I2C

SCL、SDA

半双工、同步

多个设备通信

SPI

SCLK、MOSI、MISO、CS

全双工、同步

多个设备通信

1-wire

DQ

半双工、异步

多个设备通信

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

51单片机的UART

  1. TXD:接P3.1引脚 - RXD:接P3.0引脚 - SBUF 是缓冲区,分为发送缓冲区和接收缓冲区。
  2. TH1和TL1是定时器1的功能,需要工作在方式2(自动重载模式),用来设置波特率; 接收数据时,数据从引脚接收,通过移位寄存器接收到 SBUF,然后控制寄存器把RI置1(接收中断),然后触发中断; 发送数据时,SBUF传到控制门,由发送控制器控制TI 触发中断;
4

相关寄存器

SCON:串行控制寄存器(可位寻址)

SM2:允许方式2或方式3多机通信控制位;

REN:允许/禁止穿行接收控制位。

○ 由软件置位REN,REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息;

○ 软件复位REN,即REN=0,则禁止接收;

TB8:在方式2或方式3,它为要发送的第9位数据,按需要由软件置位或清0;

RB8:在方式2或方式3,是接收到的第9位数据;

TI: 发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位;

RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=0。

0100 0000

PCON:电源控制寄存器(不可位寻址)

  1. SMOD:波特率选择位。
  2. 当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;
  3. SMOD=0,则各工作方式的波特率不加倍。复位时SMOD=0。
  4. SMOD0:帧错误检测有效控制位。
  5. 当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;
  6. 当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD0=0
5

串口通信操作流程

  1. 发送数据流程

初始化:

  1. 配置串口控制寄存器SCON为0x40(或0x50);
  2. 配置电源控制寄存器PCON(计算波特率);
  3. 配置定时器T1(串口通信只能用定时器1,只能使用8位自动重装工作模式),启动定时器T1;
  4. 禁止定时器T1中断;

注意串口初始化代码可以使用STC-ISP(附件)生成,生成后复制代码并删除其他的AURX内容。

void UartInit() //4800bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x40; //8位数据,仅用于发送
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
  1. 发送数据
/**
* @brief 串口发送一个字节数据
* @param Byte 要发送的一个字节数据
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
TXT
main.txt
1017B
EXE
stc-isp.exe
3.98MB
6

实现效果

单片机通过串口每过一秒向电脑端发送内容。

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载