远程温湿度测量系统_第1页
远程温湿度测量系统_第2页
远程温湿度测量系统_第3页
远程温湿度测量系统_第4页
远程温湿度测量系统_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、远程温湿度测虽系统任务制作一个远程温湿度测量仪,该测试仪具有温湿度测量和远程显示等功能。其结构框图如下:、要求1、基本要求(1) 通过可编程控制器、变换器和温湿度传感器采集温湿度数据并在LED上显示;(2) 温度误差1C,湿度误差1%温度测量范围0C120C,湿度测量范围1防 99%(3) 可用电池供电;2、发挥部分(1) 设计红外二极管发射电路和红外接收电路,实现温湿度数据的准确可靠发送和接收;(2) 设计射频发射电路和接收电路,实现温湿度数据的准确可靠发送和接收;(3) 最好采用微型化的温湿度传感器,无线传输距离 5米;2.2.1无线数据发射接收模块模块所选用工作频率为315M,采用声表谐

2、振器SAW稳频,频率稳定度极 高。电路采用ASK方式调制,当数据信号停止时发射电流降为零,功耗很低。 电路本身未设编码集成电路,而增加了一只数据调制三极管Q1,这种结构使得它可以方便地和其它固定编码电路、 滚动码电路及单片机接口,而不必考虑编码 电路的工作电压和输出幅度信号值的大小。模块输出功率由电压决定,电压变化时发射频率基本不变,发射电压为 3V时,空旷地传输距离约2050m,发射功率较小,当电压 5V时约100200m,当电压9V时约300500m,当发射电压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60mA,空旷地传输距离700800m,发射功率约500mW。综合考虑路

3、面状况,通过试验选 择了 70m左右的发射距离。地址及数据信息的标识采用 PT2262芯片。A0A7 为地址,采用三进制编码,即可为3的8次方共6561组编码;D0D3为数据编码 引脚,采用二进制编码即8421码,可以编2的4次方共16组状态码。数据解码 器PT2272在嵌入式单片微机控制系统的干预下,对信息采集器送来的信息编码 数据,进行数据融合,并完整、准确地解析出站址标识的数据信息。无线数据发 射接收电路如图2、图3所示:DOUT osci 加 E All/M AW1 的皿图2无线数据发射模块图3无线数据接收模块2.2.7温度检测模块:温度传感器对室内温度进行测量,测量结果将被放置在DS

4、18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。DS18B20为一线通信接口,必须在先完成 ROM设定,否则记忆和控制功能将无法使用。主要首 先提供以下功能命令之一:1 )读ROM , 2 ) ROM匹配,3 )搜索ROM,4 )跳过ROM , 5 )报警检查。这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可 以知道总线上挂有有多少,什么样的设备。电路如图12所示:图12温度传感电路DS18B20 简介:DS18B20是Dallas半导体公司生产的数字化温度传感器,一线总线的接口方式独特切经济,可轻松地组建传

5、感网络。其管脚图如图13所示:底视咔:述由世AMl12IN 您*心AR弓胭HS明GNDDQVDDNC-地液据I/D可连K匚空脚DS18B20功能特点:1. 图特的单线接口,仅需一个端口引脚进行通讯。2. 简单的多点分布应用。3. 无需外部器件。4. 可通过数据线供电。5. 零待机功耗。6. 测温范围-55+125° C,以0.5° C递增,华氏期间-67° C+257° C,以0.9°F递增。7. 温度以9位数字量读出。8. 温度数字转换时间200ms袂型值)。9. 用户可定义的非易失性温度报警设置。10. 报警搜索命令识别并标志超过程序限定温

6、度(温度报警条件)的器件。11. 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统。液晶显示LCD128X64本系统采用液晶显示模块是 128 X64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256 点阵显示RAM (GDRAM )。可与CPU直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。该部分电路图 如下所示:LL眼J6 日.7K*aYMiaRW,知 2 舞泗345 6 ?9 9an烫REST耳FZ5T 902H担028

7、051P1.OT2 P1.1JT2EXOO APO.D/ADOP0.1/JU:ilPL2P0AD2Pl.3Pl 4P0.4/AD4Pl.5Pl.6PQ6TAD6Pl.7P0.7/AD?P3.3imTTP2.0SP3.2OTTQP2 UA?P2.2/A3QP3.5FTIP3.4ITDP2J/A12P2.5XA33EAJVPXT ALSTAL2P2.6ZA34P2.1IAMRESETPS.LfTKDP3.7/RDs sALEiPROGA1037CLK责sd355DA34KB33爻22 奏2412864AQVDDAlWPA2KL GHDSDAU9最小应用系统设计AT89S52是片内有ROM/EPRO

8、M的单片机,因此,这种芯片构成的最小系统简单、可靠。用AT单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图3.1AT89S52单片机最小系统所示。 由于集成度的限制,最小应用系统只能用作一些小型的控制 单元。其应用特点:(1) 有可供用户使用的大量I/O 口线。(2) 内部存储器容量有限。(3) 应用系统开发具有特殊性。图3-2-1 51系列单片机最小系统1、时钟电路AT89S52虽然有内部振荡电路,但要形成时钟,必须外部附加电路。AT89S52单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2

9、引脚上外接定时元件,内部的振荡电路便产生自激振荡。本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,CX1、CX2可在20pF到100pF之间取值,但在 60pF到70pF时振荡器有较高 的频率稳定性。所以本设计中,振荡晶体选择6MHZ,电容选择65pF。2、复位电路AT89S52的复位是由外部的复位电路来实现的。复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部

10、复位操作所需要的信号。复位电路通常采用上电自动复位和按钮复位两种方式。最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过 1ms,就可以实现自动上电复位。时钟频率用6MHZ时C取22uF,R 取 1K Q。除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手 动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经电阻与电源 Vcc接通而实现的。按键手动复位电路见图3.2。时钟频率选用 6MHZ时,C取22uF,Rs取200 Q , Rk取 1K Q。KSTAT89S52图3-2-2 AT89S52复位电路温度检测采

11、用HS1101型温度传感器,HS1101是HUMIRE公司生产的变容式 相对湿度传感器,采用独特的工艺设计。HS1101测量湿度采用将HS1101置丁 555振荡电路中,将电容值的变化砖换 成电压频率信号,可以直接被微处理器采集。设计的电路如图1所示IKvcc51KRESETVCCTRIGDISCHGTHOLDOUTCVOLTjGND555寸U9坎OUT件1 t 3S20KR59IM_L»ciTvIHSllOl图1湿度测量电路555芯片外接电阻R57, R58与HS1101构成对HS1101的充电回路。7端通 过芯片内部的晶体管对地短路实现对 HS1101的放电回路,并将引脚2, 6

12、端相连 引入到片内比较器,构成一个多谐波振荡器,其中, 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进行传感器的不停充放电,产生方波输出。充电、

13、放电时间分别为4 =+ 艮 7) In 2上=In 2输出波形的频率和占空比的计算公式如下:f - 6208ZZzT 鸟+弓 C(2s+ )1112 180?Fk 1291xln2D 二二 鸟&+心 = 跄° + 51 = 52%T + R 620x2 + 51由此可以看出,空气相对湿度与 555芯片输出频率存在一定线性关系。表 2 给出了典型频率湿度关系(参考点:25C,相对湿度:55%输出频率:6.208k Hz)。可以通过微处理器采集555芯片的频率,然后查表即可得出相对湿度值。 为了更好提高测量精度,将采用下位机负责采集频率,将频率值送入上位机进行 分段处理。稿二板圜

14、(11038-1,9368:4俨艘E+3.0114妇0弘国T.4403妇(T板脂') 表1给出了典型频率SO系(参考6208Hz为S5%RH堡()RH0102030405060708090100Frequency68526734661865036388627161立6029?90157665623程序:湿度程序:#include "reg51.h"#define uchar unsigned char#define uint unsigned intuchar tem0 , tem1;uchar temp0 , temp1;uint f=0;初值/* 名称:time

15、r0()*功能:定时器1,每50000us中断一次。*入口参数:*/void timer0() interrupt 1EA =0;TR0=0;TR1=0;TL0=0xFF;重装值定时 50000us OX4BFFHTH0=0x4B;tem0 = TL1; 读数teml = TH1;TL1=0x00;定时器1活零TH1=0x00;f=1;作标注位TR0=1;TR1=1;EA=1;/* 名称:timer1()*功能:计数器,用丁计数将555输出的频率,以计数相对湿度。*入口参数:*/void timer1() interrupt 3/T1中断,表示计数的频率溢出,超出了可测量的频率范围,显然在这里

16、不可能。所以重新启动。EA =0;TR0=0;TR1=0;TL0=0x00;重装值 定时 50000USTH0=0x4C;TL1=0x00;定时器1活零TH1=0x00;TR0=1;TR1=1;EA=1;TMOD=0x51;/0101 0001定时器0在模式1下工作16位定时器,定时方式 定时器1在模式1下工作16位计数器,T1负跳变加1TL0=0x00;定时器0初值定时50000usTH0=0x4C;TL1=0x00;定时器1活零TH1=0x00;ET0=1;使能定时器0中断ET1=1;使能定时器1中断EA=1;使能总中断TR0=1;开始计时TR1=1;void delay(unsigned

17、 int m)/-(unsigned int n;for(;m>0;m-)for(n=0;n<125;n-);void Ddisp()(uchar i;uchar code dabit=0xfe,0xfd,0xfb,0xf7;uchar code da=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;/ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40; 共阳0f字型码uchar tp2;tp0=temp0; /i是湿度的最后两位tp1=te

18、mp1; /for(i=0;i<2;i+)P2=dabiti; / 湿度十位P0=datpi;delay(1);void tran()(f = teml;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)&

19、&( 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

20、<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;

21、 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 |

22、 temp1; */ Ddisp();温度程序:#include<REG52.H>#include<math.h>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned int;seg1=P2A0;seg2=P2A1;seg3=P2A2;DQ=P1A7;/ds18b20 端口/*/sbitsbitsbitsbitsfr dataled=0x80;/ 显示数据端口/*/uchar temp;uchar flag_get,count,num,minute,second;uchar c

23、ode tab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/7段数码管段码表共阴uchar str3;/*/void delay1(uchar MS);unsigned char ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/*/main()TMOD|=0x01;/定时器设置TH0=0xef;TL0=

24、0xf0;IE=0x82;TR0=1;P2=0x00;count=0;while(1)str2=0x39;/ 显示 C 符号str0=tabtemp/10; 十位温度 str1=tabtemp%10; 个位温度 if(flag_get=1)定时读取当前温度 temp=ReadTemperature(); flag_get=0;void tim(void) interrupt 1 using 1/中断,用丁数码管扫描和温度检测间隔 (TH0=0xef;/定时器重装值TL0=0xf0;num+;/*count1+;if(count1=100)(count1=0;*/if (num=50)/200m

25、s 检测一次(num=0;flag_get=1;/标志位有效second+;if(second>=60)(second=0;minute+;count+;if(count=1)P2=0xfe;dataled=str0;/ 数码管扫描if(count=2)P2=0xfd;dataled=str1;if(count=3) P2=0xfb;dataled=str2;count=0;/* */void delay(unsigned int i)/延时函数 while(i-);/*/18b20初始化函数void Init_DS18B20(void) (unsigned char x=0;DQ =

26、1; /DQ 复位delay(8); 稍做延时DQ = 0;单片机将DQ拉低delay(80); 精确延时大丁 480usDQ = 1;拉高总线delay(10);x=DQ;稍做延时后 如果x=0则初始化成功x=1则初始化失败delay (5);读一个字节unsigned char ReadOneChar(void) (unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-)(DQ = 0; /给脉冲信号dat>>=1;DQ = 1; /给脉冲信号if(DQ)dat|=0x80;delay(5); return(dat)

27、;写一个字节void WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i>0; i-)(DQ = 0;DQ = dat&0x01;delay(5);DQ = 1;dat>>=1;delay (5);读取温度unsigned char ReadTemperature(void)(unsigned char a=0;unsigned char b=0;unsigned char t=0;/float tt=0;Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作W

28、riteOneChar(0x44); / 启动温度转换 delay(200);Init_DS18B20();WriteOneChar(0xCC); 跳过读序号列号的操作WriteOneChar(0xBE); 读取温度寄存器等(共可读9个寄存器)前两 个就是温度a=ReadOneChar();b=ReadOneChar();b<<=4;b+=(a&0xf0)>>4;t=b;/tt=t*0.0625;/t= tt*10+0.5; 放大10倍输出并四舍五入 return(t);红外发射程序:#include <AT89X51.h>sbit DQ=P1A7;

29、/ds18b20 端口static bit OP,flag;红外发射管的亮灭static unsigned int count;延时计数器static unsigned int endcount; 终止延时计数static unsigned char Flag,temp,count1,count2;红夕卜发送标志float tt;code unsigned char shuju10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; 数码管显示数字0 9void SendIRdata(char p_irdata);void delay();/*

30、/void delay2(unsigned int i)/延时函数while(i-);void hongwai_Delay(int j) 延时函数int m;for(m=0;m<j;m+)int i;for(i=0; i<300; i+); /约 1ms/*/18b20初始化函数void Init_DS18B20(void)unsigned char x=0;/EA=0;DQ = 1; /DQ 复位delay2(8);稍做延时DQ = 0;单片机将DQ拉低delay2(80); 精确延时大丁 480usDQ = 1;拉高总线delay2(10);x=DQ;稍做延时后 如果x=0则初

31、始化成功x=1则初始化失败delay 2( 5);/EA=1;读一个字节unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;/EA=0;for (i=8;i>0;i-)DQ = 0; /给脉冲信号dat>>=1;DQ = 1; /给脉冲信号if(DQ)dat|=0x80;delay 2( 5);return(dat);/EA=1;写一个字节void WriteOneChar(unsigned char dat)unsigned char i=0;/EA=0;for (i=8; i>

32、0; i-)DQ = 0;DQ = dat&0x01;delay 2( 5);DQ = 1;dat>>=1;delay 2( 5);/EA=1;读取温度unsigned char ReadTemperature(void)(unsigned char a=0;unsigned char b=0;unsigned char t=0;/float tt=0;Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换 delay2(200);Init_DS18B20();WriteOneCh

33、ar(0xCC); 跳过读序号列号的操作WriteOneChar(0xBE); 读取温度寄存器等(共可读9个寄存器)前两 个就是温度a=ReadOneChar();b=ReadOneChar();b<<=4;b+=(a&0xf0)>>4;t=b;/tt=t*0.0625;/t= tt*10+0.5; 放大10倍输出并四舍五入 return(t);void main(void)(count = 0;Flag = 0;OP = 0;P3_7 = 1;EA = 1; 允许CPU中断TMOD = 0x11; 设定时器0和1为16位模式1ET0 = 1; /定时器0中断允

34、许P1=0xff;TH0 = 0xFF;TL0 = 0xE6; 设定时值0为38K也就是每隔26us中断一次TH1=(65535-50000)/256;TL1=(65535-50000)%256;TR1 = 1;/开始计数ET1=1;doif(flag=1)count1=0;flag=0;TR0 = 0;temp=ReadTemperature();TR0 = 1;/开始计数SendIRdata(temp); 开始发送数据while(1);void timer_1() interrupt 3TH1=(65535-4000)/256;TL1=(65535-4000)%256;count2+;if

35、(count2>=200)flag=1;count1+;if(count1=1) 数码管扫描(P2=0xfe;P0=shujutemp/10;if(count1=2)(P2=0xfd;P0=shujutemp%10;if(count1=3)(P2=0xfb;P0=0x39;count1=0;/定时器0中断处理void timeint(void) interrupt 1(TH0=0xFF;TL0=0xE6; 设定时值为38K也就是每隔26us中断一次 count+;void SendIRdata(char p_irdata)(int i;char irdata=p_irdata;/ET1=

36、0;发送9ms的起始码endcount=223;Flag=1;count=0;P3_7=0;dowhile(count<endcount);发送4.5ms的结果码 endcount=117;Flag=0;count=0;P3_7=1;dowhile(count<endcount);发送八位数据irdata=p_irdata;for(i=0;i<8;i+)endcount=10;Flag=1;count=0;P3_7=0;dowhile(count<endcount);if(irdata-(irdata/2)*2)endcount=15;elseendcount=41;F

37、lag=0;count=0;P3_7=1;dowhile(count<endcount);irdata=irdata>>1;发送八位数据的反码irdata=p_irdata;for(i=0;i<8;i+)endcount=10;Flag=1;count=0;P3_7=0;dowhile(count<endcount);if(irdata-(irdata/2)*2) endcount=15;else endcount=41;Flag=0;count=0;P3_7=1;dowhile(count<endcount);irdata=irdata>>1;

38、 endcount=10;Flag=1;count=0;P3_7=0;dowhile(count<endcount);P3_7=1;Flag=0;ET1=1;红外接收程序:#include"At89x51.h"#include"stdio.h"#include"stdlib.h"#include"string.h"#define JINGZHEN 48#define TIME0TH0us,红外遥控#define TIME0TL(65536-100*JINGZHEN/12)&0xff00)>>

39、;8/time0,10#define TIME1TH#define TIME1TL(65536-100*JINGZHEN/12)&0xff)(65536-5000*JINGZHEN/12)&0xff00)>>8(65536-5000*JINGZHEN/12)&0xff)#define uchar unsigned char#define uint unsigned intcode unsigned char Shuju10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; 数码管显示数字0 9code uchar BitMsk=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,;uint IrCount=0,Show=0,Cont=0;uchar IRDATBUF32,s20;static uchar IrDat5=0,0,0,0,0;uchar IrStart=0,IrDatCount=0;extern void initLCM( void);/LCD初始化子程序extern void DisplayListChar(ucha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论