找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13242|回复: 5
打印 上一主题 下一主题
收起左侧

HR202L HR31湿敏电阻使用电路和单片机例程等资料下载

  [复制链接]
跳转到指定楼层
楼主
传感器资料,新手,求照顾
一、产品概述
HR202L 湿敏电阻器是采用有机高分子材料的一种新型湿度敏感元件,具有感湿范围宽,响应迅速,抗污染能力强,无需加热清洗及长期使用性能稳定可靠等诸多特点。


三、应用范围
  用于温湿度显示计、温湿度礼品表、大气环境监测、工业过程控制、农业、测量仪表等应用领域。

四、产品亮点
  外型小巧美观、长期稳定性好、温湿度测量范围宽、高低温湿度测量精确。

五、电路图


湿敏电阻测试31K1004

RC測湿
注:Rs   為標準電阻 RH 為湿敏電阻
检测原理:
         RC 測湿的實現方法是利用電阻 R 給電容 C 充放電時間來測量湿度的(此處的湿度感
         測器為湿敏電阻) 。
         用不同的電阻給電容充放電時間不一樣,對 RC測量湿度的精度與電阻 R 和電容 C的
         選取有關。我們通常是選用一個標準電阻(隨湿度變化其阻值變化很小,可忽略不計,通
         常為高精度的金屬膜電阻)它的阻值 Rs 與湿度感測器在標準大氣壓下、25℃時的阻值相
         同。當湿度發生變化時,湿敏電阻的阻值 RH發生變化,那麼湿敏電阻 RH 給電容C的充放
         電時間也發生變化。而標準電阻 Rs給電容 C 的充放電時間則基本不發生變化。
         由RC充电原理我們知道,電阻 R 與電容 C 充電時間的關係可知         
         TH=K*RH*C       (1)
         Ts=K*Rs*C       (2)
         其中K 為常數
         由1,2可知充電時間的比例與 R 有關,而 C 無關。
         RH=(Rs*TH)/Ts
         當然,随着环境湿度的變化電容 C 變化比較大,我們完成標準電阻和湿敏電阻對同一電
         容的充放電在很短的時間內,因而電容C 變化引起的誤差可以消除。為了提高精度,對電
         容 C 的選取也有關係,電容容量不能太小,也不能太大,與感測器的標稱值有關。
   
         这样我们就计算出拉湿敏电阻阻值RH,通过湿阻特性查表就可以得到湿度值;当然也可以分段计算出湿度值。

硬件摘要:
         PD0、PD2和PD3是AVR单片机的3个I/O脚;
         RK为10k的精密电阻;
         RH为31K-精度为1%的湿敏电阻;
         R1为100Ω的普通电阻;
         C1为0.47μ的瓷介电容。
程序要点:
         先将 PD0、PD2,PD3都设为低电平高阻输出,使C1放电至放完。
         将PD2、PD3设置为高阻输入状态,PD0设为高电平输出,通过RK电阻对C1充电,单片机内部计时器清零并开计         时检测PD3口状态,当PD3口检测为高电平时,即C1上的电 压达 到单片机 高电平输入的门嵌电压时,单片机         计时器记录下从开始充电到PD3口转变为高电平的时间T1即TS。
         将PD0、PD2,PD3都设为低电平高阻输出,使C1放电至放完。
         再将PD0、PD3设置为输入状态,PD2设为高电平输出,通过RH电阻对C1充电,单片机内部计时器清零并开始计         时,检测PD3口状态,当PD3口检测为高电平时,单片机计时           器记录下从开始充电到PD3口转变为           高电平的时间T2即TH。


注意事项:
        从上面所述可以看出,该测湿电路的误差来源于这几个方面:单片机的定时器精度,RK电阻的精度,湿敏电           阻RH的精度,而与单片机的输出电压值、门嵌电压值、电容精          度无关。 因此,适当选取湿敏电阻          和精密电阻的精度,单片机的工作频率够高,就可以得到较好的测湿精度。
        当单片机选用4M工作频率,RK、RH均为1%精度的电阻时,湿度误差可以做到小于1℃。
        如果PD3具有外部上升沿中断的功能,程序可以更简单,效果更好。  


单片机源程序如下:
  1. /******************************************************************************
  2. * Copyright (c) 2010,湿敏电阻测试
  3. * All rights reserved.
  4. *
  5. * 文件名称:R_TEST.C   
  6. * 文件标识:
  7. * 摘 要:   系统程序。   
  8. *
  9. * 当前版本:1.1
  10. * 作 者:   OASONG
  11. * 完成日期:待定
  12. ******************************************************************************/
  13. //ICC-AVR application builder : 2010-04-00 22:43:30
  14. // Target : M88
  15. // Crystal: 8Mhz
  16. //单片机资源分配 PD0-R标定电阻接口PD2-R湿敏电阻接口PD3检测口PC2热敏电阻接口  12864显示
  17. #include "Config.h"
  18. //函数声明
  19. extern display_cuont1(unsigned int cuont );
  20. extern display_cuont2(unsigned int cuont );  
  21. extern display_cuont3(long int cuont );
  22. extern void init_lcd(void);
  23. void get_temp_vule(void);
  24. extern void display_cuont5(unsigned int cuont);       //显示湿敏电阻阻值         
  25. extern void display_cuont7(long int cuont);           //显示湿度值
  26. //全局变量定义
  27. unsigned char sreg,num1=0,num2=0,num3=0;  //记数值益出次数
  28. unsigned int HUMI_vule,temp_vule;  //湿温值
  29. long int  count_vule1,count_vule2,count_vule3; //存取RC充电计数值
  30. long int R_Humideal_int,R_TEMP;  //湿温电阻阻值
  31. /*****************************************
  32. 看门狗初始化
  33. *****************************************/
  34. void watchdog_init(void)
  35. {
  36.   //WDR();        //this prevents a timout on enabling
  37.   WDTCSR = (1<<WDCE)|(1<<WDE);
  38.   WDTCSR = 0x28; //WATCHDOG ENABLED - dont forget to issue WDRs
  39. }
  40. /*****************************************
  41. //延时子程序    1.010ms
  42. *****************************************/
  43. void DelaymS(long int dly)                     //延时子程序    1.010ms
  44. {
  45.         unsigned char i;
  46.         for ( ; dly>0; dly--)
  47.         {
  48.             WDR();
  49.                 for (i=0; i<(1050); i++);           //1131
  50.         }
  51. }
  52. /*****************************************
  53. 延时为   接近10us
  54. *****************************************/
  55. void Delay_10us(void)
  56.       {
  57.         unsigned char i;                     
  58.         i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;
  59.                 i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;
  60.                 i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;
  61.                 i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;
  62.                 i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;
  63.                 i--;i--;i--;i--;i--;i--;i--;i--;i--;i--;
  64.                 i--;i--;i--;i--;i--;i--;i--;i--;
  65.        }
  66. /*****************************************
  67. //定时器1初始化
  68. *****************************************/
  69. void timer1_init(void)
  70. {
  71. CLI();              //全局中断关
  72. TCCR1B = 0x00;      //stop
  73. TCNT1= 0x0000;     //set count初值
  74. TCCR1A = 0x00;    //普通模式
  75. STOP_TIMES ;     //停止记数
  76. }
  77. /*****************************************
  78. 读TCNT1
  79. 输入数据:从读取记数值
  80. 输出:无
  81. 作者:
  82. 修改时间:
  83. *****************************************/
  84. unsigned int read_TCNT1(void)
  85. {
  86. unsigned int i;
  87. sreg=SREG;          //保存中断标志位
  88. CLI();             //禁止中断

  89. i=TCNT1;           //读取记数值

  90. //SEI();        //全局中断
  91. SREG=sreg;     //恢复标志位
  92. return i;
  93. }
  94. /*****************************************
  95. //控制C放完电
  96. *****************************************/
  97. void fang_C()
  98. {
  99. D0_OUT;   //D0低电平输出
  100. D0_CLR;  //

  101. D2_OUT;   //D2低电平输出
  102. D2_CLR;  

  103. D3_OUT;   //D3低电平输出
  104. D3_CLR;  

  105. C2_OUT; //D3低设置输出
  106. C2_CLR;
  107. //while(D3_R);   //判断是否放完电
  108. DelaymS(50); //时间控制电容放完电
  109. }
  110. /*****************************************
  111. //控制10K标定电阻冲电记下充电时间T*count_vule1
  112. *****************************************/
  113. void chong_R1()
  114. {
  115.   fang_C();        //电容释电
  116.   
  117.    D2_IN;
  118.    D2_CLR;
  119.   
  120.    D3_IN;     //D2 D3设置高阻输入
  121.    D3_CLR;   
  122.   
  123.    C2_IN;   //D3低设置输出
  124.    C2_CLR;  
  125.   
  126.   D0_OUT;
  127.   D0_SET;   //R1C开始充电
  128.   
  129.   START_TIMES ;   //马上开始记数  
  130. loop1:if(TCNT1==65535)//防止记数溢出
  131.     {
  132.           TCNT1=0;
  133.           num1+=1;
  134.         }      
  135.   while(!D3_R) goto loop1;    //判断电平是否置高
  136.   count_vule1=TCNT1;//读取记数值
  137.   STOP_TIMES ;     //停止记数
  138.   TCNT1=0;       //记数值清0
  139.   
  140.   fang_C();    //电容释电
  141. }
  142. /*****************************************
  143. //控制湿敏电阻R2C冲电记下充电时间T*count_vule2
  144. *****************************************/
  145. void chong_R2()
  146. {
  147.   fang_C();        //电容释电
  148.   
  149.    D0_IN;
  150.    D0_CLR;
  151.    D3_IN;     //D0 D3设置高阻输入
  152.    D3_CLR;  
  153.   
  154.    C2_IN;  //D3低设置输出
  155.    C2_CLR;   
  156.   
  157.    D2_OUT;
  158.    D2_SET;   //R2C开始充电
  159.   
  160.   START_TIMES ;   //马上开始记数  
  161. loop2:if(TCNT1==65535)//防止记数溢出
  162.     {
  163.           TCNT1=0;
  164.           num2+=1;
  165.         }      
  166.   while(!D3_R) goto loop2;    //判断电平是否置高
  167.   count_vule2=TCNT1;//读取记数值
  168.   STOP_TIMES ;     //停止记数
  169.   TCNT1=0;       //记数值清0   
  170.   
  171.   fang_C();    //电容释电
  172. }
  173. /*****************************************
  174. //控制热敏电阻R3C冲电记下充电时间T*count_vule3
  175. *****************************************/
  176. void chong_R3()
  177. {
  178.   fang_C();        //电容释电
  179.   
  180.    D0_IN;
  181.    D0_CLR;
  182.    D3_IN;    //D0 D3设置高阻输入
  183.    D3_CLR;  
  184.   
  185.    C2_IN;   //D3低设置输出
  186.    C2_CLR;  
  187.   
  188.    D2_OUT;
  189.    D2_SET;    //R2C开始充电
  190.   
  191.   START_TIMES ;   //马上开始记数  
  192. loop3:if(TCNT1==65535)//防止记数溢出
  193.     {
  194.           TCNT1=0;
  195.           num3+=1;
  196.         }      
  197.   while(!D3_R) goto loop3;    //判断电平是否置高
  198.   count_vule3=TCNT1;//读取记数值
  199.   STOP_TIMES ;     //停止记数
  200.   TCNT1=0;       //记数值清0   
  201.   
  202.   fang_C();    //电容释电
  203. }
  204. /*****************************************
  205. //湿敏电阻采集数据 返回湿敏阻值R_Humideal_int
  206. *****************************************/
  207. void  dataHM_colleck()
  208. {
  209.   chong_R1();   //标定电阻充电
  210.   chong_R2();   //湿敏电阻充电
  211.   R_Humideal_int=10000*(count_vule2+(65535*num2))/(count_vule1+(65535*num1));  //得到电阻整数位小数位忽略
  212.   num2=0;
  213.   num1=0;            //溢出次数清0
  214. }
  215. /*****************************************
  216. //热敏电阻采集数据返回热敏阻值 R_TEMP
  217. *****************************************/
  218. void  dataTM_colleck()
  219. {
  220.   chong_R1();   //标定电阻充电
  221.   chong_R3();   //湿敏电阻充电
  222.   R_TEMP=10000*(count_vule3+(65535*num3))/(count_vule1+(65535*num1));//得到电阻整数位小数位忽略
  223.   num3=0;
  224.   num1=0;        //溢出次数清0
  225. }
  226. /*****************************************
  227. //31K湿敏电阻获取湿度值
  228. *****************************************/
  229. void get_31HUMI_vule()
  230. {
  231.   //分段计算湿度值
  232.   if((R_Humideal_int/1000)>=2600)    HUMI_vule=(146000-10*(R_Humideal_int/1000))*10/4800; //20-25
  233.   else if(1300<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<2600)  HUMI_vule=(91000-10*(R_Humideal_int/1000))*10/2600; //25-30
  234.   else if(630<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<1300)  HUMI_vule=(53200-10*(R_Humideal_int/1000))*10/1340; //30-35
  235.   else if(310<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<630)   HUMI_vule=(28700-10*(R_Humideal_int/1000))*10/640; //35-40
  236.   
  237.   else if(160<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<310)  HUMI_vule=(15100-10*(R_Humideal_int/1000))*10/300; //40-45
  238.   
  239.   else if(87<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<160)  HUMI_vule=(8170-10*(R_Humideal_int/1000))*10/146; //45-50
  240.   else if(49<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<87)  HUMI_vule=(4670-10*(R_Humideal_int/1000))*10/76; //50-55
  241.   else if(31<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<49)  HUMI_vule=(2470-10*(R_Humideal_int/1000))*10/36; //55-60     
  242.   else if(20<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<31)  HUMI_vule=(1630-10*(R_Humideal_int/1000))*10/22; //60-65  
  243.   else if(13<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<20)  HUMI_vule=(1110-10*(R_Humideal_int/1000))*10/14; //65-70
  244.   else if(8<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<13)   HUMI_vule=(7740-100*(R_Humideal_int/1000))*10/92;//70-75
  245.   else if(6<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<8)   HUMI_vule=(4890-100*(R_Humideal_int/1000))*10/54;//75-80
  246.   //else if(5<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<6)  HUMI_vule=(2010-100*(R_Humideal_int/1000))*10/18;//80-85
  247.   else if(0<=(R_Humideal_int/1000)&(R_Humideal_int/1000)<6)  HUMI_vule=(388-10*(R_Humideal_int/1000))*10/4;//85-90
  248.   
  249.   //温度补偿0-60℃
  250.   if((0<=temp_vule)&(temp_vule<=25))  HUMI_vule= HUMI_vule+((25-temp_vule)*2);   //小于25一度加0.2
  251.   if((25<temp_vule)&(temp_vule<=40))  HUMI_vule= HUMI_vule-((temp_vule-25)*2);   //大于25一度减0.2
  252.   if(HUMI_vule>=999)  HUMI_vule=999;  //大于99  
  253. }
  254. /*****************************************
  255. //得到温度数据temp_vule  0-60℃
  256. *****************************************/
  257. void get_temp_vule()
  258. {
  259.    if(17960<=(R_TEMP)&(R_TEMP)<27280)       temp_vule=(136400-5*(R_TEMP))/4660; //0-10
  260.    else if(12091<=(R_TEMP)&(R_TEMP)<17960)  temp_vule=(238290-10*(R_TEMP))/5869; //10-20
  261.    else if(8312<=(R_TEMP)&(R_TEMP)<12091)   temp_vule=(196490-10*(R_TEMP))/3779; //20-30
  262.    else if(5827<=(R_TEMP)&(R_TEMP)<8312)    temp_vule=(157670-10*(R_TEMP))/2485; //30-40
  263.    else if(4161<=(R_TEMP)&(R_TEMP)<5827)    temp_vule=(62455-5*(R_TEMP))/833; //40-50
  264.    else if(3020<=(R_TEMP)&(R_TEMP)<4161)    temp_vule=(98660-10*(R_TEMP))/1141; //50-60
  265.    else  temp_vule=0;                       //其它温度不补偿
  266. }
  267. /*****************************************
  268. //系统初始化
  269. *****************************************/
  270. void system_init()
  271. {
  272. //电容放电
  273. D0_OUT;   //D0低电平输出
  274. D0_CLR;  //

  275. D2_OUT;   //D2低电平输出
  276. D2_CLR;  

  277. D3_OUT;   //D3低电平输出
  278. D3_CLR;  

  279. C2_OUT; //D3低设置输出
  280. C2_CLR;

  281. timer1_init();  //定时器1初始化
  282. }

  283. /*****************************************

  284. /*****************************************
  285. //主函数
  286. *****************************************/
  287. void main()
  288. {
  289. watchdog_init();  //喂狗
  290. init_lcd();    //显示初始化
  291. system_init();//系统初始化
  292. while(1)
  293.      {               
  294.          //调试湿度                  
  295.          dataHM_colleck(); //湿度数据采集
  296.          get_31HUMI_vule(); //转化湿度值
  297.          dataTM_colleck();         //温度数据采集
  298.      get_temp_vule();          //得到temp_vule
  299.          //display_cuont1(count_vule1+(65535*num1));   //显示标定电阻记数值
  300.          //display_cuont2(count_vule2+(65535*num2));  //显示湿敏电阻记数值
  301.          display_cuont5(R_Humideal_int);       //显示湿敏电阻阻值         
  302.          display_cuont7(HUMI_vule);           //显示湿度值
  303.          DelaymS(8000);                  //显示刷新数据时间控制               
  304.           
  305.         //温度调试
  306.         //dataTM_colleck();         //温度数据采集
  307.         //get_temp_vule();          //转化温度值
  308.         //display_cuont1(count_vule1+(65535*num1));   //显示标定电阻记数值
  309.         //display_cuont2(count_vule3+(65535*num3));  //显示热敏电阻记数值
  310. ……………………

  311. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
55681 HR202 湿度模块 湿敏电阻模块 湿度检测模块 湿度传感器(1).rar (4.87 MB, 下载次数: 295)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:551587 发表于 2019-5-31 07:21 | 只看该作者
感謝分享, 正想來研究低成本的濕度方案.
回复

使用道具 举报

板凳
ID:57925 发表于 2022-3-26 19:41 | 只看该作者
感谢分享,正准备玩这个湿敏电阻!
回复

使用道具 举报

地板
ID:298582 发表于 2024-3-14 20:14 | 只看该作者
好帖子,可惜我的硬件做完了,用的其他的图,自己不分析,还是你这个好理解,很完整,赞
回复

使用道具 举报

5#
ID:1123004 发表于 2024-5-30 13:50 | 只看该作者
判断条件怎么都是位与”&“?  不应该是&&吗?虽然结果一样
回复

使用道具 举报

6#
ID:1125932 发表于 2024-6-20 10:21 | 只看该作者
想问下c2是电容接哪个引脚啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表