嵌入式外设 -- 温度传感器(DS18B20)

目录

一、模块介绍

二、技术参数

关注微信公众号--星之援工作室 发送关键字(DS18B20)

 三、 驱动代码部分 (引用野火的)

main

ds18b20.c

ds18b20.h

四、资料查考


一、模块介绍

温度传感器DS18B20是一种数字式温度传感器,由Maxim Integrated公司生产。它采用1-Wire总线接口,可以通过单个引脚与微处理器通信,并提供高精度的温度测量。 DS18B20传感器具有以下特点:

1. 高精度测量:DS18B20可以测量范围为-55℃至+125℃的温度,精确到0.5℃。

2. 数字输出:传感器使用1-Wire总线协议进行数字通信,方便与微处理器连接,并以数字形式输出温度值。

3. 多个传感器支持:1-Wire总线允许多个DS18B20传感器通过单个引脚与微处理器通信,从而简化系统设计。

4. 可编程分辨率:传感器具有可编程的温度分辨率,从9位到12位不等,可根据应用需求进行调整。

5. 低功耗设计:DS18B20传感器在非工作状态下可以进入睡眠模式,以降低功耗,提高电池寿命。

6. 具有温度报警功能:传感器内部集成了温度报警功能,可以设置上下限,当温度达到预设值时触发警报。

二、技术参数

1. 测量范围:-55℃~+125℃

2. 分辨率:9~12位

3. 转换速率:大约200次/秒

4. 电源电压:3.3~5.5V

5. 工作电流:33μA(待机模式下)

6. 接口:单线制(只需一条接口线即可与微处理器连接)

7. 数据传输速率:100kbps

8. 输入方式:单线脉冲信号或边沿捕获

关注微信公众号--星之援工作室 发送关键字(DS18B20

➡️🫡🫡🫡🫡🫡🫡🫡🫡➡️

 三、 驱动代码部分 (引用野火的)

main

主函数初始化以及采集数据


#include "stm32f10x.h"
#include "./systick/bsp_SysTick.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./ds18b20/bsp_ds18b20.h"



/**
  * @brief  主函数
  * @param  无  
  * @retval 无
  */
int main(void)
{	
	uint8_t uc, ucDs18b20Id [ 8 ];
	
	
	/* 配置SysTick 为1us中断一次 */
	SysTick_Init();
	
	/* LED 端口初始化 */
	LED_GPIO_Config();
	
	USART_Config();	//初始化串口1
	
	
	printf("\r\n this is a ds18b20 test demo \r\n");
	
	while( DS18B20_Init() )	
		printf("\r\n no ds18b20 exit \r\n");
	
	printf("\r\n ds18b20 exit \r\n");
	
	
	DS18B20_ReadId ( ucDs18b20Id  );           // 读取 DS18B20 的序列号
	
	printf("\r\nDS18B20的序列号是: 0x");

	for ( uc = 0; uc < 8; uc ++ )             // 打印 DS18B20 的序列号
	 printf ( "%.2x", ucDs18b20Id [ uc ] );
	
	
	for(;;)
	{	
		printf ( "\r\n获取该序列号器件的温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) );		// 打印通过 DS18B20 序列号获取的温度值	
		
		Delay_ms(1000);		/* 1s 读取一次温度值 */
		
		LED2_TOGGLE;
		
	}	 
	
	
}
/*********************************************END OF FILE**********************/

ds18b20.c

驱动的c文件,主要是实现函数

/**
  ******************************************************************************
  * @file    bsp_ds18b20.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   DS18B20温度传感器应用函数接口
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 指南者 开发板  
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */

#include "./ds18b20/bsp_ds18b20.h"
#include "./systick/bsp_SysTick.h"
#include "./dwt_delay/core_delay.h" 

/* 可以在下面的宏定义中把后面的延时函数替换换SysTick的延时函数,就是想用那个就换成那个的 */

#define DHT11_DELAY_US(us)  CPU_TS_Tmr_Delay_US(us)
#define DHT11_DELAY_MS(ms)  CPU_TS_Tmr_Delay_MS(ms)

static void                           DS18B20_GPIO_Config                       ( void );
static void                           DS18B20_Mode_IPU                          ( void );
static void                           DS18B20_Mode_Out_PP                       ( void );
static void                           DS18B20_Rst                               ( void );
static uint8_t                        DS18B20_Presence                          ( void );
static uint8_t                        DS18B20_ReadBit                           ( void );
static uint8_t                        DS18B20_ReadByte                          ( void );
static void                           DS18B20_WriteByte                         ( uint8_t dat );
static void                           DS18B20_SkipRom                           ( void );
static void                           DS18B20_MatchRom                          ( void );



 /**
  * @brief  DS18B20 初始化函数
  * @param  无
  * @retval 无
  */
uint8_t DS18B20_Init(void)
{
	DS18B20_GPIO_Config ();
	
	DS18B20_DQ_1;
	
	DS18B20_Rst();
	
	return DS18B20_Presence ();
	
}


/*
 * 函数名:DS18B20_GPIO_Config
 * 描述  :配置DS18B20用到的I/O口
 * 输入  :无
 * 输出  :无
 */
static void DS18B20_GPIO_Config(void)
{		
	/*定义一个GPIO_InitTypeDef类型的结构体*/
	GPIO_InitTypeDef GPIO_InitStructure;
	

	/*开启DS18B20_DQ_GPIO_PORT的外设时钟*/
	DS18B20_DQ_SCK_APBxClock_FUN ( DS18B20_DQ_GPIO_CLK, ENABLE); 

	/*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN;	

	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

	/*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
  	GPIO_Init ( DS18B20_DQ_GPIO_PORT , &GPIO_InitStructure );

}

/*
 * 函数名:DS18B20_Mode_IPU
 * 描述  :使DS18B20-DATA引脚变为输入模式
 * 输入  :无
 * 输出  :无
 */
static void DS18B20_Mode_IPU(void)
{
 	  GPIO_InitTypeDef GPIO_InitStructure;

	  	/*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/	
	  GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN;

	   /*设置引脚模式为浮空输入模式*/ 
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	

	  /*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
	  GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure);
}


/*
 * 函数名:DS18B20_Mode_Out_PP
 * 描述  :使DS18B20-DATA引脚变为输出模式
 * 输入  :无
 * 输出  :无
 */
static void DS18B20_Mode_Out_PP(void)
{
 	GPIO_InitTypeDef GPIO_InitStructure;

	 	/*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/															   
  	GPIO_InitStructure.GPIO_Pin = DS18B20_DQ_GPIO_PIN;	

	/*设置引脚模式为通用推挽输出*/
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   

	/*设置引脚速率为50MHz */   
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	/*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
  	GPIO_Init(DS18B20_DQ_GPIO_PORT, &GPIO_InitStructure);
}


/*
 *主机给从机发送复位脉冲
 */
static void DS18B20_Rst(void)
{
	/* 主机设置为推挽输出 */
	DS18B20_Mode_Out_PP();
	
	DS18B20_DQ_0;
	/* 主机至少产生480us的低电平复位信号 */
	DHT11_DELAY_US(750);
	
	/* 主机在产生复位信号后,需将总线拉高 */
	DS18B20_DQ_1;
	
	/*从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲*/
	DHT11_DELAY_US(15);
}


/*
 * 检测从机给主机返回的存在脉冲
 * 0:成功
 * 1:失败
 */
static uint8_t DS18B20_Presence(void)
{
	uint8_t pulse_time = 0;
	
	/* 主机设置为上拉输入 */
	DS18B20_Mode_IPU();
	
	/* 等待存在脉冲的到来,存在脉冲为一个60~240us的低电平信号 
	 * 如果存在脉冲没有来则做超时处理,从机接收到主机的复位信号后,会在15~60us后给主机发一个存在脉冲
	 */
	while( DS18B20_DQ_IN() && pulse_time<100 )
	{
		pulse_time++;
		DHT11_DELAY_US(1);
	}	
	/* 经过100us后,存在脉冲都还没有到来*/
	if( pulse_time >=100 )
		return 1;
	else
		pulse_time = 0;
	
	/* 存在脉冲到来,且存在的时间不能超过240us */
	while( !DS18B20_DQ_IN() && pulse_time<240 )
	{
		pulse_time++;
		DHT11_DELAY_US(1);
	}	
	if( pulse_time >=240 )
		return 1;
	else
		return 0;
}


/*
 * 从DS18B20读取一个bit
 */
static uint8_t DS18B20_ReadBit(void)
{
	uint8_t dat;
	
	/* 读0和读1的时间至少要大于60us */	
	DS18B20_Mode_Out_PP();
	/* 读时间的起始:必须由主机产生 >1us <15us 的低电平信号 */
	DS18B20_DQ_0;
	DHT11_DELAY_US(10);
	
	/* 设置成输入,释放总线,由外部上拉电阻将总线拉高 */
	DS18B20_Mode_IPU();
	//DHT11_DELAY_US(2);
	
	if( DS18B20_DQ_IN() == SET )
		dat = 1;
	else
		dat = 0;
	
	/* 这个延时参数请参考时序图 */
	DHT11_DELAY_US(45);
	
	return dat;
}


/*
 * 从DS18B20读一个字节,低位先行
 */
static uint8_t DS18B20_ReadByte(void)
{
	uint8_t i, j, dat = 0;	
	
	for(i=0; i<8; i++) 
	{
		j = DS18B20_ReadBit();		
		dat = (dat) | (j<<i);
	}
	
	return dat;
}


/*
 * 写一个字节到DS18B20,低位先行
 */
static void DS18B20_WriteByte(uint8_t dat)
{
	uint8_t i, testb;
	DS18B20_Mode_Out_PP();
	
	for( i=0; i<8; i++ )
	{
		testb = dat&0x01;
		dat = dat>>1;		
		/* 写0和写1的时间至少要大于60us */
		if (testb)
		{			
			DS18B20_DQ_0;
			/* 1us < 这个延时 < 15us */
			DHT11_DELAY_US(8);
			
			DS18B20_DQ_1;
			DHT11_DELAY_US(58);
		}		
		else
		{			
			DS18B20_DQ_0;
			/* 60us < Tx 0 < 120us */
			DHT11_DELAY_US(70);
			
			DS18B20_DQ_1;			
			/* 1us < Trec(恢复时间) < 无穷大*/
			DHT11_DELAY_US(2);
		}
	}
}


 /**
  * @brief  跳过匹配 DS18B20 ROM
  * @param  无
  * @retval 无
  */
static void DS18B20_SkipRom ( void )
{
	DS18B20_Rst();	   
	
	DS18B20_Presence();	 
	
	DS18B20_WriteByte(0XCC);		/* 跳过 ROM */
	
}


 /**
  * @brief  执行匹配 DS18B20 ROM
  * @param  无
  * @retval 无
  */
static void DS18B20_MatchRom ( void )
{
	DS18B20_Rst();	   
	
	DS18B20_Presence();	 
	
	DS18B20_WriteByte(0X55);		/* 匹配 ROM */
	
}


/*
 * 存储的温度是16 位的带符号扩展的二进制补码形式
 * 当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位
 *
 *         |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|
 * 低字节  | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |
 *
 *
 *         |-----符号位:0->正  1->负-------|-----------整数-----------|
 * 高字节  |  s  |  s  |  s  |  s  |    s   |   2^6  |   2^5  |   2^4  |
 *
 * 
 * 温度 = 符号位 + 整数 + 小数*0.0625
 */
 /**
  * @brief  在跳过匹配 ROM 情况下获取 DS18B20 温度值 
  * @param  无
  * @retval 温度值
  */
float DS18B20_GetTemp_SkipRom ( void )
{
	uint8_t tpmsb, tplsb;
	short s_tem;
	float f_tem;
	
	
	DS18B20_SkipRom ();
	DS18B20_WriteByte(0X44);				/* 开始转换 */
	
	
	DS18B20_SkipRom ();
  DS18B20_WriteByte(0XBE);				/* 读温度值 */
	
	tplsb = DS18B20_ReadByte();		 
	tpmsb = DS18B20_ReadByte(); 
	
	
	s_tem = tpmsb<<8;
	s_tem = s_tem | tplsb;
	
	if( s_tem < 0 )		/* 负温度 */
		f_tem = (~s_tem+1) * 0.0625;	
	else
		f_tem = s_tem * 0.0625;
	
	return f_tem; 	
	
	
}


 /**
  * @brief  在匹配 ROM 情况下获取 DS18B20 温度值 
  * @param  ds18b20_id:用于存放 DS18B20 序列号的数组的首地址
  * @retval 无
  */
void DS18B20_ReadId ( uint8_t * ds18b20_id )
{
	uint8_t uc;
	
	
	DS18B20_WriteByte(0x33);       //读取序列号
	
	for ( uc = 0; uc < 8; uc ++ )
	  ds18b20_id [ uc ] = DS18B20_ReadByte();
	
}


 /**
  * @brief  在匹配 ROM 情况下获取 DS18B20 温度值 
  * @param  ds18b20_id:存放 DS18B20 序列号的数组的首地址
  * @retval 温度值
  */
float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
{
	uint8_t tpmsb, tplsb, i;
	short s_tem;
	float f_tem;
	
	
	DS18B20_MatchRom ();            //匹配ROM
	
  for(i=0;i<8;i++)
		DS18B20_WriteByte ( ds18b20_id [ i ] );	
	
	DS18B20_WriteByte(0X44);				/* 开始转换 */

	
	DS18B20_MatchRom ();            //匹配ROM
	
	for(i=0;i<8;i++)
		DS18B20_WriteByte ( ds18b20_id [ i ] );	
	
	DS18B20_WriteByte(0XBE);				/* 读温度值 */
	
	tplsb = DS18B20_ReadByte();		 
	tpmsb = DS18B20_ReadByte(); 
	
	
	s_tem = tpmsb<<8;
	s_tem = s_tem | tplsb;
	
	if( s_tem < 0 )		/* 负温度 */
		f_tem = (~s_tem+1) * 0.0625;	
	else
		f_tem = s_tem * 0.0625;
	
	return f_tem; 	
	
	
}

/*************************************END OF FILE******************************/

ds18b20.h

将函数进行定义引用

#ifndef __DS18B20_H
#define	__DS18B20_H



#include "stm32f10x.h"



/************************** DS18B20 连接引脚定义********************************/
#define      DS18B20_DQ_SCK_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define      DS18B20_DQ_GPIO_CLK                       RCC_APB2Periph_GPIOA

#define      DS18B20_DQ_GPIO_PORT                      GPIOA
#define      DS18B20_DQ_GPIO_PIN                       GPIO_Pin_8



/************************** DS18B20 函数宏定义********************************/
#define      DS18B20_DQ_0	                            GPIO_ResetBits ( DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN ) 
#define      DS18B20_DQ_1	                            GPIO_SetBits ( DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN ) 

#define      DS18B20_DQ_IN()	                          GPIO_ReadInputDataBit ( DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN ) 



/************************** DS18B20 函数声明 ********************************/
uint8_t                  DS18B20_Init                      ( void );
void                     DS18B20_ReadId                    ( uint8_t * ds18b20_id );
float                    DS18B20_GetTemp_SkipRom           ( void );
float                    DS18B20_GetTemp_MatchRom          ( uint8_t * ds18b20_id );



#endif /* __DS18B20_H */






四、资料查考

DS18B20温度传感器(STM32F103C8T6)icon-default.png?t=N7T8https://blog.csdn.net/weixin_45419341/article/details/124210290?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170719023916800186575350%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170719023916800186575350&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~top_positive~default-2-124210290-null-null.nonecase&utm_term=ds18b20&spm=1018.2226.3001.4450

 

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿柒学起来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值