原创 湿度测量电路及程序

2008-10-23 16:59 10879 8 33 分类: MCU/ 嵌入式

温度检测采用HS1101型温度传感器,HS1101HUMIREL公司生产的变容式相对湿度传感器,采用独特的工艺设计。


  HS1101测量湿度采用将HS1101置于555振荡电路中,将电容值的变化砖换成电压频率信号,可以直接被微处理器采集。


设计的电路如图1所示。


点击开大图


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


1 湿度测量电路


555芯片外接电阻R57R58HS1101,构成对HS1101的充电回路。7端通过芯片内部的晶体管对地短路实现对HS1101的放电回路,并将引脚26端相连引入到片内比较器,构成一个多谐波振荡器,其中,R57相对于R58必须非常的小,但决不能低于一个最小值。R51是防止短路的保护电阻。


 


HS1101作为一个变化的电容器,连接26引脚。引脚作为R57的短路引脚。HS1101的等效电容通过R57R58充电达到上限电压(近似于0.67 VCC,时间记为T1),这时555的引脚3由高电平变为低电平,然后通过R58开始放电,由于R577引脚内部短路接地,所以只放电到触发界线(近似于0.33 VCC,时间记为T2),这时555芯片的引脚3变为高电平。通过不同的两个电阻R19R20进行传感器的不停充放电,产生方波输出。


充电、放电时间分别为


f5d41265-7e78-4c0a-a88d-e2ab0cc004b9.jpg


输出波形的频率和占空比的计算公式如下:


点击开大图



由此可以看出,空气相对湿度与555芯片输出频率存在一定线性关系。表2给出了典型频率湿度关系(参考点:<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />25,相对湿度:55%,输出频率:6.208kHz)。可以通过微处理器采集555芯片的频率,然后查表即可得出相对湿度值。为了更好提高测量精度,将采用下位机负责采集频率,将频率值送入上位机进行分段处理。

 


点击看大图 


555OUT接到51单片机的T1脚上,部分程序如下:


#include "reg51.h"


 


#define uchar unsigned char


#define uint  unsigned int


 


uchar  tem0 , tem1;                             


uchar  temp0 , temp1;                         


uint   f=0;                                                  //初值


/****************************************************************************


* 名称: timer0()


* 功能: 定时器1,每50000us中断一次。


* 入口参数:


****************************************************************************/


void timer0() interrupt 1


{


 


       EA =0;


       TR0=0;


    TR1=0;


 


       TL0=0xFF;                   //重装值   定时50000us  OX4BFFH


       TH0=0x4B;


          


       tem0 = TL1;   //读数


       tem1 = TH1;


       TL1=0x00;            //定时器1清零


      TH1=0x00;


       f=1;               //作标注位


 


       TR0=1;


       TR1=1;


       EA=1;


}


 


/****************************************************************************


* 名称: timer1()


* 功能: 计数器,用于计数将555输出的频率,以计数相对湿度。


* 入口参数:


****************************************************************************/


void timer1() interrupt 3    //T1中断,表示计数的频率溢出,超出了可测量的频率范围,显然在这里不可能。所以重新启动。


{


       EA =0;


       TR0=0;


    TR1=0;


 


       TL0=0x00;                   //重装值   定时50000us


       TH0=0x4C;


    TL1=0x00;                   //定时器1清零


      TH1=0x00;


 


      TR0=1;


    TR1=1;


       EA=1;


}


 


void Init_timer()


{


 


       TMOD=0x51;               //0101 0001 定时器0在模式1下工作16位定时器,定时方式  定时器1在模式1下工作16位计数器,T1负跳变加1


       TL0=0x00;                   //定时器0初值 定时50000us


       TH0=0x4C;                 


       TL1=0x00;                   //定时器1清零


       TH1=0x00;


       ET0=1;                        //使能定时器0中断


       ET1=1;                        //使能定时器1中断


       EA=1;                          //使能总中断


       TR0=1;                        //开始计时


       TR1=1;


}


 


void tran()


{


       f = tem1;


       f = ( f<<8 ) | tem0;


    f = f * 20;                    //这里f的值是最终读到的频率,不同频率对于不同相对湿度。



    if(( 5623 <= f) && ( f<= 6852) )         //相对湿度在有效范围内(0%--100%


    {


              if(( 6734 < f) && ( f <= 6852) )


                 { temp0 = 0;  temp1 =(6852 - f)*10/118; }


              if( (6618 < f) && ( f <= 6734) )


                     { temp0 = 1; temp1 =(6734 - f)*10/116;  }


              if( (6503 < f) && ( f <= 6618 ) )


                     { temp0 = 2; temp1 =(6618 - f)*10/115;  }  


              if( (6388 < f) && ( f <= 6503 ) )


                     { temp0 = 3; temp1 =(6503 - f)*10/115;  }


              if( (6271 < f) && ( f <= 6388 ) )


                     { temp0 = 4; temp1 =(6388 - f)*10/117;  }  


              if( (6152 < f) && ( f <= 6271 ) )


                     { temp0 = 5; temp1 =(6271 - f)*10/119;  }


           if( (6029 < f) && ( f <= 6152 ) )


                     { temp0 = 6; temp1 =(6152 - f)*10/123;  }


           if( (5901 < f) && ( f <= 6029 ) )


                     { temp0 = 7;temp1 =(6029 - f)*10/128;   }


           if( (5766 < f) && ( f <= 5901 ))


                     { temp0 = 8; temp1 =(5901 - f)*10/135;  }


           if( (5623 < f) && (f <= 5766))


                     { temp0 = 9; temp1 =(5766 - f)*10/143;  }


       }


       else


       {


              temp0 = 0; temp1 = 0;


       }


}


             


void main()


{


       uchar      i,k;


       uchar      count;


       Init_timer();


       count = 0;


       while(1)


       {


              for (i=0;i<200;i++)


                     for (k=0;k<200;k++);           //延时


              tran();


              temp0 &= 0x0F;


              temp1 &= 0x0F;


              temp0 = temp0 <<4;


              count=temp0 | temp1;


              Ddisp(count);


       }


PARTNER CONTENT

文章评论25条评论)

登录后参与讨论

用户377235 2013-9-23 16:20

樓主可以把你的完整電路圖和程序發給我嗎?我的郵箱是:dna032644@gmail.com

用户444168 2013-5-4 11:13

楼主,这个程序是部分的吗?可以把整个完整程序发到我邮箱吗?408378799@qq.com 太谢谢了

用户377235 2013-3-1 07:49

为什么我的液晶显示湿度总是为0啊

用户80602 2009-10-28 17:08

还有你试过准确吗、?我模拟搭过电路,发现你50MS测次数不好,因为会有1的偏差,比如一会300一会301,一会299,乘以20背后就是20倍的差别,根据那些IF语句,湿度会在2%的跳动

用户80602 2009-10-28 17:05

是不是我用随便什么555都只要采用上图的电阻值?很希望你的回答!

用户738303 2009-6-8 15:57

不需要

用户206203 2009-6-8 13:04

不好意思 我再问一个问题 这个频率信号还要A/D转换吗 谢谢了

用户738303 2009-6-3 21:07

tlc555应该差不多,你可以查查数据手册,上面有说怎么算电阻值的。频率信号可以利用单片机的计数功能计数啊,无需转换成电压

用户206203 2009-6-3 11:55

你好,麻烦问一下,如果我用tlc555,电阻应该用多大的,频率信号可以直接送给单片机吗,不用转换成电压信号吗,谢谢

用户738303 2009-5-13 19:21

我觉得电路图和程序我上面都说了很清楚了,555OUT接到51单片机的T1脚就行了。程序你就把它拷贝到keil下编译一下就行了。
相关推荐阅读
用户738303 2009-05-13 19:04
GPRS模块短消息发送方法
最近做了一个GPRS模块的简单测试,其中短消息方式比较简单,同时也与其他GPRS模块通用,现在将我的调试笔记写下来。短消息方式:<?xml:namespace prefix = o ns = "...
用户738303 2009-05-07 15:48
AT91SAM9260的bootstrap(包括norflash)
公司的一个项目用AT91SAM9260的ARM,从百特买了一个AT91SAM9260的开发板,上面有一个norflash,但没有焊。公司要求用norflash,结果却发现开发板资料中并没有norfla...
用户738303 2008-12-30 21:04
AT91SAM9260学习——用WINARM编译bootstrap
一、下载安装WinARM编译工具(winarm.rar文件)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o...
用户738303 2008-11-11 16:19
89C51控制ZY12864D点阵液晶显示数字
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />图1所示是<?xml:name...
用户738303 2008-11-06 15:52
虚拟机下Linux和windows的文件共享――共享方式
本人使用的是vmware workstation6.0绿色版,Linux为Redhat Linux9.0。首先在虚拟机下设置windows的共享文件,然后安装vmware tools实现共享。<...
用户738303 2008-10-25 16:56
MCS51的LED1602液晶显示控制电路及程序
图1所示是80C51单片机与LED1602的接口电路。其中,74HC573作为地址锁存器。LED1602的D0~D7为8位双向数据线;RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;R/...
EE直播间
更多
我要评论
25
8
关闭 站长推荐上一条 /3 下一条