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

embedded/2025/2/22 19:01:52/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • 前言
  • DS18B20
  • 1. DS18B20 引脚说明
  • 2. 单总线通信协议
  • 3. DS18B20 操作流程
    • 初始化
    • 写操作
    • 读操作
  • 4. 示例代码
  • 5. 代码说明
  • 6. 注意事项
  • 总结


前言

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


DS18B20_15">DS18B20

DS18B20 是一款数字温度传感器c;采用单总线(1-Wire)通信协议。它具有以下特点:
温度范围:
-55°C 到 +125°C

精度:±0.5°C(-10°C 到 +85°C)
分辨率:9 到 12 位可调
单总线接口:仅需一根数据线即可通信
供电方式:支持寄生电源或外部电源

DS18B20__23">1. DS18B20 引脚说明

VDD:电源正极(3V 到 5.5V)

ckquote>

VCC:芯片外部供电
VDD:芯片内部供电
VSS:接地

ckquote>

GND:电源地
DQ:数据线(单总线)

2. 单总线通信协议

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

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

DS18B20__40">3. DS18B20 操作流程

初始化

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

写操作

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

读操作

  1. 主机拉低总线至少 1µs
  2. 主机释放总线࿰c;等待 15µs
  3. 主机读取总线状态(低电平表示 0࿰c;高电平表示 1)
  4. 主机等待至少 45µs。

4. 示例代码

以下代码展示了如何在 IAP15F2K61S2 上使用 DS18B20

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><reg52.h>class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">uchar class="token expression">class="token keyword">unsigned class="token keyword">char
class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">uint class="token expression">class="token keyword">unsigned class="token keyword">intsbit DQ class="token operator">= P2class="token operator">^class="token number">0class="token punctuation">;  class="token comment">// DS18B20 数据线class="token keyword">void class="token function">Delayclass="token punctuation">(uint usclass="token punctuation">) class="token punctuation">{class="token keyword">while class="token punctuation">(usclass="token operator">--class="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">DS18B20_Initclass="token punctuation">(class="token punctuation">) class="token punctuation">{DQ class="token operator">= class="token number">1class="token punctuation">;class="token function">Delayclass="token punctuation">(class="token number">8class="token punctuation">)class="token punctuation">;DQ class="token operator">= class="token number">0class="token punctuation">;class="token function">Delayclass="token punctuation">(class="token number">80class="token punctuation">)class="token punctuation">;  class="token comment">// 拉低总线至少 480µsDQ class="token operator">= class="token number">1class="token punctuation">;class="token function">Delayclass="token punctuation">(class="token number">14class="token punctuation">)class="token punctuation">;  class="token comment">// 等待 DS18B20 回应存在脉冲class="token keyword">while class="token punctuation">(DQclass="token punctuation">)class="token punctuation">; class="token comment">// 等待 DS18B20 释放总线class="token function">Delayclass="token punctuation">(class="token number">20class="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">DS18B20_WriteByteclass="token punctuation">(uchar byteclass="token punctuation">) class="token punctuation">{uchar iclass="token punctuation">;class="token keyword">for class="token punctuation">(i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">8class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{DQ class="token operator">= class="token number">0class="token punctuation">;DQ class="token operator">= byte class="token operator">& class="token number">0x01class="token punctuation">;class="token function">Delayclass="token punctuation">(class="token number">5class="token punctuation">)class="token punctuation">;  class="token comment">// 保持至少 15µsDQ class="token operator">= class="token number">1class="token punctuation">;byte class="token operator">>>= class="token number">1class="token punctuation">;class="token punctuation">}
class="token punctuation">}uchar class="token function">DS18B20_ReadByteclass="token punctuation">(class="token punctuation">) class="token punctuation">{uchar iclass="token punctuation">, byte class="token operator">= class="token number">0class="token punctuation">;class="token keyword">for class="token punctuation">(i class="token operator">= class="token number">0class="token punctuation">; i class="token operator">< class="token number">8class="token punctuation">; iclass="token operator">++class="token punctuation">) class="token punctuation">{DQ class="token operator">= class="token number">0class="token punctuation">;byte class="token operator">>>= class="token number">1class="token punctuation">;DQ class="token operator">= class="token number">1class="token punctuation">;class="token keyword">if class="token punctuation">(DQclass="token punctuation">) byte class="token operator">|= class="token number">0x80class="token punctuation">;class="token function">Delayclass="token punctuation">(class="token number">5class="token punctuation">)class="token punctuation">;  class="token comment">// 保持至少 45µsclass="token punctuation">}class="token keyword">return byteclass="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">DS18B20_Startclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token function">DS18B20_Initclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token function">DS18B20_WriteByteclass="token punctuation">(class="token number">0xCCclass="token punctuation">)class="token punctuation">;  class="token comment">// 跳过 ROM 命令class="token function">DS18B20_WriteByteclass="token punctuation">(class="token number">0x44class="token punctuation">)class="token punctuation">;  class="token comment">// 启动温度转换
class="token punctuation">}class="token keyword">float class="token function">DS18B20_ReadTempclass="token punctuation">(class="token punctuation">) class="token punctuation">{uchar tempLclass="token punctuation">, tempHclass="token punctuation">;class="token keyword">int tempclass="token punctuation">;class="token keyword">float temperatureclass="token punctuation">;class="token function">DS18B20_Initclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token function">DS18B20_WriteByteclass="token punctuation">(class="token number">0xCCclass="token punctuation">)class="token punctuation">;  class="token comment">// 跳过 ROM 命令class="token function">DS18B20_WriteByteclass="token punctuation">(class="token number">0xBEclass="token punctuation">)class="token punctuation">;  class="token comment">// 读取温度命令tempL class="token operator">= class="token function">DS18B20_ReadByteclass="token punctuation">(class="token punctuation">)class="token punctuation">;  class="token comment">// 读取温度低字节tempH class="token operator">= class="token function">DS18B20_ReadByteclass="token punctuation">(class="token punctuation">)class="token punctuation">;  class="token comment">// 读取温度高字节temp class="token operator">= class="token punctuation">(tempH class="token operator"><< class="token number">8class="token punctuation">) class="token operator">| tempLclass="token punctuation">;  class="token comment">// 合并温度数据temperature class="token operator">= temp class="token operator">* class="token number">0.0625class="token punctuation">;  class="token comment">// 转换为实际温度值class="token keyword">return temperatureclass="token punctuation">;
class="token punctuation">}class="token keyword">void class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token keyword">float temperatureclass="token punctuation">;class="token keyword">while class="token punctuation">(class="token number">1class="token punctuation">) class="token punctuation">{class="token function">DS18B20_Startclass="token punctuation">(class="token punctuation">)class="token punctuation">;  class="token comment">// 启动温度转换class="token function">Delayclass="token punctuation">(class="token number">100000class="token punctuation">)class="token punctuation">;    class="token comment">// 等待转换完成temperature class="token operator">= class="token function">DS18B20_ReadTempclass="token punctuation">(class="token punctuation">)class="token punctuation">;  class="token comment">// 读取温度class="token comment">// 在此处添加显示或处理温度的代码class="token punctuation">}
class="token punctuation">}
code>

5. 代码说明

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

6. 注意事项

延时:确保延时准确c;以满足单总线时序要求。
电源:如果使用寄生电源࿰c;需要在温度转换期间提供足够的上拉电流。
分辨率:DS18B20 的分辨率可以通过配置寄存器进行调整࿰c;默认分辨率为 12 位。

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


总结

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


http://www.ppmy.cn/embedded/162284.html

相关文章

洛谷题目: P2398 GCD SUM 题解 (本题较难,省选-难度)

题目传送门&#xff1a; P2398 GCD SUM - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言&#xff1a; 本题涉及到 欧拉函数&#xff0c;素数判断&#xff0c;质数&#xff0c;筛法 &#xff0c;三大知识点&#xff0c;相对来说还是比较难的。 本题要求我们计算 …

React 低代码项目:组件设计

React 低代码项目&#xff1a;组件设计 Date: February 6, 2025 React表单组件 **目标&#xff1a;**使用 Ant Design 表单组件&#xff0c;开发登录、注册、搜索功能 内容&#xff1a; 使用 React 表单组件、受控组件使用 Ant Design 表单组件使用 表单组件的校验和错误提…

第12周:LSTM(火灾温度)

1.库以及数据的导入 1.1库的导入 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn1.2数据集的导入 data pd.read_csv("woodpine2.csv")dataTimeTem1CO 1Soot 100.00025.00.0000000.00000010.22825.…

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题

20250211解决荣品的RK3566核心板在Android13下出现charge_extrem_low_power的问题 2025/2/11 17:45 缘起&#xff1a;荣品的RK3566核心板在Android13下&#xff0c;出现charge_extrem_low_power之后就直接挂住了。 由于我司使用了CW2217这个电量计&#xff0c;没有使用核心板自…

React 中级教程

1. useState 与 setState 深入理解 import React, { useState } from react;const Counter = () => {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1); // setState 会异步更新};return (<div><p>Count: {count}</…

Go 语言调用 SiliconFlow 的 Deepseek AI Janus-Pro-7B 模型进行图像生成

使用 Go 调用 SiliconFlow 图像生成 API 概述 本文档介绍如何使用 Go 语言调用 SiliconFlow 的 Deepseek AI Janus-Pro-7B 模型进行图像生成。 环境准备 Go 1.20 或更高版本网络连接SiliconFlow API 令牌 依赖管理 在项目根目录创建 go.mod 文件&#xff1a; go mod ini…

Docker compose 以及镜像使用

Docker compose 以及镜像使用 高级配置 使用 Docker Compose Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。以下是一个 docker-compose.yml 示例&#xff1a; version: 3 services:web:image: my-appbuild: .ports:- "8000:8000"volumes:- …

docker pull 报错Get “https://registry-1.docker.io/v2/“: net/http: request canceled while waiting for c

报错 &#xff1a;Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 解决方法 配置加速地址 vim /etc/docker/daemon.json 添加以下内容 {"registry-…