关键词:
Author:AXYZdong 自动化专业 工科男
有一点思考,有一点想法,有一点理性!
定个小小目标,努力成为习惯!在最美的年华遇见更好的自己!
CSDN@AXYZdong,CSDN首发,AXYZdong原创
唯一博客更新的地址为: 👉 AXYZdong的博客 👈
B站主页为:AXYZdong的个人主页
- 芯片类型:STM32F407VET6
- 开发环境:keil5 MDK
一、DHT11简介
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。
——来自百度百科
- 测量范围:湿度 5~95%RH, 温度 -20~+60℃
- 测量精度:湿度 ±5%RH, 温度 ±2℃
- 供电电压:3.3~5.5V DC
- 输 出:单总线数字信号
- 分辨率:湿度1%RH, 温度0.1℃
关于单总线协议可以查看这篇文章:【STM32】stm32f407 + DS18B20 碰出不一样的火花
二、编程思路
温湿度传感器 DHT11 和 温度传感器 DS18B20 均采用 单总线协议
,因此两者的编程思路很相似,不过 DHT11 增加了湿度的测量。
说明:在移植代码时,注意引脚的变换,选择合适的引脚,本程序中使用 PB5
作为单总线通讯的引脚。如要修改引脚,只需修改头文件中引脚的相关宏定义。
DHT11.h
// =============================================
# @Time : 2021-08-08
# @Author : AXYZdong
# @CSDN : https://axyzdong.blog.csdn.net/
# @FileName: DHT11.h
# @Software: keil5 MDK
// =============================================
#ifndef __DTH11_H
#define __DTH11_H
#include "stm32f4xx.h"
/************************** DS18B20 连接引脚定义********************************/
#define RCC_DHT11 RCC_AHB1Periph_GPIOB
#define DHT11_DQ_GPIO_PORT GPIOB
#define DHT11_DQ_GPIO_PIN GPIO_Pin_5
/************************** DS18B20 函数宏定义********************************/
#define DHT11_DQ_L GPIO_ResetBits ( DHT11_DQ_GPIO_PORT, DHT11_DQ_GPIO_PIN )
#define DHT11_DQ_H GPIO_SetBits ( DHT11_DQ_GPIO_PORT, DHT11_DQ_GPIO_PIN )
/************************** DS18B20 函数声明 ********************************/
void DHT11_Init(void);
u8 DHT11_Read_Data(u8 *temp,u8 *humi);
#endif /* __DS18B20_H */
DHT11.c
// =============================================
# @Time : 2021-08-08
# @Author : AXYZdong
# @CSDN : https://blog.csdn.net/qq_43328313
# @FileName: DHT11.c
# @Software: keil5 MDK
// =============================================
#include "stm32f4xx.h"
#include "dth11.h"
#include "delay.h"
/*******************************************************************************
* 函数名:DHT11_GPIO_Config
* 描述 :配置DHT11用到的I/O口
* 输入 :无
* 输出 :无
*******************************************************************************/
void DHT11_GPIO_Config(void)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_DHT11, ENABLE); /*开启DS18B20对应的GPIO的外设时钟*/
GPIO_InitStructure.GPIO_Pin = DHT11_DQ_GPIO_PIN; /*选择要控制的DS18B20引脚*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; /*设置引脚模式输出模式*/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /*设置引脚的输出类型为推挽输出*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*设置引脚速率为50MHz */
GPIO_Init(DHT11_DQ_GPIO_PORT, &GPIO_InitStructure); /*调用库函数,初始化相应GPIO*/
/*******************************************************************************
* 函数名:DHT11_Mode_Out
* 描述 :使DHT11-DATA引脚变为输出模式
* 输入 :无
* 输出 :无
*******************************************************************************/
static void DHT11_Mode_Out(void)
GPIO_InitTypeDef GPIO_InitStructure;
/*选择要控制的DHT11_DQ_GPIO_PORT引脚*/
GPIO_InitStructure.GPIO_Pin = DHT11_DQ_GPIO_PIN;
/*设置引脚模式输出模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
/*设置引脚的输出类型为推挽输出*/
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化DHT11_DQ_GPIO_PORT*/
GPIO_Init(DHT11_DQ_GPIO_PORT, &GPIO_InitStructure);
/*******************************************************************************
* 函数名:DHT11_Mode_IN
* 描述 :使DHT11-DATA引脚变为输入模式
* 输入 :无
* 输出 :无
*******************************************************************************/
static void DHT11_Mode_IN(void)
GPIO_InitTypeDef GPIO_InitStructure;
/*选择要控制的DS18B20_DQ_GPIO_PORT引脚*/
GPIO_InitStructure.GPIO_Pin = DHT11_DQ_GPIO_PIN;
/*设置引脚模式为浮空输入模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
/*调用库函数,初始化DS18B20_DQ_GPIO_PORT*/
GPIO_Init(DHT11_DQ_GPIO_PORT, &GPIO_InitStructure);
/*******************************************************************************
* 函数名:DHT11_Reset
* 描述 :初始化DHT11
* 输入 :无
* 输出 :无
* 返回值:初始化成功为0,不成功为1
*******************************************************************************/
void DHT11_Reset()
DHT11_Mode_Out(); //SET OUTPUT
DHT11_DQ_L; //DQ=0
delay_ms(20); //拉低至少18ms
DHT11_DQ_H; //DQ=1
delay_us(30); //主机拉高20~40us
u8 DHT11_Check(void)
u8 retry=0;//定义临时变量
DHT11_Mode_IN();//SET INPUT
while ((GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN)==1)&&retry<100)//DHT11会拉低40~80us
retry++;
delay_us(1);
;
if(retry>=100)return 1;
else retry=0;
while ((GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN)==0)&&retry<100)//DHT11拉低后会再次拉高40~80us
retry++;
delay_us(1);
;
if(retry>=100)return 1;
return 0;
//从DHT11读取一个位
//返回值:1/0
u8 DHT11_Read_Bit(void)
u8 retry=0;
while((GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN)==1)&&retry<100)//等待变为低电平
retry++;
delay_us(1);
retry=0;
while((GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN)==0)&&retry<100)//等待变高电平
retry++;
delay_us(1);
delay_us(40);//等待40us
if(GPIO_ReadInputDataBit(DHT11_DQ_GPIO_PORT,DHT11_DQ_GPIO_PIN)==1)
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读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
u8 DHT11_Read_Data(u8 *temp,u8 *humi)
u8 buf[5];
u8 i;
DHT11_Reset();
if(DHT11_Check()==0)
for(i=0;i<5;i++)//读取40位数据
buf[i]=DHT11_Read_Byte();
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
*humi=buf[0];
*temp=buf[2];
else return 1;
return 0;
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
void DHT11_Init(void)
DHT11_GPIO_Config();
DHT11_Reset(); //复位DHT11
DHT11_Check();//等待DHT11的回应
main.c
// =============================================
# @Time : 2021-08-08
# @Author : AXYZdong
# @CSDN : https://axyzdong.blog.csdn.net/
# @FileName: main.c
# @Software: keil5 MDK
// =============================================
#include "stm32f4xx.h"
#include "delay.h"
#include "QDTFT_demo.h"
#include "Lcd_Driver.h"
#include "GUI.h"
#include "dth11.h"
#include "usart.h"
#include "bsp_key.h"
#include "time.h"
u8 wd=0, sd=0;
u8 tab_wd[5],tab_sd[5];
char set_date=28;
char Set_date[5];
int main(void)
SystemInit(); //System init.
delay_init(168);//Delay init.
Lcd_Init();
Lcd_Clear(WHITE);
DHT11_Init();
Debug_USART_Config();
QDTFT_Test_Demo(); //See the test details in QDTFT_Demo.c
while(1)
DHT11_Read_Data(&wd,&sd);
tab_wd[0] = wd/10 + 0x30;
tab_wd[1] = wd%10 + 0x30;
tab_wd[2] = 'C';
tab_sd[0] = sd/10 + 0x30;
tab_sd[1] = sd%10 + 0x30;
tab_sd[2] = '%';
Set_date[0] = set_date/10 + 0x30;
Set_date[1] = set_date%10 + 0x30;
Set_date[2] = 'C';
Gui_DrawFont_GBK16(15,30,RED,WHITE,(u8 *)tab_wd);
Gui_DrawFont_GBK16(15,70,RED,WHITE,(u8 *)tab_sd);
Gui_DrawFont_GBK16(87,90,RED,WHITE,(u8 *)Set_date);
现象:TFT屏幕上显示当前的温度值和湿度值。
三、总结
- DHT11 驱动函数的编写;
- 将温湿度数据存储在数组中,利用相关显示函数将温湿度显示在屏幕上;
- 关于温湿度数据的读取,由于环境中温湿度变化不是很快,可以放在定时器里面读取。(本程序是放在了主函数中读取)
本次的分享就到这里
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “收藏” “关注”
一键三连哦!
更多精彩内容请前往 AXYZdong的博客
如果以上内容有任何错误或者不准确的地方,欢迎在下面 👇 留个言。或者你有更好的想法,欢迎一起交流学习~~~
stm32实例——基于stm32开发板实现传感数据采集-dht11温湿度采集(代码片段)
STM32开发板实现传感数据采集-DHT11温湿度采集一、前言本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等。本项目采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板... 查看详情
stm32实例——基于stm32开发板实现传感数据采集-dht11温湿度采集(代码片段)
STM32开发板实现传感数据采集-DHT11温湿度采集一、前言本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等。本项目采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板... 查看详情
stm32f103ve基于标准库下dht11数据串口打印输出(代码片段)
...-->PB7🎉引脚可以根据需求任意切换。📝主程序代码🔰工程模版采用的是正点原子的工程模版。#includ 查看详情
stm32f407+stemwin学习笔记之stemwin移植(代码片段)
原文链接:http://www.cnblogs.com/NickQ/p/8748011.html 环境:keil5.20 STM32F407ZGT6 LCD(320*240) STemwin:STemWin_Library_V1.1.2准备:STemWIn在裸机上的移植,需要准备STemwin的库( STemwin:STemWin_Library_ 查看详情
stm32f407_led代码(代码片段)
LED #include"led.h"//初始化PF9和PF10为输出口.并使能这两个口的时钟//LEDIO初始化voidLED_Init(void)GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟//GPIOF9,F10初始化设置GPIO 查看详情
stm32+dht11温湿度数据实验-stm32将采集dht11温湿度通过usart1在串口助手打印(代码片段)
...t11.c和dht11.h直接贴在下面,小伙伴可以直接移植到自己的代码中就行了之后会把stm32的两个实验组合起来实现一个简单的室内温度计,温湿度数据显示在oled上,学以致用嘛岂不美哉1#ifndef__DHT11_H2#define__DHT11_H34#include"stm32f10x.h"5#incl... 查看详情
stm32学习笔记①:环境配置及室内温湿度检测(代码片段)
文章目录前言一、项目简介1.项目名称2.项目设计思路3.项目准备软硬件二、项目实施1.BSP工程项目创建2.BSP工程开发3.硬件接线三、项目效果总结前言这是初次接触STM32单片机,作为第一个项目,在此做下笔记一、项目简介... 查看详情
stm32f407开发板用户手册第13章stm32f407启动过程详解(代码片段)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255第13章 STM32F407启动过程详解本章教程主要跟大家讲STM32F407的启动过程,这里的启动过程是指从CPU上电复位执行第1条指令开始(汇编文件)到... 查看详情
stm32f407开发板用户手册第20章stm32f407的gpio应用之无源蜂鸣器(代码片段)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255第20章 STM32F407的GPIO应用之无源蜂鸣器本章教程为大家介绍STM32F407的GPIO应用之无源蜂鸣器,蜂鸣器也是GPIO控制的经典测试例程,可以让大家... 查看详情
stm32f407开发板用户手册第8章stm32f407的终极调试组件eventrecorder(代码片段)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255第8章 STM32F407的终极调试组件EventRecorder本章节为大家介绍终极调试方案EventRecoder,之所以叫终极解决方案,是因为所有Link通吃,支持时间测量,功耗测量,prin... 查看详情
stm32f407开发板用户手册第21章stm32f407的nvic中断分组和配置(重要)(代码片段)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255第21章 STM32F407的NVIC中断分组和配置(重要)本章节为大家讲解STM32F407的中断优先级配置。此章节非常重要,初学者经常在这里犯迷糊,因此... 查看详情
stm32f407第3章threadxusbx协议栈移植到stm32f407(代码片段)
教程更新中:ThreadXUSBX协议栈教程更新记录贴,前5章发布(2021-10-11)-uCOS&uCGUI&emWin&embOS&TouchGFX&ThreadX-硬汉嵌入式论坛-PoweredbyDiscuz!http://www.armbbs.cn/forum.php?mod=viewthread&ti 查看详情
12-开发板接入小五物联实现远程控制(stm32采集温湿度传感器dht11)(代码片段)
采集DHT11温湿度数据,使用stm32f103zet6的GPIOG11引脚读取SHT11数据,通过串口打印采集的温湿度 dht11.c文件:#include"dht11.h"#include"delay.h"//复位DHT11voidDHT11_Rst(void)DHT11_IO_OUT();//SETOUTPUTDHT11_DQ_OUT=0;//拉低DQdelay_ms(20);/ 查看详情
stm32f4hal库开发--stm32f407引脚图
参看:STM32F407ZGT6芯片手册查看,Table6.STM32F40xpinandballdefinitions参看:阿波罗STM32F429开发板IO引脚分配表了解,引脚是怎么分配的。 查看详情
stm32f4hal库开发--stm32f407引脚图
参看:STM32F407ZGT6芯片手册查看,Table6.STM32F40xpinandballdefinitions参看:阿波罗STM32F429开发板IO引脚分配表了解,引脚是怎么分配的。 查看详情
stm32f407开发板用户手册第30章stm32f407的系统bootloader之串口iap固件升级(代码片段)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255第30章 STM32F407的系统bootloader之串口IAP固件升级本章节为大家讲解使用系统bootloader做程序升级的方法,即使不依赖外部boot引脚也可以方便升... 查看详情
基于stm32的温湿度检测案例串口通信屏显示(代码片段)
文章目录前言一、串口通信屏幕二、DHT11测试效果与说明 三、读入数据四、串口及中断配置五、屏幕上显示数据5.1、屏幕内嵌指令5.2、静态数据5.3、动态数据六、效果前言因为stm32f042最小单片机系统外部引脚资源较少,故选... 查看详情
stm32f407的dsp教程第29章stm32f407移植汇编定点fft库(64点,256点和1024点)(代码片段)
完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547第29章 STM32F407移植汇编定点FFT库(64点,256点和1024点)本章主要讲解ST官方汇编FFT库的应用,包括1024点,256点和64点FFT的实现。29.1汇... 查看详情