8107|7

452

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

梦之旅同学EZ430系列学习笔记和智能家居系统项目之DHT11 [复制链接]

  虽然之前有同学传了DHT11的程序,但我发现那个程序不好用,呵呵,我的在那时候也调通了,然后现在我参考下那位同学程序,优化了一下相关结构,传下我的DHT11,也说下我的DHT11开发经历,今天上传三章,呵呵,今天这项目算完结了,多谢大家关心。这个具有两个指示灯,初始化成功后会点亮红色指示灯,然后采集一次数据点亮闪烁一次绿色指示灯。

  首先说下DHT11的简介吧。

  DHT11是一款数字温湿度传感器,它有以下优点

   ►相对湿度和温度测量

   ►全部校准,数字输出

   ►卓越的长期稳定性

   ►无需额外部件

   ►超长的信号传输距离

   ►超低能耗

   ►4 引脚安装    

   ►完全互换

1.DHT11产品概述

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

 

应用领域

暖通空调          测试及检测设备

汽车              数据记录器

消费品            自动控制

气象站              家电

湿度调节器      医疗

除湿器

  本文采用它来作为一个智能家居系统中的温湿度传感装置。

2、     2.接口说明  

 建议连接线长度短于20时用5K上拉电阻,大于20时根据实际情况使用合适的上拉电阻

 

3 电源引脚

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

4、串行接口  (单线双向)

DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:

一次完整的数据传输为40bit,高位先出。

数据格式:8bit湿度整数数据+8bit湿度小数数据

+8bi温度整数数据+8bit温度小数数据

         +8bit校验和

数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。

用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据.从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。

1.通讯过程如图1所示

总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。

总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。

               

数字0信号表示方法如图4所示

数字1信号表示方法.如图5所示

介绍完DHT11后,上传我写的程序,由于没有时间,这个弄的比较简单,希望大家见谅,以后有必要再进行更改,另外我把程序写在一个文件夹里,是为了方便大家浏览,我平时写程序不是这样的,呵呵。

#include "msp430x22x4.h"
#include"stdio.h"
#define DHT11_OUTPUT   P2DIR|=BIT0
#define DHT11_INPUT   P2DIR&=~BIT0
#define DHT11_H   P2OUT|=BIT0
#define DHT11_L   P2OUT&=~BIT0
#define DHT11_IN   (P2IN&BIT0)
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CPU          (16000000)
#define delay_us(x)   (__delay_cycles((double)x*CPU/1000000.0))
#define delay_ms(x)   (__delay_cycles((double)x*CPU/1000.0))
 
uchar start_DHT11(void);
uchar DHT11_ReadChar(void);
void dht11(void);
uchar DHT11T_Data_H, DHT11T_Data_L, DHT11RH_Data_H, DHT11RH_Data_L,CheckData_temp;

void put(uchar *x)
{
  while(*x)
  {
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready? 
    UCA0TXBUF=*x;
    x++;
  }
}
void putc(char *x)
{
  while(*x)
  {
    while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready? 
    UCA0TXBUF=*x;
    x++;
  }
}
void wellcome()
{
 put("*************************************\n");
 put("********   hello,eeworld!   ********\n");
 put("********   this is mengzhilv!    ********\n");
 put("********  Copyright @ 2011   ********\n");
 put("*************************************\n\n");
 delay_ms(10);
}

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 = CALBC1_16MHZ;                    // Set DCO
  DCOCTL = CALDCO_16MHZ;
  P1DIR |=BIT0;
  P1OUT &=~BIT0;
  P1DIR |=BIT1;
  P1OUT &=~BIT1;
  P3SEL = 0x30;                             // P3.4,5 = USCI_A0 TXD/RXD
  P3DIR |=BIT4;                             //P3.4为输出方向
  //Baud rate divider with 1MHz = 1MHz/9600 = ~104.2
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 0x82;                            // 16MHz 9600
  UCA0BR1 = 0x06;                              // 16MHz 9600
  UCA0MCTL = UCBRS1;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  delay_us(100);
  wellcome();
  put("**********DHT11 TEST**********\n");
  delay_ms(1000);
 
 while(1)
  {
  dht11();
  }
}
uchar start_DHT11(void)
{
uchar TData_H_temp,TData_L_temp,RHData_H_temp,RHData_L_temp,checktemp;
uchar  presence,flag;
 uint count;
 DHT11_OUTPUT;
 DHT11_L;    //拉低18ms以上
 delay_ms(20);
 DHT11_H;
 DHT11_INPUT;
 delay_us(40);
 presence=DHT11_IN;
 if(!presence)
 {
   count=2;
   while((!DHT11_IN)&&count++);//等待低电平
   count=2;
   while((DHT11_IN)&&count++);//等待高电平
      RHData_H_temp = DHT11_ReadChar();
      RHData_L_temp = DHT11_ReadChar();
      TData_H_temp = DHT11_ReadChar();
      TData_L_temp = DHT11_ReadChar();
      CheckData_temp = DHT11_ReadChar();
      DHT11_OUTPUT;
      DHT11_H;
      checktemp = (RHData_H_temp + RHData_L_temp + TData_H_temp + TData_L_temp);
      if (checktemp == CheckData_temp) {
         DHT11RH_Data_H = RHData_H_temp;
         DHT11RH_Data_L = RHData_L_temp;
         DHT11T_Data_H = TData_H_temp;
         DHT11T_Data_L = TData_L_temp;
         flag=1;
      }
   }
   P1OUT |=BIT0;
   return flag;
}
uchar DHT11_ReadChar(void)
{
  unsigned char dat;
   unsigned int count;     //计数防止死等
   unsigned char i;
   for(i=0;i<8;i++)
   {
      count=2;
      while((!DHT11_IN)&&count++);     //等待50us低电平结束 
     delay_us(40); //40us
      dat <<= 1;        //50us低电平+28us高电平表示'0'
      if(DHT11_IN)    //50us低电平+70us高电平表示'1'
         dat |= 1;
      count=2;
      while((DHT11_IN)&&count++);
      if(count==1)      //超时则跳出for循环
         break;
   }
   return dat;  
}
void dht11()
{
char c[40];
uchar o;
o=start_DHT11();
P1OUT |=BIT1;
delay_ms(300);
P1OUT &=~BIT1;
delay_ms(300);
if (o)
      {
        put("DHT11 EXIST AND ACQUIRE SUCCESSFUL!\n");
        delay_ms(10);
  sprintf(c, "%d.%d %d.%d %d\r\n",DHT11RH_Data_H,DHT11RH_Data_L,DHT11T_Data_H,DHT11T_Data_L,CheckData_temp);
  putc(c); 
      }

}

[ 本帖最后由 梦之旅 于 2011-5-30 14:24 编辑 ]

最新回复

用CC编译怎么又错呢,我是用G2553d的  详情 回复 发表于 2014-6-20 21:06
 
点赞 关注
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/

回复
举报

283

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
你速度啊  这两天忙呢  没时间搞啊   7号过后就有时间了
 
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
不知谁用过DHT11没,哈哈,我用的时候小数位数总是0,从来没有有过数的时候,用lm3s811调也一样,51也一样,可能是DHT11这样子的,后面小数虚标的,呵呵。

点评

dht11手册上有写小数点后都是零。  详情 回复 发表于 2013-3-14 23:56
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

4
 

回复 沙发 TopMars 的帖子

我也没用什么时间,就昨天下午,包括上位机,呵呵之前看了一下别人帖子,我星期天12点半前都上班,呵呵。
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

5
 
收藏了,谢谢楼主啊,正在找这个
 
 
 

回复

6366

帖子

4912

TA的资源

版主

6
 
很详细,感谢分享
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(初级)

7
 

回复 板凳 梦之旅 的帖子

dht11手册上有写小数点后都是零。
 
 
 

回复

47

帖子

1

TA的资源

一粒金砂(中级)

8
 
用CC编译怎么又错呢,我是用G2553d的
 
个人签名自我主导
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表