目录
一、教程简介
本教程面向初学者,只介绍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摄氏度,测量精度非常可观。
六、特别说明
- 同学们在操作的过程中遇到的问题可在评论区留言,我看到后会第一时间回复。
- 想看其他传感器的教程也可在评论区留言,我会按照大家的需求来修改教程内容。
- 若您觉得本教程对您有所帮助,请点赞、收藏,这是我持续更新的最大动力,感谢您!