找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 16281|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

HR202L HR31濕敏電阻使用電路和單片機(jī)例程等資料下載

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
傳感器資料,新手,求照顧
一、產(chǎn)品概述
HR202L 濕敏電阻器是采用有機(jī)高分子材料的一種新型濕度敏感元件,具有感濕范圍寬,響應(yīng)迅速,抗污染能力強(qiáng),無(wú)需加熱清洗及長(zhǎng)期使用性能穩(wěn)定可靠等諸多特點(diǎn)。


三、應(yīng)用范圍
  用于溫濕度顯示計(jì)、溫濕度禮品表、大氣環(huán)境監(jiān)測(cè)、工業(yè)過(guò)程控制、農(nóng)業(yè)、測(cè)量?jī)x表等應(yīng)用領(lǐng)域。

四、產(chǎn)品亮點(diǎn)
  外型小巧美觀、長(zhǎng)期穩(wěn)定性好、溫濕度測(cè)量范圍寬、高低溫濕度測(cè)量精確。

五、電路圖


濕敏電阻測(cè)試31K1004

RC測(cè)濕
注:Rs   為標(biāo)準(zhǔn)電阻 RH 為濕敏電阻
檢測(cè)原理:
         RC 測(cè)濕的實(shí)現(xiàn)方法是利用電阻 R 給電容 C 充放電時(shí)間來(lái)測(cè)量濕度的(此處的濕度感
         測(cè)器為濕敏電阻) 。
         用不同的電阻給電容充放電時(shí)間不一樣,對(duì) RC測(cè)量濕度的精度與電阻 R 和電容 C的
         選取有關(guān)。我們通常是選用一個(gè)標(biāo)準(zhǔn)電阻(隨濕度變化其阻值變化很小,可忽略不計(jì),通
         常為高精度的金屬膜電阻)它的阻值 Rs 與濕度感測(cè)器在標(biāo)準(zhǔn)大氣壓下、25℃時(shí)的阻值相
         同。當(dāng)濕度發(fā)生變化時(shí),濕敏電阻的阻值 RH發(fā)生變化,那麼濕敏電阻 RH 給電容C的充放
         電時(shí)間也發(fā)生變化。而標(biāo)準(zhǔn)電阻 Rs給電容 C 的充放電時(shí)間則基本不發(fā)生變化。
         由RC充電原理我們知道,電阻 R 與電容 C 充電時(shí)間的關(guān)係可知         
         TH=K*RH*C       (1)
         Ts=K*Rs*C       (2)
         其中K 為常數(shù)
         由1,2可知充電時(shí)間的比例與 R 有關(guān),而 C 無(wú)關(guān)。
         RH=(Rs*TH)/Ts
         當(dāng)然,隨著環(huán)境濕度的變化電容 C 變化比較大,我們完成標(biāo)準(zhǔn)電阻和濕敏電阻對(duì)同一電
         容的充放電在很短的時(shí)間內(nèi),因而電容C 變化引起的誤差可以消除。為了提高精度,對(duì)電
         容 C 的選取也有關(guān)係,電容容量不能太小,也不能太大,與感測(cè)器的標(biāo)稱值有關(guān)。
   
         這樣我們就計(jì)算出拉濕敏電阻阻值RH,通過(guò)濕阻特性查表就可以得到濕度值;當(dāng)然也可以分段計(jì)算出濕度值。

硬件摘要:
         PD0、PD2和PD3是AVR單片機(jī)的3個(gè)I/O腳;
         RK為10k的精密電阻;
         RH為31K-精度為1%的濕敏電阻;
         R1為100Ω的普通電阻;
         C1為0.47μ的瓷介電容。
程序要點(diǎn):
         先將 PD0、PD2,PD3都設(shè)為低電平高阻輸出,使C1放電至放完。
         將PD2、PD3設(shè)置為高阻輸入狀態(tài),PD0設(shè)為高電平輸出,通過(guò)RK電阻對(duì)C1充電,單片機(jī)內(nèi)部計(jì)時(shí)器清零并開計(jì)         時(shí)檢測(cè)PD3口狀態(tài),當(dāng)PD3口檢測(cè)為高電平時(shí),即C1上的電 壓達(dá) 到單片機(jī) 高電平輸入的門嵌電壓時(shí),單片機(jī)         計(jì)時(shí)器記錄下從開始充電到PD3口轉(zhuǎn)變?yōu)楦唠娖降臅r(shí)間T1即TS。
         將PD0、PD2,PD3都設(shè)為低電平高阻輸出,使C1放電至放完。
         再將PD0、PD3設(shè)置為輸入狀態(tài),PD2設(shè)為高電平輸出,通過(guò)RH電阻對(duì)C1充電,單片機(jī)內(nèi)部計(jì)時(shí)器清零并開始計(jì)         時(shí),檢測(cè)PD3口狀態(tài),當(dāng)PD3口檢測(cè)為高電平時(shí),單片機(jī)計(jì)時(shí)           器記錄下從開始充電到PD3口轉(zhuǎn)變?yōu)?nbsp;          高電平的時(shí)間T2即TH。


注意事項(xiàng):
        從上面所述可以看出,該測(cè)濕電路的誤差來(lái)源于這幾個(gè)方面:?jiǎn)纹瑱C(jī)的定時(shí)器精度,RK電阻的精度,濕敏電           阻RH的精度,而與單片機(jī)的輸出電壓值、門嵌電壓值、電容精          度無(wú)關(guān)。 因此,適當(dāng)選取濕敏電阻          和精密電阻的精度,單片機(jī)的工作頻率夠高,就可以得到較好的測(cè)濕精度。
        當(dāng)單片機(jī)選用4M工作頻率,RK、RH均為1%精度的電阻時(shí),濕度誤差可以做到小于1℃。
        如果PD3具有外部上升沿中斷的功能,程序可以更簡(jiǎn)單,效果更好。  


單片機(jī)源程序如下:
  1. /******************************************************************************
  2. * Copyright (c) 2010,濕敏電阻測(cè)試
  3. * All rights reserved.
  4. *
  5. * 文件名稱:R_TEST.C   
  6. * 文件標(biāo)識(shí):
  7. * 摘 要:   系統(tǒng)程序。   
  8. *
  9. * 當(dāng)前版本:1.1
  10. * 作 者:   OASONG
  11. * 完成日期:待定
  12. ******************************************************************************/
  13. //ICC-AVR application builder : 2010-04-00 22:43:30
  14. // Target : M88
  15. // Crystal: 8Mhz
  16. //單片機(jī)資源分配 PD0-R標(biāo)定電阻接口PD2-R濕敏電阻接口PD3檢測(cè)口PC2熱敏電阻接口  12864顯示
  17. #include "Config.h"
  18. //函數(shù)聲明
  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;  //記數(shù)值益出次數(shù)
  28. unsigned int HUMI_vule,temp_vule;  //濕溫值
  29. long int  count_vule1,count_vule2,count_vule3; //存取RC充電計(jì)數(shù)值
  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. //延時(shí)子程序    1.010ms
  42. *****************************************/
  43. void DelaymS(long int dly)                     //延時(shí)子程序    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. 延時(shí)為   接近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. //定時(shí)器1初始化
  68. *****************************************/
  69. void timer1_init(void)
  70. {
  71. CLI();              //全局中斷關(guān)
  72. TCCR1B = 0x00;      //stop
  73. TCNT1= 0x0000;     //set count初值
  74. TCCR1A = 0x00;    //普通模式
  75. STOP_TIMES ;     //停止記數(shù)
  76. }
  77. /*****************************************
  78. 讀TCNT1
  79. 輸入數(shù)據(jù):從讀取記數(shù)值
  80. 輸出:無(wú)
  81. 作者:
  82. 修改時(shí)間:
  83. *****************************************/
  84. unsigned int read_TCNT1(void)
  85. {
  86. unsigned int i;
  87. sreg=SREG;          //保存中斷標(biāo)志位
  88. CLI();             //禁止中斷

  89. i=TCNT1;           //讀取記數(shù)值

  90. //SEI();        //全局中斷
  91. SREG=sreg;     //恢復(fù)標(biāo)志位
  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低設(shè)置輸出
  106. C2_CLR;
  107. //while(D3_R);   //判斷是否放完電
  108. DelaymS(50); //時(shí)間控制電容放完電
  109. }
  110. /*****************************************
  111. //控制10K標(biāo)定電阻沖電記下充電時(shí)間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設(shè)置高阻輸入
  121.    D3_CLR;   
  122.   
  123.    C2_IN;   //D3低設(shè)置輸出
  124.    C2_CLR;  
  125.   
  126.   D0_OUT;
  127.   D0_SET;   //R1C開始充電
  128.   
  129.   START_TIMES ;   //馬上開始記數(shù)  
  130. loop1:if(TCNT1==65535)//防止記數(shù)溢出
  131.     {
  132.           TCNT1=0;
  133.           num1+=1;
  134.         }      
  135.   while(!D3_R) goto loop1;    //判斷電平是否置高
  136.   count_vule1=TCNT1;//讀取記數(shù)值
  137.   STOP_TIMES ;     //停止記數(shù)
  138.   TCNT1=0;       //記數(shù)值清0
  139.   
  140.   fang_C();    //電容釋電
  141. }
  142. /*****************************************
  143. //控制濕敏電阻R2C沖電記下充電時(shí)間T*count_vule2
  144. *****************************************/
  145. void chong_R2()
  146. {
  147.   fang_C();        //電容釋電
  148.   
  149.    D0_IN;
  150.    D0_CLR;
  151.    D3_IN;     //D0 D3設(shè)置高阻輸入
  152.    D3_CLR;  
  153.   
  154.    C2_IN;  //D3低設(shè)置輸出
  155.    C2_CLR;   
  156.   
  157.    D2_OUT;
  158.    D2_SET;   //R2C開始充電
  159.   
  160.   START_TIMES ;   //馬上開始記數(shù)  
  161. loop2:if(TCNT1==65535)//防止記數(shù)溢出
  162.     {
  163.           TCNT1=0;
  164.           num2+=1;
  165.         }      
  166.   while(!D3_R) goto loop2;    //判斷電平是否置高
  167.   count_vule2=TCNT1;//讀取記數(shù)值
  168.   STOP_TIMES ;     //停止記數(shù)
  169.   TCNT1=0;       //記數(shù)值清0   
  170.   
  171.   fang_C();    //電容釋電
  172. }
  173. /*****************************************
  174. //控制熱敏電阻R3C沖電記下充電時(shí)間T*count_vule3
  175. *****************************************/
  176. void chong_R3()
  177. {
  178.   fang_C();        //電容釋電
  179.   
  180.    D0_IN;
  181.    D0_CLR;
  182.    D3_IN;    //D0 D3設(shè)置高阻輸入
  183.    D3_CLR;  
  184.   
  185.    C2_IN;   //D3低設(shè)置輸出
  186.    C2_CLR;  
  187.   
  188.    D2_OUT;
  189.    D2_SET;    //R2C開始充電
  190.   
  191.   START_TIMES ;   //馬上開始記數(shù)  
  192. loop3:if(TCNT1==65535)//防止記數(shù)溢出
  193.     {
  194.           TCNT1=0;
  195.           num3+=1;
  196.         }      
  197.   while(!D3_R) goto loop3;    //判斷電平是否置高
  198.   count_vule3=TCNT1;//讀取記數(shù)值
  199.   STOP_TIMES ;     //停止記數(shù)
  200.   TCNT1=0;       //記數(shù)值清0   
  201.   
  202.   fang_C();    //電容釋電
  203. }
  204. /*****************************************
  205. //濕敏電阻采集數(shù)據(jù) 返回濕敏阻值R_Humideal_int
  206. *****************************************/
  207. void  dataHM_colleck()
  208. {
  209.   chong_R1();   //標(biāo)定電阻充電
  210.   chong_R2();   //濕敏電阻充電
  211.   R_Humideal_int=10000*(count_vule2+(65535*num2))/(count_vule1+(65535*num1));  //得到電阻整數(shù)位小數(shù)位忽略
  212.   num2=0;
  213.   num1=0;            //溢出次數(shù)清0
  214. }
  215. /*****************************************
  216. //熱敏電阻采集數(shù)據(jù)返回?zé)崦糇柚?R_TEMP
  217. *****************************************/
  218. void  dataTM_colleck()
  219. {
  220.   chong_R1();   //標(biāo)定電阻充電
  221.   chong_R3();   //濕敏電阻充電
  222.   R_TEMP=10000*(count_vule3+(65535*num3))/(count_vule1+(65535*num1));//得到電阻整數(shù)位小數(shù)位忽略
  223.   num3=0;
  224.   num1=0;        //溢出次數(shù)清0
  225. }
  226. /*****************************************
  227. //31K濕敏電阻獲取濕度值
  228. *****************************************/
  229. void get_31HUMI_vule()
  230. {
  231.   //分段計(jì)算濕度值
  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.   //溫度補(bǔ)償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. //得到溫度數(shù)據(jù)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;                       //其它溫度不補(bǔ)償
  266. }
  267. /*****************************************
  268. //系統(tǒng)初始化
  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低設(shè)置輸出
  280. C2_CLR;

  281. timer1_init();  //定時(shí)器1初始化
  282. }

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

  284. /*****************************************
  285. //主函數(shù)
  286. *****************************************/
  287. void main()
  288. {
  289. watchdog_init();  //喂狗
  290. init_lcd();    //顯示初始化
  291. system_init();//系統(tǒng)初始化
  292. while(1)
  293.      {               
  294.          //調(diào)試濕度                  
  295.          dataHM_colleck(); //濕度數(shù)據(jù)采集
  296.          get_31HUMI_vule(); //轉(zhuǎn)化濕度值
  297.          dataTM_colleck();         //溫度數(shù)據(jù)采集
  298.      get_temp_vule();          //得到temp_vule
  299.          //display_cuont1(count_vule1+(65535*num1));   //顯示標(biāo)定電阻記數(shù)值
  300.          //display_cuont2(count_vule2+(65535*num2));  //顯示濕敏電阻記數(shù)值
  301.          display_cuont5(R_Humideal_int);       //顯示濕敏電阻阻值         
  302.          display_cuont7(HUMI_vule);           //顯示濕度值
  303.          DelaymS(8000);                  //顯示刷新數(shù)據(jù)時(shí)間控制               
  304.           
  305.         //溫度調(diào)試
  306.         //dataTM_colleck();         //溫度數(shù)據(jù)采集
  307.         //get_temp_vule();          //轉(zhuǎn)化溫度值
  308.         //display_cuont1(count_vule1+(65535*num1));   //顯示標(biāo)定電阻記數(shù)值
  309.         //display_cuont2(count_vule3+(65535*num3));  //顯示熱敏電阻記數(shù)值
  310. ……………………

  311. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼


所有資料51hei提供下載:
55681 HR202 濕度模塊 濕敏電阻模塊 濕度檢測(cè)模塊 濕度傳感器(1).rar (4.87 MB, 下載次數(shù): 303)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:551587 發(fā)表于 2019-5-31 07:21 | 只看該作者
感謝分享, 正想來(lái)研究低成本的濕度方案.
回復(fù)

使用道具 舉報(bào)

板凳
ID:57925 發(fā)表于 2022-3-26 19:41 | 只看該作者
感謝分享,正準(zhǔn)備玩這個(gè)濕敏電阻!
回復(fù)

使用道具 舉報(bào)

地板
ID:298582 發(fā)表于 2024-3-14 20:14 | 只看該作者
好帖子,可惜我的硬件做完了,用的其他的圖,自己不分析,還是你這個(gè)好理解,很完整,贊
回復(fù)

使用道具 舉報(bào)

5#
ID:1123004 發(fā)表于 2024-5-30 13:50 | 只看該作者
判斷條件怎么都是位與”&“?  不應(yīng)該是&&嗎?雖然結(jié)果一樣
回復(fù)

使用道具 舉報(bào)

6#
ID:1125932 發(fā)表于 2024-6-20 10:21 | 只看該作者
想問(wèn)下c2是電容接哪個(gè)引腳啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表