DS18B20温度传感器详解(STM32)

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

一、DS18B20简介

DS18B20是Dallas公司生产的一款单总线数字温度传感器,具有体积小、精度高、抗干扰能力强等特点。它采用单总线通信协议,仅需一根数据线即可与微控制器进行通信,大大简化了硬件电路设计。DS18B20的温度测量范围为 -55℃ 到 +125℃,测量精度可达 ±0.5℃,分辨率可通过编程设置为 9 位到 12 位。

二、硬件连接

DS18B20的引脚定义如下:

  • GND:接地
  • DQ:数据输入/输出引脚
  • VDD:电源引脚

以STM32F103为例,将DS18B20的DQ引脚连接到STM32的一个GPIO引脚(如PA0),VDD接3.3V或5V电源,GND接地。同时,为了保证通信的稳定性,需要在DQ引脚上接上一个上拉电阻(一般为4.7KΩ)。

三、单总线通信协议

DS18B20采用单总线通信协议,通信过程主要包括初始化、ROM操作命令、功能操作命令三个步骤。

1. 初始化

初始化过程是主机和DS18B20之间的握手过程。主机先将数据线拉低至少480μs,然后释放数据线,等待15 - 60μs后,DS18B20会将数据线拉低60 - 240μs作为应答信号。

2. ROM操作命令

ROM操作命令用于识别总线上的DS18B20设备。常见的ROM操作命令有:

  • 搜索ROM(0xF0):用于搜索总线上所有DS18B20的ROM编码。
  • 读ROM(0x33):用于读取单个DS18B20的ROM编码。
  • 匹配ROM(0x55):用于选择总线上特定的DS18B20设备。
  • 跳过ROM(0xCC):当总线上只有一个DS18B20设备时,可以跳过ROM操作,直接进行功能操作。

3. 功能操作命令

功能操作命令用于对DS18B20进行温度转换、读取温度值等操作。常见的功能操作命令有:

  • 温度转换(0x44):启动DS18B20进行温度转换。
  • 读暂存器(0xBE):读取DS18B20的暂存器内容,包括温度值。

四、STM32代码实现

1. 初始化GPIO引脚

#include "stm32f10x.h"

#define DS18B20_GPIO_PORT GPIOA
#define DS18B20_GPIO_PIN GPIO_Pin_0

void DS18B20_GPIO_Init(void)
{
   
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DS18B20_GPIO_PORT
### DS18B20 温度传感器STM32F103 开发教程 #### 一、硬件连接方式 为了实现DS18B20温度传感器STM32F103C8T6之间的通信,需按照特定的方式进行硬件连接。具体来说: - 将DS18B20的数据线(DQ)连接到STM32的GPIO引脚上; - 使用一个4.7kΩ的上拉电阻连接在数据线上方,确保信号稳定传输; - VCC端口接入电源正极,GND接地[^1]。 ```c // 定义用于连接DS18B20的GPIO引脚编号 #define ONE_WIRE_PIN GPIO_Pin_5 ``` #### 二、编程指南 针对上述硬件配置,在软件层面需要完成初始化设置以及读取温度值的功能模块构建。以下是主要步骤概览: ##### 初始化函数定义 创建`OneWire_Init()`方法来设定指定IO口的工作模式为推挽输出型态,并调用库内建的一系列操作以准备后续交互过程[^2]。 ```c void OneWire_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = ONE_WIRE_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO📐⚗//= GPIO_InitStructure); } ``` ##### 获取温度数值逻辑 编写专门负责解析来自DS18B20设备所反馈回来的信息流并最终转换成实际摄氏度数目的算法部分。此过程中涉及到对原始字节序列执行必要的计算处理。 ```c float getTemperature(){ uint8_t i; int16_t raw_temperature=0; // 发送复位脉冲并等待响应 if (!OneWire_Reset()) return -128; // 跳过ROM匹配命令 OneWire_WriteByte(0xCC); // 启动温度转换指令 OneWire_WriteByte(0x44); delay_ms(750); // 再次发送复位脉冲 if(!OneWire_Reset())return -128; // 跳过ROM匹配命令 OneWire_WriteByte(0xCC); // 请求寄存器中的温度数据 OneWire_WriteByte(0xBE); for(i=0;i<9;i++){ raw_temperature=(raw_temperature<<8)|OneWire_ReadByte(); } float temperature=((raw_temperature&0xFF)<<8)|(raw_temperature>>8); temperature*=0.0625f; return temperature; } ``` #### 三、示例代码展示 下面给出一段完整的Arduino风格伪代码片段作为参考实例,展示了如何利用前面介绍过的各个组件协同工作从而达到预期目标——即周期性地从环境中采集最新温湿度变化情况并通过串行接口打印出来供进一步分析使用。 ```cpp #include "stm32f1xx_hal.h" int main(void){ HAL_Init(); SystemClock_Config(); OneWire_Init(); while (true){ float temp=getTemperature(); printf("Current Temperature:%.2f°C\n",temp); HAL_Delay(1000); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值