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

2024-01-29 15:04

本文主要是介绍STM32控制DS18B20温度传感器获取温度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间记录: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小于960usDQ_OUT=1;//拉高总线Delay_Us(20);Delay_Us(40);//拉高总线时间15~60usDQInMode();Delay_Us(40);//等待40us后接收数据,60-240us存在数据if(DQ_IN)ack=1;elseack=0;Delay_Us(140);//接收时间达到240us,等待DS18B20释放总线Delay_Us(300);//接收存在信号至少480usreturn 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/0if(cmd&0x01)//最低位为1,发送"1"DQ_OUT=1;elseDQ_OUT=0;Delay_Us(10);//到达开始采集电平时间Delay_Us(45);//保持电平稳定,等待DS18B20采集结束DQ_OUT=1;//释放总线Delay_Us(3);//两个写时隙之间时间至少有1uscmd>>=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);//拉低总线,至少1usDQ_OUT=1;//释放总线Delay_Us(5);//延时5us在时间中心读取数据DQInMode();if(DQ_IN){data|=0x80;}Delay_Us(60);//读时隙至少60usDQOutMode();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();//复位初始化DS18B20vDS18B20WriteOneByte(0xCC);//跳过ROM指令vDS18B20WriteOneByte(0x44);//温度转换指令Delay_Ms(100);//等待温度数据转换完毕xDS18B20Reset();//复位初始化DS18B20vDS18B20WriteOneByte(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

这篇关于STM32控制DS18B20温度传感器获取温度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657296

相关文章

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Spring Boot中获取IOC容器的多种方式

《SpringBoot中获取IOC容器的多种方式》本文主要介绍了SpringBoot中获取IOC容器的多种方式,包括直接注入、实现ApplicationContextAware接口、通过Spring... 目录1. 直接注入ApplicationContext2. 实现ApplicationContextA

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

基于Python实现温度单位转换器(新手版)

《基于Python实现温度单位转换器(新手版)》这篇文章主要为大家详细介绍了如何基于Python实现温度单位转换器,主要是将摄氏温度(C)和华氏温度(F)相互转换,下面小编就来和大家简单介绍一下吧... 目录为什么选择温度转换器作为第一个项目项目概述所需基础知识实现步骤详解1. 温度转换公式2. 用户输入处