蓝桥杯嵌入式——扩展板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.嵌入式学习准备)
蓝桥杯嵌入式学习准备 ...
最新文章
- Iterator迭代器
- 我的计算机怎么打不开怎么办理,我的电脑打不开,怎么办【解决方法】
- OpenCV HDF和建立群组Group
- click group list in left launchpad
- php 空模块,tp5.1配置空模块,空方法
- Linux信号实践(1) --Linux信号编程概述
- (08)Vivado时钟约束
- 高通平台 Camera基础
- 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
- Java实现文件传输
- 网络安全技术第六章——第一节计算机病毒及其防治(中毒表现、计算机病毒概述、计算机病毒分类、病毒传播路径、计算机病故防治建议、我之前写过一篇这个,有需要的可以去看一下)
- 安装spinningup填坑ERROR: Could not build wheels for mpi4py which use PEP 517
- 计算机管理 超级用户,Win10如何开启Administrator超级管理员帐户?
- 人文精神、人文教育与高等教育 徐梦秋
- 2015年腾讯阿里实习生招聘面试经历
- TeamViewer远程服务器管理工具使用哪些端口
- DeFi明斯基时刻:压力测试与启示
- 某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架
- android仿微信界面的实现
- [vue+elementUI+echarts]echart折线图展示后台传来的数据
热门文章
- V2X前装量产的现状与挑战 | 车联网百家谈
- USTCOJ1240 黑屋 位运算
- 微信多开PC版微信,无需关闭已经打开的
- Mysql来帮忙:多行合并成一列
- 如何阅读c++源代码
- opencv 分水岭算法详细理论+实践
- ImageFeatures
- igmp组播实验 @yx
- 论文笔记(一):se(3)-TrackNet: Data-driven 6D Pose Tracking by ...... in Synthetic Domains
- 架构 对话架构师:亿级短视频社交美拍架构实战