AM2302数字温湿度传感器模块资料:
►相对湿度和温度测量
►全部校准,数字输出
►卓越的长期稳定性
►无需额外部件
►超长的信号传输距离
►超低能耗
►4 引脚安装
►完全互换
AM2302产品概述
AM2302数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个AM2302传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。
应用领域
►暖通空调 ►测试及检测设备
►汽车 ►数据记录器
► 消费品 ►自动控制
►气象站 ►家电
►湿度调节器 ►医疗
1、传感器性能说明
2、 采样周期不得低于最小值,否则会引起错误
3、 接口说明
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻
AM2302的接线图如下图所示。
3、 电源引脚
AM2302的供电电压为3.3-6V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
4、单总线接口
DATA 用于微处理器与 AM2302之间的通讯和同步,采用单总线数据格式,一次通讯时间5ms左右 ,具体格式在下面说明,当前数据传输为40bit,高位先出。
数据格式: 40bit数据=16bit湿度数据+16bit温度数据+8bit校验和
例子: 接收40bit数据如下:
0000 0010 1000 1100 0000 0001 0101 1111 1110 1110
湿度数据 温度数据 校验和
湿度高8位+湿度低8位+温度高8位+温度低8位=的末8位=校验和
例如:0000 0010+1000 1100+0000 0001+0101 1111=1110 1110
湿度=65.2%RH 温度=35.1℃
当温度低于0℃时温度数据的最高位置1。
例如:-10.1℃表示为1000 0000 0110 0101
用户主机(MCU)发送一次开始信号后,AM2302从低功耗模式转换到高速模式,等待主机开始信号结束后,AM2302发送响应信号,送出40bit的数据,并触发一次信号采集。(注:主机从AM2302读取的温湿度数据总是前一次的测量值,如两次测量间隔时间很长,请连续读两次以获得实时的温湿度值)
文件包括使用说明测试程序等:
1. //****************************************************************//
2. // DHT21使用范例
3. //单片机 AT89S52 或 STC89C52RC
4. //功能 串口发送温湿度数据 晶振 11.0592M 波特率 9600
5. //硬件 P2.0口为通讯口连接DHT22,DHT22的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
6. //****************************************************************//
7.
8. #include <reg51.h>
9. #include <intrins.h>
10. //
11. typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
12. typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
13. typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
14. typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
15. typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
16. typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
17. typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
18. typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
19. //
20. #define uchar unsigned char
21. #define uint unsigned int
22. #define Data_0_time 4
23.
24. //----------------------------------------------//
25. //----------------IO口定义区--------------------//
26. //----------------------------------------------//
27. sbit P2_0 = P2^0 ;
28.
29. //----------------------------------------------//
30. //----------------定义区--------------------//
31. //----------------------------------------------//
32. U8 U8FLAG,k;
33. U8 U8count,U8temp;
34. U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
35. U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
36. U8 U8comdata;
37. U8 outdata[5]; //定义发送的字节数
38. U8 indata[5];
39. U8 count, count_r=0;
40. U8 str[5]={"RS232"};
41. U16 U16temp1,U16temp2;
42. SendData(U8 *a)
43. {
44. outdata[0] = a[0];
45. outdata[1] = a[1];
46. outdata[2] = a[2];
47. outdata[3] = a[3];
48. outdata[4] = a[4];
49. count = 1;
50. SBUF=outdata[0];
51. }
52.
53. void Delay(U16 j)
54. { U8 i;
55. for(;j>0;j--)
56. {
57. for(i=0;i<27;i++);
58.
59. }
60. }
61. void Delay_10us(void)
62. {
63. U8 i;
64. i--;
65. i--;
66. i--;
67. i--;
68. i--;
69. i--;
70.
71. }
72.
73. void COM(void)
74. {
75.
76. U8 i;
77.
78. for(i=0;i<8;i++)
79. {
80.
81. U8FLAG=2;
82. while((!P2_0)&&U8FLAG++);
83. Delay_10us();
84. Delay_10us();
85. Delay_10us();
86. U8temp=0;
87. if(P2_0)U8temp=1;
88. U8FLAG=2;
89. while((P2_0)&&U8FLAG++);
90. //超时则跳出for循环
91. if(U8FLAG==1)break;
92. //判断数据位是0还是1
93.
94. // 如果高电平高过预定0高电平值则数据位为 1
95.
96. U8comdata<<=1;
97. U8comdata|=U8temp; //0
98. }//rof
99.
100. }
101.
102. //--------------------------------
103. //-----湿度读取子程序 ------------
104. //--------------------------------
105. //----以下变量均为全局变量--------
106. //----温度高8位== U8T_data_H------
107. //----温度低8位== U8T_data_L------
108. //----湿度高8位== U8RH_data_H-----
109. //----湿度低8位== U8RH_data_L-----
110. //----校验 8位 == U8checkdata-----
111. //----调用相关子程序如下----------
112. //---- Delay();, Delay_10us();,COM();
113. //--------------------------------
114.
115. void RH(void)
116. {
117. //主机拉低18ms
118. P2_0=0;
119. Delay(180);
120. P2_0=1;
121. //总线由上拉电阻拉高 主机延时20us
122. Delay_10us();
123. Delay_10us();
124. Delay_10us();
125. Delay_10us();
126. //主机设为输入 判断从机响应信号
127. P2_0=1;
128. //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
129. if(!P2_0) //T !
130. {
131. U8FLAG=2;
132. //判断从机是否发出 80us 的低电平响应信号是否结束
133. while((!P2_0)&&U8FLAG++);
134. U8FLAG=2;
135. //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
136. while((P2_0)&&U8FLAG++);
137. //数据接收状态
138. COM();
139. U8RH_data_H_temp=U8comdata;
140. COM();
141. U8RH_data_L_temp=U8comdata;
142. COM();
143. U8T_data_H_temp=U8comdata;
144. COM();
145. U8T_data_L_temp=U8comdata;
146. COM();
147. U8checkdata_temp=U8comdata;
148. P2_0=1;
149. //数据校验
150.
151. U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
152. if(U8temp==U8checkdata_temp)
153. {
154. U8RH_data_H=U8RH_data_H_temp;
155. U8RH_data_L=U8RH_data_L_temp;
156. U8T_data_H=U8T_data_H_temp;
157. U8T_data_L=U8T_data_L_temp;
158. U8checkdata=U8checkdata_temp;
159. }//fi
160. }//fi
161.
162. }
163.
164. //----------------------------------------------
165. //main()功能描述: AT89C51 11.0592MHz 串口发
166. //送温湿度数据,波特率 9600
167. //----------------------------------------------
168. void main()
169. {
170. //uchar str[6]={"RS232"};
171. /* 系统初始化 */
172. TMOD = 0x20; //定时器T1使用工作方式2
173. TH1 = 253; // 设置初值
174. TL1 = 253;
175. TR1 = 1; // 开始计时
176. SCON = 0x50; //工作方式1,波特率9600bps,允许接收
177. ES = 1;
178. EA = 1; // 打开所以中断
179. TI = 0;
180. RI = 0;
181. SendData(str) ; //发送到串口
182. Delay(10); //延时100US(12M晶振)
183. while(1)
184. {
185.
186. //------------------------
187. //调用温湿度读取子程序
188. RH();
189. //串口显示程序
190. //--------------------------
191.
192. str[0]=U8RH_data_H;
193. str[1]=U8RH_data_L;
194. str[2]=U8T_data_H;
195. str[3]=U8T_data_L;
196. str[4]=U8checkdata;
197.
198. SendData(str) ; //发送到串口
199. //读取模块数据周期不宜小于 2S
200. Delay(20000);
201. }//elihw
202.
203. }// main
204.
205. void RSINTR() interrupt 4 using 2
206. {
207. U8 InPut3;
208. if(TI==1) //发送中断
209. {
210. TI=0;
211. if(count!=5) //发送完5位数据
212. {
213. SBUF= outdata[count];
214. count++;
215. }
216. }
217.
218. if(RI==1) //接收中断
219. {
220. InPut3=SBUF;
221. indata[count_r]=InPut3;
222. count_r++;
223. RI=0;
224. if (count_r==5)//接收完4位数据
225. {
226. //数据接收完毕处理。
227. count_r=0;
228. str[0]=indata[0];
229. str[1]=indata[1];
230. str[2]=indata[2];
231. str[3]=indata[3];
232. str[4]=indata[4];
233. P0=0;
234. }
235. }
236. }
237.
238.
|