温度检测采用HS1101型温度传感器,HS1101是HUMIREL公司生产的变容式相对湿度传感器,采用独特的工艺设计。
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芯片外接电阻R57,R58与HS1101,构成对HS1101的充电回路。7端通过芯片内部的晶体管对地短路实现对HS1101的放电回路,并将引脚2,6端相连引入到片内比较器,构成一个多谐波振荡器,其中,R57相对于R58必须非常的小,但决不能低于一个最小值。R51是防止短路的保护电阻。
HS1101作为一个变化的电容器,连接2和6引脚。引脚作为R57的短路引脚。HS1101的等效电容通过R57和R58充电达到上限电压(近似于0.67 VCC,时间记为T1),这时555的引脚3由高电平变为低电平,然后通过R58开始放电,由于R57被7引脚内部短路接地,所以只放电到触发界线(近似于0.33 VCC,时间记为T2),这时555芯片的引脚3变为高电平。通过不同的两个电阻R19,R20进行传感器的不停充放电,产生方波输出。
充电、放电时间分别为
输出波形的频率和占空比的计算公式如下:
由此可以看出,空气相对湿度与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);
}
用户377235 2013-9-23 16:20
用户444168 2013-5-4 11:13
用户377235 2013-3-1 07:49
为什么我的液晶显示湿度总是为0啊
用户80602 2009-10-28 17:08
用户80602 2009-10-28 17:05
用户738303 2009-6-8 15:57
用户206203 2009-6-8 13:04
用户738303 2009-6-3 21:07
用户206203 2009-6-3 11:55
用户738303 2009-5-13 19:21