文档介绍: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 倍,例如当前实际温度是 度,采集到的数据是 327,目的是为了编程
时方便分离数据。 (详细见后面说明书)
0000 0010 1000 1100 0000 0001 0101 1111 1110 1110
湿度数据 温度数据 校验和
湿度高 8位+湿度低 8位+温度高 8位+温度低 8位=的末8位=校验和
如果需要处理零下值, 16 位的最高位为 1 表示负数,温度最大量程: -20~80 度,分辨率: 度。
如果用数据码管显示且有中断,采集数据开始需要关中断,采集结束开中断,否则在采集数据过程
中,中断会打断 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 cha