51单片机串口通信(STC89C52)
本文主要介绍串口通信的相关内容。基于STC89C52实现电脑与串口之间的通信。
目录
一、串口介绍
串口(Serial Port,串行通信接口)是设备间逐位、依次传输数据的通信接口,核心是UART 协议,搭配RS-232/RS-485等电气标准,广泛用于嵌入式调试、工业控制、传感器通信等场景。
51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。


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

三、电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
1. TTL 电平
电压:3.3V 或 5V
逻辑:1 = 3.3V/5V 0 = 0V(GND)
距离:很短,几十厘米以内
用途:
STM32、Arduino、ESP32 内部串口
USB 转 TTL 模块(CH340、CP2102)
传感器、蓝牙 / WiFi 模块
2. RS-232 电平
电压:±12V 左右
逻辑:和 TTL 完全相反! 1 = -3V ~ -15V 0 = +3V ~ +15V
距离:15 米以内
特点:
不能直接和单片机 TTL 相连!会烧芯片
必须用 MAX3232 这类电平转换芯片
3. RS-485 电平
差分信号:A、B 两根线
电压差决定逻辑
距离:最远 1200 米
抗干扰极强,工业现场必用
半双工常见通信接口比较
四、常见通信接口比较
| 名称 | 引脚定义 | 通信方式 | 特点 |
|---|---|---|---|
| UART | TXD、RXD | 全双工、异步 | 点对点通信 |
| I²C | SCL、SDA | 半双工、同步 | 可挂载多个设备 |
| SPI | SCLK、MOSI、MISO、CS | 全双工、同步 | 可挂载多个设备 |
| 1-Wire | DQ | 半双工、异步 | 可挂载多个设备 |
五、相关术语
全双工:通信双方可以同时发送和接收数据,就像打电话,两边可以同时说话。代表接口:UART、SPI。
半双工:通信双方可以发送和接收数据,但同一时间只能单向传输,就像对讲机,必须 “说完等对方回复”。代表接口:I²C、1-Wire、RS-485。
单工:只能单向传输数据,一方永远发送,另一方永远接收,就像广播电台。
同步通信:通信双方共享统一的时钟信号,用时钟边沿来同步数据传输,数据传输效率高、速度快。代表接口:I²C、SPI。
异步通信:没有统一的时钟信号,通过起始位、数据位、校验位、停止位来帧同步,接线简单但速度相对较慢。代表接口:UART、1-Wire。
点对点通信:只有两个设备之间直接通信,不能接入更多设备,通信链路简单。代表接口:UART。
时钟信号:同步通信中由主机提供的周期性电平信号,用于标记数据传输的节奏,确保收发双方数据对齐。
片选信号(CS/SS):SPI 接口中用于选择特定从设备的信号,只有被选中的设备才会响应通信,避免总线冲突。
六、51单片机的UART
STC89C52有1个UART
STC89C52的UART有四种工作模式:
模式0:同步移位寄存器
模式1:8位UART,波特率可变(常用)
模式2:9位UART,波特率固定
模式3:9位UART,波特率可变

七、串口参数与时序图
波特率:串口通信的速率,代表每秒钟传输的比特数(比如 9600、115200),决定了发送 / 接收每一位数据的间隔时间。
检验位:用于数据传输错误验证(比如奇校验、偶校验),比如发送0101 0101,如果是奇校验,要让 1 的总数变成 奇数,所以校验位 = 1。如果是偶校验,要让 1 的总数保持 偶数,所以校验位 = 0。
停止位:用于标识一帧数据的结束,起到帧间隔的作用。

八、串口工作模式的硬件结构图

1. 核心数据缓存:SBUF
地址:
99H,物理上是两个独立寄存器(发送和接收各一个,共用一个地址)
2. 波特率生成:定时器 T1 + 分频逻辑
时钟源:由定时器 T1 溢出提供(
T1溢出率)分频路径:
- T1 溢出 → 先经过
÷2或÷1(由 SMOD 位控制波特率是否加倍)- 再经过
÷16分频,最终得到串口波特率
3. 发送流程
CPU 向 发送 SBUF 写入数据
发送控制器从 SBUF 取出数据,按串口帧格式(起始位 + 数据位 + 停止位)逐位发送
发送完成后,发送中断标志位 TI 置 1,触发串口中断(如果开启)
数据通过 TXD 引脚 发送出去
4. 接收流程
RXD 引脚检测到起始位(低电平),开始接收数据
接收控制器通过 移位寄存器 逐位采集数据
一帧数据接收完成后,存入 接收 SBUF
接收中断标志位 RI 置 1,触发串口中断(如果开启)
CPU 读取 SBUF 获取数据
九、程序实现
1、串口向电脑发送数据

1.1 关于寄存器配置,需要去看一下手册的第8章和第7章。或者直接用STC-ISP波特率计算器生成代码。关键的UART_Init 和 UART_SendByte函数实现如下所示。UART_SendByte中发送中断标志位需要手动复位。
1.2 main实现通过串口发送当前秒计数值

2、电脑通过串口控制LED
2. 1 主要需要使能串口中断,同时需要用到串口中断服务函数。


2.2 在中断服务函数将接收到的数据发送到P2口
十、效果展示
1、串口向电脑发送数据

2、电脑通过串口控制LED

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)