AM2302数字温湿度传感器模块资料

AM2302数字温湿度传感器模块资料:

►相对湿度和温度测量        
►全部校准,数字输出
►卓越的长期稳定性
►无需额外部件
►超长的信号传输距离   
►超低能耗
►4 引脚安装        
►完全互换

AM2302产品概述
AM2302数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个AM2302传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为 4 针单排引脚封装。连接方便,特殊封装形式可根据用户需求而提供。

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

1、传感器性能说明

none.gif


2、  采样周期不得低于最小值,否则会引起错误
3、  接口说明   
建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻
     AM2302的接线图如下图所示。

none.gif

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读取的温湿度数据总是前一次的测量值,如两次测量间隔时间很长,请连续读两次以获得实时的温湿度值)


none.gif

文件包括使用说明测试程序等:
  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.  
复制代码



 

U客论坛下载-AM2302中文资料.doc

 

文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-211134-1-1.html
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不是一个可以编写硬件代码的AI,我只能提供一些参考信息: AM2301是一种数字湿度传感器,它采用单总线通信协议,需要通过微处理器或FPGA来进行数据读取和解析。对于FPGA来说,可以使用Verilog或VHDL等硬件描述语言来编写代码。以下是一个简单的Verilog代码示例,用于读取AM2301传感器的数据: ```verilog module am2301( input clk, input reset, input data_in, output reg [39:0] data_out, output reg ready ); reg [7:0] counter; reg [39:0] data_buf; reg start_pulse, data_pulse; parameter START_PULSE_WIDTH = 80; parameter DATA_PULSE_WIDTH = 50; always @(posedge clk) begin if(reset) begin counter <= 0; data_buf <= 0; data_out <= 0; ready <= 0; start_pulse <= 0; data_pulse <= 0; end else begin case(counter) 0: begin start_pulse <= 1; counter <= counter + 1; end 1: begin start_pulse <= 0; data_pulse <= 1; counter <= counter + 1; end [2:41]: begin data_buf[counter - 2] <= data_in; counter <= counter + 1; end 42: begin data_pulse <= 0; counter <= 0; ready <= 1; data_out <= data_buf; end endcase end end endmodule ``` 该代码有一个时钟输入(`clk`)、一个复位输入(`reset`)和一个数据输入(`data_in`),输出包括一个40位的数据输出(`data_out`)和一个就绪信号(`ready`)。在时钟的上升沿触发的时候,根据计数器的状态机控制输出信号的变化。首先发送一个起始脉冲,然后发送一个数据脉冲,并将传感器返回的数据存储在`data_buf`中。当传输完成时,输出就绪信号和数据输出。请注意,此代码仅供参考,需要根据具体的FPGA硬件平台和AM2301传感器的规格进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值