一、DS18B20是什么?
是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样。
二、主要参数
1.独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
2.测温范围 -55℃~+125℃,固有测温误差(注意,不是分辨率,这里之前是错误的)1℃。
3.支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,实现多点测温,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定。
4.工作电源: 3.0~5.5V/DC (可以数据线寄生电源)
5.在使用中不需要任何外围元件
6.测量结果以9~12位数字量方式串行传送
7.不锈钢保护管直径 Φ6
8.适用于DN15~25, DN40~DN250各种介质工业管道和狭小空间设备测温
9.标准安装螺纹 M10X1, M12X1.5, G1/2”任选
三、基于嵌入式的使用步骤(以STM32F1X为例)
在我使用的STM32F103ZET6中,DS18B20的电源电压选择为3.3V,5V电压不能工作。
根据时序图来进行配置和初始化。
下面展示ds18b20.h
的完整代码
#ifndef _DS18B20_H
#define _DS18B20_H
#include "stm32l0xx.h"
uint64_t ds18b20_get_id(void);
void bsp_InitDS18B20(void);
int16_t DS18B20_ReadTempReg(void);
uint64_t DS18B20_Get_ID(void);
int DS18B20_ReadTempByID(uint8_t _id);
#if defined USEID
int DS18B20_ReadTemperatureByROMCodes(uint8_t groupid,uint8_t *iRomCode);
#endif
#endif
下面展示 ds18b20.c
完整代码。
#include "ds18b20.c"
#include "main.h"
#include "ds18b20.h"
#include "timer.h"
注意:uint8_t 包含的头文件是在我写的main.h里面的 #include <stdint.h>
我用的不是标准库,而是HAL库,所以里面还有 #include “stm32l0xx_hal.h”
我的延时函数delay_us()被包含在#include "timer.h"里面,你们可以自己调用自己的延时函数头文件
下面是通过寄存器来配置GPIO口,你们也可以通过函数来配置,只要能达到相应的功能就行
GPIO_TypeDef* PORT_DQ = NULL;//GPIO_InitTypeDef
uint16_t PIN_DQ = NULL;
#define DQ_0() PORT_DQ->BRR = PIN_DQ //设置某个IO口为低电平
#define DQ_1() PORT_DQ->BSRR = PIN_DQ //设置某个IO口为高电平
/* 判断DQ输入是否为低 */
#define DQ_IS_LOW() ((PORT_DQ->IDR & PIN_DQ) == 0)
/*
*********************************************************************************************************
* 函 数 名: DS18B20_Reset
* 功能说明: 复位DS18B20。 拉低DQ为低,持续最少480us,然后等待
* 形 参: 无
* 返 回 值: 0 失败; 1 表示成功
*********************************************************************************************************
*/
uint8_t DS18B20_Reset(void)
{
/*
复位时序, 见DS18B20 page 15
首先主机拉低DQ,持续最少 480us
然后释放DQ,等待DQ被上拉电阻拉高,约 15-60us
DS18B20 将驱动DQ为低 60-240us, 这个信号叫 presence pulse (在位脉冲,表示DS18B20准备就绪 可以接受命令)
如果主机检测到这个低应答信号,表示DS18B20复位成功
*/
uint8_t i;
uint16_t k;
/* 复位,如果失败则返回0 */
for (i = 0; i < 1; i++)
{
DQ_0(); /* 拉低DQ */
delay_us(520); /* 延迟 520uS, 要求这个延迟大于 480us */
DQ_1(); /* 释放DQ */
delay_us(60); /* 等待15us-60us */
/* 检测DQ电平是否为低 */
for (k = 0; k < 24; k++)//60-240us
{
if (DQ_IS_LOW())
{
break;
}
delay_us(10); /* 等待65us */
}
if (k >= 24)
{
continue; /* 失败 */
}
/* 等待DS18B20释放DQ */
for (k = 0; k < 41; k++)
{
delay_us(10); /* 等待至少405us */
}
if (<