DS18B20温度传感器完整使用介绍(配合51单片机)

news2024/11/26 1:22:32

DS18B20是一款由Maxim Integrated(原Dallas Semiconductor)生产的数字温度传感器,以其高精度、低功耗、灵活的接口方式和易于使用的特性,在各种温度监测应用中被广泛采用。

以下是DS18B20的详细介绍:

基本特性

  1. 数字输出:DS18B20直接输出数字信号,与传统的模拟温度传感器相比,它简化了与微控制器的接口设计,减少了对模数转换器(ADC)的需求。

  2. 单总线接口:采用独特的单线(1-Wire)通信协议,仅需一根数据线即可完成与微控制器的双向通信,降低了硬件成本和复杂度。此外,多个DS18B20可以通过这条单线总线连接在一起,每个传感器都有一个唯一的64位序列号,使得系统能够识别并单独寻址每个传感器。

  3. 温度测量范围:DS18B20的测量范围广泛,从-55°C到+125°C(-67°F至+257°F),满足了大多数常规温度测量需求。

  4. 高精度与分辨率:在-10°C到+85°C范围内,其精度通常可达到±0.5°C;分辨率可在9位至12位之间调节,默认为12位,对应分辨率最高达0.0625°C。

  5. 低功耗:工作电压范围为3V至5.5V,静态电流极低,非常适合电池供电的应用。

  6. 多功能性:DS18B20支持多种工作模式,包括温度转换模式、读取温度模式、配置模式等,用户可以根据需要设置不同的工作参数。

  7. 封装形式多样:DS18B20提供了多种封装形式,如TO-92、SOP8、DIP8等,适应不同的安装需求,包括管道式、螺纹式、磁铁吸附式、不锈钢封装式等,适用于各种恶劣或狭小环境的温度测量。

应用场景

DS18B20因其灵活性和可靠性,被广泛应用于多种领域,包括但不限于:

  • 家用电器(如冰箱、空调温度监控)
  • 工业自动化(如设备温度监控、环境温度控制)
  • 农业(如温室大棚温度管理)
  • 数据中心和服务器机房的温度监测
  • 汽车电子(发动机温度监控)
  • 医疗设备温度监控
  • 水族箱和养鱼场的水温控制

使用方法

使用DS18B20通常需要遵循一定的通信协议,包括初始化、搜索传感器、读取或设置寄存器等步骤。在编程时,开发者需编写相应的代码来控制单总线的时序,或者利用已有的库函数(如Arduino、Raspberry Pi等平台上的库)来简化操作。通过简单的函数调用,即可读取到当前的温度值。

原理图

image-20240531153702317

image-20240531153622926image-20240531153636304

实验板上的DS18B20模块接在单片机的P3.7 IO口上,在插入DS18B20芯片时,圆弧朝上插入,具体效果可以看上面图片。

DS18B20的工作原理介绍

DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。

它的一个工作周期可分为两个部分,温度检测和数据处理。

DS18B20内部有三种形态的存储器:

(1) ROM只读存储器:用于存放 DS18B20ID 编码,其前 8 位是单线系列编码(DS18B20 的编码是19H),后面 48 位是芯片唯一的序列号,最后8位是以上56的位的 CRC 码(冗余校验),数据在芯片出厂时设置不可由用户更改。DS18B20 共 64 位 ROM(8+48+8)。

(2) RAM数据暂存器:用于内部计算和数据存取,数据在掉电后丢失,DS18B20 共 9 个字节 RAM,每个字节为 8 位。第 1、 2 个字节是温度转换后的数据值信息,第 3、 4 个字节是用户 EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第 5 个字节则是用户第 3 个 EEPROM的镜像。第 6、 7、 8 个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第 9 个字节为前 8 个字节的 CRC 码。

(3) EEPROM非易失性记忆体:用于存放长期需要保存的数据。比如: 上下限温度报警值和校验数据,DS18B20共有3个字节的EEPROM,并在 RAM 都存在镜像,以方便用户操作。

DS18B20默认工作在12位分辨率模式,转换后得到的12位数据,存储在DS18B20的两个8比特的RAM中(最前面的两个字节),二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。

数据提取也可以使用位运算,读取出来的数据是2个字节一共16位(H和L),最低4位是小数位,剩下的是整数位。如果读取的数据是负数,需要-1再取反即可得到真实数据。

例如:

int temp=0;
temp=DS18B20_ReadTemp(); //读取一次DS18B20采集的温度(返回H+L位)
if(temp<0) //如果温度是负数
{
    temp=temp-1;
    temp=~temp;
    printf("DS18b20=-%d.%d\r\n",temp>>4,temp&0xF);
}
else
{
printf("DS18b20=%d.%d\r\n",temp>>4,temp&0xF);
}

读取DS18B20温度示例代码(单只DS18B20情景)

下面代码演示了循环读取DS18B20温度的过程,在主函数里1秒的间隔读取一次温度。

在编写DS18B20时序代码时,要注意时间的把控。

当前实验板的环境:采用STC90C516RD单片机,晶振是12MHZ,工作在12T模式下,代码中执行一条i++语句大概消耗的时间是12us。 程序中的延时时间,都是通过该时间推算的,如果程序要移植到其他单片机上,要注意时间的问题。

(硬件平台说明:CPU是STC90C516RD、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

示例代码:

#include <reg51.h>
/*DS18B20硬件接口: P3.7*/
sbit DS18B20_GPIO=P3^7;
int DS18B20_ReadTemp(void);
/*
说明: 在12MHZ晶振下,12T模式下,i++消耗的时间差不多是12us
*/
/*
函数名称:u8 DS18B20_Init(void)
函数功能:向DS18B20发送复位脉冲,并检测应答信号
返 回 值:1表示失败,0表示成功
说明: 51单片机IO口默认输出高电平
*/
u8 DS18B20_ResetSignal(void)
{
    u8 i=0;
    //1. 发送复位信号
    DS18B20_GPIO=0;//将总线拉低480us
    i=50;   
    while(i--){}   //延时600us ,最少480us
    i=0;
    DS18B20_GPIO=1;//然后释放(拉高)总线,如果DS18B20做出反应会将在15us~60us后总线拉低
    //2. 等待DS18B20拉低总线
    while(DS18B20_GPIO)
    {
        i++;
        if(i>10)return 1;//失败 ,大概120us
    }
    //3. 等待DS18B20释放总线
    i=0;
    while(DS18B20_GPIO==0) //60us~240us
    {
        i++;
        if(i>20)return 1;//失败,大概240us
    }
    return 0;//初始化成功
}
/*
函数名称:u8 DS18B20_WriteByte(void)
函数功能:向DS18B20写入一个字节的数据
函数形参:写入的字节数据
*/
void DS18B20_WriteByte(u8 byte)
{
    u16 i=0,j=0;
    for(j=0;j<8;j++)
    {
        DS18B20_GPIO=0;//每写入一位数据之前先把总线拉低1us
        i++; //+1消耗的时间是12us
        DS18B20_GPIO=byte&0x01;//然后写入一个数据,从最低位开始
        i=6;
        while(i--){}//持续时间最少60us,这里大概72us
        DS18B20_GPIO=1;//然后释放总线
        byte>>=1;//继续发送
    }
}
/*
函数名称:u8 DS18B20_ReadByte(void)
函数功能:从DS18B20读取一个字节的数据
返 回 值:读到的数据
*/
u8 DS18B20_ReadByte(void)
{
    u8 byte=0;
    u16 i=0,j=0;    
    for(j=0;j<8;j++)
    {
        DS18B20_GPIO=0;//先将总线拉低1us
        i++;//+1消耗的时间是12us
        DS18B20_GPIO=1;//然后释放总线
        i++; 
        i++;//至少等待15us的时间,在读取数据
        byte>>=1; //先从低位开始接收数据
        if(DS18B20_GPIO)byte|=0x80;                   
        i=4; //读取完之后等待48us再接着读取下一个数据
        while(i--){}
    }               
    return byte;
}
/*
函数名称:u16 DS18B20_ReadTemp(void)
函数功能:读取一次DS18B20的温度数据
返 回 值:读取的温度值
注意: 返回值要使用有符号的数据类型,因为温度可以返回负数。
*/
int DS18B20_ReadTemp(void)
{
    int temp=0;//存放温度数据
    u8 TH,TL;
    //第一步: 启动温度转换
    DS18B20_ResetSignal(); //发送复位脉冲并检测应答信号
    DS18B20_WriteByte(0xcc);//跳过ROM操作命令      
    DS18B20_WriteByte(0x44);//温度转换命令
    
    //第二步: 读取温度
    DS18B20_ResetSignal();//发送复位脉冲并检测应答信号
    DS18B20_WriteByte(0xcc);//跳过ROM操作命令
    DS18B20_WriteByte(0xbe);//发送读取温度命令
    TL=DS18B20_ReadByte();//读取温度值共16位,先读低字节
    TH=DS18B20_ReadByte();//再读高字节
    temp=TH<<8|TL; //合并成16位
    return temp;
}
int main()
{
    int temp=0;
    UART_Init();        //初始化串口波特率为4800
    while(1)
    {
        temp=DS18B20_ReadTemp();
        if(temp<0) //如果温度是负数
        {
            temp=temp-1;
            temp=~temp;
            printf("DS18b20=-%d.%d\r\n",temp>>4,temp&0xF);
        }
        else
        {
            printf("DS18b20=%d.%d\r\n",temp>>4,temp&0xF);
        }
        DelayMs(1000);
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1833628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS in Depth2精译】1.1 层叠

CSS 本质上就是声明规则&#xff0c;并让这些特定的规则在各种情况下生效。一个类添加到某个元素上&#xff0c;则应用这个类包含的这一些样式&#xff1b;元素 X 是元素 Y 的一个子节点&#xff0c;则应用另一些样式。浏览器于是根据这些规则&#xff0c;判定所有样式生效的具…

数据结构-十大排序算法集合(四万字精讲集合)

前言 1&#xff0c;数据结构排序篇章是一个大的工程&#xff0c;这里是一个总结篇章&#xff0c;配备动图和过程详解&#xff0c;从难到易逐步解析。 2&#xff0c;这里我们详细分析几个具备教学意义和实际使用意义的排序&#xff1a; 冒泡排序&#xff0c;选择排序&#xff0c…

解决安全规模问题:MinIO 企业对象存储密钥管理服务器

在强大可靠的存储解决方案领域&#xff0c;MinIO 作为持久层脱颖而出&#xff0c;为组织提供安全、持久和可扩展的存储选项。MinIO 通常负责处理关键任务数据&#xff0c;在确保高可用性方面发挥着至关重要的作用&#xff0c;有时甚至在全球范围内。存储数据的性质&#xff0c;…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

《现代通信原理与技术》数字调制与解调(MSK调制)实验报告

摘 要&#xff1a; 本实验旨在研究数字调制中的最小频移键控&#xff08;MSK&#xff09;调制技术&#xff0c;并使用MATLAB软件对其进行模拟和实现。首先&#xff0c;我们介绍了MSK调制的原理和特点&#xff0c;以及其在数字通信系统中的应用。然后&#xff0c;我们使用MATLAB…

分布式光纤测温DTS使用的单模光纤与多模光纤有何区别?

分布式光纤测温DTS中使用的单模光纤和多模光纤之间存在着本质区别。单模光纤是一种在光纤通信中应用广泛的光纤类型&#xff0c;几乎所有的光纤入户和主干线通信都采用单模光纤。从通信的角度来看&#xff0c;单模光纤就好比一条单行道的高速铁路&#xff0c;而多模光纤则类似于…

微型操作系统内核源码详解系列五(2):cm3下栈的初始化

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

Flutter 实现软鼠标

文章目录 前言一、如何实现&#xff1f;1、记录鼠标偏移2、MouseRegion获取偏移3、Transform移动图标 二、完整代码三、使用示例总结 前言 flutter在嵌入式系统中运行时&#xff0c;有可能遇到drm鼠标无法使用的情况&#xff0c;但鼠标事件却可以正常接收&#xff0c;此时如果…

一季度直播6000场,同比增长60%,遥望科技透露重要信息

6月17日&#xff0c;经由深圳证券交易所许可&#xff0c;遥望科技&#xff08;股票代码&#xff1a;002291&#xff09;正式对《年报问询函》进行公开回复&#xff0c;就经营的多个维度做出解释和回应。 在回复中&#xff0c;遥望科技预测2024年毛利率为14.4%&#xff0c;相比…

MybatisPlus:高效便捷的Java持久层框架

一、MybatisPlus简介 MybatisPlus&#xff08;简称MP&#xff09;是一个流行的Java持久层框架&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生&#xff0c;旨在简化数据库操作和提高开发效率。MybatisPlus为开发者提供了一套方便的API和…

【Java开发规范】IDEA 设置 text file encoding 为 UTF-8,且文件的换行符使用 Unix 格式

1. IDEA 设置 text file encoding 为 UTF-8 file -> settings -> editor -> code style -> file encoding Transparent-native-to-asci conversion 要不要勾选&#xff1f;> 不推荐勾选&#xff08;它的作用是用来自动转换ASCII编码&#xff0c;防止文件乱码&am…

vue3的基本使用方法

【 vue3实例 】 【 0 】对象、方法和属性 对象&#xff08;Object&#xff09;&#xff1a; 对象是编程中的一个数据结构&#xff0c;它可以包含多种数据类型&#xff0c;包括数字、字符串、布尔值、数组、其他对象等。对象通常由一系列属性和方法组成。在面向对象编程&…

如何在纯内网环境下,将EasyCVR视频汇聚网关通过4G与第三方公网云平台级联?

EasyCVR视频汇聚网关是TSINGSEE青犀软硬一体的一款产品&#xff0c;可提供多协议的接入、音视频采集、处理&#xff0c;能实现海量前端设备的轻量化接入/转码/分发、视频直播、云端录像、云存储、检索回看、智能告警、平台级联等&#xff0c;兼容多种操作系统&#xff0c;轻松扩…

基于CentOS的全新Linux机器安装Jenkins并生成Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 一、安装Docker 在CentOS上&#xff0c;首先更新包管理工具并安装所需的包。 sudo yum update…

Python将字符串用特定字符分割并前面加序号

Python将字符串用特定字符分割并前面加序号 Python将字符串用特定字符分割并前面加序号&#xff0c;今天项目中就遇到&#xff0c;看着不难&#xff0c;得花点时间搞出来急用啊&#xff0c;在网上找了一圈&#xff0c;没发现有完整流程的文章。所以就搞出来并写了这个文章。仅…

02 - matlab m_map地学绘图工具基础函数 - m_proj

02 - matlab m_map地学绘图工具基础函数 - m_proj 0. 引言1. 查看所有投影方式3. 各投影方式绘图示例3.1 极射赤面投影法&#xff08;Stereographic &#xff09;3.2 Orthographic 正射投影示例3.3 Azimuthal Equal-area 方位等面积投影3.4 Azimuthal Equidistant 等距方位投影…

[C++][数据结构][哈希表]详细讲解

目录 1.哈希概念2.哈希冲突3.哈希函数4.哈希冲突解决5.闭散列1.何时扩容&#xff1f;如何扩容&#xff1f;2.线性探测3.二次探测 6.开散列(哈希桶)1.概念2.开散列增容3.开散列思考只能存储key为整形的元素&#xff0c;其他类型怎么解决&#xff1f;除留余数法&#xff0c;最好模…

新手如何入门Web3?

一、什么是Web3&#xff1f; Web3是指下一代互联网&#xff0c;它基于区块链技术&#xff0c;致力于将各种在线活动变得更加安全、透明和去中心化。Web3是一个广义的概念&#xff0c;涵盖了包括数字货币、去中心化应用、智能合约等在内的多个方面。它的主要特点包括去中心化、…

C++初学者指南第一步---5.介绍std::vector

C初学者指南第一步—5.介绍std::vector 目录 C初学者指南第一步---5.介绍std::vector1.初始化/访问2.添加元素3.Resizing调整大小4.在尾部删除元素5. 复制一直是深拷贝&#xff01; 注意std代表C标准库的命名空间&#xff0c;vector&#xff08;向量&#xff09;是标准库中的一…

Golang | Leetcode Golang题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; func findPeakElement(nums []int) int {n : len(nums)// 辅助函数&#xff0c;输入下标 i&#xff0c;返回 nums[i] 的值// 方便处理 nums[-1] 以及 nums[n] 的边界情况get : func(i int) int {if i -1 || i n {return math.MinInt64}re…