0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【笔记】多路DS18B20温度的读取

撞上电子 2023-06-08 09:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

多路DS18B20温度传感器的读取原理如下:1. 初始化:首先需要初始化GPIO引脚的配置,将其设置为推挽输出模式。这个引脚将用于与DS18B20传感器进行通信。2. 启动温度转换:在读取温度之前,需要向DS18B20传感器发送启动转换命令。这个命令告诉传感器开始进行温度转换。3. 延时等待转换完成:启动转换后,需要等待一段时间,使得DS18B20完成温度转换过程。这个时间取决于DS18B20的转换时间,可以根据数据手册进行设置。4. 读取温度值:在转换完成后,可以读取DS18B20传感器的温度值。读取的过程需要按照DS18B20的通信协议进行,具体如下:- 拉低总线并延时一段时间(2微秒)来准备读取数据。- 释放总线并等待DS18B20发出应答信号。- 通过逐位读取的方式,读取DS18B20传感器发送的数据。每位数据的读取包括等待一个周期的时间,然后读取数据位的值。- 读取完所有的数据位后,还需读取校验位。校验位的读取方式与数据位相同。- 根据读取到的数据计算出温度值。温度值的整数部分由8位数据组成,温度值的小数部分由校验位和第一位数据位组成。- 最后,根据校验位的值判断温度值的符号。5. 处理温度值:获取到温度值后,可以根据需要进行相应的处理,比如打印到串口、显示到LCD屏幕或进行其他逻辑操作。

#include "stm32f4xx_hal.h"
#define DS18B20_GPIO_Port GPIOA#define DS18B20_Pin GPIO_PIN_0
// 定义函数原型void DS18B20_Init(void);void DS18B20_StartConversion(void);float DS18B20_ReadTemperature(void);
int main(void){ HAL_Init();
// 初始化DS18B20 DS18B20_Init();
while (1) { // 启动温度转换 DS18B20_StartConversion();
// 延时一段时间等待转换完成 HAL_Delay(1000);
// 读取温度值 float temperature = DS18B20_ReadTemperature();
// 在这里处理温度值,例如打印到串口或者进行其他操作
HAL_Delay(5000); // 延时5秒 }}
// DS18B20初始化函数void DS18B20_Init(void){ GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIO时钟 __HAL_RCC_GPIOA_CLK_ENABLE();
// 配置GPIO引脚为推挽输出模式 GPIO_InitStruct.Pin = DS18B20_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);
// 拉低总线,准备写入指令 HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET); HAL_Delay(480); // 延时480微秒
// 释放总线,准备读取应答信号 HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET); HAL_Delay(80); // 延时80微秒
// 等待DS18B20发出应答信号 while (HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_RESET) ;}
// 启动温度转换void DS18B20_StartConversion(void){ // 拉低总线,发送启动转换命令 HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET); HAL_Delay(2); // 延时2微秒
// 释放总线,转换开始 HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET); HAL_Delay(10); // 延时10毫秒}
// 读取温度值float DS18B20_ReadTemperature(void){ uint8_t data[9]; uint8_t i, j; float temperature = 0;
// 拉低总线,准备读取温度数据 HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_RESET); HAL_Delay(2); // 延时2微秒
// 释放总线,开始读取数据 HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET); HAL_Delay(10); // 延时10微秒
// 等待DS18B20发出应答信号 while (HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_RESET) ;
// 读取数据 for (i = 0; i < 8; i++) { // 延时一个周期 HAL_Delay(2);
// 读取数据位 if (HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_SET) { data[i] = 1; } else { data[i] = 0; }
// 等待下一个数据位 while (HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_SET) ; }
// 校验位 if (HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_SET) { data[8] = 1; } else { data[8] = 0; }
// 计算温度值 for (i = 0; i < 8; i++) { temperature |= data[i] << i; }
// 温度值的小数部分 j = data[0] >> 3; temperature += (float)j * 0.0625;
// 温度值的符号位 if (data[8] == 1) { temperature = -temperature; }
return temperature;}

以上代码示例实现了通过STM32的HAL库读取多路DS18B20温度传感器的功能。在初始化阶段,通过设置GPIO引脚为推挽输出模式来控制DS18B20的通信,然后使用相关的时序操作启动温度转换和读取温度值。在读取温度值时,按照DS18B20的通信协议逐位读取数据,并进行计算得到最终的温度值。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2579

    文章

    56008

    浏览量

    796420
  • 温度
    +关注

    关注

    2

    文章

    147

    浏览量

    11053
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入解析DS1616:温度与数据记录的全能芯片

    )的芯片,为数据记录和监测提供了强大而全面的解决方案。今天,我们就来深入探讨一下DS1616的特性、功能以及应用。 文件下载: DS1616K-000.pdf 一、DS1616的主要特性 1. 多通道数据测量
    的头像 发表于 05-26 13:15 206次阅读

    ds2482读取个别18b20温度返回0x7FF是什么原因导致的?如何解决?

    DS2482驱动18B20,大多数18B20读取温度正常,但有的18B20
    发表于 05-13 07:34

    实际温度低于-55时,DS1B20读取结果是什么?

    请问下当实际温度低于-55度时,DS18B20读取导致的温度值是保持为-55度 还是 其它值 ?
    发表于 05-08 06:03

    HJ18B20 数字单总线温度传感器

    一、概述 HJ18B20 是一款高精度的单总线温度测量电路,温度传感器的测量范围-55℃到+125℃。根据用户 需要通过配置寄存器可以设定数字转化精度和测温速度。电路内置 4byte 非易失性
    发表于 04-21 14:17

    一文看懂常用传感器:温度、光照、气体全覆盖

    对照各类传感器。01温度传感器常用型号:DS18B20、LM35、NTC热敏电阻工作原理:通过电阻或半导体材料随温度变化改变电压或电流接口类型:模拟输出、数字接口
    的头像 发表于 01-09 19:03 1503次阅读
    一文看懂常用传感器:<b class='flag-5'>温度</b>、光照、气体全覆盖

    DS92LV1818位总线LVDS串行器/解串器的深度解析

    DS92LV1818位总线LVDS串行器/解串器的深度解析 在电子设计领域,数据传输的高效性和稳定性一直是工程师们关注的重点。TI推出的DS92LV18 18位总线LVDS串行器/解
    的头像 发表于 12-30 10:05 590次阅读

    CW32F003怎样延时1微秒?

    CW32F003怎样延时1微秒,DS18B20,DHT11需要使用
    发表于 12-30 07:19

    CW32L031嘀嗒定时器怎样定时1us?

    CW32L031嘀嗒定时器 怎样定时1us,以便DS18B20,DHT11使用。提供一下代码
    发表于 12-10 07:40

    请问CW32F003内部上拉电阻是多少?

    最近在调试DS18B20,用寄生电源,所以需要上拉电阻,如果不接外部上拉电阻,芯片内部的上拉电阻可以不?
    发表于 11-21 06:15

    要做一个DS18B20读取程序,单总线需要配置为输入或者输出,怎么配置好?

    目前要做一个DS18B20读取程序,单总线需要配置为输入或者输出。怎么配置好
    发表于 11-18 06:30

    单总线接口数字温度传感器芯片GX18E20

    成为分布式测温系统的核心选择。GX18E20作为一款基于单总线协议的数字温度传感器芯片,在实现-55℃至+125℃宽范围测温的同时,支持多点组网与报警设定,适用于HVAC、粮情监测、工业过程控制等复杂场景。
    的头像 发表于 11-11 15:22 751次阅读

    使用18b20软件包报错怎么解决?

    In file included from ../packages/ds18b20-latest/src/dallas_ds18b20_sensor_v1.c:12:0: C
    发表于 10-14 06:49

    STM32项目分享:矿井环境监测系统

    01—项目简介1.功能详解STM32矿井环境监测系统功能如下:STM32F103C8T6单片机作为主控制器DS18B20测量环境温度
    的头像 发表于 08-16 10:03 1236次阅读
    STM32项目分享:矿井环境监测系统

    液体介电常数测试仪中的温度控制与热漂移抑制

    55。同时,温度波动会使电阻、电容等无源元件参数改变,晶体管等有源器件工作点偏移,最终影响测量精度。 温度控制方案设计 温度测量模块 常用温度传感器中,热电偶测量范围广但需冷端补偿;
    的头像 发表于 07-31 13:23 859次阅读
    液体介电常数测试仪中的<b class='flag-5'>温度</b>控制与热漂移抑制

    低频段 LNA 前端模块(B26/B5/B18/B19、B8、B20B12/13/17、B28A、B28BB29) skyworksinc

    电子发烧友网为你提供()低频段 LNA 前端模块(B26/B5/B18/B19、B8、B20
    发表于 06-27 18:32
    低频段 LNA 前端模块(<b class='flag-5'>B</b>26/<b class='flag-5'>B</b>5/<b class='flag-5'>B18</b>/<b class='flag-5'>B</b>19、<b class='flag-5'>B</b>8、<b class='flag-5'>B20</b>、<b class='flag-5'>B</b>12/13/17、<b class='flag-5'>B</b>28A、<b class='flag-5'>B28B</b> 和 <b class='flag-5'>B</b>29) skyworksinc