整理远程温湿度测量系统.docx
- 文档编号:15857003
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:35
- 大小:343.94KB
整理远程温湿度测量系统.docx
《整理远程温湿度测量系统.docx》由会员分享,可在线阅读,更多相关《整理远程温湿度测量系统.docx(35页珍藏版)》请在冰点文库上搜索。
整理远程温湿度测量系统
远程温湿度测量系统
一、任务
制作一个远程温湿度测量仪,该测试仪具有温湿度测量和远程显示等功能。
其结构框图如下:
二、要求
1、基本要求
(1)通过可编程控制器、变换器和温湿度传感器采集温湿度数据并在LED上显示;
(2)温度误差<1℃,湿度误差<1%,温度测量范围0℃~120℃,湿度测量范围1%~99%;
(3)可用电池供电;
2、发挥部分
(1)设计红外二极管发射电路和红外接收电路,实现温湿度数据的准确可靠发送和接收;
(2)设计射频发射电路和接收电路,实现温湿度数据的准确可靠发送和接收;
(3)最好采用微型化的温湿度传感器,无线传输距离>5米;
2.2.1无线数据发射接收模块
模块所选用工作频率为315M,采用声表谐振器SAW稳频,频率稳定度极高。
电路采用ASK方式调制,当数据信号停止时发射电流降为零,功耗很低。
电路本身未设编码集成电路,而增加了一只数据调制三极管Q1,这种结构使得它可以方便地和其它固定编码电路、滚动码电路及单片机接口,而不必考虑编码电路的工作电压和输出幅度信号值的大小。
模块输出功率由电压决定,电压变化时发射频率基本不变,发射电压为3V时,空旷地传输距离约20~50m,发射功率较小,当电压5V时约100~200m,当电压9V时约300~500m,当发射电压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60mA,空旷地传输距离700~800m,发射功率约500mW。
综合考虑路面状况,通过试验选择了70m左右的发射距离。
地址及数据信息的标识采用PT2262芯片。
A0~A7为地址,采用三进制编码,即可为3的8次方共6561组编码;D0~D3为数据编码引脚,采用二进制编码即8421码,可以编2的4次方共16组状态码。
数据解码器PT2272在嵌入式单片微机控制系统的干预下,对信息采集器送来的信息编码数据,进行数据融合,并完整、准确地解析出站址标识的数据信息。
无线数据发射接收电路如图2、图3所示:
图2无线数据发射模块
图3无线数据接收模块
2.2.7温度检测模块:
温度传感器对室内温度进行测量,测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。
DS18B20为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。
主要首先提供以下功能命令之一:
1)读ROM,2)ROM匹配,3)搜索ROM,4)跳过ROM,5)报警检查。
这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
电路如图12所示:
图12温度传感电路
DS18B20简介:
DS18B20是Dallas半导体公司生产的数字化温度传感器,一线总线的接口方式独特切经济,可轻松地组建传感网络。
其管脚图如图13所示:
图13DS18B20引脚图
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.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件。
11.应用包括温度控制、工业系统、消费品、温度计或任何热感测系统。
液晶显示LCD128X64
本系统采用液晶显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置国标GB2312码简体中文字库(16X16点阵)、128个字符(8X16点阵)及64X256点阵显示RAM(GDRAM)。
可与CPU直接接口,提供两种界面来连接微处理机:
8-位并行及串行两种连接方式。
具有多种功能:
光标显示、画面移位、睡眠模式等。
该部分电路图如下所示:
最小应用系统设计
AT89S52是片内有ROM/EPROM的单片机,因此,这种芯片构成的最小系统简单﹑可靠。
用AT单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可,如图3.1AT89S52单片机最小系统所示。
由于集成度的限制,最小应用系统只能用作一些小型的控制单元。
其应用特点:
(1)有可供用户使用的大量I/O口线。
(2)
内部存储器容量有限。
(3)应用系统开发具有特殊性。
图3-2-151系列单片机最小系统
1、时钟电路
AT89S52虽然有内部振荡电路,但要形成时钟,必须外部附加电路。
AT89S52单片机的时钟产生方法有两种。
内部时钟方式和外部时钟方式。
本设计采用内部时钟方式,利用芯片内部的振荡电路,在XTAL1、XTAL2引脚上外接定时元件,内部的振荡电路便产生自激振荡。
本设计采用最常用的内部时钟方式,即用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHZ到12MHZ之间选择。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小、振荡电路起振速度
有少许影响,CX1、CX2可在20pF到100pF之间取值,但在60pF到70pF时振荡器有较高的频率稳定性。
所以本设计中,振荡晶体选择6MHZ,电容选择65pF。
2、复位电路
AT89S52的复位是由外部的复位电路来实现的。
复位引脚RST通过一个斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
最简单的上电自动复位电路中上电自动复位是通过外部复位电路的电容充电来实现的。
只要Vcc的上升时间不超过1ms,就可以实现自动上电复位。
时钟频率用6MHZ时C取22uF,R取1KΩ。
除了上电复位外,有时还需要按键手动复位。
本设计就是用的按键手动复位。
按键手动复位有电平方式和脉冲方式两种。
其中电平复位是通过RST端经电阻与电源Vcc接通而实现的。
按键手动复位电路见图3.2。
时钟频率选用6MHZ时,C取22uF,Rs取200Ω,RK取1KΩ。
AAT89
图3-2-2AT89S52复位电路
温度检测采用HS1101型温度传感器,HS1101是HUMIREL公司生产的变容式相对湿度传感器,采用独特的工艺设计。
HS1101测量湿度采用将HS1101置于555振荡电路中,将电容值的变化砖换成电压频率信号,可以直接被微处理器采集。
设计的电路如图1所示。
图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给出了典型频率湿度关系(参考点:
25℃,相对湿度:
55%,输出频率:
6.208kHz)。
可以通过微处理器采集555芯片的频率,然后查表即可得出相对湿度值。
为了更好提高测量精度,将采用下位机负责采集频率,将频率值送入上位机进行分段处理。
程序:
湿度程序:
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
uchartem0,tem1;
uchartemp0,temp1;
uintf=0;//初值
/****************************************************************************
*名称:
timer0()
*功能:
定时器1,每50000us中断一次。
*入口参数:
****************************************************************************/
voidtimer0()interrupt1
{
EA=0;
TR0=0;
TR1=0;
TL0=0xFF;//重装值定时50000usOX4BFFH
TH0=0x4B;
tem0=TL1;//读数
tem1=TH1;
TL1=0x00;//定时器1清零
TH1=0x00;
f=1;//作标注位
TR0=1;
TR1=1;
EA=1;
}
/****************************************************************************
*名称:
timer1()
*功能:
计数器,用于计数将555输出的频率,以计数相对湿度。
*入口参数:
****************************************************************************/
voidtimer1()interrupt3//T1中断,表示计数的频率溢出,超出了可测量的频率范围,显然在这里不可能。
所以重新启动。
{
EA=0;
TR0=0;
TR1=0;
TL0=0x00;//重装值定时50000us
TH0=0x4C;
TL1=0x00;//定时器1清零
TH1=0x00;
TR0=1;
TR1=1;
EA=1;
}
voidInit_timer()
{
TMOD=0x51;//01010001定时器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;
}
voiddelay(unsignedintm)
//--------------------------------------
{
unsignedintn;
for(;m>0;m--)
for(n=0;n<125;n--);
}
voidDdisp()
{
uchari;
ucharcodedabit[]={0xfe,0xfd,0xfb,0xf7};
ucharcodeda[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40;共阳0~f字型码
uchartp[2];
tp[0]=temp0;//i是湿度的最后两位
tp[1]=temp1;//
for(i=0;i<2;i++)
{
P2=dabit[i];//湿度十位
P0=da[tp[i]];
delay
(1);
}
}
voidtran()
{
f=tem1;
f=(f<<8)|tem0;
f=f*20;//这里f的值是最终读到的频率,不同频率对于不同相对湿度。
if((5623<=f)&&(f<=6852))//相对湿度在有效范围内(0%--100%)
{
if((6734 {temp0=0;temp1=(6852-f)*10/118;} if((6618 {temp0=1;temp1=(6734-f)*10/116;} if((6503 {temp0=2;temp1=(6618-f)*10/115;} if((6388 {temp0=3;temp1=(6503-f)*10/115;} if((6271 {temp0=4;temp1=(6388-f)*10/117;} if((6152 {temp0=5;temp1=(6271-f)*10/119;} if((6029 {temp0=6;temp1=(6152-f)*10/123;} if((5901 {temp0=7;temp1=(6029-f)*10/128;} if((5766 {temp0=8;temp1=(5901-f)*10/135;} if((5623 {temp0=9;temp1=(5766-f)*10/143;} } else { temp0=0;temp1=0; } } voidmain() { uchari,k; ucharcount; 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(); } } 温度程序: #include #include #include #defineucharunsignedchar #defineuintunsignedint; /*****************************************************************************/ sbitseg1=P2^0; sbitseg2=P2^1; sbitseg3=P2^2; sbitDQ=P1^7;//ds18b20端口 sfrdataled=0x80;//显示数据端口 /**********************************************************************/ uchartemp; ucharflag_get,count,num,minute,second; ucharcodetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阴 ucharstr[3]; /***********************************************************************/ voiddelay1(ucharMS); unsignedcharReadTemperature(void); voidInit_DS18B20(void); unsignedcharReadOneChar(void); voidWriteOneChar(unsignedchardat); voiddelay(unsignedinti); /************************************************************************/ main() { TMOD|=0x01;//定时器设置 TH0=0xef; TL0=0xf0; IE=0x82; TR0=1; P2=0x00; count=0; while (1) { str[2]=0x39;//显示C符号 str[0]=tab[temp/10];//十位温度 str[1]=tab[temp%10];//个位温度 if(flag_get==1)//定时读取当前温度 { temp=ReadTemperature(); flag_get=0; } } } voidtim(void)interrupt1using1//中断,用于数码管扫描和温度检测间隔 { TH0=0xef;//定时器重装值 TL0=0xf0; num++; /*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=str[0];}//数码管扫描 if(count==2) {P2=0xfd; dataled=str[1];} if(count==3) {P2=0xfb; dataled=str[2]; count=0;} } /*************************************************************************************/ voiddelay(unsignedinti)//延时函数 { while(i--); } /***************************************************************************************/ //18b20初始化函数 voidInit_DS18B20(void) { unsignedcharx=0; DQ=1;//DQ复位 delay(8);//稍做延时 DQ=0;//单片机将DQ拉低 delay(80);//精确延时大于480us DQ=1;//拉高总线 delay(10); x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败 delay(5); } //读一个字节 unsignedcharReadOneChar(void) { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; delay(5); } return(dat); } //写一个字节 voidWriteOneChar(unsignedchardat) { unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; delay(5); DQ=1; dat>>=1; } delay(5); } //读取温度 unsignedcharReadTemperature(void) { unsignedchara=0; unsignedcharb=0; unsignedchart=0; //floattt=0; Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(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 sbitDQ=P1^7;//ds18b20端口 staticbitOP,flag;//红外发射管的亮灭 staticunsignedintcount;//延时计数器 staticunsignedintendcount;//终止延时计数 staticunsignedcharFlag,temp,count1,count2;//红外发送标志 floattt; codeunsignedcharshuju[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示数字0-9 voidSendIRdata(charp_irdata); voiddelay(); /*************************************************************************************/ voiddelay2(unsignedinti)//延时函数 { while(i--); } voidhongwai_Delay(intj)//延时函数 { intm; for(m=0;m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 整理 远程 温湿度 测量 系统