51单片机串口通信的原理及应用
不同型号的单片机使用的串口不同,根据需求选择相应的单片机,在有些场合如果单片机如果没有需要的串行通信接口,则可以通过单片机的I/O口进行模拟。 全双工UART(异步串行通信接口) UART有两种工作状态: 同步串行通信状态:速率高,硬件电路复杂,需要同时使用两条信号线,所以只能使用单工方式或半双工方式工作。 异步串行通信状态:方式简单,传输速率不高,应用广泛,方便与其他通信标准进行衔接。
好的,我们来详细讲解一下51单片机串口通信的原理及应用。
一、 串口通信的本质
串口通信 (Serial Communication) 是一种最基本、最常用的单片机与外部设备之间串行传输数据的方式。其核心在于:
- 串行: 数据位(比特流)按顺序,一位接一位地通过一根(或一对)信号线进行传输。
- 异步: 通信双方不依赖共同的时钟信号来严格同步每个比特的开始和结束时刻,而是依靠事先约定的波特率(比特率)来协调发送和接收的速度,并通过起始位和停止位来界定每个数据单元的边界。
二、 51单片机串口通信的核心 - UART
51单片机内部集成了一个硬件模块,称为UART (Universal Asynchronous Receiver/Transmitter - 通用异步收发器)。它的作用是:
- 发送时: 将CPU送来的并行数据(一个字节)转换成串行比特流,并按帧格式(加上起始位、可选的校验位、停止位)通过
TXD(P3.1)引脚发送出去。 - 接收时: 通过
RXD(P3.0)引脚持续检测串行数据线上的信号。当检测到有效的起始位时,它开始按约定的波特率采样后续的数据位(以及校验位,如果有)。在收到停止位后,将整个收到的字节转换成并行数据,并告诉CPU有新数据到达(通过设置接收中断标志RI)。
UART工作的关键要素(帧格式)
每个传输的单位(通常是一个字节)称为一个"帧",其基本格式如下:
- 起始位: 固定1位低电平 (
0),用于标志一帧数据的开始。 - 数据位: 有效数据部分,通常是5、6、7、8位(最常用的是8位)。数据的最高位(
MSB)或最低位(LSB)在先传输由具体设置决定(51通常是LSB,即最低位先发送)。 - 校验位(可选): 1位,用于检错。常见方式:
- 奇校验: 使数据位+校验位中
1的总数为奇数。 - 偶校验: 使数据位+校验位中
1的总数为偶数。 - 无校验: 不包含校验位(最常用)。
- 奇校验: 使数据位+校验位中
- 停止位: 1位或2位的高电平(
1),标志一帧数据的结束,并为下一帧提供一定的间隔。常用1位停止位。 - 波特率: 单位时间内传输的码元(symbol)数量(位/秒,bps)。通信双方必须设定相同的波特率!常见有4800, 9600, 19200, 38400, 57600, 115200等。
三、 51单片机实现串口通信(寄存器原理)
51单片机通过几个特殊功能寄存器(SFR)来控制和使用UART:
-
SCON (Serial Control Register - 串行控制寄存器, 地址 0x98):
SM0,SM1: 工作方式选择位。组合决定了通信模式(同步/异步)和帧格式。通常设置为SM0=0, SM1=1选择工作方式1 (8位UART, 波特率可变),这是最常用的异步模式。REN: 接收允许位。置1允许UART接收数据。TI: 发送中断标志位。当发送一帧数据完成(发送完停止位)时,由硬件自动置1。需要在中断服务程序(ISR)中或查询后用软件清0。RI: 接收中断标志位。当成功接收到一帧有效数据时(接收完停止位,且帧格式正确),由硬件自动置1。需要在中断服务程序(ISR)中或查询后用软件清0。
-
SBUF (Serial Buffer - 串行数据缓冲器, 地址 0x99):
- 这是一个物理上分开的发送寄存器和接收寄存器,但映射到同一个地址。
- 写SBUF: CPU向SBUF写数据,数据被送入发送寄存器,随即触发UART启动串行发送过程。
- 读SBUF: CPU从SBUF读数据,数据是从接收寄存器中读出。
-
PCON (Power Control Register - 电源控制寄存器, 地址 0x87):
SMOD: 波特率加倍位。当使用定时器1作为波特率发生器时:SMOD=0: 波特率 = (定时器1溢出率) / 32SMOD=1: 波特率 = (定时器1溢出率) / 16- 置
1可以将波特率提高一倍。
-
定时器1:
- 在常用的工作方式1下,波特率由定时器1的溢出率决定。
- 通常将定时器1配置为工作方式2 (8位自动重载):
TMOD |= 0x20。 - 波特率计算公式:
波特率 = (2^SMOD / 32) * (定时器1的溢出率) 定时器1溢出率 = Fosc / 12 / (256 - TH1) Fosc:系统时钟频率(Hz)。TH1:定时器1重装初值寄存器。
四、 51单片机串口通信的基本步骤
-
初始化设置:
- 配置UART工作方式:设置
SCON(常用0x50:SM0=0, SM1=1, REN=1允许接收)。 - 配置波特率:
- 选择
SMOD值(置0或1)。 - 配置定时器1为方式2:
TMOD = (TMOD & 0x0F) | 0x20;。 - 根据所需波特率计算并设置
TH1(和TL1)的初值。 - 启动定时器1:
TR1 = 1;。
- 选择
- (可选) 开启串口中断:
EA=1;(总中断)ES=1;(串口中断)。 - (可选) 清除发送/接收中断标志
TI/RI(启动前清除)。
- 配置UART工作方式:设置
-
发送数据:
- 查询方式:
void UART_SendByte(unsigned char dat) { SBUF = dat; // 将数据写入发送缓冲器,启动发送 while (!TI); // 等待发送完成标志TI置位 TI = 0; // 必须软件清零TI } - 中断方式:
- 设置
ES=1,EA=1。 - 在发送中断服务函数(
void UART_ISR() interrupt 4)中:if (TI) { TI = 0; // 清除发送中断标志 // (可选) 设置状态或启动发送下一字节 } - 主程序中直接写
SBUF = dat;启动发送。中断处理完TI表示该字节发送完成。
- 设置
- 查询方式:
-
接收数据:
- 查询方式:
unsigned char UART_RecvByte(void) { while (!RI); // 等待接收完成标志RI置位 RI = 0; // 必须软件清零RI return SBUF; // 读取接收到的数据 } - 中断方式 (强烈推荐):
- 设置
ES=1,EA=1。 - 在接收中断服务函数(
void UART_ISR() interrupt 4)中:if (RI) { RI = 0; // 清除接收中断标志 dat = SBUF; // 读取接收到的数据 // 处理接收到的数据dat (存入缓冲区、解析命令等) } - UART硬件会在检测到完整的有效数据帧后自动触发中断,在ISR中读取
SBUF即可。
- 设置
- 查询方式:
五、 51单片机串口通信的典型应用
-
单片机与PC通信 (最常用):
- 场景:调试信息输出、程序下载(如STC单片机的ISP)、接收PC指令控制单片机、将传感器数据发送给PC显示或存储。
- 实现:单片机UART通过
TXD/RXD连接到USB转TTL串口模块(如CH340, CP2102等),模块的USB端插入PC。 - 工具:PC端使用串口调试助手软件(如串口猎人、SSCOM、XCOM、Putty、Tera Term等)进行收发数据。
-
单片机与传感器/模块通信:
- 许多传感器(如温湿度传感器DHT11/DHT22需要模拟时序,但有些如BMP280气压模块可用串口)、GPS模块(GPS NEO-6M/7M等)、蓝牙模块(HC-05/06)、Wi-Fi模块(ESP8266/ESP32本身是主控,但常通过串口与51通信)、GSM模块、OLED显示屏模块等都支持UART接口的指令通信协议。
- 51单片机作为主机,通过串口发送指令查询数据或控制这些模块。
- 通常连接方式:51-TXD -> 模块-RXD; 51-RXD -> 模块-TXD; 共地(GND)。
-
单片机与单片机通信 (双机通信):
- 两台(或更多,可通过多机通信模式实现)51单片机之间直接交换数据。
- 简单双机通信连接:A-TXD -> B-RXD; A-RXD -> B-TXD; A-GND -> B-GND。
- 需要约定好帧格式(数据位、停止位、校验方式,通常8N1无校验)和波特率。发送方调用
UART_SendByte发送数据,接收方查询或中断接收数据。
-
调试输出:
- 在程序中关键位置通过串口输出变量值、状态信息、错误信息等,是非常强大的调试手段(俗称“printf调试法”)。不需要额外硬件(连接PC),信息直观。
六、 注意事项
- 波特率匹配: 通信双方波特率必须一致!否则数据完全错误。
- 数据帧格式匹配: 双方约定的数据位长度(8位)、停止位长度(1位)、校验方式(无校验)必须相同。
- 硬件连接: 交叉连接:TX->RX, RX->TX!连接地线(GND)是必须的。
- 中断标志处理:
TI和RI必须由软件清零,否则无法触发下一次中断或判断。 - 资源占用: UART通信会占用定时器1(用作波特率发生器)和串口中断(如果使用中断方式)。
- 抗干扰: 长距离传输或强干扰环境考虑使用RS-232(需要电平转换芯片如MAX232)或RS-485(支持半双工、长距离、多节点,需收发器如MAX485)。
七、 常见问题解决方向
- 收不到数据/乱码:
- 检查波特率是否准确匹配?(重新计算并设置TH1)
- 检查硬件连接是否正确?(交叉连接?TX/RX是否接反?VCC/GND?)
- 检查UART初始化是否正确?(SCON, TMOD, TH1, TR1, 波特率加倍位)
- 检查接收标志RI的清除和读取SBUF的时机?
- 检查PC端串口助手软件设置(波特率、数据位、停止位、校验位)是否匹配?
- 数据有部分错误(如某些位变位): 可能是波特率微小的不匹配、硬件干扰或地线接触不良。检查波特率计算的精度(尝试微调TH1值),检查接线可靠性、接触点是否氧化,缩短线缆长度或加磁环/屏蔽层。在弱干扰环境可考虑加奇偶校验(降低误码率)。
总结
51单片机的串口通信(UART)是一种基于串行异步传输协议的高效实用通信方式。理解其工作原理(串行、异步、帧格式)、掌握相关寄存器(SCON, SBUF, PCON, TMOD, TH1)的配置和使用方法(查询或中断)、熟悉波特率计算和硬件连接规则,就能轻松实现51单片机与PC、传感器、其他模块或其他单片机之间的数据交换,为应用开发提供强大的通信基础。它是单片机开发者必须掌握的核心技能之一。
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 芯片的工作原理是什么?
- ssd是什么意思
- 什么是蓝牙?它的主要作用是什么?
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- dtmb信号覆盖城市查询
- 怎样挑选路由器?
- 华为芯片为什么受制于美国?
- 元宇宙概念股龙头一览
- type-c四根线接法图解
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- amoled屏幕和oled区别
- BLDC电机技术分析
- 复位电路的原理及作用
- dsp是什么意思?有什么作用?
- iphone13promax电池容量是多少毫安
- 苹果无线充电器怎么使用?
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 传感器常见类型有哪些?
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机