undefined
+
  • undefined

温湿度模块DHT21

温湿度模块DHT21产品是采用高稳定性电容式感湿元件作为传感元件,经过微处理器采集处理转化成数字信号输出。每一个传感器都经过标定校准和测试。具有长期稳定、可靠性高、 精度高、低功耗等特点。 温湿度模块DHT21具有以下特点:1、数字输出,单总线协议,通信距离支持100米;2、超低功耗;3、0-100%相对湿度测量范围; 4、全标定、温漂校准。5、使用独立感湿元器件,稳定性好,抗污染能力强。

所属分类:

温湿度露点传感器系列

关键词:

温湿度模块DHT21


立即咨询
X

获取免费报价


To: 公司名称


操作
我想要更多的细节。 产品要求: 定制: 交货时间: 支付: 船运: 用法:
((最多5个文件。支持jpg, jpeg, png, gif, txt, doc, pdf, xls, docx, xlsx, 小于5MB))

联系方式和可选详细信息

立即发送询价

邮箱表格代码在这里html元素里面,如果使用,请删除提示以及html。以免出现质检不通过情况。

产品手册

温湿度模块

DHT21产品手册

产品概述

本产品是采用高稳定性电容式感湿元件作为传感元件,经过微处理器采集处理转化成数字信号输出。每一个传感器都经过标定校准和测试。具有长期稳定、可靠性高、 精度高、低功耗等特点。

尺寸图

单位:mm(±0.5)

\\主机-pc\市场部\产品图片\数字温湿度模块DHT11 新款\新款DHT11 DHT21 DHT22尺寸图.jpg新款DHT11 DHT21 DHT22尺寸图

三、产品特点

DHT21数字温湿度模块具有以下特点:

1、数字输出,单总线协议,通信距离支持100米;

2、超低功耗;

3、0-100%相对湿度测量范围;

4、全标定、温漂校准。

5、使用独立感湿元器件,稳定性好,抗污染能力强

四、性能特征

相对湿度 温度

参数

条件

最小

典型

最大

单位

分辨率

   

0.1

 

%RH

量程范围

 

0

 

99.9

%RH

精度

25℃

 

±3

 

%RH

重复性

   

±0.1

   

响应时间

1/e(63%)

 

<8

 

S

迟滞

   

±0.5

   

漂移

典型值

 

<3

 

%RH/r

参数

条件

最小

典型

最大

单位

分辨率

   

0.1

 

工作范围

 

-40

 

80

精度

   

±0.5

 

重复性

   

±0.2

 

响应时间

1/e(63%)

1

   

S

迟滞

   

±0.1

   

漂移

典型值

 

<0.2

 

℃/r

 

表2

表1

图2

图1

电气特性

参数

条件

最小

典型

最大

单位

供电电压VDD

 

2.8

3.3

5.5

V

供电电流

休眠模式

 

0.2

 

uA

测量模式

 

500

 

uA

采样周期

   

2.0

 

S

低电平输出电压

Io<4mA

0

 

250

mV

高电平输出电压

Rp<25kΩ

80%

 

100%

VDD

低电平输入电压

下降沿

0%

 

20%

VDD

高电平输入电压

上升沿

80%

 

100%

VDD

输出电流

On

   

4

mA

三态门(Off)

 

10

20

μA

表3 Io表示低电平输出电流 Rp代表上拉电阻

用户指南

1、 引脚分配

引脚

名称

描述

1

VDD

电源 2.8~5.5V

2

SDA

串行数据,双向口

3

NC

NC

4

GND

 

表4 引脚分配

1.1、电源引脚(VDD GND)

本产品的供电电压为2.8~5.5V,建议供电电压为3.3V。

1.2、串行数据(SDA)

SDA为数据口,三态结构,SDA在SCK时钟下降沿之后改变状态,并仅在SCK上升沿有效

2、通信协议

DHT21为了精确测量气体的湿度,减少温度对测量的影响,DHT21传感器在非工作期间,自动转为休眠模式,以降低传感器自身的发热对周围气体湿度的影响。DHT21采用被动式工作模式,即主机通过指令唤醒传感器后,传感器才开始测量、应答等动作。通讯结束后,传感器进入休眠状态。

2.1、DHT21连接图

图4 单总线通讯连接图

注:上拉电阻一般建议采用10KΩ电阻,传感器与主机传输距离超过10米,建议用5.1KΩ

2.2、单总线接口时序

参数

符号

最小

典型

最大

单位

时序长度

tSLOT

60

 

120

us

恢复时间

tREC

1

5

 

us

写0低电平时间

tLOW0

60

60

120

us

写1低电平时间

tLOW1

1

5

15

us

读数据有效时间

tRDV

 

5

15

us

复位低电平时间

tRSTL

480

960

 

us

应答高电平时间

tPDHIGH

15

30

60

us

应答低电平时间

tPDLOW

60

115

240

us

单总线写0时序

单总线写1时序

单总线读取时序

单总线复位时序

应答

读取湿度校准数A、B

CCDDH

触发温湿度测量

CC10H

读取转化结果

CCBDH

时序说明:(详细请参考程序例程附件)

每一帧时序长度为60us。每次数据通信前使用单总线复位时序,同步时序。

紧接着监测应答信号。

发送指令0xCCDD 获取湿度校准数据A、B

发送指令0xCC10 触发温湿度转化。耗时约30ms

发送指令0xCCBD 获取温湿度转化结果。

客户同样可以无需等待读取,则此时读取的为上次触发转化的温湿度数据。

温度、相对湿度转换

通过上面两种方式可以获得16bit温度原始数据St、16bit湿度原始数据Sh

最终带入下面公式

温度(℃):

 

湿度(%RH):

 

RHrel = RH + 0.25*(T - 25.0) (注: 温漂1℃为 -0.25%RH)

 

注: RH限定在0~100, if(RH>100) RH=100;

Else if(RH<0) RH=0;

(1)循环冗余校验(CRC)计算

u8 CRC8MHT_Cal(u8 *serial, u8 length)

{

u8 result = 0x00;

u8 pDataBuf;

u8 i;

while(length--) {

pDataBuf = *serial++;

for(i=0; i<8; i++) {

if((result^(pDataBuf))&0x01){

result ^= 0x18;

result >>= 1;

result |= 0x80;

}

else {

result >>= 1;

}

pDataBuf >>= 1;

}

}

return result;

}

应用信息

1、工作条件

确保传感器性能正常稳定的工作,建议使用温度范围-40℃-80℃,湿度范围0-99.9%RH。超出建议的范围可能导致测量结果暂时性漂移。

2、存储条件与恢复

湿度传感器为环境敏感型电子元器件,需要仔细防护。长期暴露在高浓度的化学蒸汽中将会致使传感器的测量产生漂移。因此建议将传感器存放于原包装内,并符合存储条件:温度范围10℃-50℃;湿度范围20-60%RH。在生产和运输过程中,要保证传感器远离高浓度的化学溶剂。要避免使用挥发性胶水、粘性胶带、不干胶贴纸,或者具有挥发性的包装材料,如发泡塑料袋、泡沫塑料等。

3温度影响

相对湿度,很大程度上依赖于温度。产品在出厂前都做了温度的校准补偿,测量湿度时,应尽可能的保证传感器在同一温度下工作,安装在产品上时要尽可能的远离热源。否则将无法准确的测试到气体的相对湿度。

特别说明

许可协议

以上内容由本公司提供,版权所有,未经本公司之书面许可,此手册中任何段落,章节内容均不得被摘抄、拷贝或以任何形式复制、传播,否则一切后果由违者自负,本公司保留一切法律权利。

本公司保留对手册所描述之产品规格进行修改的权利,恕不另行通知。订货前,请垂询当地代理商以获悉本产品的最新规格。

警告

使用及人身伤害

勿将本产品用于安全保护装置或急停设备上,以及由于本产品故障可能导致人身受到伤害的任何应用中;在使用本产品前,请仔细阅读本说明书中的内容;

禁止在易燃气体附近使用

禁止在易燃、易爆气体的场所使用;

严禁直接触及传感器

为防止污染感湿膜,避免手指直接触摸元件表面;汗液会污染感湿膜会导致性能漂移,接触传感器请戴防静电手指套;

工作环境

建议使用温度范围-40℃-80℃,湿度范围0-100%RH。超出建议的范围可能导致测量结果暂时性漂移;本产品对光线不敏感,但长时间暴露在太阳光或则紫外线辐射中,同样加速老化。

 

附件1:

协议说明:

1、上电后数据口SDA高电平。拉低>480us后,让数据口SDA转换为输入状态对电平检测,等待该模块低电平响应信号。发现低电平响应信号后等待模块释放该总线(即变为高电平)。

2、写入字节,(低位先入),SDA转为输出口,发送1即:拉低电平>1us <15us然后拉高电平>60us

发送0即:拉低电平>60us然后拉高电平(该时间要求不高典型值5us)

3、读取字节,(低位先出),SDA转为输出口,拉低电平(>1us 典型5us <15us)触发模块输出,释放总线延时5us左右后采样,当总线为高电平,即代表当前接收位为1,否则为0。

static u16 OwHumA,OwHumB;

//初始化,获取校准数据 A B值

void DHT21Init_OW(void)

{

uint8_t i,crc;

u8 ResDat[13];

 

Timer4Stop(); //暂停有可能打断通信的中断

DQ_Rst();

DQ_Presence();

DQ_Write_Byte(0xcc);

DQ_Write_Byte(0xdd);

 

OwHumA = DQ_Read_Byte();

OwHumA = (OwHumA<<8)|DQ_Read_Byte();

OwHumB = DQ_Read_Byte();

OwHumB = (OwHumB<<8)|DQ_Read_Byte();

 

Timer4Start();

//当读取满一组数据即13个字节后,才有CRC值

//无需要时可以按上面读取前面4个即可

/*

for(i=0;i<13;i++)

{

ResDat[i] = DQ_Read_Byte();

}

crc = CRC8MHT_Cal(ResDat,13);

if(crc == 0)

{

OwHumA = ResDat[0];

OwHumA = (OwHumA<<8)|ResDat[1];

OwHumB = ResDat[2];

OwHumB = (OwHumB<<8)|ResDat[3];

}

*/

}

//读取温湿度函数

u8 ReadDHT21_onewire(s16 *tem,u16 *hum)

{

u8 ResDat[5],crc=0,ReBit;

u16 i;

s16 TemBuf;

Long CapBuf;//s32

Timer4Stop();//单总线通讯 暂停中断

DQ_Rst();

DQ_Presence();

DQ_Write_Byte(0xcc);

DQ_Write_Byte(0x10);

Timer4Start();

//可以不延时直接读取,但读取到的是上次转化的数据

delay(7075);//2ms*15 35ms 改时间可以去处理其他任务回来读取

 

Timer4Stop();

DQ_Rst();

DQ_Presence();

DQ_Write_Byte(0xcc);

DQ_Write_Byte(0xbd);

ResDat[0] = DQ_Read_Byte();

ResDat[1] = DQ_Read_Byte();

ResDat[2] = DQ_Read_Byte();

ResDat[3] = DQ_Read_Byte();

ResDat[4] = DQ_Read_Byte();

 

 

Timer4Start();

crc = CRC8MHT_Cal(ResDat,5);

if(crc == 0)

{

TemBuf = (u16)ResDat[1]<<8|(ResDat[0]);

TemBuf = 400+TemBuf/25.6;//*10 结果*10倍 286即28.6℃

*tem = TemBuf;

 

CapBuf = (u16)ResDat[3]<<8|(ResDat[2]);

CapBuf = (CapBuf-OwHumB)*600/(OwHumA-OwHumB)+300;//同样结果*10

//20℃为5个湿度点 即1℃为0.25个湿度点 0.1℃ 为0.025

CapBuf = CapBuf+ 25*(TemBuf-250)/100;

 

if(CapBuf>999)CapBuf = 999;

else if(CapBuf<0)CapBuf=0;

*hum = (u16)CapBuf;

}

 

return crc;

}

//子函数-------------------------------

void DQ_Rst(void)

{

HDCSDA_Output();

DelaySus(2); //5us 无需严格要求

HDCSDA_CLR();

delay(114); //>480us 典型值960us 规格书:tRSTL

HDCSDA_SET();

DelaySus(7); //8us 无需严格要求

}

//应答 DQ_Rst 低电平释放后,模块会有一个 tPDLOW的应答信号

u8 DQ_Presence(void)

{

u8 pulse_time = 0;

HDCSDA_Input();

DelaySus(2); //5us 无需严格要求

while( (HDCGet_SDA()) && pulse_time<100 ) //存在检测高电平15~60us 模块响应高电平时间 tPDHIGH 规格书:

{

pulse_time++;

DelaySus(5);//>6us

}

if( pulse_time >=20 )

return 0x01;

else

pulse_time = 0;//应答正常

while((HDCGet_SDA()==0) && pulse_time<240 ) //存在检测低电平时间60~240us tPDLOW

{

pulse_time++;

DelaySus(2);//1~5us

}

if( pulse_time >=10 )// 应答正常

{

return 0x01;

}

else

return 0x0;

}

//拉低最少1us 后延时一小段时间如6us,后再15us内读取完。 后延时45us以上 即一个周期是60us

//tINIT+tRC+tSample < 15us

//tINIT+tRC+tSample+tDelay>60us

u8 DQ_Read_Bit(void)

{

u8 dat;

 

HDCSDA_Output();

 

HDCSDA_CLR();

DelaySus(2); //tINIT>1us 典型5us <15us

// HDCSDA_SET();

HDCSDA_Input();

DelaySus(5);//tRC 典型5us

if(HDCGet_SDA())//tSample

dat = 1;

else

dat = 0;

DelaySus(33);//tDelay >60us 确保一帧数据传输完毕

return dat;

}

u8 DQ_Read_Byte(void)

{

u8 i, j, dat = 0;

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

{

j = DQ_Read_Bit();

dat = (dat) | (j<

}

return dat;

}

void DQ_Write_Byte(uint8_t dat)

{

uint8_t i, testb;

HDCSDA_Output();

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

{

testb = dat&0x01;

dat = dat>>1;

if(testb)//写1

{

HDCSDA_CLR();

DelaySus(3);//>1us <15us

HDCSDA_SET();

DelaySus(33);//>=60us

}

else//写0

{

HDCSDA_CLR();

DelaySus(38);//MY_DELAY_US(70);>60us

HDCSDA_SET();

DelaySus(3);//典型5us

}

}

}

u8 CRC8MHT_Cal(u8 *serial, u8 length)

{

u8 result = 0x00;

u8 pDataBuf;

u8 i;

while(length--) {

pDataBuf = *serial++;

for(i=0; i<8; i++) {

if((result^(pDataBuf))&0x01){

result ^= 0x18;

result >>= 1;

result |= 0x80;

}

else {

result >>= 1;

}

pDataBuf >>= 1;

}

}

return result;

时序例程

这是重置总线,然后写入0xccdd命令,获取校准值A、B的时序

即按低位先出,写入的数据是:11001100即0xcc

11011101即0xdd

即得到4个字节依次是(低位先出):01101111即0x6f

00101110 即 0x2e 即HumA为0x6f2e 即28462

00110111即 0x37

00000110即 0x06 即HumB为0x3706 即14086

产品规格书

  • 温湿度模块

    DHT21产品手册

    产品概述

    本产品是采用高稳定性电容式感湿元件作为传感元件,经过微处理器采集处理转化成数字信号输出。每一个传感器都经过标定校准和测试。具有长期稳定、可靠性高、 精度高、低功耗等特点。

    尺寸图

    单位:mm(±0.5)

    \\主机-pc\市场部\产品图片\数字温湿度模块DHT11 新款\新款DHT11 DHT21 DHT22尺寸图.jpg新款DHT11 DHT21 DHT22尺寸图

    三、产品特点

    DHT21数字温湿度模块具有以下特点:

    1、数字输出,单总线协议,通信距离支持100米;

    2、超低功耗;

    3、0-100%相对湿度测量范围;

    4、全标定、温漂校准。

    5、使用独立感湿元器件,稳定性好,抗污染能力强

    四、性能特征

    相对湿度 温度

    参数

    条件

    最小

    典型

    最大

    单位

    分辨率

       

    0.1

     

    %RH

    量程范围

     

    0

     

    99.9

    %RH

    精度

    25℃

     

    ±3

     

    %RH

    重复性

       

    ±0.1

       

    响应时间

    1/e(63%)

     

    <8

     

    S

    迟滞

       

    ±0.5

       

    漂移

    典型值

     

    <3

     

    %RH/r

    参数

    条件

    最小

    典型

    最大

    单位

    分辨率

       

    0.1

     

    工作范围

     

    -40

     

    80

    精度

       

    ±0.5

     

    重复性

       

    ±0.2

     

    响应时间

    1/e(63%)

    1

       

    S

    迟滞

       

    ±0.1

       

    漂移

    典型值

     

    <0.2

     

    ℃/r

     

    表2

    表1

    图2

    图1

    电气特性

    参数

    条件

    最小

    典型

    最大

    单位

    供电电压VDD

     

    2.8

    3.3

    5.5

    V

    供电电流

    休眠模式

     

    0.2

     

    uA

    测量模式

     

    500

     

    uA

    采样周期

       

    2.0

     

    S

    低电平输出电压

    Io<4mA

    0

     

    250

    mV

    高电平输出电压

    Rp<25kΩ

    80%

     

    100%

    VDD

    低电平输入电压

    下降沿

    0%

     

    20%

    VDD

    高电平输入电压

    上升沿

    80%

     

    100%

    VDD

    输出电流

    On

       

    4

    mA

    三态门(Off)

     

    10

    20

    μA

    表3 Io表示低电平输出电流 Rp代表上拉电阻

    用户指南

    1、 引脚分配

    引脚

    名称

    描述

    1

    VDD

    电源 2.8~5.5V

    2

    SDA

    串行数据,双向口

    3

    NC

    NC

    4

    GND

     

    表4 引脚分配

    1.1、电源引脚(VDD GND)

    本产品的供电电压为2.8~5.5V,建议供电电压为3.3V。

    1.2、串行数据(SDA)

    SDA为数据口,三态结构,SDA在SCK时钟下降沿之后改变状态,并仅在SCK上升沿有效

    2、通信协议

    DHT21为了精确测量气体的湿度,减少温度对测量的影响,DHT21传感器在非工作期间,自动转为休眠模式,以降低传感器自身的发热对周围气体湿度的影响。DHT21采用被动式工作模式,即主机通过指令唤醒传感器后,传感器才开始测量、应答等动作。通讯结束后,传感器进入休眠状态。

    2.1、DHT21连接图

    图4 单总线通讯连接图

    注:上拉电阻一般建议采用10KΩ电阻,传感器与主机传输距离超过10米,建议用5.1KΩ

    2.2、单总线接口时序

    参数

    符号

    最小

    典型

    最大

    单位

    时序长度

    tSLOT

    60

     

    120

    us

    恢复时间

    tREC

    1

    5

     

    us

    写0低电平时间

    tLOW0

    60

    60

    120

    us

    写1低电平时间

    tLOW1

    1

    5

    15

    us

    读数据有效时间

    tRDV

     

    5

    15

    us

    复位低电平时间

    tRSTL

    480

    960

     

    us

    应答高电平时间

    tPDHIGH

    15

    30

    60

    us

    应答低电平时间

    tPDLOW

    60

    115

    240

    us

    单总线写0时序

    单总线写1时序

    单总线读取时序

    单总线复位时序

    应答

    读取湿度校准数A、B

    CCDDH

    触发温湿度测量

    CC10H

    读取转化结果

    CCBDH

    时序说明:(详细请参考程序例程附件)

    每一帧时序长度为60us。每次数据通信前使用单总线复位时序,同步时序。

    紧接着监测应答信号。

    发送指令0xCCDD 获取湿度校准数据A、B

    发送指令0xCC10 触发温湿度转化。耗时约30ms

    发送指令0xCCBD 获取温湿度转化结果。

    客户同样可以无需等待读取,则此时读取的为上次触发转化的温湿度数据。

    温度、相对湿度转换

    通过上面两种方式可以获得16bit温度原始数据St、16bit湿度原始数据Sh

    最终带入下面公式

    温度(℃):

     

    湿度(%RH):

     

    RHrel = RH + 0.25*(T - 25.0) (注: 温漂1℃为 -0.25%RH)

     

    注: RH限定在0~100, if(RH>100) RH=100;

    Else if(RH<0) RH=0;

    (1)循环冗余校验(CRC)计算

    u8 CRC8MHT_Cal(u8 *serial, u8 length)

    {

    u8 result = 0x00;

    u8 pDataBuf;

    u8 i;

    while(length--) {

    pDataBuf = *serial++;

    for(i=0; i<8; i++) {

    if((result^(pDataBuf))&0x01){

    result ^= 0x18;

    result >>= 1;

    result |= 0x80;

    }

    else {

    result >>= 1;

    }

    pDataBuf >>= 1;

    }

    }

    return result;

    }

    应用信息

    1、工作条件

    确保传感器性能正常稳定的工作,建议使用温度范围-40℃-80℃,湿度范围0-99.9%RH。超出建议的范围可能导致测量结果暂时性漂移。

    2、存储条件与恢复

    湿度传感器为环境敏感型电子元器件,需要仔细防护。长期暴露在高浓度的化学蒸汽中将会致使传感器的测量产生漂移。因此建议将传感器存放于原包装内,并符合存储条件:温度范围10℃-50℃;湿度范围20-60%RH。在生产和运输过程中,要保证传感器远离高浓度的化学溶剂。要避免使用挥发性胶水、粘性胶带、不干胶贴纸,或者具有挥发性的包装材料,如发泡塑料袋、泡沫塑料等。

    3温度影响

    相对湿度,很大程度上依赖于温度。产品在出厂前都做了温度的校准补偿,测量湿度时,应尽可能的保证传感器在同一温度下工作,安装在产品上时要尽可能的远离热源。否则将无法准确的测试到气体的相对湿度。

    特别说明

    许可协议

    以上内容由本公司提供,版权所有,未经本公司之书面许可,此手册中任何段落,章节内容均不得被摘抄、拷贝或以任何形式复制、传播,否则一切后果由违者自负,本公司保留一切法律权利。

    本公司保留对手册所描述之产品规格进行修改的权利,恕不另行通知。订货前,请垂询当地代理商以获悉本产品的最新规格。

    警告

    使用及人身伤害

    勿将本产品用于安全保护装置或急停设备上,以及由于本产品故障可能导致人身受到伤害的任何应用中;在使用本产品前,请仔细阅读本说明书中的内容;

    禁止在易燃气体附近使用

    禁止在易燃、易爆气体的场所使用;

    严禁直接触及传感器

    为防止污染感湿膜,避免手指直接触摸元件表面;汗液会污染感湿膜会导致性能漂移,接触传感器请戴防静电手指套;

    工作环境

    建议使用温度范围-40℃-80℃,湿度范围0-100%RH。超出建议的范围可能导致测量结果暂时性漂移;本产品对光线不敏感,但长时间暴露在太阳光或则紫外线辐射中,同样加速老化。

     

    附件1:

    协议说明:

    1、上电后数据口SDA高电平。拉低>480us后,让数据口SDA转换为输入状态对电平检测,等待该模块低电平响应信号。发现低电平响应信号后等待模块释放该总线(即变为高电平)。

    2、写入字节,(低位先入),SDA转为输出口,发送1即:拉低电平>1us <15us然后拉高电平>60us

    发送0即:拉低电平>60us然后拉高电平(该时间要求不高典型值5us)

    3、读取字节,(低位先出),SDA转为输出口,拉低电平(>1us 典型5us <15us)触发模块输出,释放总线延时5us左右后采样,当总线为高电平,即代表当前接收位为1,否则为0。

    static u16 OwHumA,OwHumB;

    //初始化,获取校准数据 A B值

    void DHT21Init_OW(void)

    {

    uint8_t i,crc;

    u8 ResDat[13];

     

    Timer4Stop(); //暂停有可能打断通信的中断

    DQ_Rst();

    DQ_Presence();

    DQ_Write_Byte(0xcc);

    DQ_Write_Byte(0xdd);

     

    OwHumA = DQ_Read_Byte();

    OwHumA = (OwHumA<<8)|DQ_Read_Byte();

    OwHumB = DQ_Read_Byte();

    OwHumB = (OwHumB<<8)|DQ_Read_Byte();

     

    Timer4Start();

    //当读取满一组数据即13个字节后,才有CRC值

    //无需要时可以按上面读取前面4个即可

    /*

    for(i=0;i<13;i++)

    {

    ResDat[i] = DQ_Read_Byte();

    }

    crc = CRC8MHT_Cal(ResDat,13);

    if(crc == 0)

    {

    OwHumA = ResDat[0];

    OwHumA = (OwHumA<<8)|ResDat[1];

    OwHumB = ResDat[2];

    OwHumB = (OwHumB<<8)|ResDat[3];

    }

    */

    }

    //读取温湿度函数

    u8 ReadDHT21_onewire(s16 *tem,u16 *hum)

    {

    u8 ResDat[5],crc=0,ReBit;

    u16 i;

    s16 TemBuf;

    Long CapBuf;//s32

    Timer4Stop();//单总线通讯 暂停中断

    DQ_Rst();

    DQ_Presence();

    DQ_Write_Byte(0xcc);

    DQ_Write_Byte(0x10);

    Timer4Start();

    //可以不延时直接读取,但读取到的是上次转化的数据

    delay(7075);//2ms*15 35ms 改时间可以去处理其他任务回来读取

     

    Timer4Stop();

    DQ_Rst();

    DQ_Presence();

    DQ_Write_Byte(0xcc);

    DQ_Write_Byte(0xbd);

    ResDat[0] = DQ_Read_Byte();

    ResDat[1] = DQ_Read_Byte();

    ResDat[2] = DQ_Read_Byte();

    ResDat[3] = DQ_Read_Byte();

    ResDat[4] = DQ_Read_Byte();

     

     

    Timer4Start();

    crc = CRC8MHT_Cal(ResDat,5);

    if(crc == 0)

    {

    TemBuf = (u16)ResDat[1]<<8|(ResDat[0]);

    TemBuf = 400+TemBuf/25.6;//*10 结果*10倍 286即28.6℃

    *tem = TemBuf;

     

    CapBuf = (u16)ResDat[3]<<8|(ResDat[2]);

    CapBuf = (CapBuf-OwHumB)*600/(OwHumA-OwHumB)+300;//同样结果*10

    //20℃为5个湿度点 即1℃为0.25个湿度点 0.1℃ 为0.025

    CapBuf = CapBuf+ 25*(TemBuf-250)/100;

     

    if(CapBuf>999)CapBuf = 999;

    else if(CapBuf<0)CapBuf=0;

    *hum = (u16)CapBuf;

    }

     

    return crc;

    }

    //子函数-------------------------------

    void DQ_Rst(void)

    {

    HDCSDA_Output();

    DelaySus(2); //5us 无需严格要求

    HDCSDA_CLR();

    delay(114); //>480us 典型值960us 规格书:tRSTL

    HDCSDA_SET();

    DelaySus(7); //8us 无需严格要求

    }

    //应答 DQ_Rst 低电平释放后,模块会有一个 tPDLOW的应答信号

    u8 DQ_Presence(void)

    {

    u8 pulse_time = 0;

    HDCSDA_Input();

    DelaySus(2); //5us 无需严格要求

    while( (HDCGet_SDA()) && pulse_time<100 ) //存在检测高电平15~60us 模块响应高电平时间 tPDHIGH 规格书:

    {

    pulse_time++;

    DelaySus(5);//>6us

    }

    if( pulse_time >=20 )

    return 0x01;

    else

    pulse_time = 0;//应答正常

    while((HDCGet_SDA()==0) && pulse_time<240 ) //存在检测低电平时间60~240us tPDLOW

    {

    pulse_time++;

    DelaySus(2);//1~5us

    }

    if( pulse_time >=10 )// 应答正常

    {

    return 0x01;

    }

    else

    return 0x0;

    }

    //拉低最少1us 后延时一小段时间如6us,后再15us内读取完。 后延时45us以上 即一个周期是60us

    //tINIT+tRC+tSample < 15us

    //tINIT+tRC+tSample+tDelay>60us

    u8 DQ_Read_Bit(void)

    {

    u8 dat;

     

    HDCSDA_Output();

     

    HDCSDA_CLR();

    DelaySus(2); //tINIT>1us 典型5us <15us

    // HDCSDA_SET();

    HDCSDA_Input();

    DelaySus(5);//tRC 典型5us

    if(HDCGet_SDA())//tSample

    dat = 1;

    else

    dat = 0;

    DelaySus(33);//tDelay >60us 确保一帧数据传输完毕

    return dat;

    }

    u8 DQ_Read_Byte(void)

    {

    u8 i, j, dat = 0;

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

    {

    j = DQ_Read_Bit();

    dat = (dat) | (j<

    }

    return dat;

    }

    void DQ_Write_Byte(uint8_t dat)

    {

    uint8_t i, testb;

    HDCSDA_Output();

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

    {

    testb = dat&0x01;

    dat = dat>>1;

    if(testb)//写1

    {

    HDCSDA_CLR();

    DelaySus(3);//>1us <15us

    HDCSDA_SET();

    DelaySus(33);//>=60us

    }

    else//写0

    {

    HDCSDA_CLR();

    DelaySus(38);//MY_DELAY_US(70);>60us

    HDCSDA_SET();

    DelaySus(3);//典型5us

    }

    }

    }

    u8 CRC8MHT_Cal(u8 *serial, u8 length)

    {

    u8 result = 0x00;

    u8 pDataBuf;

    u8 i;

    while(length--) {

    pDataBuf = *serial++;

    for(i=0; i<8; i++) {

    if((result^(pDataBuf))&0x01){

    result ^= 0x18;

    result >>= 1;

    result |= 0x80;

    }

    else {

    result >>= 1;

    }

    pDataBuf >>= 1;

    }

    }

    return result;

    时序例程

    这是重置总线,然后写入0xccdd命令,获取校准值A、B的时序

    即按低位先出,写入的数据是:11001100即0xcc

    11011101即0xdd

    即得到4个字节依次是(低位先出):01101111即0x6f

    00101110 即 0x2e 即HumA为0x6f2e 即28462

    00110111即 0x37

    00000110即 0x06 即HumB为0x3706 即14086

产品附件

XML 地图