蓝桥杯篇---温度传感器 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的使用。

相关推荐
Zevalin爱灰灰15 分钟前
编程技巧(基于STM32)第一章 定时器实现非阻塞式程序——按键控制LED灯闪烁模式
stm32·单片机·嵌入式硬件
红花与香菇2____2 小时前
【学习笔记】Cadence电子设计全流程(二)原理图库的创建与设计(上)
笔记·嵌入式硬件·学习·pcb设计·cadence·pcb工艺
Jerry.yl2 小时前
关于 BK3633 上电时受串口 UART2 影响而无法启动的问题说明
嵌入式硬件·物联网·bk3633
苏慕TRYACE4 小时前
RT-Thread+STM32L475VET6实现红外遥控实验
stm32·单片机·嵌入式硬件·rt-thread
武乐乐~5 小时前
欢乐力扣:旋转图像
算法·leetcode·职场和发展
小幽余生不加糖5 小时前
deepseek帮我设计物理量采集单片机口保护电路方案
单片机·嵌入式硬件
Ronin-Lotus6 小时前
蓝桥杯篇---IAP15F2K61S2串口
单片机·嵌入式硬件·职场和发展·蓝桥杯·c·iap15f2k61s2
xiaohai@Linux6 小时前
ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
c语言·嵌入式硬件·tcp/ip·wifi·esp32
yyqzjw8 小时前
【STM32】外部时钟|红外反射光电开关
stm32·单片机·嵌入式硬件
charlie1145141918 小时前
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
c语言·stm32·单片机·嵌入式硬件·学习·教程