8.1  DHT11简单介绍

实物图如图所示,从左往右依次是 VDD、DATA、NC、GND。

简介

DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。

注意事项:

1.数据“0”和数据“1”不是指高低电平,而是指电平的时间长短,时间短是数据“0”,时间长是数据“1”。

2.上拉电阻.由原理图可知DHT11的DATA接口接了一个上拉电阻,这里接的是一个10K的上拉电阻,因为在空闲状态时总线需要进入高电平,而大部分的单片机引脚的上拉能力不够,如果线路较长或者时间长,会有很大的寄生电容,从而变成RC充放电,会使高电平或低电平的时间变长,当高低电平时间不符合DHT11的时序后,数据就会出现错误。

3.DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可以增加一个100nF 的电容,用以去耦滤波。

4.DHT11检测到的湿度受温度的影响,在测量湿度时,应尽量在同一温度下。我们在演示的时候是用手按住DHT11,当手的温度比较高的时候,湿度会快速上升,那这个湿度并不是当时环境的湿度,只是为了方便演示,体现一些功能。

8.2  DHT11驱动程序

dht11.c

/**********************************
包含头文件
**********************************/
#include "dht11.h"
/****
*******DHT11延时函数 
*****/
void delay_dht11(uint i)
{
	while(i--);
}
/****
*******从DHT11读取一个字节函数
*******返回值:读到的数据
*****/
uchar DHT11_Read_Byte(void)    
{        
  uchar i,retry,dat=0;
	for (i=0;i<8;i++) 
	{
		dat<<=1;
		while(DHT11_DQ_OUT == 0);//等待50us低电平过去
		delay_dht11(3);						//延时30us
		if(DHT11_DQ_OUT)
			dat |= 0x01;
		retry=0;
		while(DHT11_DQ_OUT&&retry<100)//等待变为低电平 12-14us 开始
		{
			retry++;
			_nop_();
		}
	}
	return dat;
}

/****
*******从DHT11读取一次数据函数
*******参量定义:	temp:温度值(范围:0~50°)
*******           humi:湿度值(范围:20%~95%)
*******返回值:0:正常; 1:读取失败
*****/
uchar Dht11_Get_Temp_Humi_Value(uint *temp,uint *humi)
{        
 	uchar buf[5];
	uchar i;
	DHT11_DQ_OUT=0; 	//拉低DQ
	usleep(21);    	//拉低至少18ms
	DHT11_DQ_OUT=1; 	//DQ=1 
	delay_dht11(4);
	if(DHT11_DQ_OUT == 0)
	{
		while(DHT11_DQ_OUT == 0);//等待80us的低电平过去
		while(DHT11_DQ_OUT == 1);//等待80us的高电平过去
		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]*10+buf[1];
			*temp=buf[2]*10+buf[3];
		}
		else
			return 1;
  }
	else
		return 1;
	return 0;	    
}

dht11.h

#ifndef _DHT11_H_
#define _DHT11_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit DHT11_DQ_OUT=P2^0;																				//DQ数据引脚P1.3
/**********************************
函数声明
**********************************/
uchar Dht11_Get_Temp_Humi_Value(uint *temp,uint *humi);	//从DHT11读取一次数据函数
#endif

8.3  DHT11获取温湿度

/**********************************
函数名: main
传递参数:无
返回参数:无
函数作用:主函数
**********************************/
void main(void)
{
  lcd1602_init();
  lcd1602_clear();
  while(1) 
  {
      //从DHT11读取一次数据函数
    Dht11_Get_Temp_Humi_Value(&temp,&humi);				
    sprintf(dis_buf,"Temp:%.1f",temp/10.0);
		lcd1602_show_string(0,0,dis_buf);
    //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
    lcd1602_write_data(0xdf);	
    //显示"C"符号,0x43是液晶屏字符库里大写C的地址码    
    lcd1602_write_data(0x43);
    sprintf(dis_buf,"Humi:%.1f%%",humi/10.0);
    lcd1602_show_string(0,1,dis_buf);
  }
}

 

发表回复

后才能评论