蓝桥杯嵌入式——扩展板DHT11
和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>© 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相关推荐
- 【STM32G431RBTx】备战蓝桥杯嵌入式→扩展模块→DHT11
文章目录 前言 一.软件准备 二.DHT11 1.扩展板上模块的原理图以及我们需要配置的元素 2.CubeMx的配置步骤 3.代码修改以及应用 方法1.以移植F103驱动包为方法 ①.在工程中添加大赛 ...
- 【蓝桥杯嵌入式】【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 ...
- 蓝桥杯嵌入式扩展板学习之数码管
作者:*wj 数码管 硬件知识 根据电路图可以知道:数码管是根据三个595移位数据锁存器来控制数码管的显示的,并且数码管只有段选没有位选. 1:数码管是共阴数码管(高电平点亮) 2:数码管的断码:0- ...
- stm32入门学什么板子_“蓝桥杯”嵌入式stm32开发入门(1)概述
声明:笔者绝不是给"蓝桥杯"打广告,而是笔者曾经参加过蓝桥杯嵌入式设计与开发比赛,想借此机会总结并分享自己的学习中的点点滴滴. 此系列教程将以蓝桥杯官方指定的开发板和接口板来深入浅 ...
- 蓝桥杯嵌入式类比赛经验分享
第八届蓝桥杯大赛(嵌入式组) 蓝桥杯的嵌入式组是Stm32rbt6单片机的编程比赛,我想对于学习电子信息工程专业的同学这不是一个陌生的名词,如果你是电信专业的大四同学却没有听说过msp430或者stm ...
- 蓝桥杯嵌入式CT117E硬件开发平台经验分享11 | 第九届蓝桥杯国赛题
基于 基于 CT117E 嵌入式竞赛板 嵌入式竞赛板 的 "电子秤"程序设计与调试 赛题硬件框图 由于赛题细节多,赛题PDF要求书放入了附件,链接后续加入.本文主要讲述本届题目的困 ...
- 【国信长天蓝桥杯】扩展板⑦ 光敏电阻的使用
摘要 本文章主要基于国信长天蓝桥杯嵌入式开发板及其扩展板,介绍了扩展板上光敏电阻的使用方法. 硬件原理图 光敏电阻的阻值会随着光照强度的变化而变化,光照越强阻值越小,光线越暗阻值越大. 从上图可以看出 ...
- 蓝桥杯嵌入式国赛模块训练之数码管
文章目录 前言 一.电路原理图 1.共阴极数码管 2.SN74LS595N 3. 扩展板跳线帽连接 二.驱动代码 1.seg.h 2.seg.c 总结 前言 数码管是蓝桥杯嵌入式国赛需准备的第一个模块 ...
- 蓝桥杯嵌入式开发经验分享(1.嵌入式学习准备)
蓝桥杯嵌入式学习准备 ...
最新文章
- 替换某个字符串_postman教程-10-如何在集合中快速查询和替换数据
- elementui 搭建布局页面路由_【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局...
- 【计算几何】线段相交
- JSP小项目,会员管理系统之实现登录功能
- tensorrt安装_[深度学习] TensorRT安装
- Codeforces Edu Round 68 (Rated for Div. 2)
- zabbix告警邮件美化
- html5 职工入职后台管理系统_后台管理平台
- 如何使用计算机讲解ppt,如何录制PPT讲解视频?
- Hadoop——3.x安装部署
- 读取assets目录下的文件详细介绍
- 踏歌黑名单工具类DEMO(AUB)
- Linux驱动之TTY(一):概念
- 宝宝树全自动引流脚本软件高质量活跃粉丝
- 总线宽度为32bit,时钟频率为200MHz,若总线上每5个时钟周期传送一个32bit的字,则该总线的带宽为 (4) MB/S。...
- vim编辑器的简单使用(参考别人文章的学习笔记)
- 华为的隐藏功能,你们知道多少?
- 智商黑洞(门萨Mensa测试)6
- electron-bulider 12 打包出现的问题
- 命令执行原理和利用知识点
热门文章
- 第14届计算机设计大赛获奖情况,我校学子在第14届中国大学生计算机设计大赛中南赛区再创佳绩...
- 思科网络安全 第六章考试答案
- FP-growth算法以及代码实现
- 关联规则—Apriori、FP-growth/FP-Tree
- 【JAVA程序设计】(C00101)基于Servlet的在线鞋店销售管理系统
- 不要慌,我有亿点小建议!万字长文
- python股票分析之放量跌倒底买入
- python 模拟浏览器selenium_从零开始写Python爬虫 --- 3.1 Selenium模拟浏览器
- opencv 分水岭算法详细理论+实践
- 【windows2008R2问题2】Windows Server® 2008 Enterprise 组件服务 找不到 ”Microsoft Word 97 - 2003 文档“组件...