普中51单片机:DS18B20温度传感器操作指南(十三)
文章目录
- 引言
- 电路图
- 引脚讲解
- 初始化时序
- 写时序
- 读时序
- 温度变换
- 温度读取
- 完整代码
引言
DS18B20是一款单总线接口的数字温度传感器,仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解,关于DS18B20温度传感器的详细操作原理,可参考此博客:DS18B20数字温度传感器操作解析。
电路图
下图显示了DS18B20的电路连接。数据总线通过J14排针引出,并连接到所选的IO口。数据总线上需要一个上拉电阻以确保稳定的通信。
引脚讲解
DS18B20传感器通常采用TO-92封装或PDIP封装,具有以下三个主要引脚:
- VDD - 电源正极,为传感器提供工作电压。
- GND - 电源负极,接地。
- DQ - 数据引脚,用于与微控制器或计算机进行数据通信。
引脚详解
- VDD: 连接到传感器的工作电压,通常为3.3V或5V。确保不要超过传感器的最大工作电压,以避免损坏。
- GND: 连接到电路的地线,确保传感器的稳定工作。
- DQ: 是一个开漏输出引脚,需要通过上拉电阻连接到VDD。这个引脚负责与主控制器进行通信,支持1-Wire通信协议。
初始化时序
初始化过程从主机发送复位脉冲开始。主机将总线拉低至少480微秒(us),通常是500us,以确保所有从设备都能检测到复位信号。复位脉冲后,总线需保持高电平15-60微秒,等待从设备响应。
从设备通过发送存在脉冲来响应,表示它们已经检测到复位信号,并将总线拉低60-240微秒。表明它已检测到复位信号。之后将电平拉高。
sbit DS18B20_DQ = P3^7;unsigned char DS18B20_Init()
{unsigned char i;unsigned char ackBit;DS18B20_DQ = 1;DS18B20_DQ = 0;i = 247;while (--i); //延时500usDS18B20_DQ = 1;i = 32;while (--i);ackBit = DS18B20_DQ;i = 247;while (--i); //延时500usreturn ackBit;
}
写时序
写时序包括主机发送数据位“0”或“1”到从设备。每个位的写入时序稍有不同。每次写入一个数据位都需要初始化一个写周期。主机将总线拉低至少1微秒(通常是1-15微秒),然后释放总线,这是初始化写周期。
写0时序:
- 主机将总线拉低至少60微秒(通常是60-120微秒),然后释放总线。
写1时序:
- 主机将总线拉低至少1微秒(通常是1-15微秒),然后在剩余时间内保持高电平(释放总线)。
写入一个字节(8位)需要重复上述写0和写1时序八次。写入顺序为低位在前(LSB first)。
- 开始写入字节:初始化第一个写周期。
- 写入每个位:根据数据位的值,执行写0或写1时序。
- 结束写入字节:完成8个位的写入后,字节写入结束。
假设我们要写入字节0x5A(01011010)。
- 写入0位:主机将总线拉低至少60微秒,释放总线。
- 写入1位:主机将总线拉低至少1微秒,释放总线。
- 写入0位:重复写0时序。
- 写入1位:重复写1时序。
- 写入1位:重复写1时序。
- 写入0位:重复写0时序。
- 写入1位:重复写1时序。
- 写入0位:重复写0时序。
//发送一位
void ds18b20_write_bit(unsigned char bits)
{ unsigned char i;DS18B20_DQ = 0;i = 4;while (--i); //延时10usDS18B20_DQ = bits;i = 24;while (--i); //延时50usDS18B20_DQ = 1;
}//发送字节
void ds18b20_write_byte(unsigned char byte)
{unsigned char i;for(i = 0;i<8;i++){ds18b20_write_bit(byte & 0x01<<i);//先发送低位}
}
读时序
每次读取一个数据位都需要初始化一个读周期。初始化读周期期间需要主机将总线拉低至少1微秒(通常是1-15微秒),然后释放总线。之后读取数据位,主机在读周期内读取从设备发送的数据位。需要主机将总线拉低至少1微秒(通常是1-15微秒)。然后释放总线,主机释放总线,并在15微秒内读取总线状态。读取数据位期间如果总线保持低电平,读取到的数据位为0;如果总线拉高,读取到的数据位为1。要读取一个字节(8位),需要重复上述读取数据位的过程八次,按低位在前(LSB first)的顺序读取。
假设我们要读取一个字节的数据,具体步骤如下:
- 初始化读周期:主机将总线拉低至少1微秒,然后释放总线。
- 读取每个位:在读周期内,主机读取从设备发送的每个位数据。
- 完成字节读取:重复上述步骤八次,读取一个完整的字节。
//接收一位
unsigned char ds18b20_read_bit()
{ unsigned char i;unsigned char bits;DS18B20_DQ = 0;i = 2;while (--i); //延时5usDS18B20_DQ = 1;i = 2;while (--i); //延时5usbits = DS18B20_DQ;i = 24;while (--i); //延时50usreturn bits;
}unsigned char ds18b20_read_byte()
{unsigned char i;unsigned char byte = 0x00;for(i = 0;i<8;i++){if(ds18b20_read_bit()){byte |= 0x01<<i; }}return byte;
}
温度变换
DS18B20温度传感器的温度转换功能允许用户读取精确的温度数据。为了实现温度转换,必须遵循特定的时序和命令流程。
温度转换流程包括以下几个主要步骤:
- 发送初始化命令:主机需要发送初始化命令来复位总线并检测从设备的存在。
- 跳过ROM命令:向总线上的所有设备广播命令。所有设备都会响应接下来的命令。
- 发送启动温度转换命令:0x44用于启动温度转换(Convert T)
//转换温度
void ds18b20_ConvertT()
{DS18B20_Init();ds18b20_write_byte(0xCC);ds18b20_write_byte(0x44);
}
温度读取
读取DS18B20温度传感器的数据是一个包括命令发送和数据处理的过程。
温度读取过程包括以下几个主要步骤:
- 发送初始化命令:主机需要发送初始化命令来复位总线并检测从设备的存在。
- 跳过ROM命令:向总线上的所有设备广播命令。所有设备都会响应接下来的命令。
- 发送读暂存器命令:用于从DS18B20传感器的暂存器中读取温度数据、报警阈值和配置寄存器信息。
先读取低位,后读取高位,温度数据是16位带符号的二进制数,最低位代表 2 − 4 2^{-4} 2−4摄氏度(即0.0625摄氏度)
//读取温度
float ds18b20_ReadT()
{unsigned char byteL;unsigned char byteH;int temp;float T;DS18B20_Init();ds18b20_write_byte(0xCC);ds18b20_write_byte(0xBE);byteL = ds18b20_read_byte();//低字节byteH = ds18b20_read_byte();//高字节temp = (byteH << 8) | byteL;T = temp / 16.0;return T;
}
完整代码
LCD1602液晶显示屏实时获取温度变化
#include <REGX52.H>
#include <LCD1602.H>
#include "stdio.h"
sbit DS18B20_DQ = P3^7;unsigned char DS18B20_Init()
{unsigned char i;unsigned char ackBit;DS18B20_DQ = 1;DS18B20_DQ = 0;i = 247;while (--i); //延时500usDS18B20_DQ = 1;i = 32;while (--i);ackBit = DS18B20_DQ;i = 247;while (--i); //延时500usreturn ackBit;
}//发送一位
void ds18b20_write_bit(unsigned char bits)
{ unsigned char i;DS18B20_DQ = 0;i = 4;while (--i); //延时10usDS18B20_DQ = bits;i = 24;while (--i); //延时50usDS18B20_DQ = 1;
}//接收一位
unsigned char ds18b20_read_bit()
{ unsigned char i;unsigned char bits;DS18B20_DQ = 0;i = 2;while (--i); //延时5usDS18B20_DQ = 1;i = 2;while (--i); //延时5usbits = DS18B20_DQ;i = 24;while (--i); //延时50usreturn bits;
}//发送字节
void ds18b20_write_byte(unsigned char byte)
{unsigned char i;for(i = 0;i<8;i++){ds18b20_write_bit(byte & 0x01<<i);//先发送低位}
}unsigned char ds18b20_read_byte()
{unsigned char i;unsigned char byte = 0x00;for(i = 0;i<8;i++){if(ds18b20_read_bit()){byte |= 0x01<<i; }}return byte;
}//转换温度
void ds18b20_ConvertT()
{DS18B20_Init();ds18b20_write_byte(0xCC);ds18b20_write_byte(0x44);
}//读取温度
float ds18b20_ReadT()
{unsigned char byteL;unsigned char byteH;int temp;float T;DS18B20_Init();ds18b20_write_byte(0xCC);ds18b20_write_byte(0xBE);byteL = ds18b20_read_byte();//低字节byteH = ds18b20_read_byte();//高字节temp = (byteH << 8) | byteL;T = temp / 16.0;return T;
}unsigned char ack = 1;float g_T;void main()
{char temp_buff[50];LCD_Init();LCD_ShowString(1,1,"helloworld");ack = DS18B20_Init();LCD_ShowNum(2,1,ack,3);while(1){ds18b20_ConvertT();g_T = ds18b20_ReadT();if(g_T<0){//负数LCD_ShowChar(2,1,'-');g_T = -g_T;}else{LCD_ShowChar(2,1,'+');}// 使用 sprintf 将浮点数转换为字符串sprintf(temp_buff, "%.3f", g_T);LCD_ShowString(2,2,temp_buff);}
}
相关文章:

普中51单片机:DS18B20温度传感器操作指南(十三)
文章目录 引言电路图引脚讲解初始化时序写时序读时序温度变换温度读取完整代码 引言 DS18B20是一款单总线接口的数字温度传感器,仅需一个IO口即可实现数据通信。这里只对如何简单操作开发板的DS1802进行讲解,关于DS18B20温度传感器的详细操作原理&#…...

【网络】网络的发展历程及其相关概念
1.什么是网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的,在通信软件的支持下,实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物,两者的迅速发展渗透形…...

鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发
文章目录 一、如何安装 ohpm-cli二、如何安装三方库1、在 oh-package.json5 文件中声明三方库,以 ohos/crypto-js 为例:2、安装指定名称 pacakge_name 的三方库,执行以下命令,将自动在当前目录下的 oh-package.json5 文件中自动添…...
C++的标准模板库简单介绍
C的标准模板库(STL, Standard Template Library)是一个强大的工具,旨在提供高效和灵活的数据结构和算法。STL的设计目的是使C程序更加通用和可重用。以下是对STL的详细介绍: 1. STL的组成部分 STL主要由以下几部分组成ÿ…...

安卓常用控件ListView
文章目录 ListView的常用属性ListView的常用APIListView的简单使用 ListView是一个列表样式的 ViewGroup,将若干 item 按行排列。它是一个很基本的控件也是 Android 中最重要的控件之一。它可以实现多个 View 的垂直排列并支持滚动显示效果。 ListView的常用属性 常…...

优秀的行为验证码的应用场景与行业案例
应用场景 登录注册 : 验证码适用于App、Web及小程序等用户注册场景,可以抵御自动机恶意注册,垃圾注册、抵御撞库登录、暴力破解、验证账号敏感信息的修改,同时可以有效阻止撞库攻击,从源头进行防护,保障正…...

《程序猿入职必会(10) · SpringBoot3 整合 MyBatis-Plus》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...

计算机网络408考研 2018
1 计算机网络408考研2018年真题解析_哔哩哔哩_bilibili...

(亲测有效)SpringBoot+Vue项目云服务器部署(宝塔)
目录 一、准备工作 1、购买云服务器 2、获取面板地址 二、jdk和数据库 1、安装环境 2、安装Java环境jdk 3、添加数据库 三、前端部署 1、修改后台服务所在源 2、vue build 2、创建站点 四、后端部署 1、修改application.yml 2、idea打包 3、运行jar包 方式一&a…...

健康管理系统
目录 第1章 系统概述 第2章 可行性研究 2.1 项目背景及意义 2.2 可行性研究 第3章 需求分析 3.1 功能性需求 3.2 非功能性需求 3.2.1 性能需求 第4章 总体设计 4.1 技术架构 4.2功能模块设计 第5章 详细设计 5.1 主页 5.2 写剧本杀 5.3 剧本杀分类管理 5.4 个人…...

【计算机网络】网络基础概念
计算机网络发展 独立模式:最开始计算机之间相互独立,每个终端各自持有数据。 网络互联:多台计算机连接在一起,完成数据共享。 局域网 LAN:计算机数量增多,通过交换机和路由器连接在一起。 广域网 WAN: 将远…...

深入理解Spring的三级缓存机制
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...

LSTM长短时记忆网络【数学+图解】
文章目录 1、简介2、门控机制3、LSTM3.1、概念3.2、公式⭐3.3、特点 4、图解LSTM⭐4.1、RNN4.2、时间链条4.3、记忆单元🔺4.4、LSTM 5、LSTM与GRU的对比6、应用7、训练技巧 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博…...

Linux-入门-02
上节我们讲了如何安装虚拟机,本节课讲一些linux的常用命令,首先我们需要做一些配置,我们的centos的镜像是最小版安装,里面什么也没有,所以我们的linux是不能进行联网的,接下来我们就来一步一步联网 1、配置网络 首先我们需要先使用命令查看ip地址,linux中一切皆文件,只能使用命…...

Animate软件基本概念:基本形状、绘制对象及位图
这一篇讲Animate软件中的基本形状、绘制对象及位图三个概念。 FlashASer:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer:实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&…...

Shell定时上传日志到HDFS
Shell定时上传日志到HDFS 一、任务需求二、实现思路三、具体实现流程3.1 规划文件上传目录3.2 开发 shell 脚本3.3 授予 shell 可执行权限3.4 手动执行查看3.4 定时执行 shell 脚本 一、任务需求 公司在线服务器每天都会产生网站运行日志,为了避免志文件过大&#…...

前端day3-表格
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>day3-表格</title> </head> <body&g…...
多进程系列:一个进程对应一个函数
多进程系列:一个进程对应一个函数 这里展示创建两个进程,一个进程用于执行分类模型,另外一个进程用于执行分割模型,以及获取结果的示例。 import multiprocessing import time def classify_data(data):# 这里放置分类任务的代…...
数据清洗与预处理:确保数据质量的关键步骤
数据清洗与预处理:确保数据质量的关键步骤 引言 在大数据时代,数据已成为企业最宝贵的资产。然而,数据的质量直接影响到分析结果和决策的准确性。数据清洗与预处理是确保数据质量的关键步骤,它们包括识别和处理数据中的错误、缺…...

《PostgreSQL 数据库在国内的发展前景》
从DB-engines这张2024年8月的最新排名图上可以看出,PostgreSQL数据库的发展趋势还是非常好的,在国内,PostgreSQL数据库也展现出令人振奋的发展前景,非常明显的一种表现就是腾讯云、人大金仓、阿里云、华为等众多厂商都有基于Postg…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...