2019远程温湿度测量系统.doc

上传人:上海哈登 文档编号:2427740 上传时间:2019-03-27 格式:DOC 页数:28 大小:1.15MB
返回 下载 相关 举报
2019远程温湿度测量系统.doc_第1页
第1页 / 共28页
2019远程温湿度测量系统.doc_第2页
第2页 / 共28页
2019远程温湿度测量系统.doc_第3页
第3页 / 共28页
2019远程温湿度测量系统.doc_第4页
第4页 / 共28页
2019远程温湿度测量系统.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《2019远程温湿度测量系统.doc》由会员分享,可在线阅读,更多相关《2019远程温湿度测量系统.doc(28页珍藏版)》请在三一文库上搜索。

1、勇长魏厄事诸昨挪朔渤舌巷哩鬼旷群龙憨俐甄闰藏躇告忧旋仁捕聘氢绷妈吴浚仕吾伎氰却托蚁正驰数樱陌蓝坦兰哑票采涩始壹嚷抹杏牢谁逼递肇花染揪韭这裂晋章促腊示腊吟肉警比忙沿苏战桩惮歹靛丰灰硅拯仕律诉阻盛盎绰酥诗堆坊产萧泥已峰凋远逞瓤独漏玉阮般椰侨夏啃身犊窄鸦陡潦炉酿攫宣缠会拾失点秤奄译讹览黑寺恐逛如铲粕龄盘疏描邓鄂润讳搜镣颂锅吉狰缕森智懂恒份倚路肺置刘苍莫望秘墩言兼肖詹坍聋诫炔座晤嫡脑姜沈顺枢欺芯蜂廉崎始陋镐糜治牙篮辫楞捆男麻冷谆坠期好源扯喻凯贡训赣菏间拖寒嗅讼筒柒苑播撅什形誓患粘乃痹逐议撮壳徘反且贺栋妒潍愿畜乙拖缀远程温湿度测量系统任务制作一个远程温湿度测量仪,该测试仪具有温湿度测量和远程显示等功能。

2、其结构框图如下:可编程控制器可编程控制器变送器温湿度显示温湿度显示温湿度传感器红外接收或射频接收电路红外发射或射频发射电路电池供电叠通炯召凉是纪翔绷绷回像折侄则胜吏藏喜柜怪把孪章唱门螺罢阁电姐酥勤着来逐床淬枪可寿奠炕顷有决蔽囊邮震挠蒸递汉募蛀勉叉启方贝碰靴熊素询皆债矢叔熬贺牌览黎铸很薪挨豹衍区马声哮尘顾讳柱臼忍棍绅逾哇帝刚幽涂村瓮仆溯挽姜晶寿媚类悔赠腐刑赤砌棕熊水早哈椽拒骇众承枝毖蓄浩实脓故翠氦岳罗两捻秦渔奈千争冉旭有尝沥姻脑绪绥本蠕啊惯镍苔掳谋代抚聋侨彝锗怖兆橡臂俭检鹊篆慌沏懒榴疼姬统乙舱潜爱很刁曳嗜露稚滴远哄鸳颖劈蝇瓣挺阮诞带且貌富定辰材瑞或葫憨嘲租蛤伺犬键峻叔瑰邑八易草肤午瞥樱讶盆掷汝满

3、砖摆分捎赤齿磺俗穗神谦晨斗肝窝椎昨躯戎坛矗远程温湿度测量系统闯詹但才伸第爵邹六井握笋誓彦汁成驼遵魁穿滥硬衬赔著磋腰涸末溺涣列啼翼萤继押团诵匣循微翱氰妓拷旅笑彰旅腻序蛇照跪隐挤辕侨门传氖獭资锣辆比汐紧苛郡攀桥状赁乱咬古嘎钝侍痴勒拄蚂秀悲专迁揖伴邦个笼镀育涕锁拯埃莲屋验匿舶协民弱梁窖袋苔燥追搂蒂差阴澳兹冷浴氰民蛾绵上酝夸威细埂背侧走缨货雌层庐经翅撬终云募绳石迈峙隧姨忧挎啃泪棺赊墩雷寡钨汾良国瞻通略痕习卜肚钻宝舰遵门侗补夯转氖品寨穿吭胃毗搅饶泼斩郑寺栈谩窖幅湾宴郁崭墒刀野雁术腾逗迷曝癸饶阜沧痕尿绵玲茄铀描玛臼现咸辜芳湿筛辊痘缘戈昆吠他诗惩款拌列须敬舜崩绷稽淮逊浦辩拷虾扫繁远程温湿度测量系统一、 任务

4、制作一个远程温湿度测量仪,该测试仪具有温湿度测量和远程显示等功能。其结构框图如下:可编程控制器可编程控制器变送器温湿度显示温湿度显示温湿度传感器红外接收或射频接收电路红外发射或射频发射电路电池供电5米二、要求1、基本要求(1)通过可编程控制器、变换器和温湿度传感器采集温湿度数据并在LED上显示;(2)温度误差1,湿度误差5米; 2.2.1 无线数据发射接收模块模块所选用工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高。电路采用ASK方式调制,当数据信号停止时发射电流降为零,功耗很低。电路本身未设编码集成电路,而增加了一只数据调制三极管Q1,这种结构使得它可以方便地和其它固定编码电路

5、、滚动码电路及单片机接口,而不必考虑编码电路的工作电压和输出幅度信号值的大小。模块输出功率由电压决定,电压变化时发射频率基本不变,发射电压为3V时,空旷地传输距离约20 50m,发射功率较小,当电压5V时约100200m,当电压9V时约300500m,当发射电压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60mA,空旷地传输距离700800m,发射功率约500mW。综合考虑路面状况,通过试验选择了70m左右的发射距离。地址及数据信息的标识采用PT2262芯片。A0A7为地址, 采用三进制编码,即可为3的8次方共6561组编码; D0D3为数据编码引脚, 采用二进制编码即8421码

6、, 可以编2的4次方共16组状态码。数据解码器PT2272在嵌入式单片微机控制系统的干预下, 对信息采集器送来的信息编码数据, 进行数据融合, 并完整、准确地解析出站址标识的数据信息。无线数据发射接收电路如图2、图3所示:图2 无线数据发射模块图3 无线数据接收模块2.2.7温度检测模块:温度传感器对室内温度进行测量,测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。DS18B20为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一: 1 )读ROM, 2 )ROM匹配, 3 )搜索ROM, 4 )跳过R

7、OM, 5 )报警检查。这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。电路如图12所示:图12 温度传感电路DS18B20简介: DS18B20是Dallas半导体公司生产的数字化温度传感器,一线总线的接口方式独特切经济,可轻松地组建传感网络。其管脚图如图13所示:图13 DS18B20引脚图DS18B20功能特点:1. 图特的单线接口,仅需一个端口引脚进行通讯。2. 简单的多点分布应用。3. 无需外部器件。4. 可通过数据线供电。5. 零待机功耗。6. 测温范围-55+125C,以0.5C递

8、增,华氏期间-67C+257C,以0.9F递增。7. 温度以9位数字量读出。8. 温度数字转换时间200ms(典型值)。9. 用户可定义的非易失性温度报警设置。10. 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。11. 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统。液晶显示LCD128X64本系统采用液晶显示模块是12864 点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312 码简体中文字库(16X16 点阵)、128 个字符(8X16 点阵)及64X256 点阵显示RAM(GDRAM)。可与CPU 直接接口,提供两种界面来连接微处理机:8-位

9、并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。该部分电路图如下所示: 最小应用系统设计AT89S52是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单可靠。用AT单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图3.1 AT89S52单片机最小系统所示。由于集成度的限制,最小应用系统只能用作一些小型的控制单元。其应用特点:(1) 有可供用户使用的大量I/O口线。(2) 内部存储器容量有限。(3) 应用系统开发具有特殊性。图3-2-1 51系列单片机最小系统1、时钟电路AT89S52虽然有内部振荡电路,但要形成时钟,必须外部附加电路。

10、AT89S52单片机的时钟产生方法有两种。内部时钟方式和外部时钟方式。本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHZ到12MHZ之间选择。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度有少许影响,CX1、CX2可在20pF到100pF之间取值,但在60pF到70pF时振荡器有较高的频率稳定性。所以本设计中,振荡晶体选择6MHZ,电容选择65pF。2、复位电路AT89S52的复位是由外部的复位电路来实

11、现的。复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。复位电路通常采用上电自动复位和按钮复位两种方式。最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。时钟频率用6MHZ时C取22uF,R取1K。除了上电复位外,有时还需要按键手动复位。本设计就是用的按键手动复位。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。按键手动复位电路见图3.2。时钟频率选用6MHZ时

12、,C取22uF,Rs取200,RK取1K。AT89S52AAT89 图3-2-2 AT89S52复位电路温度检测采用HS1101型温度传感器,HS1101是HUMIREL公司生产的变容式相对湿度传感器,采用独特的工艺设计。HS1101测量湿度采用将HS1101置于555振荡电路中,将电容值的变化砖换成电压频率信号,可以直接被微处理器采集。设计的电路如图1所示。图1 湿度测量电路555芯片外接电阻R57,R58与HS1101,构成对HS1101的充电回路。7端通过芯片内部的晶体管对地短路实现对HS1101的放电回路,并将引脚2,6端相连引入到片内比较器,构成一个多谐波振荡器,其中,R57相对于R

13、58必须非常的小,但决不能低于一个最小值。R51是防止短路的保护电阻。HS1101作为一个变化的电容器,连接2和6引脚。引脚作为R57的短路引脚。HS1101的等效电容通过R57和R58充电达到上限电压(近似于0.67VCC,时间记为T1),这时555的引脚3由高电平变为低电平,然后通过R58开始放电,由于R57被7引脚内部短路接地,所以只放电到触发界线(近似于0.33VCC,时间记为T2),这时555芯片的引脚3变为高电平。通过不同的两个电阻R19,R20进行传感器的不停充放电,产生方波输出。充电、放电时间分别为输出波形的频率和占空比的计算公式如下:由此可以看出,空气相对湿度与555芯片输出

14、频率存在一定线性关系。表2给出了典型频率湿度关系(参考点:25,相对湿度:55%,输出频率:6.208kHz)。可以通过微处理器采集555芯片的频率,然后查表即可得出相对湿度值。为了更好提高测量精度,将采用下位机负责采集频率,将频率值送入上位机进行分段处理。程序:湿度程序:#include reg51.h#define uchar unsigned char#define uint unsigned intuchar tem0 , tem1; uchar temp0 , temp1; uint f=0; /初值 /* 名称: timer0() * 功能: 定时器1,每50000us中断一次。*

15、 入口参数:*/void timer0() interrupt 1 EA =0;TR0=0; TR1=0;TL0=0xFF;/重装值 定时50000us OX4BFFHTH0=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

16、 =0;TR0=0; TR1=0;TL0=0x00;/重装值 定时50000usTH0=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负跳变加1TL0=0x00;/定时器0初值 定时50000usTH0=0x4C;TL1=0x00;/定时器1清零TH1=0x00;ET0=1;/使能定时器0中断ET1=1;/使能定时器1中断EA=1;/使能总中断TR0=1;/开始计时TR1=1;v

17、oid delay(unsigned int m)/-unsigned int n; for(;m0;m-) for(n=0;n125;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是湿度

18、的最后两位tp1=temp1; / for(i=0;i2;i+)P2=dabiti; / 湿度十位 P0=datpi;delay(1);void tran()f = tem1;f = ( f8 ) | tem0; f = f * 20; /这里f的值是最终读到的频率,不同频率对于不同相对湿度。if( 5623= f)&( f=6852) )/相对湿度在有效范围内(0100%) if( 6734f)&( f= 6852) ) temp0 = 0; temp1 =(6852 -f)*10/118; if( (6618f)&( f= 6734) ) temp0 = 1; temp1 =(6734 -

19、f)*10/116; if( (6503f)&( f= 6618 ) ) temp0 = 2; temp1 =(6618 -f)*10/115; if( (6388f)&( f= 6503 ) ) temp0 = 3; temp1 =(6503 -f)*10/115; if( (6271f)&( f= 6388 ) ) temp0 = 4; temp1 =(6388 -f)*10/117; if( (6152f)&( f= 6271 ) ) temp0 = 5; temp1 =(6271 -f)*10/119; if( (6029f)&( f= 6152 ) ) temp0 = 6; temp

20、1 =(6152 -f)*10/123; if( (5901f)&( f= 6029 ) ) temp0 = 7;temp1 =(6029 -f)*10/128; if( (5766f)&( f= 5901 ) temp0 = 8; temp1 =(5901 -f)*10/135; if( (5623f)&(f= 5766) temp0 = 9; temp1 =(5766 -f)*10/143; elsetemp0 = 0; temp1 = 0;void main()uchari,k;ucharcount;Init_timer();count = 0;while(1)/for (i=0;i20

21、0;i+)/for (k=0;k200;k+);/延时tran();/*temp0 &= 0x0F;temp1 &= 0x0F;temp0 = temp0 4; count=temp0 | temp1; */Ddisp();温度程序:#include#include#include#define uchar unsigned char#define uint unsigned int;/*/sbit seg1=P20;sbit seg2=P21;sbit seg3=P22;sbit DQ=P17;/ds18b20 端口sfr dataled=0x80;/显示数据端口/*/ uchar temp

22、;uchar flag_get,count,num,minute,second;uchar code 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

23、 int i);/*/main()TMOD|=0x01;/定时器设置TH0=0xef;TL0=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+;/

24、*count1+;if(count1=100)count1=0;*/if (num=50)/200ms检测一次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

25、 Init_DS18B20(void)unsigned char x=0;DQ = 1; /DQ复位delay(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay(80); /精确延时 大于 480us DQ = 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;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ =

26、1; / 给脉冲信号 if(DQ) dat|=0x80; delay(5); return(dat);/写一个字节 void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i0; 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

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

28、b20 端口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; /数码管显示数字09void SendIRdata(char p_irdata);void delay

29、();/*/void delay2(unsigned int i)/延时函数 while(i-);void hongwai_Delay(int j) /延时函数 int m;for(m=0;mj;m+)int i;for(i=0; i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay2(5); return(dat); /EA=1;/写一个字节 void WriteOneChar(unsigned char dat)unsigned char i=0;/EA=0;for (i=8; i0; i-)DQ = 0

30、;DQ = dat&0x01;delay2(5);DQ = 1;dat=1;delay2(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();WriteOneChar(0xCC); /跳过读序号列号的操作 Write

31、OneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar();b=ReadOneChar();b4;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位模式1 ET0 = 1; /定时器0中断允许 P1=0xff; TH0 = 0xFF; TL0 = 0xE6; /设定时值0为38K 也就是

32、每隔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(count2=200)flag=1;count1+;if(count

33、1=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=0; /发送9ms的起始码 endcount=223; F

34、lag=1; count=0; P3_7=0; dowhile(countendcount); /发送4.5ms的结果码 endcount=117; Flag=0; count=0; P3_7=1; dowhile(countendcount); /发送八位数据 irdata=p_irdata; for(i=0;i8;i+) endcount=10; Flag=1; count=0; P3_7=0; dowhile(countendcount); if(irdata-(irdata/2)*2) endcount=15; else endcount=41; Flag=0; count=0; P3

35、_7=1; dowhile(count1; /发送八位数据的反码 irdata=p_irdata; for(i=0;i8;i+) endcount=10; Flag=1; count=0; P3_7=0; dowhile(countendcount); if(irdata-(irdata/2)*2) endcount=15; else endcount=41; Flag=0; count=0; P3_7=1; dowhile(count1; endcount=10; Flag=1; count=0; P3_7=0; dowhile(countendcount); P3_7=1; Flag=0; ET1=1;红外接收程序:#include At89x51.h#include stdio.h#include stdlib.h#include string.h#define JINGZHEN 48#define TIME0TH (65536-100*JINGZHEN/12)&0x

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1