远程温湿度测量系统Word格式.docx
《远程温湿度测量系统Word格式.docx》由会员分享,可在线阅读,更多相关《远程温湿度测量系统Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
B级精度为(0.30+0.005*|t|)℃;
其中|t|为实际温度的绝对值。
热响应时间<
30s;
最小置入深度:
热电阻的最小置入深度≥200mm;
允通电流≤5mA。
另外,PT100温度传感器还具有抗振动、稳定性好、准确度高、耐高压等优点。
但在实际应用中,使用单片机来进行温度的计算,表达式比较复杂,用单片机处理这样的计算过程,将会占用大量的资源,程序的编写上很复杂。
方案二:
本方案采用DS18B20数字温度传感器。
DS18B20温度传感器的技术性能:
单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,测温范围-55℃~+125℃,固有测温分辨率0.5℃,工作电源:
3~5V/DC,测量结果以9~12位数字量方式串行传送。
基于设计要求的考虑,即温度误差<1℃,温度测量范围0℃~120℃,方案二完全能满足要求,且设计电路和程序编写较为简单,本设计采用方案二。
1.2湿度测量方案
本方案采用HR202电阻型湿度传感器。
HR202电阻型湿度传感器技术参数:
工作范围20…95%RH,0…60℃,供电电压为1.5VAC,工作频率为500Hz…2kHz,湿度检测精度为±
5%RH。
特点:
线性优良,高性价比,能耗低,测量范围宽,响应迅速,抗污染能力强,性能稳定。
本方案采用HS1101湿度传感器。
HS1101湿度传感器技术参数:
工作温度:
-40~100℃,湿度范围:
0~100%RH。
曲线精度(10%~90%):
+/-2%RH,供电电压:
5~10V。
全互换性在标准环境下不需校正,长时间饱和下快速脱湿,高可靠性与长时间稳定性,可用于线性电压或频率输出回炉,快速反应时间。
从设计要求湿度误差<1%,湿度测量范围1%~99%出发,HS1101更符合要求,本设计采用方案二。
1.3远程数据传输方案
使用射频发射电路和接收电路传输数据。
射频技术是用无线电波来传送控制信号的,它的特点没有方向性,可以不“面对面”控制、距离远,可达数十米。
发射器和接收器之间只要没有能起屏蔽作用的金属阻挡物,就可正常使用。
射频发射电路制作成本较高,但其无方向性,使用方便。
使用红外二极管发射电路和红外接收电路传输数据。
红外发射接收有方向性,发射器必须对准接收器,并且中间不能有阻挡物,距离较近,但不受电磁干扰,成本优势明显,制作成本低、价格便宜。
基于设计要求传输距离大于5米和成本问题,选择方案二。
第二章系统设计与论证计算
2.1总体设计
数据采集发射端采用单片机(STC89C52)作为处理器,由DS18B20直接采集温度数据与单片机进行双向通信,HS1101与7555定时器构成多谐震荡电路,将HS1101的电容值转换为频率值并用单片机的计数器测量并转换为相对湿度值,测得的数据将在1602液晶显示屏上显示,由红外发射管发射数据。
数据接收显示端也采用STC89C52单片机作为处理器,由红外接收管接收发射端发出的温度湿度数据,并显示在1602液晶显示屏上以便与发射端进行对比。
2.2流程图
第三章理论分析与计算
3.1HS1101湿度计算
由电路可知
t充电=C(R2+R1)ln2
t放电=CR4ln2
因而,输出的方波率
f=1/(t充电+t放电)=1/[C(R2+2R1)ln2)]
相对湿度与电容的关系可看成直线段,所以有相对湿度
RH=2.7C+163
所以有
3.2DS18B20工作原理
DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。
其一个工作周期可分为两个部分,即温度检测和数据处理。
在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。
18B20共有三种形态的存储器资源,它们分别是:
ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。
数据在出产时设置不由用户更改。
DS18B20共64位ROM。
RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。
第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。
在上电复位时其值将被刷新。
第5个字节则是用户第3个EEPROM的镜像。
第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。
第9个字节为前8个字节的CRC码。
EEPROM非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。
初始化时序图
写数据时序图
读数据时序图
3.3红外发射与HS0038工作原理
HS0038红外接收电路一体化的红外接收装置将遥控信号的接收、放大、检波、整形集于一身,并且输出可以让单片机识别的TTL信号,这样大大简化了接收电路的复杂程度和电路的设计工作,方
便使用。
在本系统中我们采用红外一体化接收头HS0038,外观图如图3所示。
HS0038黑色环氧树脂封装,不受日光、荧光灯等光源干扰,内附磁屏蔽,功耗低,灵敏度高。
在用小功率发射管发射信号情况下,其接收距离可达35m。
它能与TTL、COMS电路兼容。
HS0038为直立侧面收光型。
它接收红外信号为38kHz,周期约26μs,同时能对信号进行放大、检波、整形,得到TTL电平的编码信号。
三个管脚分别是地、+5V电源、解调信号输出端。
红外一体化接收头的测试可以利用图4所示的电路进行,在HS0038的电源端与信号输出端之间接上一只二极管及一只发光二极管后,再配上规定的工作电源(为+5V),当手拿遥控器对着接收头按任意键时,发光二极管会闪烁,说明红外接收头和遥控器工作都正常;
如果发光二极管不闪烁发光,说明红外接收头和遥控器至少有一个损坏。
只要确保遥控器工作正常,很容易判断红外接收头的优劣。
红外管发出波形和HS0038信号输出原理
红外接收部分是通过测量HS0038接收到的红外线,然后所产生的正脉宽时间进行信号接收。
当测到第一个正脉宽在4.5-7.0ms时,开始准备计数,然后检测16次正脉宽的大小值。
当接收的正脉宽时间是1.7-2.1ms时,计0;
当接收的正脉宽时间是2.1-2.5ms时,计1;
得到16位二进制数,在液晶上显示。
第四章电路图及软件设计(见附录)
4.1整体电路图
液晶显示电路
第五章测量方法及仪器
将测得的温度和湿度数据与家用温湿表对比,调整参数,得到粗略数据,然后进实验室进行更为精确的测试。
第六章测量数据及测试结果分析
在常温下测试的数据与普通的温度计对比,温度相差应小于一度。
湿度传感器由于过于灵敏,需要在实验室做进一步调试。
第七章设计总结
本设计能够比较准确的走时,并能够通过硬件对时钟进行时间调整。
◆功能介绍:
达到测试温度范围-55—125摄氏度,湿度范围1%—99%,
采用红外发射与接收,距离大于5m,采用1602液晶显示。
◆制作心得:
在这次课程设计的调试过程中,我遇到很多问题,如:
在查找资料的过程中学到了许多,同时在协作过程中增进同学间的友谊。
[1]郭天祥.51单片机C语言教程.清电子工业出版社.2008
[2]童诗白华成英.模拟电子技术基础.高等教育出版社.2006
[3]邱玉娟.运用KEILC分析HS1101湿度传感器F-RH转换算法.江阴职业技术学院.2008
附录(程序设计)
/************************************************************************
红外接收部分是通过测量HS0038接收到的红外线,然后所产生的正脉宽时间进
行信号接收。
当测到第一个正脉宽在4.5-7.0ms时,开始准备计数,然后检测16次
正脉宽的大小值。
当接收的正脉宽时间
是2.1-2.5ms时,计1;
红外发部分包温湿度采
集和红外发射功能,红外发射的信号为38KHz,正脉宽时间接收端。
*************************************************************************/
//红外接收和温度显示(11.0592MHz)
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitlcdrs=P3^7;
sbitlcden=P3^6;
sbitreceive=P3^2;
//红外接收口
ulongnum,num1,num2,num11,t;
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=10;
y>
y--);
}
voidwrite_com(ucharcom)//写1602地址
lcdrs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
voidwrite_date(uchardate)//写1602数据
lcdrs=1;
P2=date;
voidwriteString(uchar*str,ucharlength)//写一个数组
uchari;
for(i=0;
i<
length;
i++)
{
write_date(str[i]);
}
voiddisplay_tempzheng(ucharadd,uinttemp)//显示正温度
unsignedcharcount;
unsignedchardatas[]={0,0,0,0,0};
datas[0]=temp/10000;
datas[1]=temp%10000/1000;
datas[2]=temp%1000/100;
datas[3]=temp%100/10;
datas[4]=temp%10;
write_com(0x80+add);
writeString("
+"
2);
if(datas[0]!
=0)
write_date(0x30+datas[0]);
for(count=1;
count!
=5;
count++)
write_date(0x30+datas[count]);
if(count==2)
write_date('
.'
);
write_date(0x63);
write_date(0xDF);
voiddisplay_tempfu(ucharadd,uinttemp)//显示负温度
-"
voiddisplay_huminity(ucharadd,uinthaminity)//显示湿度
datas[0]=haminity/10000;
datas[1]=haminity%10000/1000;
datas[2]=haminity%1000/100;
datas[3]=haminity%100/10;
datas[4]=haminity%10;
write_com(0x80+0x40+add);
%"
voidinit()//初始化函数
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
EA=1;
TMOD=0x01;
TH0=(65535-9206)/256;
TL0=(65535-9206)%256;
ET0=1;
TR0=0;
temp:
"
7);
write_com(0x80+0x40);
rh:
6);
voidmain()
{
init();
while
(1)
{
TH0=0;
TL0=0;
while(receive==1);
while(receive==0);
TR0=1;
while(receive);
num1=TH0*256+TL0;
num11=num1*1085/1000;
if(num11<
4500||num11>
7000)continue;
//如果在4.5-7ms内,开始接收数据
delay(4);
for(i=0;
i<
16;
i++)
t=TH0*256+TL0;
t=t*1085/1000;
if(t>
2500||t<
1700)
i=i-1;
continue;
//是否开始接收第i位数据
num=num>
>
1;
1700&
&
t<
2100)num=num|0x0000;
2100&
2500)num=num|0x8000;
}
if(num>
=0&
num<
10000)display_huminity(9,num);
//显示湿度
=10000&
=22500)display_tempzheng(7,num-10000);
//显示正温度
22500&
=28000)display_tempfu(7,num-22500);
//显示负温度
voidtime0()interrupt1
//温湿度采集&
发送(24MHz晶振)
reg52.H>
intrins.H>
math.H>
sbitsend=P3^0;
//红外发送口
sbitRS=P3^7;
sbitLCDEN=P3^6;
uintflag,F1;
inttemp;
for(y=47;
voidsend_num(uintnum)//发送数据
uintnum1;
num=num*2;
delay(6);
delay(30);
//4.5-7.0ms开始发送数据
{
num1=num>
i;
num1=num1&
0x01;
delay(3);
if(num1==0x00)delay(10);
//1.7ms-2.1ms
if(num1==0x01)delay(12);
//2.1ms-2.5ms发送16位数据
voiddelayUs()
_nop_();
voiddelayMs(uinta)
uinti,j;
for(i=a;
i>
0;
i--)
for(j=100;
j>
j--);
voidwriteComm(ucharcomm)//写1602地址
RS=0;
P2=comm;
LCDEN=1;
delayUs();
LCDEN=0;
delayMs
(2);
voidwriteData(uchardat)//写1602数据
RS=1;
P2=dat;
writeData(str[i]);
sbitds=P3^1;
voiddsInit()//DS18B20复位,初始化函数
unsignedinti;
ds=0;
i=100;
while(i>
0)i--;
ds=1;
i=4;
voiddsWait()
while(ds);
while(~ds);
while(i>
0)i--;
bitreadBit()//读一位数据函数
bitb;
i++;
b=ds;
i=8;
returnb;
unsignedcharreadByte()//读一个字节数据函数
unsignedcharj,dat;
dat=0;
i<
8;
j=readBit();
dat=(j<
<
7)|(dat>
1);
returndat;
voidwriteByte(unsignedchardat)//向DS18B20写一个字节数据函数
unsignedcharj;
for(j=0;
j<
8;
j++)
b=dat&
0x01;
dat>
=1;
if(b)
else
voidsendChangeCmd()
dsInit();
//DS18B20复位,初始化函数
dsWait();
delayMs
(1);
//延时
writeByte(0xcc);
//写跳过读ROM指令
writeByt