STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8

目录

一、教程简介

二、驱动理论讲解

三、CubeMX生成底层代码

四、Keil5编写代码

五、实验结果


一、教程简介

        本教程面向初学者,只介绍DS18B20的常用功能,但也能满足大部分的运用需求。跟着本教程操作,可在10分钟内解决DS18b20通信难题。

二、驱动理论讲解

        DS18b20支持多传感器共用一个引脚,但本教程只教使用一个温湿度传感器。使用DS18b20可分为下面两个步骤进行

(一)初始化:

        1、将引脚初始化为推挽输出、上拉。

        2、发送复位脉冲:引脚输出大于480us的低电平复位信号(建议600us),延时600us之后,需将引脚拉高并延时15us。

        3、检测存在脉冲:将引脚设置为上拉输入,并检测低电平到来的时间,若超过100us还没检测到低电平,则初始化失败。检测到低电平后开始计算时间,若低超过240us还没检测到高电平,则初始化失败。

(二)获取温度:

        1、配置单DS18b20模式:重复初始化操作后发送命令:0xCC

        2、发送温度转换命令:发送0x44

        3、配置单DS18b20模式:重复初始化操作后发送命令:0xCC

        4、发送读取命令:发送0xBE

        5、接收两个字节的温度数据

三、CubeMX生成底层代码

1、芯片选择:这里选用STM32F103C8t6

 2、配置Debug模式

3、 配置外部高速时钟

4、 配置时钟速率

5、 配置DS18b20引脚

6、配置串口

7、输出工程文件

四、Keil5编写代码

(一)获取驱动源码

       1、 请添加威信:able078  

       2、 发送信息:获取DS18b20驱动

        我投入了大量时间与精力开发这款驱动,为了能继续提供更优质的驱动资源,获取驱动文件需要付费。

        请相信,免费的未必是最经济的选择,而投资于高质量的资源,往往能带来超乎预期的回报。本驱动有着极高的易用性和兼容性,只需遵循简明教程,几乎可在10分钟内移植成功。可为您节省大量的开发时间。

(二)驱动移植

1、解压完获取到的压缩包后,打开驱动文件,可以看到下面两个驱动文件。

2、打开CubeMX生成的工程文件夹,打开Core文件夹,将ds18b20.c复制到Src文件夹中,将ds18b20.h文件复制到Inc文件夹中。如下图所示:

2、将CubeMX生成的工程在Keil5中打开,按照下图操作:

 

3、调用DS18b20驱动函数

        在main.c中合适的位置处添加 #include "ds18b20.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

#include "ds18b20.h"

/* USER CODE END Includes */

        定义一个浮点型的变量,用于存放温度数据

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

float Temp = 0;

/* USER CODE END PD */

         在main函数中初始化ds18b20

/* Initialize all configured peripherals */
   MX_GPIO_Init();
   MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */

   DS18B20_Init();

/* USER CODE END 2 */

        在while(1)中调用温度读取函数

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		Temp = DS18B20_GetTemp_SkipRom();
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

        编译代码

4、main.c 参考调用代码(将数据通过串口发送到上位机)

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "ds18b20.h"
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
char  Tx_Buf[30] = {0};
float Temp = 0;
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	while(DS18B20_Init())
	{
		HAL_UART_Transmit(&huart1,(uint8_t*)"DS18b20初始化失败\r\n",19,100);
		HAL_Delay(1000);
	}
	HAL_UART_Transmit(&huart1,(uint8_t*)"DS18b20初始化成功\r\n",19,100);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		Temp = DS18B20_GetTemp_SkipRom();
		sprintf(Tx_Buf,"温度:%0.3f \r\n",Temp);
		HAL_UART_Transmit(&huart1,(uint8_t*)Tx_Buf,15,100);
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

五、实验结果

        通过本驱动使用DS18b20测量出来的环境温度,与米家温湿度计测量的结果仅仅相差0.012摄氏度,测量精度非常可观。

 六、特别说明

  • 同学们在操作的过程中遇到的问题可在评论区留言,我看到后会第一时间回复。
  • 想看其他传感器的教程也可在评论区留言,我会按照大家的需求来修改教程内容。
  • 若您觉得本教程对您有所帮助,请点赞、收藏,这是我持续更新的最大动力,感谢您!
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值