嵌入式系统(51单片机)核心外设详解:UART通信与DS18B20温度采集

掌握微控制器与外界设备的通信是嵌入式开发的基石。本文将深入剖析两种最经典的技术:UART异步串行通信DS18B20单总线温度采集,从协议原理到寄存器配置,为您提供清晰的实践指南。

第一部分:UART------通用异步收发传输器

1. 核心概念

UART是一种硬件接口,采用异步、全双工、串行 的通信协议。所谓"异步",指通信双方没有统一的时钟线,依靠预先约定好的波特率来同步数据节奏。

2. 硬件连接

连接时务必牢记交叉互连原则:发送端(TXD)接接收端(RXD),接收端(RXD)接发送端(TXD),VCC和GND直接相连。

3. 通信方式辨析

  • 单工:单向传输,如收音机。

  • 半双工:双向但分时传输,如对讲机,同一时刻只能一方发言。

  • 全双工:双向同时传输,如电话通话,UART即采用此方式。

4. 数据传输细节

  • 发送顺序 :遵循LSB(最低有效位)优先,即从数据的最低位(bit0)开始发送。

  • 串行 vs 并行

    • 串行 :单根数据线,逐位发送。成本低、距离远、抗干扰强,但速度相对慢。UART、I2C、SPI属此类。

    • 并行 :多根数据线,同时发送多位。速度极快,但成本高、线间干扰大、传输距离短。

5. 通信帧格式与参数

一个完整的UART数据帧包含:

  1. 起始位:1位低电平,标志传输开始。

  2. 数据位:通常为8位(5-9位可选),即要发送的有效数据。

  3. 校验位:1位,用于简单的错误检测。

    • 奇校验:数据位+校验位中"1"的个数为奇数。

    • 偶校验:数据位+校验位中"1"的个数为偶数。

    • 无校验:不启用校验位。

    • 注意:奇偶校验无法检测偶数个位发生的错误。

  4. 停止位: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. 确定波特率,计算定时器1(T1)初值。

  2. 配置TMOD,设T1为8位自动重装模式。

  3. 给TH1和TL1装入初值,启动T1(TR1=1)。

  4. 配置SCON,设工作模式,并使能接收(REN=1)。

  5. 配置PCON,决定是否波特率加倍(SMOD)。

  6. 配置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线的拉低、释放和采样。

  • 复位脉冲(初始化)

    1. 主机拉低DQ线至少480µs。

    2. 主机释放DQ线(转为输入模式),由上拉电阻拉高。

    3. DS18B20等待15-60µs后,会拉低DQ线60-240µs作为"应答脉冲"。

    4. 主机检测到这个低电平,表示传感器存在。

  • 写时序

    • 写'0':主机拉低DQ线至少60µs,然后释放。

    • 写'1':主机拉低DQ线1-15µs,然后迅速释放,并保持高电平至少45µs。

  • 读时序

    1. 主机拉低DQ线至少1µs。

    2. 主机迅速释放DQ线。

    3. 主机在拉低后的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严格的单总线时序,则意味着具备了驱动复杂传感器的能力。建议在理解理论后,务必在开发板上动手实践,通过示波器观察波形,通过代码调试数据,才能真正融会贯通。

相关推荐
小白电脑技术2 小时前
玩客云OneCloud插入内存卡之后,开机自动挂载教程
网络·电脑
不染尘.2 小时前
Linux的rpm与yum
linux·mysql·jdk·centos·tomcat·ssh
e***98572 小时前
跨平台虚拟机网络故障排查指南
运维·网络
重生之绝世牛码2 小时前
Linux软件安装 —— SSH免密登录
大数据·linux·运维·ssh·软件安装·免密登录
AI殉道师2 小时前
Vercel 重磅发布 agent-browser:AI Agent 浏览器自动化的新纪元来了
运维·人工智能·自动化
计算机C9硕士_算法工程师2 小时前
基于深度学习风力叶片缺陷检测系统 无人机自动巡检风电场 - 风电运维智能诊断平台 - 缺陷生命周期追踪系统
运维·深度学习·无人机
早日退休!!!2 小时前
内存泄露(Memory Leak)核心原理与工程实践报告
大数据·网络
Kiyra2 小时前
阅读 Netty 源码关于 NioEventLoop 和 Channel 初始化部分的思考
运维·服务器·前端
废墟乌托邦2 小时前
实验10 路由器的基本配置 实验报告
网络·智能路由器