(STM32F103单片机)DHT11温湿度传感器

这篇具有很好参考价值的文章主要介绍了(STM32F103单片机)DHT11温湿度传感器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 

一,产品介绍

二,产品亮点

三,产品参数

四,引脚连接及通信说明

 五,原理讲解

六,源码

1,DHR11.C

2.DHR11.H

3,main.c


一,产品介绍

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包 括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。

二,产品亮点

成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的信号传输距离、数字信号输出、精确校准。 (STM32F103单片机)DHT11温湿度传感器

三,产品参数

(STM32F103单片机)DHT11温湿度传感器(STM32F103单片机)DHT11温湿度传感器

四,引脚连接及通信说明

引脚说明
1、VDD供电3.3~5.5VDC
2、DATA串行数据,单总线
3、NC空脚
4、GND接地,电源负极
◎单总线说明
DHT11器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许
设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约 4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主
机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。
◎单总线传送数据位定义
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先出。
◎数据格式
8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位。
注:其中湿度小数部分为0。
◎校验位数据定义
“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”8bit校验 位等于所得结果的末8位。

 五,原理讲解

(STM32F103单片机)DHT11温湿度传感器

 (STM32F103单片机)DHT11温湿度传感器

DHT11编码步骤:

一. 单片机上点后1s内不读取(不重要)

二. 主机(单片机)发送起始信号:

1.主机先拉高data。

2.拉低data延迟18ms。(大于18小于30ms)

3.拉高data(通过此操作将单片机引脚设置为输入)。图2

三. 从机(DHT11)收到起始信号后进行应答:

 从机拉低data,主机读取到data线被拉低持续83us后从机拉高data线, 持续87us,直到高电平结束,意味着主机可以开始接受数据。                   图3

四. 主机开始接收数据:

1.主机先把data线拉高(io设置为输入)。

2.从机把data线拉低,主机读取data线电平,直到低电平结束(大约50us)

  从机拉高data线后,延迟40us左右(28~70us之间)主机再次读取data线电平,如果为低电平,则为“0”,如果为高电平,则为“1”。

(DTH11.C中有一部分u8 DHT11_receive_bit(void)获得一个字节过程所得格式0或1,是通过从机信号高电平的持续时长判断的,如果60us之后任然为高电平则为格式1,反之为格式0)                                                                                             图4.2

3.继续重复上述1,2步骤累计40次。

五. data线拉低50us代表读取结束

(STM32F103单片机)DHT11温湿度传感器
图2
(STM32F103单片机)DHT11温湿度传感器
图3
(STM32F103单片机)DHT11温湿度传感器
图4

六,源码

1,DHR11.C

  1. #include "DHT11.h"
    #include "delay.h"
    #include "usart.h"
    
    u8 receive_R_dat[10];//¶¨ÒåÒ»¸öÊý¾Ý×é
    u8 receive_T_dat[10];//¶¨ÒåÒ»¸öÊý¾Ý×é
    
    void DHT11_Init(void)  //´«¸ÐÆ÷³õʼ»¯
    {
    
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);	//ʹÄÜGPIO_EʱÖÓ
    	
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PE.12
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;	//ͨÓÃÍÆÍìÊä³ö
      GPIO_Init(GPIOE, &GPIO_InitStructure);//³õʼ»¯GPIOE12
    }
    
    void DHT11_Start(void)  //·¢ËÍÆðʼÐźÅ
    	
    {
    	GPIO_SetBits(GPIOE,GPIO_Pin_12);
    	delay_us(10);  //À­¸ßµçƽµÈ´ý
    	GPIO_ResetBits(GPIOE,GPIO_Pin_12);
    	delay_ms(25);  //µÍµçƽ±£³Öʱ¼ä²»Ð¡ÓÚ18MS²»´óÓÚ30MS
    	GPIO_SetBits(GPIOE,GPIO_Pin_12);
    	delay_us(30); //À­¸ßµçƽ·¢ËÍÆðʼÐźÅ
    	
    }
    
    u8 DHT11_receive_bit(void)  //´«¸ÐÆ÷·µ»ØÏìÓ¦Ðźš£½ÓÊÕÒ»¸ö×Ö½Ú
    { 
    	u8 i,dat=0;
    	GPIO_ResetBits(GPIOE,GPIO_Pin_12); //À­¸ß
    	delay_us(81); 
    	GPIO_SetBits(GPIOE,GPIO_Pin_12); //À­µÍ
    	delay_us(85);
    	//¿ªÊ¼×¼±¸·¢ËÍÊý¾Ý
    	for(i=0;i<8;i++)
    	{
    		PEout(12)=0; //À­µÍ³ÖÐø83US
    		delay_us(50);
    		PEout(12)=1; //À­¸ß³ÖÐø
    		delay_us(60);
    		dat<<=1;
    		if(PEout(12)==1) //Èç¹û¸ßµçƽʱ¼ä³¬¹ý60us¡£Îª¡±1¡°×´Ì¬
    			dat+=1;
    		
    		while(PEout(12));
    	}
    	return dat; //·µ»ØÊý¾Ý
    }
    
    void DHT11_receive_dat(void)
    {
    	u8 R_H,R_L,T_H,T_L,RH,RL,TH,TL,Checkout;
    	
    	DHT11_Start();//¿ªÊ¼ÆðʼÏìÓ¦¡£½ÓÊÕ40λÊý¾Ý
    	
    	if(PEout(12)==0)
    	{
    		while(PEout(12)==0); //µÈ´ýÀ­¸ß
    		delay_us(80); //À­¸ßºóÑÓʱ80us
    		R_H=DHT11_receive_bit();
    		R_L=DHT11_receive_bit();
    		T_L=DHT11_receive_bit();
    		T_L=DHT11_receive_bit();
    		Checkout=DHT11_receive_bit();
    		
    		delay_us (50);
    			
    	}
    	/*УÑéÊý¾Ý*/
    	if((R_H+R_L+T_H+T_L)==Checkout)
    	{
    		R_H=RH;
    		R_L=RL;
    		T_H=TH;
    		T_L=TL;	
    	}
    	
    	/*Êý¾Ý´¦Àí*/
    
    	receive_R_dat[1]=RH/10+0x30;
    	receive_R_dat[2]=RH%10+0x30;
    	receive_R_dat[3]='.';
    	receive_R_dat[4]=RL/10+0x30;
    	receive_R_dat[5]=RL%10+0x30;
    	receive_R_dat[6]='%';
    	
    
    	receive_T_dat[1]=TH/10+0x30;
    	receive_T_dat[2]=TH%10+0x30;
    	receive_T_dat[3]='.';
    	receive_T_dat[4]=TL/10+0X30;
    	receive_T_dat[5]=TL%10+0X30;
    	receive_T_dat[6]='^';
    	receive_T_dat[7]='C';	
    	
    
    	
    	printf ("Humidity:\r\n");
    	MyUSART_SendArr(receive_R_dat,7);
    	printf("\r\n");
    	printf ("Temperture:\r\n");
    	MyUSART_SendArr(receive_T_dat,8);
    	printf("\r\n");
    }
    
    
    

2.DHR11.H

#ifndef __DHT11_H
#define __DHT11_H

#include "stm32f10x.h"

void DHT11_Init(void); //´«¸ÐÆ÷³õʼ»¯

void DHT11_Start(void);  //·¢ËÍÆðʼÐźÅ
u8 DHT11_receive_bit(void) ; //´«¸ÐÆ÷·µ»ØÏìÓ¦Ðźš£½ÓÊÕÒ»¸ö×Ö½Ú
void DHT11_receive_dat(void);//µÃµ½Êý¾Ý×é

extern u8 receive_R_dat[10];//¶¨ÒåÒ»¸öÊý¾Ý×é
extern u8 receive_T_dat[10];//¶¨ÒåÒ»¸öÊý¾Ý×é

#endif




3,main.c

#include "sys.h"
#include "DHT11.h"
#include "usart.h"
#include "delay.h"
 



 int main(void)
 {	
//	u8 receive_R_dat[10];//¶¨ÒåÒ»¸öÊý¾Ý×é
//	u8 receive_T_dat[10];//¶¨ÒåÒ»¸öÊý¾Ý×é	 
	delay_init();	    	 //ÑÓʱº¯Êý³õʼ»¯	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
	uart_init(115200);	 //´®¿Ú³õʼ»¯Îª115200
	DHT11_Init() ;   //ÎÂʪ¶È´«¸ÐÆ÷³õʼ»¯
	printf("温湿度传感器初始化成功:\r\n");
	

	while(1)
	{
		DHT11_receive_dat();
		delay_ms (10000);
	}
 }

/*注释*/

receive_R_dat[1]=RH/10+0x30;    二进制转换十进制
    receive_R_dat[2]=RH%10+0x30;
    receive_R_dat[3]='.';
    receive_R_dat[4]=RL/10+0x30;
    receive_R_dat[5]=RL%10+0x30;
    receive_R_dat[6]='%';
    

    receive_T_dat[1]=TH/10+0x30;
    receive_T_dat[2]=TH%10+0x30;
    receive_T_dat[3]='.';
    receive_T_dat[4]=TL/10+0X30;
    receive_T_dat[5]=TL%10+0X30;
    receive_T_dat[6]='^';
    receive_T_dat[7]='C';    

/*计算*/

00110101+00000000+00011000+00000100=01010001
接收数据正确:
湿度:00110101(整数)=35H=53%RH
           00000000(小数)=00H=0.0%RH=>53%RH+0.0%RH=53.0%RH
温度:00011000(整数)=18H=24℃
           00000100(小数)=04H=0.4℃=>24℃+0.4℃=24.4℃

最后,欢迎各位指正,互相交流互相学习 文章来源地址https://www.toymoban.com/news/detail-403725.html

到了这里,关于(STM32F103单片机)DHT11温湿度传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机】STM32单片机的各个定时器的定时中断程序,标准库,STM32F103

    高级定时器和普通定时器的区别(https://zhuanlan.zhihu.com/p/557896041): TIM1是高级定时器,使用的时钟总线是RCC_APB2Periph_TIM1,和普通定时器不一样。 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用 timer.c timer.h 调用

    2024年02月07日
    浏览(23)
  • 【单片机】STM32单片机,定时器的输入捕获,基于捕获的频率计,STM32F103

    下面的定时器都具有输入捕获能力: 查看另一篇文章:https://qq742971636.blog.csdn.net/article/details/131471539 外部计数频率计的缺点:需要两个定时器配合,最高能测量的频率是否有限制我没具体尝试。 基于捕获的频率计的缺点:最高能测量的频率有限制。 TIM3_CH1 PWM PA6 10KHZ。 输入

    2024年02月14日
    浏览(23)
  • STM32F103ZE单片机呼吸灯源代码

    本实验采用的系统频率SYSTIM为8MHZ,如果频率改变需要修改一个数值

    2024年02月09日
    浏览(25)
  • JDY-31蓝牙模块远程控制STM32F103单片机

       手机app通过蓝牙模块发送指令实时控制单片机的外设功能,比如发送衣柜开关门指令(舵机旋转),衣架上升降落(步进电机正转反转),远程开启去污除湿功能(继电器控制打开关闭小风扇+加热片)。 本次例子:手机APP连接蓝牙模块远程控制SG90舵机正转(0-180°)和反

    2024年02月01日
    浏览(27)
  • 86、基于STM32单片机的温湿度DHT11 MQ-2烟雾火灾报警器蓝牙物联网设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案                     二、设计功能 三、实物图 四、原理图 五、硬件框图 六、流程图 七、程序源码   八、资料包括 随着社会和经济的发展,防火工作越来越重要,但是目前国内的许多研发都侧重

    2024年02月06日
    浏览(21)
  • 【单片机】STM32单片机,RTC实时时钟,STM32F103C8T6,程序,万年历,数字时钟

    我以STM32F103C8T6为例,但STM32F103的RTC是通用的,STM32F103C8T6有一个原理图: https://qq742971636.blog.csdn.net/article/details/131288390 用纽扣电池给VBAT供电(要共地),即可实现掉电后依旧走时的能力。 主要特性(来源于STM32中文参考手册V10.pdf): 记得加标准库文件: 串口接收:

    2024年02月11日
    浏览(20)
  • 【单片机】STM32单片机频率计程序,外部脉冲计数程序,基于脉冲计数的频率计程序,STM32F103

    两种方法用于在单片机中实现频率计的功能。 第一种方法是通过定时器来衡量信号的周期,然后将周期转换为频率。在这种方法中,你可以使用单片机的定时器模块来测量输入信号的周期,定时器会产生一个计数值,你可以根据这个计数值来推算出输入信号的周期,并通过简

    2024年02月11日
    浏览(23)
  • STM32F103单片机控制继电器开关小风扇和加热片

       在智能衣柜中,使用异味传感器检测柜内异味值,当异味值大于设定值时会自动开启小风扇,小风扇起到一个排污去浊的功能,再加上温湿度传感器检测柜内的温度和湿度,当温湿度达到设定值时,加热片自动发热,起到一个降温除霉的作用。想要使小风扇和加热片自动

    2024年02月02日
    浏览(28)
  • 【单片机】STM32F103C8T6 最小系统板原理图

    STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,由STMicroelectronics(ST)公司生产。它是STMicroelectronics的STM32系列微控制器中的一员,被广泛应用于嵌入式系统和电子设备中。 STM32F103C8T6单片机的主要特点和资源包括: 内存资源: Flash存储器:64 KB SRAM(静态随机访问存储器

    2024年02月12日
    浏览(17)
  • stm32F103单片机pwm控制伺服驱动器进而控制步进电机

    1.需要一台步进电机,私服驱动器,stm32单片机;先按照说明文档,连接好硬件相关线路,对应好sign+,sign-,puls+,puls-线路,其中sign只是个io口拉高拉低操作,puls是pwm波形输出口,虽然有两根线,但只是需要控制一个IO口输出波形即可; 采用主从模式,TIM1为主定时器,tim3未从定

    2024年02月04日
    浏览(18)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包