和DS18b20很像,知道数据格式就比较懂了

目录

一. 原理

二. 代码编写

1. dht11.c文件

2. dht.h文件

3. main.c 文件

三. 注意事项

结语


一. 原理

读到的数据是5字节的数据:

1字节湿度整数部分+1字节湿度小数部分+1字节温度整数部分+1字节温度小数部分+1字节校验部分

二. 代码编写

对官方的DHT11驱动文件做适当的修改就行了

1. dht11.c文件

#include "dht11.h"#define Delay_us(X)  delayd((X)*80/5)void delayd(unsigned int n)
{while(n--);
}void DHT11_PIN_OUT(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/**/GPIO_InitStruct.Pin = DHT11_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DHT11_PIN_PORT, &GPIO_InitStruct);
}
void DHT11_PIN_INPUT(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};DHT11_PIN_CLOCK;/**/GPIO_InitStruct.Pin = DHT11_PIN;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(DHT11_PIN_PORT, &GPIO_InitStruct);
}
//复位DHT11
void DHT11_Rst(void)
{DHT11_PIN_OUT();   //设置为输出DHT11_PIN_OUT_L;     //低电平HAL_Delay(20); //拉低至少18msDHT11_PIN_OUT_H;  //高电平Delay_us(60);      //主机拉高20~40us
}//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{u8 re = 0;DHT11_PIN_INPUT();      //设置为输出while (DHT11_PIN_IN && re < 100) //DHT11会拉低40~80us{re++;Delay_us(1);};if(re >= 100)return 1;else re = 0;while (!DHT11_PIN_IN && re < 100) //DHT11拉低后会再次拉高40~80us{re++;Delay_us(1);};if(re >= 100)return 1;return 0;
}//从DHT11读取一个位
u8 DHT11_Read_Bit(void)
{u8 re = 0;while(DHT11_PIN_IN && re < 110) //等待变为低电平{re++;Delay_us(1);}re = 0;while(!DHT11_PIN_IN && re < 110) //等待变高电平{re++;Delay_us(1);}Delay_us(80);//等待40usif(DHT11_PIN_IN)return 1;else return 0;
}//从DHT11读取一个字节
u8 DHT11_Read_Byte(void)
{u8 i, dat;dat = 0;for (i = 0; i < 8; i++){dat <<= 1;dat |= DHT11_Read_Bit();}return dat;
}//从DHT11读取一次数据
u8 DHT11_Read_Data(float *temp, float *humi)
{u8 buf[5];u8 i;DHT11_Rst();if(DHT11_Check() == 0){for(i = 0; i < 5; i++){buf[i] = DHT11_Read_Byte();}if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]){*humi = buf[0]+buf[1]/10.f;*temp = buf[2]+buf[3]/10.f;}}else return 1;return 0;
}//初始化DHT11的IO口,同时检测DHT11的存在u8 DHT11_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};DHT11_PIN_CLOCK;;GPIO_InitStruct.Pin = DHT11_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(DHT11_PIN_PORT, &GPIO_InitStruct);DHT11_Rst();return DHT11_Check();
}

2. dht.h文件

#ifndef __DHT11_H
#define __DHT11_H#include "main.h"#define u8 unsigned char
#define DHT11_PIN_PORT       GPIOA
#define DHT11_PIN        GPIO_PIN_7
#define DHT11_PIN_CLOCK  __HAL_RCC_GPIOA_CLK_ENABLE()
#define DHT11_PIN_OUT_H   HAL_GPIO_WritePin(DHT11_PIN_PORT, DHT11_PIN, GPIO_PIN_SET)
#define DHT11_PIN_OUT_L   HAL_GPIO_WritePin(DHT11_PIN_PORT, DHT11_PIN, GPIO_PIN_RESET)
#define DHT11_PIN_IN      HAL_GPIO_ReadPin(DHT11_PIN_PORT, DHT11_PIN)u8 DHT11_Init(void);//初始化DHT11
u8 DHT11_Read_Data(float *temp, float *humi); //读取温湿度
u8 DHT11_Read_Byte(void);//读出一个字节
u8 DHT11_Read_Bit(void);//读出一个位
u8 DHT11_Check(void);//检测是否存在DHT11
void DHT11_Rst(void);//复位DHT11
#endif

3. main.c 文件

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stdio.h"
#include "lcd.h"
#include "tim.h"
#include "i2c_hal.h"
#include "dht11.h"//模块计时
__IO uint32_t Lcd_uwTick=0;// 温湿度
float   temper ;
float   humi ;/*函数声明------------------------------------------------------------------------------*/
void SystemClock_Config(void);
void lcd(void);/*主函数------------------------------------------------------------------------------*/
int main(void)
{HAL_Init();SystemClock_Config();//系统时钟设置TIM2_Init();//定时器2初始化 100msHAL_TIM_Base_Start_IT(&htim2);//启动定时器2中断工作模式I2CInit();//IIC初始化LCD_Init();//LCD初始化LCD_Clear(Black);//清屏LCD_SetBackColor(Black);//背景颜色LCD_SetTextColor(White);//文本颜色DHT11_Init();while (1){DHT11_Read_Data(&temper, & humi);      //读取温湿度值HAL_Delay(100);}
}
/*常用函数------------------------------------------------------------------------------*/
void lcd()//LCD显示模块
{if (uwTick - Lcd_uwTick < 200) return; Lcd_uwTick = uwTick;//温湿度显示sprintf(a," TH:%5.3f RH:%5.3f  ",temper,humi);LCD_DisplayStringLine(Line0,(unsigned char *)a);}//定时器中断处理
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){lcd();//屏幕显示}
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Configure the main internal regulator output voltage*/HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;RCC_OscInitStruct.PLL.PLLN = 20;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}/** Initializes the peripherals clocks*/PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC12;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_HSE_DIV32;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

三. 注意事项

(1)PA7-HDQ

结语

第一次用DHT11,不太熟悉,小数部分好像最多只有一位

蓝桥杯嵌入式——扩展板DHT11相关推荐

  1. 【STM32G431RBTx】备战蓝桥杯嵌入式→扩展模块→DHT11

    文章目录 前言 一.软件准备 二.DHT11 1.扩展板上模块的原理图以及我们需要配置的元素 2.CubeMx的配置步骤 3.代码修改以及应用 方法1.以移植F103驱动包为方法 ①.在工程中添加大赛 ...

  2. 【蓝桥杯嵌入式】【STM32】14_CT117E_EXA蓝桥杯嵌入式扩展板硬件资源一览及其驱动编写

    文章目录 1.硬件资源一览 2.硬件资源功能 2.1.3 位 7 段共阴数码管 2.2.8 个 ADC 按键 2.3.DS18B20 2.4.DHT11 2.5.LIS302DL 2.6.光敏电阻DO ...

  3. 蓝桥杯嵌入式扩展板学习之数码管

    作者:*wj 数码管 硬件知识 根据电路图可以知道:数码管是根据三个595移位数据锁存器来控制数码管的显示的,并且数码管只有段选没有位选. 1:数码管是共阴数码管(高电平点亮) 2:数码管的断码:0- ...

  4. stm32入门学什么板子_“蓝桥杯”嵌入式stm32开发入门(1)概述

    声明:笔者绝不是给"蓝桥杯"打广告,而是笔者曾经参加过蓝桥杯嵌入式设计与开发比赛,想借此机会总结并分享自己的学习中的点点滴滴. 此系列教程将以蓝桥杯官方指定的开发板和接口板来深入浅 ...

  5. 蓝桥杯嵌入式类比赛经验分享

    第八届蓝桥杯大赛(嵌入式组) 蓝桥杯的嵌入式组是Stm32rbt6单片机的编程比赛,我想对于学习电子信息工程专业的同学这不是一个陌生的名词,如果你是电信专业的大四同学却没有听说过msp430或者stm ...

  6. 蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题

    基于 基于 CT117E 嵌入式竞赛板 嵌入式竞赛板 的 "电子秤"程序设计与调试 赛题硬件框图 由于赛题细节多,赛题PDF要求书放入了附件,链接后续加入.本文主要讲述本届题目的困 ...

  7. 【国信长天蓝桥杯】扩展板⑦ 光敏电阻的使用

    摘要 本文章主要基于国信长天蓝桥杯嵌入式开发板及其扩展板,介绍了扩展板上光敏电阻的使用方法. 硬件原理图 光敏电阻的阻值会随着光照强度的变化而变化,光照越强阻值越小,光线越暗阻值越大. 从上图可以看出 ...

  8. 蓝桥杯嵌入式国赛模块训练之数码管

    文章目录 前言 一.电路原理图 1.共阴极数码管 2.SN74LS595N 3. 扩展板跳线帽连接 二.驱动代码 1.seg.h 2.seg.c 总结 前言 数码管是蓝桥杯嵌入式国赛需准备的第一个模块 ...

  9. 蓝桥杯嵌入式开发经验分享(1.嵌入式学习准备)

                                                                                              蓝桥杯嵌入式学习准备 ...

最新文章

  1. Iterator迭代器
  2. 我的计算机怎么打不开怎么办理,我的电脑打不开,怎么办【解决方法】
  3. OpenCV HDF和建立群组Group
  4. click group list in left launchpad
  5. php 空模块,tp5.1配置空模块,空方法
  6. Linux信号实践(1) --Linux信号编程概述
  7. (08)Vivado时钟约束
  8. 高通平台 Camera基础
  9. 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
  10. Java实现文件传输
  11. 网络安全技术第六章——第一节计算机病毒及其防治(中毒表现、计算机病毒概述、计算机病毒分类、病毒传播路径、计算机病故防治建议、我之前写过一篇这个,有需要的可以去看一下)
  12. 安装spinningup填坑ERROR: Could not build wheels for mpi4py which use PEP 517
  13. 计算机管理 超级用户,Win10如何开启Administrator超级管理员帐户?
  14. 人文精神、人文教育与高等教育 徐梦秋
  15. 2015年腾讯阿里实习生招聘面试经历
  16. TeamViewer远程服务器管理工具使用哪些端口
  17. DeFi明斯基时刻:压力测试与启示
  18. 某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架
  19. android仿微信界面的实现
  20. [vue+elementUI+echarts]echart折线图展示后台传来的数据

热门文章

  1. V2X前装量产的现状与挑战 | 车联网百家谈
  2. USTCOJ1240 黑屋 位运算
  3. 微信多开PC版微信,无需关闭已经打开的
  4. Mysql来帮忙:多行合并成一列
  5. 如何阅读c++源代码
  6. opencv 分水岭算法详细理论+实践
  7. ImageFeatures
  8. igmp组播实验 @yx
  9. 论文笔记(一):se(3)-TrackNet: Data-driven 6D Pose Tracking by ...... in Synthetic Domains
  10. 架构 对话架构师:亿级短视频社交美拍架构实战