文章目录
- 前言
- DS18B20
- [1. DS18B20 引脚说明](#1. DS18B20 引脚说明)
- [2. 单总线通信协议](#2. 单总线通信协议)
- [3. DS18B20 操作流程](#3. DS18B20 操作流程)
- [4. 示例代码](#4. 示例代码)
- [5. 代码说明](#5. 代码说明)
- [6. 注意事项](#6. 注意事项)
- 总结
前言
以上就是今天要讲的内容,本文简单介绍了IAP15F2K61S2中温度传感器模块DS18B20的使用。
DS18B20
DS18B20 是一款数字温度传感器 ,采用单总线(1-Wire)通信协议。它具有以下特点:
温度范围:-55°C 到 +125°C
精度:±0.5°C (-10°C 到 +85°C)
分辨率:9 到 12 位可调
单总线接口:仅需一根数据线即可通信
供电方式:支持寄生电源或外部电源
1. DS18B20 引脚说明
VDD:电源正极(3V 到 5.5V)
VCC:芯片外部供电
VDD:芯片内部供电
VSS:接地
GND:电源地
DQ:数据线(单总线)
2. 单总线通信协议
单总线通信协议包括以下步骤:
- 初始化:主机发送复位脉冲 ,DS18B20 回应存在脉冲。
- ROM 命令 :用于选择特定设备(如跳过 ROM 命令)。
- 功能命令 :用于配置传感器或读取数据 (如启动温度转换、读取温度)。
- 数据传输:主机读取或写入数据。
3. DS18B20 操作流程
初始化
- 主机拉低总线 至少 480µs。
- 主机释放总线 ,等待 DS18B20 回应存在脉冲(60µs 到 240µs)。
- 主机检测存在脉冲。
写操作
- 主机拉低总线至少 1µs。
- 主机发送 1 位数据 (拉低总线 15µs 表示写 0,拉低总线 1µs 后释放总线表示写 1)。
- 主机释放总线,等待至少 45µs。
读操作
- 主机拉低总线至少 1µs。
- 主机释放总线,等待 15µs。
- 主机读取总线状态(低电平表示 0,高电平表示 1)。
- 主机等待至少 45µs。
4. 示例代码
以下代码展示了如何在 IAP15F2K61S2 上使用 DS18B20。
c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P2^0; // DS18B20 数据线
void Delay(uint us) {
while (us--);
}
void DS18B20_Init() {
DQ = 1;
Delay(8);
DQ = 0;
Delay(80); // 拉低总线至少 480µs
DQ = 1;
Delay(14); // 等待 DS18B20 回应存在脉冲
while (DQ); // 等待 DS18B20 释放总线
Delay(20);
}
void DS18B20_WriteByte(uchar byte) {
uchar i;
for (i = 0; i < 8; i++) {
DQ = 0;
DQ = byte & 0x01;
Delay(5); // 保持至少 15µs
DQ = 1;
byte >>= 1;
}
}
uchar DS18B20_ReadByte() {
uchar i, byte = 0;
for (i = 0; i < 8; i++) {
DQ = 0;
byte >>= 1;
DQ = 1;
if (DQ) byte |= 0x80;
Delay(5); // 保持至少 45µs
}
return byte;
}
void DS18B20_Start() {
DS18B20_Init();
DS18B20_WriteByte(0xCC); // 跳过 ROM 命令
DS18B20_WriteByte(0x44); // 启动温度转换
}
float DS18B20_ReadTemp() {
uchar tempL, tempH;
int temp;
float temperature;
DS18B20_Init();
DS18B20_WriteByte(0xCC); // 跳过 ROM 命令
DS18B20_WriteByte(0xBE); // 读取温度命令
tempL = DS18B20_ReadByte(); // 读取温度低字节
tempH = DS18B20_ReadByte(); // 读取温度高字节
temp = (tempH << 8) | tempL; // 合并温度数据
temperature = temp * 0.0625; // 转换为实际温度值
return temperature;
}
void main() {
float temperature;
while (1) {
DS18B20_Start(); // 启动温度转换
Delay(100000); // 等待转换完成
temperature = DS18B20_ReadTemp(); // 读取温度
// 在此处添加显示或处理温度的代码
}
}
5. 代码说明
- DS18B20_Init():初始化 DS18B20。
- DS18B20_WriteByte():向 DS18B20 写入一个字节。
- DS18B20_ReadByte():从 DS18B20 读取一个字节。
- DS18B20_Start():启动温度转换。
- DS18B20_ReadTemp():读取温度并转换为实际温度值。
6. 注意事项
延时:确保延时准确 ,以满足单总线时序要求。
电源:如果使用寄生电源,需要在温度转换期间提供足够的上拉电流。
分辨率:DS18B20 的分辨率可以通过配置寄存器进行调整,默认分辨率为 12 位。
通过以上代码,你可以在 IAP15F2K61S2 上实现对 DS18B20 的温度读取操作。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了IAP15F2K61S2中温度传感器模块DS18B20的使用。