zoukankan      html  css  js  c++  java
  • 传感器介绍之DHT11

    一.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

  • 相关阅读:
    Daily Scrum (2015/10/28)
    Dailu Scrum (2015/10/27)
    wenbao与cmd
    wenbao与IIS
    wenbao与模板
    wenbao与git
    wenbao与vscode
    wenbao与矩阵
    wenbao与面试题
    wenbao 与将linux系统(kali)装入U盘
  • 原文地址:https://www.cnblogs.com/sjsxk/p/5351525.html
Copyright © 2011-2022 走看看