一、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
-
发送数据
-
关注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
↓
计算温度