和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. 替换某个字符串_postman教程-10-如何在集合中快速查询和替换数据
  2. elementui 搭建布局页面路由_【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局...
  3. 【计算几何】线段相交
  4. JSP小项目,会员管理系统之实现登录功能
  5. tensorrt安装_[深度学习] TensorRT安装
  6. Codeforces Edu Round 68 (Rated for Div. 2)
  7. zabbix告警邮件美化
  8. html5 职工入职后台管理系统_后台管理平台
  9. 如何使用计算机讲解ppt,如何录制PPT讲解视频?
  10. Hadoop——3.x安装部署
  11. 读取assets目录下的文件详细介绍
  12. 踏歌黑名单工具类DEMO(AUB)
  13. Linux驱动之TTY(一):概念
  14. 宝宝树全自动引流脚本软件高质量活跃粉丝
  15. 总线宽度为32bit,时钟频率为200MHz,若总线上每5个时钟周期传送一个32bit的字,则该总线的带宽为 (4) MB/S。...
  16. vim编辑器的简单使用(参考别人文章的学习笔记)
  17. 华为的隐藏功能,你们知道多少?
  18. 智商黑洞(门萨Mensa测试)6
  19. electron-bulider 12 打包出现的问题
  20. 命令执行原理和利用知识点

热门文章

  1. 第14届计算机设计大赛获奖情况,我校学子在第14届中国大学生计算机设计大赛中南赛区再创佳绩...
  2. 思科网络安全 第六章考试答案
  3. FP-growth算法以及代码实现
  4. 关联规则—Apriori、FP-growth/FP-Tree
  5. 【JAVA程序设计】(C00101)基于Servlet的在线鞋店销售管理系统
  6. 不要慌,我有亿点小建议!万字长文
  7. python股票分析之放量跌倒底买入
  8. python 模拟浏览器selenium_从零开始写Python爬虫 --- 3.1 Selenium模拟浏览器
  9. opencv 分水岭算法详细理论+实践
  10. 【windows2008R2问题2】Windows Server® 2008 Enterprise 组件服务 找不到 ”Microsoft Word 97 - 2003 文档“组件...