您的位置:首页 > 其它

传感器介绍之DHT11

2016-04-04 10:44 204 查看
一.DHT11介绍

DHT11 数字温湿度传感器,如图所示,是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC 测温元件,并与一个高性能8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20 米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。



二.编程分析

DHT11是通过单总线与单片机进行通信的,这样做的好处就是占用资源少,编程实现简单,发送数据的具体格式为 8bit 湿度整数数据+8bit 湿度小数数据+8bi 温度整数数据+8bit 温度小数数据+8bit校验和。主机先要给DHT11发送一个启动新号,等待DHT11做出响应,然后再进行检测温湿度的发送及传输,下面通过一张图来了解一下DHT11的传输过程。





从图上我们可以看出,主机要先把应答线拉低,因为空闲的时候是高状态,然后再次拉高,等待DHT11的响应,也就是等待数据线被拉低,当DHT11准备输出数据时,再把数据线拉低,输出数据给单片机,单片机可以根据高电平时间的长短来判别输出的数据是0还是1,最后在进行校验位的检查,从而成传输。

三.程序

下面给出DHT11读数据的程序

uchar DhtReadByte(void)

{

bit bit_i;

uchar j;

uchar dat=0;

for(j=0;j<8;j++)

{

while(!TRH); // 等待低电平结束

Delay5us(); // 延时 Delay5us();

Delay5us(); Delay5us(); // 延时

Delay5us(); Delay5us();

if(TRH) // 检测数据线是高电平还是低电平

{ bit_i=1; while(TRH); }

else { bit_i=0; }

dat<<=1; // 将该位移位保存到dat变量中

dat|=bit_i; }

return(dat); }

/************** 函数:void ReadTrh(void) --------------------------- 说明:将读取到的温湿度通过串口发送出去 参数: 返回值:读取到的字节内容 ***********/

void ReadTrh(void)

{ uchar check; // 校验字节

uchar TemHig,TemLow,HumiHig,HumiLow;

TRH=0; // 主机拉低18ms DelayMs(18);

TRH=1; // DATA总线由上拉电阻拉高 主机延时20us

Delay5us(); Delay5us(); Delay5us(); Delay5us(); // 主机设为输入 判断从机响应信号

while(!TRH); // 等待DHT 80us的低电平结束

while(TRH); // 等待DHT 80us的高电平结束

HumiHig = DhtReadByte(); // 湿度高8位

HumiLow = DhtReadByte(); // 湿度低8为,总为0

TemHig = DhtReadByte(); // 温度高8位

TemLow = DhtReadByte(); // 温度低8为,总为0

check = DhtReadByte(); // 8位校验码,其值等于读出的四个字节相加之和的低8位 TRH=1; // 释放总线

if(check==HumiHig + HumiLow + TemHig + TemLow) // 如果收到的数据无误

{ Send(TemHig); Send(HumiHig); } }

四.总结

上述程序是从DHT11温湿度传感器读出数并发送给串口值的程序,要学这一类传感器的程序,大家要记得,学会看懂时序图,会用就可以了,需要DHT11的pdf的小伙伴,请留下联系方式或私聊我0.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: