51单片机如何实现串口通信?它的工作原理是什么?
串口通信是单片机一个重要的部分,单片机和PC,单片机和单片机之间的通信大都用串口。单片机的串口是全双工异步串口通信方式。串口传送数据是一帧一帧发送的,它有四种工作方式,同时也可以做并行I/O的扩展。
更多
51单片机(主要指兼容Intel 8051架构的微控制器)通过其内置的通用异步收发器(UART, Universal Asynchronous Receiver/Transmitter)模块来实现串口通信。这是一种异步串行通信方式,不需要发送时钟信号线,仅需两条数据线(TXD发送,RXD接收)即可实现双向通信。
工作原理核心要点
-
异步通信:
- 发送端和接收端不使用共享的时钟信号进行同步。
- 依靠预定义的波特率(Baud Rate)来约定通信速度(每位数据的持续时间)。
- 每帧数据传输以起始位(Start Bit)开始,以停止位(Stop Bit)结束来界定数据帧。
-
数据帧格式: 一个完整的数据帧通常包含以下部分(最常见的是8-N-1格式):
- 起始位 (1位): 逻辑低电平(0),表示一个新字节传输的开始。
- 数据位 (5-9位): 通常是8位,代表一个字节的有效数据。51单片机通常默认支持5-9位。
- 校验位 (可选1位): 用于简单的错误检测。可以是奇校验、偶校验或无校验(最常见)。
- 停止位 (1位、1.5位或2位): 逻辑高电平(1),标志着一个帧的结束,并为下次传输提供稳定时间。通常是1位或2位。
-
UART模块内部核心部件(51单片机视角):
- 发送缓冲器(SBUF): 用于存放待发送的数据字节。当启动发送时,UART硬件会自动将这个字节装入发送移位寄存器。
- 接收缓冲器(SBUF): 用于存放从接收移位寄存器移入并转换完成的完整接收字节。读
SBUF获取数据(发送和接收物理上是两个寄存器,但软件访问地址相同)。 - 发送移位寄存器: 将并行数据(来自SBUF)按设定的波特率逐位从TXD引脚串行输出(先输出起始位,然后是数据位LSB->MSB,最后是停止位)。
- 接收移位寄存器: 监视RXD引脚,在检测到起始位后,按约定的波特率采样接收数据位并移入寄存器(采样通常在每位周期的中间时刻进行)。当完整的一帧接收完毕(包括预期停止位),数据会被并行送入接收SBUF,并置位接收完成标志(RI)。
- 波特率发生器: 通常由一个独立的定时器(通常是T1)驱动,产生与预设波特率匹配的时钟频率。这个频率通常是波特率的16倍(用于接收采样)或直接驱动移位。
- 控制和状态寄存器: SCON(串行控制寄存器)是最核心的寄存器,负责配置:
- 工作模式(模式1是最常用的8位UART模式)。
- 波特率倍增(SMOD位,影响T1溢出率)。
- 发送完成标志(TI)。
- 接收完成标志(RI)。
- 允许接收(REN)。
- PCON(电源控制寄存器): 其中SMOD位用于波特率倍增控制(0:不倍增;1:倍增)。
- 中断系统: UART发送完成(TI=1)或接收完成(RI=1)时,可以触发串口中断(如果中断被使能)。
在51单片机中实现串口通信的典型步骤
-
选择波特率:
- 根据通信需求(通信速度、抗干扰要求)和晶振频率确定波特率。
- 使用定时器1(工作在模式2 - 8位自动重载)作为波特率发生器是最常见的方法。
- 计算公式:
波特率 = (2^SMOD / 32) * (定时器T1溢出率)(模式1下的UART) - 溢出率 = Fosc / (12 * (256 - TH1))
- 推导得到TH1初值:
TH1 = 256 - (Fosc * (2^SMOD)) / (384 * BaudRate)。需要计算并配置TH1。
-
配置定时器T1:
- 设置TMOD寄存器,使T1工作在模式2(8位自动重载),例如:
TMOD = 0x20; - 将计算好的TH1初值装入TH1(TL1会自动加载TH1值)。
- 启动定时器T1(TR1=1)。
- 设置TMOD寄存器,使T1工作在模式2(8位自动重载),例如:
-
配置串口控制器SCON:
- 选择模式1(8位UART,波特率可变,使用T1产生):
SM0=0, SM1=1 - 允许接收(如果要接收数据):
REN=1。 - 清除发送完成(TI)和接收完成(RI)标志(软件清零)。
- 例如:
SCON = 0x50; // 0101 0000 即 SM0=0, SM1=1, REN=1
- 选择模式1(8位UART,波特率可变,使用T1产生):
-
配置波特率倍增(PCON):
- 根据计算需要使用SMOD位:
PCON |= 0x80;(设置SMOD=1,波特率加倍) 或PCON &= 0x7F;(清除SMOD=0,波特率不加倍)。默认通常是0。
- 根据计算需要使用SMOD位:
-
发送数据(查询方式):
- 将需要发送的数据写入SBUF寄存器,例如:
SBUF = 'A'; - UART硬件自动开始发送(置起始位、移位数据位、置停止位)。
- 软件循环查询TI标志:
while (!TI);(等待硬件置位TI表示发送完成)。 - 软件清除TI标志:
TI = 0;(为下次发送做准备)。
- 将需要发送的数据写入SBUF寄存器,例如:
-
接收数据(查询方式):
- 确保REN=1 (已设置)。
- 软件循环查询RI标志:
while (!RI);(等待硬件置位RI表示接收到一个完整字节)。 - 软件清除RI标志:
RI = 0;(为下次接收做准备)。 - 读取SBUF中的数据:
received_data = SBUF;
-
(可选) 使用中断方式处理收发:
- 更高效,避免CPU空转查询。
- 使能串口中断:
ES = 1; - 使能总中断:
EA = 1; - 在串口中断服务程序(中断号为4)中:
- 判断是发送中断(TI=1)还是接收中断(RI=1)。
- 如果是接收中断:
- 读取SBUF:
received_data = SBUF; - 务必清除RI标志:
RI = 0;
- 读取SBUF:
- 如果是发送中断:
- 清除TI标志:
TI = 0; - 通常在这里可以启动下一个字节的发送(将新数据写入SBUF)。
- 清除TI标志:
代码示例(查询方式,晶振11.0592MHz,波特率9600)
#include <reg51.h> // 包含51单片机寄存器定义头文件
void UART_Init() {
// 1. 配置T1为波特率发生器(模式2)
TMOD = 0x20; // 设置T1为8位自动重装模式(TMOD.5和TMOD.4为2)
TH1 = 0xFD; // TH1和TL1初值(针对11.0592MHz,9600bps)
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
// 2. 配置SCON(串口模式1,允许接收)
SCON = 0x50; // 0101 0000b:模式1(UART,8位), REN=1
// 3. PCON波特率倍增设置(默认为0,不需要设置)
// PCON &= 0x7F; // 可选:确保SMOD=0
}
void UART_SendByte(unsigned char dat) {
SBUF = dat; // 数据放入发送缓冲器,硬件自动开始发送
while (!TI); // 等待发送完成标志TI置位
TI = 0; // 软件清除TI标志
}
unsigned char UART_ReceiveByte() {
while (!RI); // 等待接收完成标志RI置位
RI = 0; // 软件清除RI标志
return SBUF; // 返回接收到的数据
}
void main() {
unsigned char received_char;
UART_Init(); // 初始化串口
while (1) {
received_char = UART_ReceiveByte(); // 等待并接收一个字节
UART_SendByte(received_char + 1); // 将接收到的字符+1后发送回去(简单回显+1测试)
}
}
重要提示
- 物理电平转换: 51单片机的UART模块工作在TTL电平(0V表示逻辑0,5V/3.3V表示逻辑1)。要连接标准的RS232设备(如电脑串口,逻辑1是-3V到-15V,逻辑0是+3V到+15V),必须使用RS232电平转换芯片(如MAX232, CH340G, CP2102, FT232等)。
- 连接方式: 单片机的
TXD脚连接对方的RXD脚,单片机的RXD脚连接对方的TXD脚。GND必须相连。 - 波特率误差: 波特率的设置依赖于系统时钟精度和重载值的计算。11.0592MHz晶振非常常用,因为它能精确产生大量常用波特率(如9600, 19200, 38400, 57600, 115200等)。使用12MHz晶振则误差较大。
- 停止位: 常见的1位停止位是默认设置。
- 双工: UART是全双工通信,发送和接收可以同时进行。
总结来说,51单片机的串口通信依赖内置的UART硬件模块实现异步串行数据传输。核心是配置定时器1产生正确的波特率时钟,设置SCON寄存器定义数据帧格式和收发使能。通过查询或中断方式检测TI/RI标志来管理数据的发送和接收流程。理解起始位、停止位、波特率以及SBUF、TI、RI寄存器的操作是关键。
7天热门专题
换一换
换一换
- 如何分清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功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机