掌握微控制器与外界设备的通信是嵌入式开发的基石。本文将深入剖析两种最经典的技术:UART异步串行通信 和DS18B20单总线温度采集,从协议原理到寄存器配置,为您提供清晰的实践指南。
第一部分:UART------通用异步收发传输器
1. 核心概念
UART是一种硬件接口,采用异步、全双工、串行 的通信协议。所谓"异步",指通信双方没有统一的时钟线,依靠预先约定好的波特率来同步数据节奏。
2. 硬件连接
连接时务必牢记交叉互连原则:发送端(TXD)接接收端(RXD),接收端(RXD)接发送端(TXD),VCC和GND直接相连。
3. 通信方式辨析
-
单工:单向传输,如收音机。
-
半双工:双向但分时传输,如对讲机,同一时刻只能一方发言。
-
全双工:双向同时传输,如电话通话,UART即采用此方式。
4. 数据传输细节
-
发送顺序 :遵循LSB(最低有效位)优先,即从数据的最低位(bit0)开始发送。
-
串行 vs 并行:
-
串行 :单根数据线,逐位发送。成本低、距离远、抗干扰强,但速度相对慢。UART、I2C、SPI属此类。
-
并行 :多根数据线,同时发送多位。速度极快,但成本高、线间干扰大、传输距离短。
-
5. 通信帧格式与参数
一个完整的UART数据帧包含:
-
起始位:1位低电平,标志传输开始。
-
数据位:通常为8位(5-9位可选),即要发送的有效数据。
-
校验位:1位,用于简单的错误检测。
-
奇校验:数据位+校验位中"1"的个数为奇数。
-
偶校验:数据位+校验位中"1"的个数为偶数。
-
无校验:不启用校验位。
-
注意:奇偶校验无法检测偶数个位发生的错误。
-
-
停止位:1位(或1.5、2位)高电平,标志帧结束。
常用参数组合示例 :9600 8 N 1表示波特率9600,8位数据,无校验,1位停止位。
6. 51单片机UART寄存器配置(核心)
以51单片机为例,配置UART需操作以下几个关键寄存器:
-
SCON(串行控制寄存器,地址:98H):
-
SM0、SM1 :选择工作模式。通常设置为
01,选择8位UART、波特率可变模式。 -
REN:接收使能位。置1允许串口接收数据。
-
TI :发送中断标志。发送完成时由硬件置1,必须用软件清0。
-
RI :接收中断标志。接收完成时由硬件置1,必须用软件清0。
-
-
PCON(电源控制寄存器,地址:87H):
- SMOD:波特率加倍位。置1可使波特率翻倍。
-
定时器1用作波特率发生器:
UART的波特率由定时器1的溢出率产生。通常将定时器1配置为8位自动重装模式 (TMOD寄存器高4位设为
0010B)。-
波特率计算公式 :
波特率 = (2^SMOD / 32) * (定时器1溢出率) -
定时器初值计算 :
TH1 = TL1 = 256 - (晶振频率) / (波特率 * 384 / (2^SMOD))
-
-
中断控制:
- 在IE(中断允许寄存器) 中,需将EA(总中断开关) 和 **ES(串口中断开关)** 置1,以启用串口中断功能。
配置流程总结:
-
确定波特率,计算定时器1(T1)初值。
-
配置TMOD,设T1为8位自动重装模式。
-
给TH1和TL1装入初值,启动T1(TR1=1)。
-
配置SCON,设工作模式,并使能接收(REN=1)。
-
配置PCON,决定是否波特率加倍(SMOD)。
-
配置IE,开启总中断和串口中断。
第二部分:DS18B20------单总线数字温度传感器
1. 传感器简介
DS18B20是一款著名的**单总线(1-Wire)** 数字温度传感器。
-
测量范围:-55℃ 至 +125℃。
-
精度:±0.5℃。
-
分辨率:可配置9~12位,默认12位,对应分辨率0.0625℃。
-
工作电压:3.0V - 5.5V。
2. 引脚与连接
传感器仅有三根引脚:
-
VCC:电源(3-5.5V)。
-
DQ :单数据总线,需接4.7KΩ上拉电阻。
-
GND:地。
与单片机连接时,DQ引脚连接任意一个GPIO口(如P3.7)。
3. 单总线协议与操作时序
DS18B20通信严格依赖于精确的时序,所有操作都基于主机(单片机)对DQ线的拉低、释放和采样。
-
复位脉冲(初始化):
-
主机拉低DQ线至少480µs。
-
主机释放DQ线(转为输入模式),由上拉电阻拉高。
-
DS18B20等待15-60µs后,会拉低DQ线60-240µs作为"应答脉冲"。
-
主机检测到这个低电平,表示传感器存在。
-
-
写时序:
-
写'0':主机拉低DQ线至少60µs,然后释放。
-
写'1':主机拉低DQ线1-15µs,然后迅速释放,并保持高电平至少45µs。
-
-
读时序:
-
主机拉低DQ线至少1µs。
-
主机迅速释放DQ线。
-
主机在拉低后的15µs内采样DQ线电平,读取到的即为传感器发送的数据位。
-
4. 温度读取完整流程
读取一次温度需要严格遵循以下命令序列:
flowchart TD
A[开始读取温度] --> B[发送复位脉冲]
B --> C[发送跳过ROM命令 0xCC]
C --> D[发送开始转换命令 0x44]
D --> E{等待转换完成<br>(延时或查询)}
E --> F[发送复位脉冲]
F --> G[发送跳过ROM命令 0xCC]
G --> H[发送读暂存器命令 0xBE]
H --> I[连续读取2字节温度数据]
I --> J[数据处理与转换]
J --> K[结束]
关键命令:
-
0xCC:跳过ROM地址匹配,适用于单传感器场景。 -
0x44:启动温度转换。 -
0xBE:读取传感器内部暂存器(前2字节即为温度值)。
5. 温度数据处理
读出的温度值是16位有符号整数(二进制补码格式),低字节在前。
-
高字节的高5位(S)是符号位。S=0为正温度,S=1为负温度。
-
低字节的低4位是小数部分。
-
温度值计算 :
温度 = (读取的16位整数) * 0.0625
总结
UART和DS18B20是嵌入式系统中"通信"与"感知"的经典代表。理解UART,就掌握了微控制器与电脑、模块对话的通用语言;攻克DS18B20严格的单总线时序,则意味着具备了驱动复杂传感器的能力。建议在理解理论后,务必在开发板上动手实践,通过示波器观察波形,通过代码调试数据,才能真正融会贯通。