目录
一、教程简介
二、驱动理论讲解
三、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、ds18b20.c 代码
2、ds18b20.h 代码
- #ifndef __DS18B20_H
- #define __DS18B20_H
- /* 包含头文件 ----------------------------------------------------------------*/
- #include "main.h"
- /* 引脚操作函数宏定义 --------------------------------------------------------*/
- #define DS18B20_Dout_LOW() HAL_GPIO_WritePin(DS18b20_GPIO_Port,DS18b20_Pin,GPIO_PIN_RESET)
- #define DS18B20_Dout_HIGH() HAL_GPIO_WritePin(DS18b20_GPIO_Port,DS18b20_Pin,GPIO_PIN_SET)
- #define DS18B20_Data_IN() HAL_GPIO_ReadPin(DS18b20_GPIO_Port,DS18b20_Pin)
- /* 函数声明 ------------------------------------------------------------------*/
- void DS18B20_Rst(void);
- void DS18B20_SkipRom(void);
- void DS18B20_Mode_IPU(void);
- void DS18B20_Mode_Out_PP(void);
- void DS18B20_WriteByte(uint8_t dat);
- void DS18B20_Delay(__IO uint32_t delay);
- float DS18B20_GetTemp_SkipRom(void);
- uint8_t DS18B20_Init(void);
- uint8_t DS18B20_ReadBit(void);
- uint8_t DS18B20_Presence(void);
- uint8_t DS18B20_ReadByte(void);
- #endif
复制代码 3、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摄氏度,丈量精度非常可观。
六、特别说明
- 同学们在操作的过程中遇到的问题可在评论区留言,我看到后会第一时间回复。
- 想看其他传感器的教程也可在评论区留言,我会按照大家的需求来修改教程内容。
- 若您以为本教程对您有所帮助,请点赞、收藏,这是我持续更新的最大动力,感谢您!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |