最近学习了嵌入式底层通信这块内容,从51单片机的UART串口,学到DS18B20单总线温度传感器。
一、UART串口通信
UART全称串行异步收发器,是单片机最基础的通信方式,用来实现单片机之间、单片机和电脑之间的数据交互。
- 接线要点
串口最少需要3根线:
RXD:接收数据线
TXD:发送数据线
GND:共地线
重点:TX交叉接对方RXD,并且双方GND必须连在一起。电压信号依靠电位差传输,基准地不一致,收到的数据大概率全是乱码。
单片机和电脑通信一般需要CH340芯片,把单片机串口信号转换成USB信号。
- 核心基础概念
波特率:串口传输速率,单位bps,代表一秒传输多少比特。常用:2400、4800、9600、115200。
串行:数据按位依次传输,先发低位LSB,后发高位MSB。
异步:通信双方不需要共用同一个时钟,只需要提前约定波特率;即便波特率参数一致,硬件时钟也会存在微小偏差,传输速度越快越容易出错。
全双工:TX、RX两条线相互独立,收发可以同时进行。
- 一帧数据组成
发送1字节数据完整帧:1位起始位 + 8位数据位 + 可选奇偶校验位 + 1位停止位
- 51单片机串口配置流程
发送流程
-
设置串口工作模式(常用模式1,8位数据,无校验)
-
PCON寄存器配置SMOD,选择波特率是否加倍
-
根据公式计算定时器初值TH1
-
配置定时器1:8位自动重装模式,写入初值,打开定时器
-
向SBUF写入待发送字节,硬件自动开始发送
-
发送完成硬件自动置TI标志,TI必须软件手动清零,才能继续下一次发送
接收流程
-
设置串口工作模式为模式1
-
开启串口接收允许位REN
-
PCON配置SMOD
-
计算波特率,配置定时器1
-
打开定时器1
-
编写串口中断服务函数
-
开启总中断EA、串口中断ES
-
等待接收中断触发;接收完成硬件置RI,RI必须软件清零
二、DS18B20单总线温度传感器
DS18B20是单总线温度传感器,只需要一根DQ数据线,外加电源和地就能通信,测温范围:-55℃ ~ +125℃。
- 引脚
GND:电源地
DQ:单总线通信引脚
VCC:供电引脚,供电范围3.0V~5.5V
12bit分辨率下,一次温度转换最长耗时750ms。
- 复位时序(通信第一步)
单总线时序要求非常严格,所有通信都要先复位:
-
总线空闲默认高电平
-
主机拉低DQ至少480us,发起复位
-
释放总线,等待DS18B20回应60~240us低电平脉冲;有应答代表传感器正常。
-
读写位时序
-
主机写0:拉低总线保持60~120us
-
主机写1:拉低总线至少1us,15us内释放总线回到高电平,供传感器采样
每发送1bit,位与位之间间隔要大于1us
-
主机读数据:主机先拉低总线至少1us,随后释放总线;DS18B20会把数据放到总线上,主机要在15us之内完成电平采样。
-
常用指令
0xCC:跳过ROM指令,多个传感器挂载总线时不能使用,单传感器场景直接用
0x44:启动温度转换,转换完成温度数据存入暂存器
0xBE:读取暂存器9字节数据,我们只需要前两个字节
-
完整读取温度流程
-
发送复位信号
-
发送0xCC跳过ROM
-
发送0x44启动温度转换
-
等待约800ms,等待转换完成
-
再次发送复位信号
-
发送0xCC
-
发送0xBE读取暂存器
-
读取2字节:第1字节LSB,第2字节MSB
-
温度计算公式:温度 = 合并数值 × 0.0625
UART和单总线是嵌入式里很经典的两种通信。UART异步串口靠两根线+地线通信,开发简单稳定;DS18B20单总线节省引脚,但对时序要求苛刻,写代码稍微延时不对就通信失败。学这部分的时候,要多参考手册内容,许多是已经规定好的所以不必深究。