stm32stm32f407+dht11(代码片段)

AXYZdong AXYZdong     2023-02-18     670

关键词:

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汇... 查看详情