首页

BASCOM-AVR读取DHT11数字温湿度传感器
(转载请注明出自http://avr.cnta.net,谢谢)

  简介
  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。单线制串行接口,使系统集成变得简易快捷,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

  应用领域
  ►暖通空调   ►测试及检测设备   ►汽车    ►数据记录器   ►消费品    ►自动控制
  ►气象站    ►湿度调节器     ►家电    ►医疗      ►除湿器

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

    


 

  串行接口 (单线双向)
  DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
  一次完整的数据传输为40bit,高位先出。
  数据格式:8bit湿度整数数据+8bit湿度小数数据
       +8bi温度整数数据+8bit温度小数数据
       +8bit校验和

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

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

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

  

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

  

 

  数字1信号表示方法如下图所示:
  

 

  读取数据
  程序使用BASCOM-AVR编制,单片机芯片使用MEGA16,PORTD.6作为数据读取端口,串口输出察看读取的数据。

'-------------------------------------------------------------------------------
'名       称  : DHT11.bas
'目       的  : 读取DHT11数字温湿度传感器
'芯       片  : Mega16
'编 译 环 境  : BASCOM-AVR 1.11.9.5
'熔 丝 说 明  : 外部晶振14.7456M, JTAG禁止
'作       者  : slyt
'网       址  : http://avr.cnta.net
'日       期  : 2010-7-30
'-------------------------------------------------------------------------------

$regfile = "m16def.dat"
$crystal = 14745600
$baud = 115200

Declare Sub Get_wenshidu(wendu As Byte , Shidu As Byte)

Config Serialin = Buffered , Size = 128
Config Serialout = Buffered , Size = 128


Dht_put Alias Portd.6
Dht_get Alias Pind.6
Dht_io_set Alias Ddrd.6

Dim I As Byte , Tmp As Byte
Dim J As Byte
Dim Mybyte As Byte
Dim Wenshi As String * 40
Dim Tmp_str8 As String * 8
Dim Count As Byte

Enable Interrupts

Set Dht_io_set
Set Dht_put

Print
Print "Start......"
Do
   Waitms 1500
   Call Get_wenshidu(i , J)
   Print "温度:" ; I ; "℃"
   Print "湿度:" ; J ; "%"
   Print
Loop


Sub Get_wenshidu(wendu As Byte , Shidu As Byte)
   '一次完整的数据传输为40bit,高位先出。
   '数据格式:8bit湿度整数数据+8bit湿度小数数据
   '         +8bi温度整数数据+8bit温度小数数据
   '         +8bit校验和
   '数据传送正确时校验和数据等于"8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据"所得结果的末8位。
   '当前小数部分用于以后扩展,现读出为零。

   '总线空闲状态为高电平,主机把总线拉低等待DHT11响应,
   '主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号
   Count = 0
   Wenshi = ""                                              '清空字符串
   Set Dht_io_set                                           '设置DATA脚为输出
   Reset Dht_put                                            '总线拉低
   Waitms 20
   'DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.
   '主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,
   '主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高。
   '总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,
   '准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。

   Set Dht_put                                              '总线拉高
   Waitus 40
   Reset Dht_io_set                                         '切换到输入模式
   Waitus 40                                                '等待40us,检测总线是否为低电平
   If Dht_get = 1 Then                                      '若为高电平,DHT没有响应,退出子程序
      Shidu = 255                                           '湿度赋值255,作为主程序判断标记
      Exit Sub
   End If

   Waitus 80                                                '等待80us,检测总线是否为高电平
   If Dht_get = 0 Then                                      '若为低电平,DHT没有响应,退出子程序
      Shidu = 255                                           '湿度赋值255,作为无输出数据判断标记
      Exit Sub
   End If

   While Dht_get = 1 : Wend                                 '等待总线80us低电平结束,准备接收数据

   Do
      While Dht_get = 0 : Wend                              '等待总线50us低电平时隙结束
      '数字0信号表示方法为总线拉高26-28us
      '数字1信号表示方法为总线拉高70us
      Waitus 30                                             '等待30us,若总线为高,表示为数字1,反之为0
      If Dht_get = 1 Then
         Wenshi = Wenshi + "1"
         While Dht_get = 1 : Wend                           '等待总线高电平结束
         Else
         Wenshi = Wenshi + "0"
      End If
      Incr Count
   Loop Until Count = 40

   Set Dht_io_set                                           '切换到输出模式
   Set Dht_put                                              '总线拉高

   '取湿度值
   Tmp_str8 = Left(wenshi , 8)
   Shidu = Binval(tmp_str8)

   '取温度值
   Tmp_str8 = Mid(wenshi , 17 , 8)
   Wendu = Binval(tmp_str8)

   '取校验值
   Tmp_str8 = Right(wenshi , 8)
   Tmp = Binval(tmp_str8)

   Mybyte = Wendu + Shidu
   If Mybyte <> Tmp Then                                    '判断校验字节
      Shidu = 255                                           '湿度赋值255,作为无输出数据判断标记
   End If
End Sub

  DHT11规格书.PDF 

 

 goto1480@163.com