精华内容
下载资源
问答
  • 主机发送一个大于18ms的低电平给DHT11作为启动信号。 然后拉高20-40us后读DHT11响应信号。 发开始信号 DHT11_IO_OUT(); //SET OUTPUT DHT11_OUT_LOW(); //拉低DQ delay_ms(5); //拉低至少18ms delay_ms(5); ...

    一、引脚说明

    在这里插入图片描述

    二、时序解读

    2.1、通信过程

    在这里插入图片描述

    2.2、开始信号

    主机发送一个大于18ms的低电平给DHT11作为启动信号。
    然后拉高20-40us后读DHT11响应信号。
    在这里插入图片描述
    发开始信号

    	DHT11_IO_OUT(); 	//SET OUTPUT
        DHT11_OUT_LOW(); 	//拉低DQ
        delay_ms(5);    	//拉低至少18ms
        delay_ms(5);
        delay_ms(5);
        delay_ms(5);
        DHT11_OUT_HIGH(); 	//DQ=1 
    	delay_us(30);     	//主机拉高20~40us
    

    2.3、响应信号

    DHT11检测到开始信号后,会等待开始信号结束,然后发送响应信号
    响应信号为一个80us的低电平
    响应信号发送后,会拉高80us,然后发送数据。
    在这里插入图片描述
    读响应信号

    	DHT11_IO_IN();//SET INPUT	 
        while (DHT11_IN_LEVEL() == 0 && retry<100)//DHT11会拉低80us
    	{
    		retry++;
    		delay_us(1);
    	};	 
    	if(retry>=100)return 0;
    	else retry=0;
    

    2.4、一位数据的表示

    一个位数据总是从50us的低电平开始,高电平持续时间不同表示0和1

    2.4.1、数字0信号

    高电平持续26-28us表示0
    在这里插入图片描述

    2.4.2、数字1信号

    高电平持续70us表示0
    在这里插入图片描述

    2.4.3、读取一位数据

    低电平结束后,延时大于28us(小于28+50us,要在下一个高电平来之前读取数据),主机读取当前电平,读到高电平表示DHT11发送数据1,读到低电平表示DHT11发送数据0

    	while(DHT11_IN_LEVEL())//等待变为低电平
    	{
    
    	}
     
    	while(!DHT11_IN_LEVEL())//等待变高电平
    	{
    
    	}
    	delay_us(40);//等待40us
    	return DHT11_IN_LEVEL();   
    

    三、树莓派4B内核驱动代码(部分代码)

    使用GPIO25

    
    #define delay_us(x) udelay(x);
    #define delay_ms(x) mdelay(x);
    
    #define DHT11_IO_OUT() *GPFSEL2 &= ~(0x6 << 15);\
                            *GPFSEL2 |= (0x1 << 15);
    
    #define DHT11_IO_IN() *GPFSEL2 &= ~(0x7 << 15);\
                            *GPFSEL2 |= (0x0 << 15); 
    
    #define DHT11_OUT_HIGH() *GPSET0 = 1 << 25; 
    #define DHT11_OUT_LOW() *GPCLR0 = 1 << 25;  
    
    #define DHT11_IN_LEVEL() ((*GPLEV0>>25) & 1)
    
    
    static unsigned char DHT11_Read_Bit(void) 			 
    {
    
    	while(DHT11_IN_LEVEL())//等待变为低电平
    	{
    
    	}
     
    	while(!DHT11_IN_LEVEL())//等待变高电平
    	{
    
    	}
    	delay_us(40);//等待40us
    	return DHT11_IN_LEVEL();   
    }
    
    //从DHT11读取一个字节
    static unsigned char DHT11_Read_Byte(void)    
    {        
        unsigned char i,dat;
        dat=0;
    	for (i=0;i<8;i++) 
    	{
       		dat<<=1; 
    	    dat|=DHT11_Read_Bit();
        }						    
        return dat;
    }
    
    static unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)    
    {        
     	unsigned char buf[5];
    	unsigned char i;
        unsigned char retry=0;
    
    	DHT11_IO_OUT(); 	//SET OUTPUT
        DHT11_OUT_LOW(); 	//拉低DQ
        delay_ms(5);    	//拉低至少18ms
        delay_ms(5);
        delay_ms(5);
        delay_ms(5);
        DHT11_OUT_HIGH(); 	//DQ=1 
    	delay_us(30);     	//主机拉高20~40us
    
    	
    	DHT11_IO_IN();//SET INPUT	 
        while (DHT11_IN_LEVEL() == 0 && retry<100)//DHT11会拉低80us
    	{
    		retry++;
    		delay_us(1);
    	};	 
    	if(retry>=100)return 0;
    	else retry=0;
    
    	if(retry==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 0;
    	return 1;	    
    }
    
    
    
    

    四、测试代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main()
    {
        char data[2];
        int nread = 0;
    
        int fd = open("/dev/dht11",O_RDWR);
        if(fd == -1){
            perror("open ");
            exit(-1);
        }
    
        while(1){
            getchar();
            nread = read(fd,data,2);
            printf("nread :%d  temp=%d humi=%d\n",nread,data[0],data[1]);
        }
        
    
    
    }
    

    DHT11 Linux内核驱动完整代码(树莓派4B)

    展开全文
  • DHT11中文数据手测 并具有C语言程序
  • DHT11数据手册,国产温湿度传感器,价格较便宜,相对于sht11.
  • 本资源包括温湿度传感器DHT11的Proteus仿真文件,Keil源代码,DHT11数据手册等。。
  • 的温湿度复合型传感器,为 DHT11 的升级产品。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有较高的可靠性与 卓越的长期稳定性。 DHT12 具有单总线和标准 I 2 C 两种通讯,且单总线通讯方式完 全兼容...
  • stm32获取DHT11模块温湿度数值原理解析 stm32单片机如何从DHT11获取到温湿度的呢? 首先可以通过DHT11手册了解一下DHT11模块,掌握该温湿度模块的通讯过程 ...

    stm32获取DHT11模块温湿度数据原理解析

    stm32单片机如何从DHT11获取到温湿度的呢?
    首先可以通过DHT11手册了解一下DHT11模块,掌握该温湿度模块的通讯过程在这里插入图片描述
    简单分析stm32与模块建立通讯的过程:通过高低电平的持续时间和切换来控制模块开始采集和传输数据。
    首先了解如何控制该模块,分析时序图:
    在这里插入图片描述
    假设连接该模块的引脚为A,那么与模块建立通讯需按照一下步骤:
    1.A为输出模式并且输出低电平持续大于等于18ms(根据图中主机至少拉低18ms)
    2.A输出高电平持续20-40μs(图示主机拉高20-40μs)
    3.A改变为输入模式并且接收到DHT响应信号80μs(图中DHT响应信号80μs)
    4.A接收到高电平持续80μs,为DHT11发送的响应信号(图中DHT拉高80μs)

    与DHT11模块建立通讯完成。


    接下来主要解析如何接收DHT11温湿度模块返回的温湿度数据
    阅读DTH11手册得知,该模块温湿度数据传输为40bit,高位先出,传输格式如下:

    8bit湿度整数数据+8bit湿度小数数据
    +8bi温度整数数据+8bit温度小数数据
    +8bit校验和

    那么如何传输这40bit的数据呢?

    建立通讯后,模块进入高速模式,并且触发一次数据采集,送出40bit的数据

    40bit数据以二进制的形式通过波形传播

    该模块会返回两种波形,一种波形代表数字 0 ,另一种代表数字 1 ,一共返回 40 个波形,每个波形代表一位二进制数( 0 或 1 ),每 8 个波形为一组,一共五组,每一组组成一个 8 位的二进制数分别代表湿度整数部分、小数部分 和 温度整数部分、小数部分,最后是校验和

    接下来看下返回的两种波形
    图一,表示数字 0,图二表示数字 1 ,如下图所示


    图一:
    在这里插入图片描述


    图二:在这里插入图片描述


    对原理有一定的了解之后
    就可以根据温湿度模块输出的波形进行解码得到温湿度数据
    初始化配置代码就不一一列出了

    主要编写的是如何对模块返回的波形进行解码,最后得到温湿度数据

    经过引脚的高低电平和输入输出模式转换后

    模块返回波形,以下为解码波形的核心代码(仅适用于理解)

    假设PG9引脚与该模块连接,完成通讯后处于输入模式

    
    uint8_t p[5]//定义一个数组用于存储温湿度数据
    uint32_t t=0;		//定义变量t用于超时处理的时间计算
    int32_t i=0,j=0;	//定义变量 i j 用于逻辑预算
    uint8_t d=0;		//定义变量 d 用于波形转二进制数的解码运算
    uint8_t check_sum=0;//用于数据检验
    
    
    //接收五个字节
    for(j=0; j<5; j++)
    {
    	d=0;
    	//每个字节由八位二进制数字组成
    	for(i=7; i>=0; i--)
    	{
    		//测量低电平持续的时间,添加超时处理
    		t=0;
    		while(PGin(9)==0)
    		{
    			t++;
    			delay_us(1);	
    			//需编写延时函数,延时100μs			
    			if(t >=100)  
    			{
    				return -1;
    			}			   
    		}	
    					
    		//延时40us
    		delay_us(40);
    		
    		//判断是否由高电平产生
    		if(PGin(9))
    		{
    			d|=1<<i;			
    			//测量高电平持续的时间,添加超时处理
    			t=0;
    			while(PGin(9))
    			{
    				t++;
    				delay_us(1);	
    				if(t >=100)
    				{
    					return -2;
    				}		   
    			}		
    		}		
    	}
    	p[j]=d;
    }
    
    //延时100us,通信结束
    delay_us(100);
    
    //进行数据校验
    check_sum=p[0]+p[1]+p[2]+p[3];
    
    
    展开全文
  • 温湿度传感器DHT11数据处理

    万次阅读 2011-12-08 18:35:22
    这几天弄了两片DHT11温湿度传感器,令人蛋疼的数据让我忙了整整一天。现在终于明白了。 数据手册上说是40bit的数据流:8bit湿度整数部+8bit湿度小数部分+8bit温度整数部分+8bit温度小数部分+8bit校验和 检验和=8...

    这几天弄了两片DHT11温湿度传感器,令人蛋疼的数据让我忙了整整一天。现在终于明白了。

    数据手册上说是40bit的数据流:8bit湿度整数部+8bit湿度小数部分+8bit温度整数部分+8bit温度小数部分+8bit校验和

    检验和=8bit湿度整数+8bit湿度小数+8bit温度整数+8bit温度小数

    我数学学得不是多好,所以涉及到数制的转换就很不明白

    将温度和湿度的数据进行拼接在转换成十进制数,截取小数点即可

    例:

    unsigned char temp_h=0x32,temp_l=0x00;

    unsigned int temp=0;

    temp=temp_h<<8+temp_l;

    temp/1000为整数部分,

    temp%1000为小数部分,

    故,该手册中的整数和小数的用法很容易引起误解,并且没有具体的计算公式,让我这样的人,无从下手了。



    展开全文
  • 温湿度DHT11

    2018-12-20 22:17:34
    有关DHT11的相关代码和原理图,数据手册,IAR的相关工程
  • DHT11和DHT22使用区别(基于STM32)

    千次阅读 2020-10-15 14:14:52
    温湿度模块DHT11和DHT22区别介绍DHT系列区别起始信号代码实现:数据处理代码实现调试问题DHT22读取失败实现代码 介绍 温湿度模块DHT11和DHT22小项目用得比较多,虽然二者均是1-wire协议,但是细节部分还是有所差异。1...

    介绍

    温湿度模块DHT11和DHT22小项目用得比较多,虽然二者均是1-wire协议,但是细节部分还是有所差异。1-wire协议我就不多介绍了,网上很详细。这里着重介绍二者使用的区别。

    DHT11
    DHT11
    DHT22

    在这里插入图片描述

    DHT系列区别

    DHT11和DHT22

    芯片手册
    提取:hgew

    起始信号

    DHT11

    在这里插入图片描述

    在这里插入图片描述

    DHT22

    在这里插入图片描述
    在这里插入图片描述

    显然DHT11拉低要>18ms,而DHT22拉低只要>1ms就足够。

    代码实现

    /*
     * 一次完整的数据传输为40bit,高位先出
     * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 
     */
    uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
    {  
    	/*输出模式*/
    	DHT11_Mode_Out_PP();
    	/*主机拉低*/
    	DHT11_Dout_0;
    	
    	/*延时18ms*/
    	DHT11_DELAY_MS(18); //dht11
    	//DHT11_DELAY_MS(2); //dht22
    	
    	/*总线拉高 主机延时30us*/
    	DHT11_Dout_1; 
    
    	DHT11_DELAY_US(30);   //延时30us
    
    	/*主机设为输入 判断从机响应信号*/ 
    	DHT11_Mode_IPU();
    
    	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
    	if(DHT11_Dout_IN()==Bit_RESET)     
    	{
    		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
    		while(DHT11_Dout_IN()==Bit_RESET);
    
    		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
    		while(DHT11_Dout_IN()==Bit_SET);
    
    		/*开始接收数据*/   
    		DHT11_Data->humi_int= DHT11_ReadByte();
    
    		DHT11_Data->humi_deci= DHT11_ReadByte();
    
    		DHT11_Data->temp_int= DHT11_ReadByte();
    
    		DHT11_Data->temp_deci= DHT11_ReadByte();
    
    		DHT11_Data->check_sum= DHT11_ReadByte();
    
    
    		/*读取结束,引脚改为输出模式*/
    		DHT11_Mode_Out_PP();
    		/*主机拉高*/
    		DHT11_Dout_1;
    
    		/*检查读取的数据是否正确*/
    		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
    			return SUCCESS;
    		else 
    			return ERROR;
    	}
    	
    	else
    		return ERROR;
    	
    }
    

    13行 DHT11_DELAY_MS(18); 14行 DHT11_DELAY_MS(2); //DHT11时,延时18ms;DHT22时,延时1ms(建议2ms,经测试1ms有可能读取失败)

    数据处理

    DHT11

    在这里插入图片描述
    在这里插入图片描述

    DHT22

    在这里插入图片描述
    在这里插入图片描述

    代码实现

    /*
     * 一次完整的数据传输为40bit,高位先出
     * 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和 
     */
    uint8_t DHT11_Read_TempAndHumidity(DHT11_Data_TypeDef *DHT11_Data)
    {  
    	uint32_t humi=0;
    	uint32_t temp =0;
    	
    	/*输出模式*/
    	DHT11_Mode_Out_PP();
    	/*主机拉低*/
    	DHT11_Dout_0;
    	/*延时2ms*/
    	DHT11_DELAY_MS(2);
    
    	/*总线拉高 主机延时30us*/
    	DHT11_Dout_1; 
    
    	DHT11_DELAY_US(30);   //延时30us
    
    	/*主机设为输入 判断从机响应信号*/ 
    	DHT11_Mode_IPU();
    
    	/*判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行*/   
    	if(DHT11_Dout_IN()==Bit_RESET)     
    	{
    		/*轮询直到从机发出 的80us 低电平 响应信号结束*/  
    		while(DHT11_Dout_IN()==Bit_RESET);
    
    		/*轮询直到从机发出的 80us 高电平 标置信号结束*/
    		while(DHT11_Dout_IN()==Bit_SET);
    
    		/*开始接收数据,需要修改的计算方式跟dht11不同*/   
    		DHT11_Data->humi_int= DHT11_ReadByte();
    
    		DHT11_Data->humi_deci= DHT11_ReadByte();
    
    		DHT11_Data->temp_int= DHT11_ReadByte();
    
    		DHT11_Data->temp_deci= DHT11_ReadByte();
    
    		DHT11_Data->check_sum= DHT11_ReadByte();
    
    
    		/*读取结束,引脚改为输出模式*/
    		DHT11_Mode_Out_PP();
    		/*主机拉高*/
    		DHT11_Dout_1;
    
    		/*检查读取的数据是否正确*/
    		if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci)
    		{	/*----------------------------------数据处理-----------------------*/
    			/*----------------DHT22温湿度16bit精度,故需要分高低字节计算,且需要uint32_t变量装载---------------------*/
    			/*-----------------------------湿度和温度的高八位需要乘以256再加上低八位---------------------------------*/
    			humi = DHT11_Data->humi_int *256 + DHT11_Data->humi_deci;
    			temp = DHT11_Data->temp_int *256 + DHT11_Data->temp_deci;
    			
    			
    			DHT11_Data->humi_int = (uint8_t)(humi*0.1);
    			DHT11_Data->humi_deci = humi%10;
    			
    			DHT11_Data->temp_int = (uint8_t)(temp*0.1);
    			DHT11_Data->humi_deci = temp%10;
    			
    			return SUCCESS;
    		}
    		else 
    			return ERROR;
    	}
    	
    	else
    		return ERROR;
    	
    }
    

    此处并没有错,我的程序通过改变宏定义即可切换dht11或dht22测量。所以函数名称没改回来。

    调试问题

    DHT22读取失败

    1.主机拉低发送起始信号延时1ms时会读取失败,但延时2ms能完美解决问题。
    2.两次数据读取时间过短,建议大于2s。

    实现代码

    代码地址

    展开全文
  • dht11这个传感器也是非常古老的一个温湿度传感器了,基础课程部分我还是用它来介绍。 我们要实现的目标 前面我们实现了在数码管上显示数字和时间,那么这节课我们计划读取温湿度传感器上面的温度,湿度数据,显示在...
  • DHT11温湿度传感器编程思路以及代码的实现

    万次阅读 多人点赞 2018-07-25 11:11:31
    在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推荐大家刚开始练习的时候使用DHT11来练习。 推荐的原因: ...那么在使用传感器前,我们必须要先看数据手册,并不需要全...
  • 初次接触DHT11温度传感器

    千次阅读 多人点赞 2020-06-17 21:20:55
    一、首先找到DHT11的官方手册 (可以选择技新网http://www.jixin.pro) 二、了解DHT11 1、单总线结构 2、引脚说明:GND、VCC、空脚、数据引脚DATA (其中数据引脚既可以接收数据,又可以发送数据) 3、时序图 三、...
  • 文章目录实验内容实验器件实验连线实验步骤实验代码实验结果 ...DHT11温湿度传感器 X 1 USB数据烧写线 X 1 面包板 x 1 杜邦线 X 10 实验连线 ESP8266 Arduino 3v3 3.3V GND GND EN 3.3V RX TX TX RX
  • 一、相关介绍 DHT11介绍: DHT11是一款比较便宜的温湿度传感器模块。读取数据只需要占用一个IO口。... DHT11数据手册可以看这里:http://wenku.baidu.com/view/1955cc70a417866fb84a8e7b.htm...
  • 树莓派实现dht11温湿度传感器

    千次阅读 2020-09-17 09:10:56
    使用一种传感器,一定会用到他的数据手册dht11温湿度传感器也不例外,但并不需要全部浏览,我们只需要看他重要的点。 如: DHT11引脚说明 传感器性能说明 接口说明 数据格式(重要) 这里主要记录如何读取数据...
  • 一、相关介绍 DHT11介绍: ...DHT11数据手册可以看这里:http://wenku.baidu.com/view/1955cc70a417866fb84a8e7b.html 需要注意的是,文档中写明一句话:小数部分用于扩展,现只能读出0。所以小数...
  • 基于温度湿度一体的传感器DHT11 以下是在51单片机上测试成功的代码 #include #include<intrins.h>//加上这句下面的 _nop_();就能用 bit xianshiqiehuan; // sbit dht11_dat=P1^6; //开发板用 sbit dht11_...
  • 基于CC2530的DHT11实现

    千次阅读 2020-04-21 19:35:41
    DHT11官方数据手册,建议电路连接方式: 在zigbee模块上的原理图上显示,DATA(数据线)接CC2530的P0_6引脚 单总线时序: 起始信号: 响应信号(DHT11拉低data(P0_6)线80us): ‘0’值的表示,高电平...
  • DHT11驱动(STM32)

    千次阅读 2019-01-13 21:08:05
    数据手册。需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 dht11.h #ifndef __DHT11_H__ #define __DHT11_H__ #include &quot;stm32f10x.h&quot; ...
  • 温湿度传感器DHT11模块模块软硬件技术资料+STM32单片机软件工程源码: 1-i_MX_RT系列配套程序 1-STM32系列配套程序 2-参考资料_数据手册 DHT11与各开发板引脚连接说明 DHT11引脚说明.png
  • 下面的代码以详细注释DHT11的通信过程,想了解更多可看其数据手册 #include <iocc2530.h> #include <stdio.h> #include <string.h> #define DATA_PIN P0_0 // DHT11 的数据引脚 typedef ...
  • 本文借鉴自_Line_大佬:...DHT11官方手册来自:http://www.aosong.com/products-21.html 修改为串口输出温湿度数据: #include<reg51.h> #include<intrins.h> #define uchar...

空空如也

空空如也

1 2 3 4
收藏数 61
精华内容 24
关键字:

dht11数据手册