DHT22 数字温湿度 传感器 AM2302温湿度模块(带说明)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AM2302温湿度传感器C程序(测试可以用)

2017-8-13

说明:

DHT22与DHT11程序基本相同,DHT11起始信号拉低18ms,DHT22起始信号拉低是800us,用户主机(MCU)发送一次起始信号(把数据总线SDA拉低至少800µs)后,AM2302从休眠模式转换到高速模式。待主机开始信号结束后,AM2302发送响应信号,从数据总线SDA串行送出40Bit 的数据,先发送字节的高位;发送的数据依次为湿度高位、湿度低位、温度高位、温度低位、校验位,发送数据结束触发一次信息采集,采集结束传感器自动转入休眠模式,直到下一次通信来临。

注意事项:

与DHT11相同,一次采集8个位数据,循环4次采集完成所有数据,40位采集完成后,校验数据,如果数据正确,将高8位左移8位与低8位相或,再保存到一个16位变量中,就可以得到一个整数值。默认采集的数据是实际值的10倍,例如当前实际温度是32.7度,采集到的数据是327,目的是为了编程时方便分离数据。(详细见后面说明书)

0000 0010 1000 1100 0000 0001 0101 1111 1110 1110

湿度数据温度数据校验和

湿度高8位+湿度低8位+温度高8位+温度低8位=的末8位=校验和如果需要处理零下值,16位的最高位为1表示负数,温度最大量程:-20~80度,分辨率:0.1度。

如果用数据码管显示且有中断,采集数据开始需要关中断,采集结束开中断,否则在采集数据过程中,中断会打断DHT22时序,造成采集数据不正确。

每次采集间隔大于1秒,否则采集数据不准确。

C程序:

为了方便程序阅读,其它器件的初始化及定义都删除掉了,以下代码纯DHT22代码,使用时直接调用RH函数即可。由于程序多次修改,可能有多余的变量,大家自己清理下。

RH函数调用后,以下四个变量会得相应的数据:

R_H 湿度高8位

R_L 湿度低8位(包含小数)

T_H 温度高8位

T_L 湿度低8位(包含小数)

如果采集的数据是:0000 0010 1000 1100 0000 0001 0101 1111

由上面四个变量是16位,采集数据是8位,分四次采完,8位放在16位里面应该是这样:

R_H= 00000000 00000010

R_L= 00000000 10001100

所以R_H左移8个位或上R_L才是我们要的数据。R_H =R_H & R_L

以上采集数据湿度为652,湿度为351,再除以10就是实际温湿度值。

#include

#include

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量*/ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量*/

typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量*/ typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量*/ typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量*/

typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量*/ typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度)*/

typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度)*/

//

#define uchar unsigned char

#define uint unsigned int

#define Data_0_time 4

//----------------------------------------------//

//----------------IO口定义区--------------------//

//----------------------------------------------//

sbit P2_0 = P3^2 ;

//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8 U8FLAG,k;

U8 U8count,U8temp;

U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

U8 U8comdata;

U8 outdata[5]; //定义发送的字节数

U8 indata[5];

U8 count, count_r=0;

U8 str[5]={"RS232"};

U16 U16temp1,U16temp2;

U16 R_H,R_L,T_H,T_L;

void Delay(U16 j)

{ U8 i;

for(;j>0;j--)

{

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

相关文档
最新文档