STM32控制DS18B20温度传感器获取温度

news2025/7/10 11:10:46

时间记录:2024/1/28

一、DS18B20温度传感器介绍

(1)测温范围-55℃~+125℃,在-10℃到+85℃范围内误差为±0.4
(2)返回的温度数据为16位二进制数据
(3)STM32和DS18B20通信使用单总线协议,仅通过一个端口即可进行通信
(4)具有掉电保护功能, DS18B20 内部含有 EEPROM ,通过配置寄存器可以设定数字转换精度和报警温度,在系统掉电以后,它仍可保存分辨率及报警温度的设定值
(5)每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值
(6)宽电压供电,电压2.5V~5.5V
(7)DS18B20返回的16位二进制数代表此刻探测的温度值,其高五位代表正负。如果高五位全部为1,则代表返回的温度值为负值。如果高五位全部为0,则代表返回的温度值为正值。后面的11位数据代表温度的绝对值,将其转换为十进制数值之后,再乘以0.0625(分辨率为12位时)即可获得此时的温度值

二、器件引脚图

DS18B20

三、DS18B20内部构成介绍

(1)64位ROM

1.存储独有的序列号,出厂前被光刻好的,每个DS18B20序列号均不相同,可以实现一根总线上挂接多个DS18B20的目的。

(2)高速暂存器

1.温度传感器,字节0保存温度低八位,字节1保存温度高八位;
2.温度上限和下限报警触发器,字节2高温触发器数据,字节3低温触发器数据;
3.配置寄存器,允许设置温度分辨率,9、10、11、12位,对应分辨率为0.5、0.25、0.125、0.0625℃。

(3)存储器

1.由一个高速RAM和一个可擦除的EEPROM组成,EEPROM存储着温度上下限和配置寄存器的数据。

四、时序介绍

(1)复位初始化,单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高总线),等待15-60us后DS18B20会拉低总线,在60-240us内保持低电平表示DS18B20应答,DS18B20拉低总线60-240us后会释放总线为高电平,复位脉冲产生释放总线开始到接收完应答信号时间至少480us。
复位初始化
复位初始化代码

static u8 xDS18B20Reset(void)
{
    u8 ack=1;
    DQOutMode();
    DQ_OUT=0;//拉低总线
    Delay_Us(500);//拉低总线时间大于480us小于960us
    DQ_OUT=1;//拉高总线
    Delay_Us(20);
    Delay_Us(40);//拉高总线时间15~60us
    DQInMode();
    Delay_Us(40);//等待40us后接收数据,60-240us存在数据
    if(DQ_IN)
        ack=1;
    else
        ack=0;
    Delay_Us(140);//接收时间达到240us,等待DS18B20释放总线
    Delay_Us(300);//接收存在信号至少480us
    return ack;
}

(2)写时序,单片机拉低总线至少1us,然后在15us内改变总线电平,然后DS18B20在15-60us的时间内采样,总线为“1”则向DS18B20写入“1”,总线为“0”则向DS18B20写入“0”,发送数据“0”时,拉低总线时间需要大于60us小于120us,然后释放总线(拉高总线)至少1us等待下一个数据的发送。
写时序
写1字节数据代码,低位先发

static void vDS18B20WriteOneByte(u8 cmd)
{
    DQOutMode();
    for(u8 i=0;i<8;i++){
        DQ_OUT=0;
        Delay_Us(5);//拉低总线至少1us,15us之内改变电平决定发送1/0
        if(cmd&0x01)//最低位为1,发送"1"
            DQ_OUT=1;
        else
            DQ_OUT=0;
        Delay_Us(10);//到达开始采集电平时间
        Delay_Us(45);//保持电平稳定,等待DS18B20采集结束
        DQ_OUT=1;//释放总线
        Delay_Us(3);//两个写时隙之间时间至少有1us
        cmd>>=1;
    }
}

(3)读时序,单片机拉低总线至少1us,然后释放总线,在15us之内读取DS18B20发送过来的数据,然后再保持45us,使读时序达到最小时间60us,然后拉高总线至少1us(恢复时间)准备读下一位数据。
读时序
读一字节数据代码,低位先读

static u8 xDS18B20ReadOneByte(void)
{
    u8 data=0;
    for(int i=0;i<8;i++){
        data>>=1;
        DQOutMode();
        DQ_OUT=0;
        Delay_Us(2);//拉低总线,至少1us
        DQ_OUT=1;//释放总线
        Delay_Us(5);//延时5us在时间中心读取数据
        DQInMode();
        if(DQ_IN){
            data|=0x80;
        }
        Delay_Us(60);//读时隙至少60us
        DQOutMode();
        DQ_OUT=1;
        Delay_Us(2);//拉高至少1us准备读取下一位数据
    }
    
    return data;
}

五、DS18B20命令介绍

(1)0xCC:跳过ROM
(2)0x44:温度转换指令
(3)0xBE:读暂存器指令
(4)0x33:读ROM
(5)0x55:匹配ROM,发送此命令后,发送64位的ROM编码进行匹配
(6)0xF0:搜索ROM
(7)0xEC:警报搜索

六、读取温度函数和其他代码

(1)读取温度函数

float xDS18B20ReadTemp(void)
{
    u8 TL,TH;
    float temp;

    xDS18B20Reset();//复位初始化DS18B20
    vDS18B20WriteOneByte(0xCC);//跳过ROM指令
    vDS18B20WriteOneByte(0x44);//温度转换指令
    Delay_Ms(100);//等待温度数据转换完毕
    xDS18B20Reset();//复位初始化DS18B20
    vDS18B20WriteOneByte(0xCC);//跳过ROM指令
    vDS18B20WriteOneByte(0xBE);//读取数据指令
    
    TL=xDS18B20ReadOneByte();
    TH=xDS18B20ReadOneByte();
    
    //转换温度数据
    temp=((TH << 8)|TL)*0.0625;
    return temp;
}

(2)其他代码
初始化

void vDS18B20Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    Delay_Init();
}

头文件

#ifndef __DS18B20_H__
#define __DS18B20_H__
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"

#define DQ_IN PAin(0)
#define DQ_OUT PAout(0)

#define DQOutMode() {GPIOA->CRL&=0xFFFFFFF0;GPIOA->CRL|=3<<0;}
#define DQInMode() {GPIOA->CRL&=0xFFFFFFF0;GPIOA->CRL|=8<<0;}

//初始化DS18B20
void vDS18B20Init(void);
//读取温度数据
float xDS18B20ReadTemp(void);

#endif

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

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

相关文章

算法模板 3.二分查找

二分查找 789. 数的范围 - AcWing题库 check函数&#xff08;lr&#xff08;这里要不要1&#xff09;&#xff09;>> 1 &#xff0c;要根据具体情况&#xff0c;如果是r mid的话lr就不用1&#xff0c;l mid的话就要1 #include <bits/stdc.h> using namespace s…

Android Retrofit添加header参数

前言 有些接口需要单独设置header参数 作为标记 如何灵活 或者统一设置请求header呢 注解Headers 顾名思义 Headers是指多个header 放在对象里 统一管理 //获取xxx Headers({"Content-Type: application/json","User-Agent: test"}) POST("xxxx&q…

小程序:类型三级分类

一、效果图片 二、代码 <template><view class"customPosition"><!-- header --><navBar :border"false" :hasBack"true" :title"titleName"></navBar><!-- 查询 --><view class"search…

JavaWeb之打包失败解决方案

情况描述&#xff1a; ---打包不成功 这时点击Maven中的蓝色小闪电&#xff1a; 小闪电的意思&#xff1a;是否跳过测试。点击选中就可以跳过&#xff0c;打包的时候就可以跳过测试代码。 再次打包后即可成功&#xff1a; 查看具体打包后的jar包&#xff1a; 打包后&#x…

openGaussdb5.0单点企业版部署_Centos7_x86

本文档环境&#xff1a;CentOS7.9 x86_64 4G1C40G python2.7.5 交互式初始化环境方式 介绍 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&#xff0c;结合企业级场景需求&#xff0c;持续…

Ubuntu远程连接登录信息解读(ubuntu登录信息、远程登录信息)

文章目录 1. Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-100-generic aarch64)2. 三个链接是官方提供的文档、管理工具和技术支持3. System information as of Thu 01 Feb 2024 03:30:45 PM HKT4. System load: 1.16&#xff1a;系统负载指数5. Processes: 1096系统正在运…

虹科技术|一文详解IO-Link Wireless技术如何影响工业无线自动化

导读&#xff1a;在工业无线自动化的飞速发展进程中&#xff0c;IO-Link Wireless技术成为了一项具有颠覆性的创新。它将IO-Link协议与无线连接完美结合&#xff0c;解决了传统通信技术在工业应用中的痛点。本文将深入解析IO-Link Wireless技术的原理、应用领域、优势以及实际案…

vue3集成video.js

就长这个样子&#xff0c;该有的功能都有了 首先安装 npm install video.js 然后创建一个vue文件 <template><div class"full" style"padding: 10px;overflow: auto;"><video :id"videoId" class"video-js"><…

LeetCode.1686. 石子游戏 VI

题目 题目链接 分析 本题采取贪心的策略 我们先假设只有两个石头a,b&#xff0c; 对于 Alice 价值分别为 a1,a2&#xff0c; 对于 Bob 价值而言价值分别是 b1,b2 第一种方案是 Alice取第一个&#xff0c;Bob 取第二个&#xff0c;Alice与Bob的价值差是 c1 a1 - b1&#xf…

Django模型(八)

一、修改数据 先获取对象,通过对象属性更新数据,再保存 (更新单一数据)通过QuerySet的update函数更新数据 (更新多条数据) #单条记录修改 save c = Cook.objects.get(pk=1) c.name = 安妮 c.save()# 更新多个值 update Cook.objects.filter(sect=粤菜).update(level=5)1.1、…

游戏APP开发:从创意到实现的全过程

随着智能手机的普及和移动互联网的发展&#xff0c;游戏APP市场日益繁荣。游戏APP开发已经成为一个热门行业&#xff0c;吸引了众多开发者和创业者的关注。本文将介绍游戏APP开发的全过程&#xff0c;包括创意、策划、设计、开发、测试和发布等环节。 一、创意 游戏APP开发的…

测试access和trunk口的区别(华为)

思科设备参考&#xff1a;测试access和trunk口的区别&#xff08;思科&#xff09; 一&#xff0c;实验目的 实现同一 Vlan 内的主机互通&#xff0c;不同 Vlan 间的主机隔离。 二&#xff0c;配置前测试 PC1分别ping PC2、PC3、PC4都能通&#xff0c;因为四台PC默认同处于v…

2024年美赛F题Problem F Reducing Illegal Wildlife Trade减少非法野生动物贸易的完整思路代码分享

非法的野生动物贸易会对我们的环境产生负面影响&#xff0c;并威胁到全球的生物多样性。据估计&#xff0c;它每年涉及高达265亿美元&#xff0c;被认为是全球第四大非法交易。[1]你将开发一个由数据驱动的5年项目&#xff0c;旨在显著减少非法野生动物贸易。你的目标是说服一个…

2024 美国大学生数学建模竞赛 美赛(D题)五大湖水资源调配问题 国际大学生数学建模竞赛| 建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍希望大家都能轻松建模呀&#xff0c;华数杯也会持续给大家放送思路滴~ 抓紧小秘籍&#xff0c;我们出发吧~ 完整内容可以在文章末尾领取&#xff01; 问题一&#xff1a;建立一个包括五大湖和连接从苏必利尔湖到大西洋的河流的…

软件工程(最简式总结)

目录 第一章:概述 1.软件危机的表现原因 2.常见的软件开发方法包括&#xff1a; 3.软件工程基本原则 4.软件工程三要素 5.设计模式的分类 6.针对变换型数据流设计步骤 7.针对事务型数据流设计步骤 第二章&#xff1a;软件过程 1.软件生命周期 2.软件过程模型 &…

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…

SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备&#xff08;例如硬盘&#xff09;是否可读写&#xff0c;但在Java中并没有直接针对硬件级别的磁盘探活API。然而&#xff0c;我们可以模拟一个场景&#xff0c;即检查某个目录或文件是否可以被Java程序正常读写&#xff0c;以此作为主盘活跃的一个…

OSPF 协议

OSPF 开放式最短路径优先协议 形容&#xff1a; 无类别链路状态协议&#xff1a; 无类别 ---- 存在掩码 IGP 内部网关协议 动态路由协议 一、链路状态协议(LS) OSPF 协议 隶属于 链路状态协议。 区别&#xff1a; 距离矢量协议(DV)&#xff1a;运行距离矢量协议的路由器…

2024数学建模美赛C题详细代码思路手把手教学

问题分析 问题围绕2023年温网男单决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉兹击败36岁的诺瓦克德约科维奇的比赛。德约科维奇自2013年以来首次在温布尔登输球&#xff0c;结束了他在大满贯赛事中的杰出表现。这场比赛被认为是一场精彩的较量&#xff0c;经历了多次势头…

备战蓝桥杯---数据结构与STL应用(进阶1)

让我们先来看一看map的基础应用吧&#xff1a; 下面是实现代码&#xff1a; #include<bits/stdc.h> using namespace std; typedef map<int,multiset<int> > line; map<int,multiset<int> >mx; map<int,multiset<int> >my; int n,m…