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小于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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下安装Nginx及配置SSL证书

安装 Nginx nginx 的一些模块需要依赖一些 lib 库&#xff0c;在安装 nginx 之前&#xff0c;须先安装这些 lib 库&#xff0c;比如常见依赖库主要有g、gcc、openssl-devel、pcre-devel和zlib-devel 所以执行如下命令安装&#xff1a; $ yum install gcc-c pcre pcre-devel z…

node后端服务框架

前言&#xff1a; 随着互联网的快速发展&#xff0c;Web 开发已成为当今计算机领域中非常重要的一部分。 Node.js 的出现为前端开发者提供了一个全新的方向&#xff0c;使得他们可以同时涉足前端和后端开发。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff…

批量导出域控用户及其所在OU和组

在Windows域环境中&#xff0c;批量导出域控用户及其所在OU&#xff08;组织单位&#xff09;和组成员身份信息&#xff0c;可以使用PowerShell脚本实现。以下是一个基本的示例脚本&#xff1a; Import-Module ActiveDirectory# 遍历所有用户 Get-ADUser -Filter * -Propertie…

数组奇缘:林浩然与杨凌芸的Java编程冒险记

数组奇缘&#xff1a;林浩然与杨凌芸的Java编程冒险记 Array Odyssey: The Java Programming Adventure of Lin Haoran and Yang Lingyun 在Java编程的广阔天地中&#xff0c;林浩然和杨凌芸的故事如同一段奇妙而生动的冒险传奇。林浩然&#xff0c;一个对代码充满热情、逻辑严…

python16-Python的字符串之转义字符

.前面已经提到&#xff0c;在字符串中可以使用反斜线进行转义;如果字符串本身包含反斜线&#xff0c;则需要使用“”表示&#xff0c;“W”就是转义字符。Python当然不会只支持这么几个转义字符&#xff0c;Python支持的转义字符如下表 掌握了上面的转义字符之后&#xff0c;下…

互斥锁/读写锁的概念及使用、死锁的避免

互斥锁的概念和使用 线程通信-互斥 临界资源&#xff1a;一次只允许一个任务(进程、线程)访问的共享资源 临界区&#xff1a;访问临界资源的代码 互斥机制&#xff1a;mutex互斥锁&#xff0c;任务访问临界资源前申请锁&#xff0c;访问完后释放锁互斥锁初始化 两种方法创建互…

中科星图——MODIS/006/MYD13A1的MYD13A1.006类数据集

数据名称&#xff1a; MYD13A1.006 Modis 16天 Aqua 500m 数据来源&#xff1a; NASA 时空范围&#xff1a; 2000-2022年 空间范围&#xff1a; 全国 数据简介&#xff1a; MOD13A1 V6数据集是由Aqua星搭载的中分辨率成像光谱仪获取的L3级植被指数产品&#xff0c…

三角函数转换(积分必备)

目录 一、诱导公式 二、二角和差公式 三、积化和差公式 四、万能、辅助角公式 五、倍角公式 六、反三角函数 七、余弦定理 一、诱导公式 1.公式一&#xff1a;设α为任意角&#xff0c;πα的三角函数值与α的三角函数值之间的关系 sin(π A) &#xff1d;&#xff0d;s…

《向量数据库指南》——Milvus Cloud向量过滤搜索及其优化

向量过滤搜索是一种基于条件的向量搜索方法&#xff0c;常用于推荐系统和信息检索等领域&#xff0c;能够帮助用户快速找到在给定条件下与其查询相关的内容。 在 Milvus Cloud社区中&#xff0c;这也是呼声比较高的功能。为满足广大用户的需求&#xff0c;Milvus Cloud在 Knowh…

王殿华主任:中医对睡眠的认知与睡眠障碍分类

睡眠不足不仅会导致黑眼圈&#xff0c;还会带来许多健康风险。怎样才能睡得更好&#xff1f; 一、睡眠障碍的分类 失眠症呼吸系统相关睡眠障碍&#xff1b;中枢多发性睡眠&#xff1b;睡眠节律紊乱&#xff1b;睡眠异常&#xff1b;睡眠运动障碍&#xff1b;其他睡眠障碍。 失…

CSS3的学习笔记

CSS3的学习笔记 什么是css: CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写&#xff0c;是一种用来描述网页样式和布局的标记语言。它可以控制网页中的文字大小、颜色、间距、背景、边框、布局等方面&#xff0c;使网页更加美观和易于阅读。通过CSS&a…

Jmeter学习系列之一:Jmeter的详细介绍

目录 一、Jmeter的介绍 二、Jemeter的特点 三、Jemter相关概念 3.1采样器&#xff08;Samplers&#xff09; 3.2逻辑控制器&#xff08;Logic Controllers&#xff09; 3.3监听器&#xff08;Listeners&#xff09; 3.4配置元件&#xff08;Configuration Elements&#…

python 匿名函数lambda的简洁用法

当前版本&#xff1a; Python 3.8.4 文章目录如下 1. lambda 的特点 2. lambda 的用法 2.1. 基本语法 2.2. 函数传参 2.3. 结合条件语句 3. lambda 的应用场景 3.1. 处理列表 3.2. 处理字典 1. lambda 的特点 lambda 是一种匿名函数的定义方式&#xff0c;也称为 lam…

Windows 7 x64 SP1 安装 Google Chrome 109.0.5414.120 (正式版本) (64 位)

1 使用 IE 浏览器 输入网址 Google Chrome 网络浏览器得益于 Google 智能工具&#xff0c;Chrome 现在更易用、更安全、更快速。https://www.google.cn/chrome/&#xff0c;点击下载 Chrome。 2 点击 接受并安装。 3 提示。 4 保存。 5 双击 运行 ChromeSetup.exe。 6 等待安…

MySQL十部曲之六:数据操作语句(DML)

文章目录 前言语法约定DELETEINSERTSELECT查询列表SELECT 选项子句FROMWHEREORDER BYGROUP BYHAVINGWINDOWLIMITFOR SELECT ... INTO连接查询CROSS JOIN和INNER JOINON和USINGOUTER JOINNATURE JOIN 子查询标量子查询使用子查询进行比较带有ANY、IN或SOME的子查询带有ALL的子查…

网站将http升级到https大概要多少费用

随着网络安全意识的不断提升&#xff0c;越来越多的网站正从传统的HTTP协议转向更安全的HTTPS协议。这一转变的核心在于部署SSL&#xff08;Secure Sockets Layer&#xff09;或TLS&#xff08;Transport Layer Security&#xff09;证书&#xff0c;以实现数据加密传输&#x…

docker 容器管理

文章目录 docker 容器管理容器基础容器概念可写的容器层容器的磁盘大小写时拷贝 容器操作容器创建和运行容器的启停查看容器信息进入容器操作删除容器基于容器创建镜像 容器限制限制容器内存限制容器CPU限制容器块IO带宽资源限制的实现机制动态修改容器配置 容器监控容器监控命…

热门应用滥用苹果 iPhone 推送通知,暗中窃取用户数据

移动研究人员 Tommy Mysk 近日揭露&#xff0c;部分热门应用利用 iPhone 推送通知功能秘密发送用户数据&#xff0c;这引发了用户隐私安全担忧。 许多 iOS 应用程序正在使用由推送通知触发的后台进程来收集设备的用户数据&#xff0c;从而有可能创建用于跟踪的指纹档案。 Mys…

【misc | CTF】攻防世界 2017_Dating_in_Singapore

天命&#xff1a;这次终于碰到了算是真正的misc题目了 下载附件&#xff0c;打开是PDF&#xff0c;我一开始以为是flag隐写在PDF里面了 虽然也不奇怪&#xff0c;应该是可以的&#xff0c;毕竟PDF有xss漏洞也是可以的 言归正传&#xff0c;打开PDF 看着新加坡的日历&#xff…

机器学习系列15:通过t-SNE可视化高维数据

t-SNE 的全称是 t-distributed stochastic neighbor embedding&#xff08;t-分布随机领域嵌入&#xff09;&#xff0c;这是一种非线性降维技术。而 PCA 和 LDA 是线性的降维技术。 t-SNE 通常用来在二维或者三维空间中可视化复杂数据集。 简单来说&#xff0c;t-SNE 试图发…