DHT11是数字的湿度传感器....6元一个买的...与它的通信方式类似于I2C总线通信.

04T_8RO0M$_1CNF@@YZ%ZDJ

image

串行数据一次返回40位.

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

如果模块离芯片距离近,建议在数据线接一5k电阻上拉.

时序图如下:

image

第一次拉低要求至少18ms,之后拉高20-40us,之后DHT拉低80us后再拉高80us..之后进入数据阶段.每个数据,0,1以高电平的时间长短区分.0数据高电平时间为26-28us,1为70us..不论1或者0,之前都先输出50us的低电平..数据传输完成后拉高总线.

在此次的程序中用P2.1作为信息口.

程序如下

#include <msp430x14x.h>
#define HIGH P2OUT|=BIT1;
#define LOW P2OUT&=~BIT1;
void DelayNus(int n)
{
    CCR0 = n;
    TACTL |= MC_1;           //增计数到CCR0
    while(!(TACTL & BIT0));   //等待
    TACTL &= ~MC_1;          //停止计数
    TACTL &= ~BIT0;          //清除中断标志
}
char receive(void)               //接受函数
{
  char tem,cnt=0;                      //临时变量用于存储接受数据
  while(cnt<8)
  {
  while(!(P2IN&BIT1));              //等待50us的低电平结束
  DelayNus(45); 
  if(P2IN&BIT1)                       //长于30us定义为1
  {
    tem++;                      
    tem<<=1;
    while(P2IN&BIT1);             //结束高电平
  }
  else
  {
    tem<<=1;
  }
  if(cnt!=7)
    while(!(P2IN&BIT1));              //最后一次给函数返回留下时间
  cnt++;
  }
  return tem;
}

int main( void )
{
  int i;
  char temph,templ,humdh,humdl,check,cal;
  WDTCTL=WDTPW+WDTHOLD;
  _DINT();
  BCSCTL1&=~XT2OFF;
  do
  {
    IFG1&=~OFIFG;
    for(i=0xff;i>0;i--);
  }
  while(IFG1&OFIFG);
  _EINT();
  BCSCTL2|=SELM_2+SELS;            //SMCLK 8分频
  P2DIR|=BIT1;
  P2OUT|=BIT1;
  TACTL|=TASSEL_2+ID_3;
  //inited
  LOW;
  DelayNus(18000);
  HIGH;
  DelayNus(30);
  P2DIR&=~BIT1; 
  while(P2IN&BIT1);
  while(!(P2IN&BIT1));
  while(P2IN&BIT1);
  //Data comes 
  humdh=receive();
  humdl=receive();
  temph=receive();
  templ=receive();
  check=receive();
  cal=humdh+humdl+temph+templ;
  if(check==cal)
  {
    LPM0;
  }
 
 
  return 0;
}