单片机学习笔记(二)——UART串口与DS18B20

一、UART串口通信

1. 什么是UART

UART(Universal Asynchronous Receiver/Transmitter)即串行异步收发器

主要用于:

  • 单片机与单片机之间通信

  • 单片机与PC机通信

  • 单片机与其他主控设备通信

资料中将UART作为单片机部分的第一个内容。


2. UART引脚

UART通信至少需要连接3根线:

引脚 功能
RXD 接收数据
TXD 发送数据
GND 地线

其中通信双方一定要共地

因为串口传输的是电压信号,而电压是相对于参考电压的差值,所以通信双方的GND必须保持一致。

3. 接线方式

单片机与单片机
复制代码
单片机A              单片机B

TXD  ------------->  RXD
RXD  <-------------  TXD
GND  -------------  GND

注意:

TXD接对方RXD,RXD接对方TXD。

单片机与PC

通常通过USB转TTL模块连接:

复制代码
单片机              USB转TTL              PC

TXD  -------------> RXD
RXD  <------------- TXD
GND  -------------  GND

二、串口通信的基本概念

1. 波特率

波特率表示串口传输数据的速率,单位为 bps

也就是:

1秒钟传输多少个比特。

常见波特率:

复制代码
2400
4800
9600
115200

2. 串口的特点

串行

数据按照字节逐位发送:

复制代码
一个字节
 ↓
一位一位发送
 ↓
LSB → MSB
异步

通信双方没有共同的时钟线,而是通过设置相同的波特率进行通信。

因此双方的波特率需要保持一致,否则容易出现通信错误。

全双工

UART具有TX和RX两条数据线,因此可以同时进行发送和接收。


三、串口通信时序

串口发送一个字节的数据,基本格式为:

复制代码
起始位 + 8位数据位 + 停止位

1位起始位
+
8位数据位
+
1位奇偶校验位(省略)
+
1位停止位

四、UART串口使用流程

1. 串口发送流程

基本步骤:

复制代码
设置串口模式
    ↓
设置波特率
    ↓
设置定时器1
    ↓
启动定时器1
    ↓
发送数据
    ↓
等待TI
    ↓
清除TI

具体流程是:

  1. 设置串口工作模式为模式1

  2. 设置波特率是否加倍

  3. 根据公式设置波特率

  4. 设置定时器1

  5. 发送数据

  6. 关注TI标志位并手动清除


2. 串口接收流程

串口接收的基本流程:

复制代码
设置串口模式
    ↓
打开串口接收
    ↓
设置波特率
    ↓
设置定时器1
    ↓
开启定时器1
    ↓
编写中断函数
    ↓
开启中断
    ↓
等待接收数据

五、STC89C52串口编程

在STC89C52中,可以使用:

复制代码
#include <reg52.h>

来访问单片机的寄存器。

一个简单的串口初始化函数可以写成:

复制代码
void UartInit(void)
{
    SCON = 0x50;        // 串口模式1,允许接收
    TMOD &= 0x0F;
    TMOD |= 0x20;       // 定时器1,8位自动重装
    TH1 = 0xFD;         // 9600波特率
    TL1 = 0xFD;
    TR1 = 1;            // 启动定时器1
}

发送一个字节:

复制代码
void UartSendByte(unsigned char dat)
{
    SBUF = dat;

    while(TI == 0);

    TI = 0;
}

发送字符串:

复制代码
void UartSendString(char *str)
{
    while(*str)
    {
        UartSendByte(*str);
        str++;
    }
}

例如:

复制代码
UartSendString("Hello\r\n");

六、DS18B20温度传感器

1. DS18B20是什么

DS18B20是一种单总线温度传感器,可以用于采集温度数据。

  • 温度测量范围:-55℃~+125℃

  • 供电范围:3.0V~5.5V

  • 支持9~12 bit温度分辨率

  • 12 bit分辨率下,一次温度转换约需要750ms


2. DS18B20引脚

主要有三个引脚:

引脚 功能
GND 接单片机GND
DQ 数据通信
VCC 电源

DQ连接到单片机 P3.7


七、DS18B20通信时序

DS18B20采用单总线通信

通信过程中,数据线平时保持高电平。

1. 复位

主机首先将总线拉低:

复制代码
主机拉低 ≥ 480us
        ↓
DS18B20复位
        ↓
DS18B20返回响应脉冲

从机在规定时间内返回60~240us的低电平脉冲,表示响应主机复位。


2. 发送0

复制代码
拉低总线
    ↓
保持低电平60~120us
    ↓
表示发送0

3. 发送1

发送1时:

复制代码
先拉低
 ↓
至少1us
 ↓
快速拉高
 ↓
DS18B20采样高电平

八、DS18B20常用命令

DS18B20通信过程中需要发送一些命令。

1. 0xCC

复制代码
0xCC

功能:

跳过ROM。


2. 0x44

复制代码
0x44

功能:

启动温度转换。

资料中说明,在默认12 bit分辨率下,完成一次转换大约需要750ms。


3. 0xBE

复制代码
0xBE

功能:

读取DS18B20暂存器中的数据。

暂存器共有9个字节,读取温度时主要使用前两个字节。


九、DS18B20读取温度的完整流程

整个过程可以记成:

复制代码
发送复位
   ↓
发送 0xCC
   ↓
发送 0x44
   ↓
等待温度转换
   ↓
发送复位
   ↓
发送 0xCC
   ↓
发送 0xBE
   ↓
读取2个字节
   ↓
得到温度

完整流程是:

复制代码
1. 发送DS18B20复位信号
2. 发送0xCC
3. 发送0x44
4. 等待800ms
5. 再次发送复位信号
6. 发送0xCC
7. 发送0xBE
8. 读取2个字节
9. 第一个字节为LSB
10. 第二个字节为MSB

十、温度数据计算

DS18B20读取到两个字节:

复制代码
LSB
MSB

组成一个16位数据。

复制代码
温度 = 数值 × 0.0625

例如:

复制代码
读取数值 = 400

温度 = 400 × 0.0625
     = 25℃

十一、本节知识总结

本节主要学习了两个内容:

1. UART串口

重点记忆:

复制代码
UART
 ↓
TXD:发送
RXD:接收
GND:共地

以及:

复制代码
波特率
串行
异步
全双工

串口发送和接收都需要进行相应的初始化配置。

2. DS18B20

重点记忆:

复制代码
DS18B20
 ↓
单总线温度传感器
 ↓
复位
 ↓
0xCC
 ↓
0x44
 ↓
等待转换
 ↓
0xCC
 ↓
0xBE
 ↓
读取LSB、MSB
 ↓
计算温度

UART主要解决"单片机和外部设备怎么通信",DS18B20主要解决"单片机怎么通过单总线读取温度"。

相关推荐
新晨单片机设计2 小时前
S018A-基于STM32单片机脉搏计(光电对管)【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·proteus
HRTOS2 小时前
HRTOS Debug:8051实时操作系统资源状态监控与分析
单片机·嵌入式硬件·51单片机
崇山峻岭之间2 小时前
HC32F460PETB的PH2的EMB_IN4
单片机
youcans_2 小时前
【嵌入式软件AI编程】12. Claude Code的基本操作
stm32·单片机·ai编程·嵌入式软件·claude code
SilicoCode3 小时前
正点原子HAL库与江协科技标准库关于中断的对比解析
单片机·嵌入式硬件
Brilliantwxx3 小时前
【STM32】 从HAL库源码深度解析I2C(源码解析+面试题)
开发语言·stm32·单片机·嵌入式硬件·架构
H_oRIZoN_4 小时前
Linux入门DAY44 ARM 入门 Day02|ARM 汇编指令、模式切换、栈操作、汇编 C 混合编程
linux·单片机·嵌入式硬件·arm·linux应用编程
老当益壮梁奶奶14 小时前
51单片机DS18B20温度传感器详解:单总线时序与C51驱动实现
笔记·stm32·单片机·嵌入式硬件·51单片机
Horn Still Sounds14 小时前
ARM嵌入式基础|内核、寄存器、架构、存储、汇编移位全面梳理
arm开发·单片机·嵌入式硬件·硬件架构