蓝桥杯篇---温度传感器 DS18B20


文章目录

  • 前言
  • 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. 单总线通信协议

单总线通信协议包括以下步骤:

  1. 初始化:主机发送复位脉冲 ,DS18B20 回应存在脉冲。
  2. ROM 命令 :用于选择特定设备(如跳过 ROM 命令)。
  3. 功能命令 :用于配置传感器或读取数据 (如启动温度转换、读取温度)。
  4. 数据传输:主机读取或写入数据。

3. DS18B20 操作流程

初始化

  1. 主机拉低总线 至少 480µs。
  2. 主机释放总线 ,等待 DS18B20 回应存在脉冲(60µs 到 240µs)。
  3. 主机检测存在脉冲。

写操作

  1. 主机拉低总线至少 1µs。
  2. 主机发送 1 位数据 (拉低总线 15µs 表示写 0,拉低总线 1µs 后释放总线表示写 1)。
  3. 主机释放总线,等待至少 45µs。

读操作

  1. 主机拉低总线至少 1µs。
  2. 主机释放总线,等待 15µs。
  3. 主机读取总线状态(低电平表示 0,高电平表示 1)。
  4. 主机等待至少 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. 代码说明

  1. DS18B20_Init():初始化 DS18B20。
  2. DS18B20_WriteByte():向 DS18B20 写入一个字节。
  3. DS18B20_ReadByte():从 DS18B20 读取一个字节。
  4. DS18B20_Start():启动温度转换。
  5. DS18B20_ReadTemp():读取温度并转换为实际温度值。

6. 注意事项

延时:确保延时准确 ,以满足单总线时序要求。

电源:如果使用寄生电源,需要在温度转换期间提供足够的上拉电流。

分辨率:DS18B20 的分辨率可以通过配置寄存器进行调整,默认分辨率为 12 位。

通过以上代码,你可以在 IAP15F2K61S2 上实现对 DS18B20 的温度读取操作。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了IAP15F2K61S2中温度传感器模块DS18B20的使用。

相关推荐
Nil20810 小时前
leetcode 763划分字母区间
算法·leetcode·职场和发展
不会就选b11 小时前
算法日常・每日刷题--<动态规划>19
算法·leetcode·职场和发展
考研保研资料分享12 小时前
新闻传播保研经验:中传预推免面试、广告学代表作与实习准备(2025)
面试·职场和发展
夏幻灵14 小时前
每日一题:LeetCode 165:比较版本号
算法·leetcode·职场和发展
创界工坊工作室15 小时前
22-基于STM32的汽车防盗系统设计
stm32·单片机·嵌入式硬件·proteus
书生执笔画浮沉15 小时前
分享一个开源小工具CAdapt
linux·c·gnu·glibc·kernel·升级·灵感
雨田言炎17 小时前
STM32之RCC系统时钟控制(芯片的心脏控制器)
stm32·单片机·嵌入式硬件
李永奉17 小时前
日常使用的锂电池上,新、旧锂电池的差异分析
单片机·嵌入式硬件·物联网·智能手机·电脑
额额额对了17 小时前
IMX6ULL 杂项设备 LED 驱动
stm32·单片机·嵌入式硬件
长春的KAKA19 小时前
Proxmark3 Iceman分支CLI命令总表
嵌入式硬件