STM32基于HAL库的DS18B20实现

开发板:野火挑战者_V2
GPIO:PE2

创建工程

使能USART1

用来通过串口打印温度值
在这里插入图片描述

配置GPIO

在这里插入图片描述

代码编写

我们先打开 DS18B20 的手册

1、DS18B20 复位与存在脉冲

在这里插入图片描述

复位
/**
 * @brief  DS18B20 复位
 * @param  无
 * @return 无
 * @note 将总线拉低 480us - 960us 启动复位,然后等待 15us 检测存在脉冲
 */
void Ds18b20_Reset(void)
{
	//输出模式下
	DQ_GPIO_OUT();
	
	//拉低总线 750us
	DQ_Write(DQ_LEVEL_LOW);
	Delay_Us(750);
	
	//释放总线,等待存在脉冲
	DQ_Write(DQ_LEVEL_HIGHT);
	Delay_Us(15);
}
检测存在脉冲
/**
 * @brief  检测存在脉冲	
 * @param  无
 * @return   存在脉冲: 0 
 *         不存在脉冲: 1
 */
uint8_t Ds18B20_CheckPulse(void)
{
	/* 超时计数,若设备不存在,需要退出,不能一直等待 */
	uint8_t Time_Count = 0;
	
	//将 GPIO 改成输入模式下
	DQ_GPIO_IN();
	
	/* 对应时序中的 DS18B20 等待 (15 - 60)us */
	while (DQ_Read && Time_Count < 100)
	{
		Time_Count++;
		Delay_Us(1);
	}
	
	/* 已经过去了 100us 存在脉冲还没到来,代表设备不存在 */
	if (Time_Count >= 100)
		return 1;   
	/* 脉冲到来,复位超时计数 */
	else
		Time_Count = 0;
	
	/* 对应时序中的 DS18B20 存在脉冲 (60 - 240)us */
	while (!DQ_Read && Time_Count < 240)
	{
		Time_Count++;
		Delay_Us(1);
	}
	
	/* 由时序图可知,存在脉冲最长不得超过 240us */
	if (Time_Count >= 240)
		return 1;
	else
		return 0;    //检测到存在脉冲
}
2、读取数据

在这里插入图片描述

读取 1Bit
/**
 * @brief  读取1bit数据 
 * @param  无
 * @return 读取到1Bit的数据
 * @note   先将总线拉低 15us 后,读取总线状态
 */ 
uint8_t Ds18b20_Read_Bit(void)
{
	uint8_t dat;
	//输出模式
	DQ_GPIO_OUT();
	
	//先拉低总线 15us 后读取总线状态
	DQ_Write(DQ_LEVEL_LOW);
	Delay_Us(15);
	
	//下面要读取总线值,将引脚设置成输入模式
	DQ_GPIO_IN();
	
	if (DQ_Read == SET)
		dat = 1;
	else
		dat = 0;
	
	//读取周期至少 60us
	Delay_Us(50);
	
	return dat;
}
读取 1Byte
/** 
 * @brief  从 DS18B20 上读取 1Byte
 * @param  无
 * @return 读到的8位数据
 * @note   低位到高位
 */
uint8_t Ds18B20_Read_Byte(void)
{
	uint8_t data = 0x00,mask;
	
	for (mask = 0x01;mask != 0;mask <<= 1)
	{
		if (Ds18b20_Read_Bit() == SET)
			data |= mask;
		else
			data &= ~mask;
	}
	
	return data;
}
3、向 DS18B20 写入数据

在这里插入图片描述

/**
 * @brief  写入一字节数据,低位先行
 * @param  data 写入的数据 
 * @return 无
 * @note  写0: 由时序图可知,拉低总线至少 60us 表示写 0
          写1: 由时序图可知,拉低总线大于 1us 并且小于 15us 后,紧接着拉高总线,总时间超过 60us
          写周期必须有 1us 的恢复时间
 */
void Ds18B20_Write_Byte(uint8_t data)
{
	uint8_t mask;
	
	for (mask = 0x01;mask != 0;mask <<= 1)
	{
		DQ_GPIO_OUT();
		
		//写0
		if ((data & mask) == RESET)
		{
			/* 拉低总线至少 60us */
			DQ_Write(DQ_LEVEL_LOW);
			Delay_Us(70);
			
			//2us 的恢复时间
			DQ_Write(DQ_LEVEL_HIGHT);
			Delay_Us(2);
		}
		else  //写1
		{
			/* 拉低总线大于 1us 并且小于 15us */
			DQ_Write(DQ_LEVEL_LOW);
			Delay_Us(9);
			
			/* 拉高总线,总时间超过 60us */
			DQ_Write(DQ_LEVEL_HIGHT);
			Delay_Us(55);
		}
	}
}
4、获取温度

DS18B20是通过ROM指令进行操作的,下图展示获取温度的一种流程
在这里插入图片描述

/**
 * @brief  获取温度
 * @param  无
 * @return 从DS18B20上读取到的温度值
 * @note   此获取方法为跳过 ROM 读取,适合于总线上只有一个设备
 */
float Ds18b20_Get_Temp(void)
{
	uint8_t tpmsb, tplsb;
	short s_tem;
	float f_tem;
	
	Ds18b20_Reset();	   
	Ds18B20_CheckPulse();	 
	Ds18B20_Write_Byte(SKIP_ROM);				         /* 跳过 ROM */
	Ds18B20_Write_Byte(CONVERT_TEMP);				     /* 开始转换 */
	
	Ds18b20_Reset();	   
	Ds18B20_CheckPulse();	 
	Ds18B20_Write_Byte(SKIP_ROM);				        /* 跳过 ROM */
	Ds18B20_Write_Byte(READ_SCRATCHPAD);				/* 读温度值 */
	
	tplsb = Ds18B20_Read_Byte();		 
	tpmsb = Ds18B20_Read_Byte(); 
	
	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; 	
}

实验现象

在这里插入图片描述

想要完整驱动,查看评论

  • 11
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
### 回答1: STM32HAL可以用来驱动DS18B20温度传感器。DS18B20是一种数字温度传感器,可以通过一根数据线进行通信。以下是使用STM32HAL驱动DS18B20的步骤: 1. 配置GPIO口为输出模式,并将数据线拉低一段时间(至少480us)。 2. 将数据线拉高,等待一段时间(至少60us)。 3. 配置GPIO口为输入模式,并等待DS18B20的响应信号(15-60us内拉低数据线)。 4. DS18B20发送数据,STM32HAL读取数据并进行解析,得到温度值。 5. 关闭总线,将GPIO口配置为输出模式,将数据线拉高。 以上是使用STM32HAL驱动DS18B20的基本步骤,具体实现可以参考STM32HAL的相关文档和示例代码。 ### 回答2: DS18B20是一种数字温度传感器,可通过OneWire总线进行通信。使用STM32HAL中提供的函数可以轻松地驱动DS18B20。 首先,需要在STM32上设置GPIO端口为输出模式,初始化OneWire总线。使用HAL_GPIO_WritePin函数将总线线置为低电平,以开始通信。在总线线为低电平时,发送指令之前应等待至少480微秒。可以使用HAL_Delay函数来实现这个等待。 然后,发送读温度指令,该指令由8个比特组成,其中第一个比特为复位信号,后面的7个比特为功能码0x44。使用HAL_GPIO_WritePin函数将总线线拉到高电平,然后使用HAL_GPIO_ReadPin函数读取总线线的状态。 在发送读温度指令后,DS18B20将在约750毫秒内测量并转换温度,并将其存储在其内部RAM中。可以使用相同的OneWire总线来读取温度数据。 读取温度数据的过程是读取68个比特的数据。先发送读取ROM地址指令(0x33),然后读取DS18B20的ROM信息。发送读取温度数据指令(0x44)后,读取16位数据,其中低8位为温度数据的整数部分,高8位为小数部分。 使用STM32HAL中提供的函数和上述步骤,可以轻松地驱动DS18B20,并从中读取温度数据。当然,代码中应包含错误处理,以确保温度测量过程不会出现问题。 ### 回答3: STM32HAL是针对STM32系列微控制器的一套开发,其中包含了各种外设的驱动,包括DS18B20的驱动DS18B20是一种数字温度传感器,采用1-Wire串行总线进行通信。在使用STM32HAL驱动DS18B20时,需要进行以下步骤: 1. 确定DS18B20连接到STM32的引脚:DS18B20使用单线通信方式,其中引脚包括VDD、GND和DQ(数据线)。DQ需要连接到STM32 GPIO引脚上。 2. 配置STM32 GPIO引脚:使用HAL的GPIO_Init()函数配置STM32的GPIO引脚,使其能够与DS18B20进行通信。设置引脚为输出模式,并将其电平拉高。 3. 发送复位脉冲并读取DS18B20的ROM码:复位脉冲是指在数据总线上产生一个低电平脉冲,用于初始化传感器的状态。复位脉冲需要保持至少480微秒,并在复位结束后读取DS18B20的ROM码。 4. 配置DS18B20的分辨率和触发温度转换:DS18B20的分辨率可以设置为9、10、11或12位,并且DS18B20可以通过读写调节配置寄存器的方式来实现其分辨率设置和触发转换。 5. 发送温度转换指令并读取结果:在触发温度转换之前需要发送一个片选脉冲,然后将指令字节发送到DS18B20。温度转换需要一定的时间,可以使用DS18B20芯片内部的计时功能来检测转换是否完成,并读取温度值。 总之,使用STM32HAL驱动DS18B20需要通过合适的GPIO端口进行传输,进行各种参数的设置,并调用HAL的相关函数来操作DS18B20,最终将温度值反馈到STM32中。通过熟练掌握DS18B20的规格说明书和STM32HAL的API手册,可以很好地完成这项任务。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点灯大师~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值