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的通信协议逐位读取数据,并进行计算得到最终的温度值。

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

    关注

    2525

    文章

    48129

    浏览量

    740198
  • 温度
    +关注

    关注

    2

    文章

    121

    浏览量

    10310
收藏 人收藏

    评论

    相关推荐

    机智云采用MCU方案采集DS18B20温度,一直无法读取数据怎么解决?

    单片机:STC8A8K64S4A12;ESP8266-01 采用机智云的MCU方案,51单片机的程序是自动生成的,基础功能已经实现,但是一直无法读取DS18B20数据,DS18B20控制程序已经验证没有问题,
    发表于 11-06 07:45

    如何用ds18b20读取来的数据并通过串口发送到pc?

    如何用ds18b20读取来的数据并通过串口发送到pc?
    发表于 11-06 07:26

    如何解决DS18b20发热对温度测量的影响?

    如何解决DS18b20发热对温度测量的影响
    发表于 11-03 06:52

    为什么我的定时器一打开DS18B20温度读取不了了 ?

    为什么我的定时器一打开,就影响了DS18B20了呢,温度读取不了了
    发表于 11-01 07:02

    DS18B20可以实现并联测温吗?

    分别读取两个DS18B20温度
    发表于 10-24 07:45

    ds18b20怎么把默认的12位温度改成9位?

    ds18b20怎么把默认的12位温度改成9位
    发表于 10-17 06:05

    DS18B20采样温度的精度可以达到多少?

    DS18B20采样温度的精度可以达到多少
    发表于 10-12 08:14

    DS18B20 数字温度计特点

    一.DS18B20特点 DS18B20 数字温度计提供12位(二进制)温度读数的数字型传感器。传感器仅需要单总线接口与CPU连接,实现信号送入 DS
    的头像 发表于 09-11 11:19 1376次阅读
    <b class='flag-5'>DS18B20</b> 数字<b class='flag-5'>温度</b>计特点

    如何使用Nano100来读DS18B20

    : NuTiny-EVB-Nano130-LQFP128 v1.1 MCU与DS18B20到PD.0的DS18B20通信读DS18B20,然后通过串端输出温度,作为浮体类型。
    发表于 08-30 08:07

    如何使用Mini51来读DS18B20

    MCU与DS18B20至P5.2进行通信,读DS18B20,然后通过串端输出温度,作为浮体类型。 DS18B20温度分辨率为12比特。 港
    发表于 08-29 07:08

    如何使用Nano100来读DS18B20

    : NuTiny-EVB-Nano130-LQFP128 v1.1 MCU与DS18B20到PD.0的DS18B20通信读DS18B20,然后通过串端输出温度,作为浮体类型。
    发表于 08-22 07:54

    使用Mini51来读DS18B20

    MCU与DS18B20至P5.2进行通信,读DS18B20,然后通过串端输出温度,作为浮体类型。 DS18B20温度分辨率为12比特。 港
    发表于 08-22 06:08

    基于51单片机的DS18B20温度读取实验

    DS18B20:是一个数字温度传感器,提供 9-Bit 到12-Bit 的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。
    发表于 06-25 14:08 1327次阅读
    基于51单片机的<b class='flag-5'>DS18B20</b><b class='flag-5'>温度</b><b class='flag-5'>读取</b>实验

    Proteus教程第四讲:DS18B20温度测量

    Proteus教程第四讲:DS18B20温度测量
    的头像 发表于 06-14 11:19 1145次阅读
    Proteus教程第四讲:<b class='flag-5'>DS18B20</b><b class='flag-5'>温度</b>测量

    【正点原子STM32精英V2开发板体验】DS18B20温度采集

    of \'XXX\'”。 本节主要分享基于DS18B20温度精准采集,我们知道DS18B20是美国DSLIAS公司推出的单总线数字温度传感器,具有微型化、低功耗、高性能、抗干扰能力
    发表于 05-03 19:31