温度湿度无线监测系统设计毕设.docx
《温度湿度无线监测系统设计毕设.docx》由会员分享,可在线阅读,更多相关《温度湿度无线监测系统设计毕设.docx(17页珍藏版)》请在冰豆网上搜索。
![温度湿度无线监测系统设计毕设.docx](https://file1.bdocx.com/fileroot1/2022-11/18/b603c880-891a-48dd-aef2-00156a8c9d9b/b603c880-891a-48dd-aef2-00156a8c9d9b1.gif)
温度湿度无线监测系统设计毕设
温度湿度无线监测系统
一、总述
本系统由一个监测终端和多个监测点组成,可实现远程监测,传输距离可达2000米,
支持最多225路多地同时监测。
监测点具有测量温度湿度以及发送信息的功能,监测终端能
够接收各监测点的序号温度湿度信息,并通过液晶屏显示。
无线收发使用315M天线,主
芯片为STC89C52温度湿度传感器为DHT11,使用LCD1602显示接收到的监测点序号温度值和湿度值。
、硬件电路设计
1、监测点电路设计
监测点电路方框图
2、监测终端电路设计
监测终端电路方框图
电源
3、仿真图
数据由引导码加24位数据码组成,0码由01表示,1码由011表示。
上图中发送的数据为0x01(固定地址位),0x00(模拟温度值),0x00(模拟湿度值)。
Leu
监测点电路原理图
K
315M
GND'llI——
\TO
DMA
GND
STC89C52RC
Hu1-.^dinJ67—o-1—rti.^_3djsJrD7irtulirt—nJroTrvaMpl.円hhpi.pi.P2.P2.K核P2P2H
tlte
汨XI
-nvnrti-.^4J4ci7—
U1CK
vss
监测终端电路原理图
•GND
STC89C52RC
1T1
s
•&皿
c-D—
KIV.RJ.RlvIV.mmm
I1K
HE巴
PPDIPpppp
JA\4・\・6r$・P3P3P3P3P3P3P3'P3
(N)
TICuF
三、软件程序设计
1、程序流程图
监测点程序流程图
监测终端程序流程图
2、程序源代码
(1)
DHT11读温湿度程序
#include"DHT11.h"
unsignedcharwendu,shidu;
voiddelay_us()
{
unsignedchari;
i--;
i--;
i--;
i--;
i--;
i--;
}
voiddelay_ms(unsignedcharx)
unsignedcharn;
while((x--)!
=0)
{
for(n=0;n<115;n++){;}
}
}
charreceive()
{
unsignedinti;
unsignedchartemp,respond;
unsignedcharcom_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!
TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;respond=2;while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
//湿度读取子程序
//温度高
8位=
=TL_data
//温度低
8位=
=TH_data
//湿度高
8位=
=RH_data
//湿度低
8位=
=RH_data
//校验8位=
CK_data
voidread()
{
unsignedintrespond;
unsignedintRH_temp,RL_temp,TH_temp,TL_temp,CK_temp,untemp,RH_data,RL_data,TH_data,TL_data,CK_data;
//主机拉低18ms
TRH=0;delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高主机延时20usdelay_us();
delay_us();
delay_us();
delay_us();
TRH=1;
//判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行if(!
TRH)
{respond=2;
//判断DHT11发出80us的低电平响应信号是否结束while((!
TRH)&&respond++);
respond=2;
//判断从机是否发出80us的高电平,如发出则进入数据接收状态while((TRH)&&respond++);
//数据接收
RH_temp=receive();RL_temp=receive();
TH_temp=receive();
TL_temp=receive();
CK_temp=receive();
TRH=1;untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
//数据校验if(CK_temp==untemp)
{
RH_data=RH_temp;RL_data=RL_temp;TH_data=TH_temp;TL_data=TL_temp;CK_data=CK_temp;
}
}
//温度值湿度值wendu=(unsignedchar)(TH_data);shidu=(unsignedchar)(RH_data);
(2)监测点发送数据程序
/*****************************************************
发送8位地址和温度湿度
地址位定为0x01******************************************************/
#include
#include
#include
sbitsend0=P1A0;
sbitsend仁PUl;//接LED用于显示P1.0,P1.1的电位
unsignedchartemp,n;
unsignedcharAdress=0x01;//定义地址
voidSend(unsignedcharx)//发送数据函数
{
unsignedchari;
temp=0x80;//temp用于取位
for(i=0;i<8;i++)
{
if(temp&x)//如果对应位为1,则发送011
{
send0=0;send1=send0;
delayms
(1);
send0=1;send1=send0;
delayms
(2);
}
else//否则发送01
{
send0=0;send1=send0;
delayms
(1);
send0=1;send1=send0;
delayms
(1);
}
temp>>=1;//将对应位右移,取下一位
}
}
voidmain()
{
while
(1)
{
read();//读取温度湿度函数n=4;
while(n)
{
//头码发送
send0=1;
send1=1;
delayms(20);//间隔
Send(Adress);//发送地址
Send(wendu);//发送数据1
Send(shidu);//发送数据2
send0=0;
send1=0;
delayms(20);
--n;//循环4次
}delay1s();
}
}
(3)接收终端数据处理程序
/*
接收1个头码8位地址码2个8位数据25位液晶分别显示地址数,数据1,数据2
*/
//#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<1602.h>
sbitIR=P3A2;//无线接口标志
/*
全局变量声明*/unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok;
unsignedcharadres1,adres2,dat1,dat2,dat3,dat4;//显示变量,地址,数据1,数据2的个位十位
unsignedcharirdata[25];//存储变量unsignedchardisplay[10]={'0','1','2','3','4','5','6','7','8','9'};//显示字符数组unsignedcharrecv_data[3];
/*
函数声明
*/
//voidIr_work(void);
voidIrcordpro(void);
/*
定时器0中断处理
*/
voidtim0_isr(void)interrupt1using1{
irtime++;//用于计数2个下降沿之间的时间
}
/*
外部中断0中断处理
*/
voidEX0_ISR(void)interrupt0//外部中断0服务函数{
staticunsignedchari;//接收无线信号处理
staticbitstartflag;//是否开始处理标志位
if(startflag)
{
if(irtime<160&&irtime>=140)//引导码TC9012的头码,2*19ms/0.256msi=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;
i++;
if(i==25)//接收完头码和24位数据,数据自加到25
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}}
/*
定时器0初始化
*/voidTIM0init(void)//定时器0初始化{
TMOD=0x02;〃定时器0工作方式2,THO是重装值,TLO是初值
TH0=0x00;//重载值
TL0=0x00;//初始化值
ET0=1;//开中断
TR0=1;
}
/*
外部中断0初始化
*/voidEX0init(void)
{
INT0(P3.2)
IT0=1;//指定外部中断0下降沿触发,
EX0=1;//使能外部中断
EA=1;//开总中断
}
/*
无线码值处理
*/
voidIrcordpro(void)//无线码值处理函数
{
unsignedchari,j,k;
unsignedcharcord,value;
if(irdata[0]>140&&irdata[0]<160)
{
k=1;
for(i=0;i<=2;i++)
{
for(j=1;j<=8;j++)//处理1个字节8位
{
cord=irdata[k];
if(cord>10)//大于某值为1,这个和晶振有绝对关系,这里使用
12M计算,此值可以有一定误差3ms-/0.256value|=0x01;
if(j<8)
{value<<=1;
}
k++;
}
recv_data[i]=value;
value=0;
}adres1=recv_data[0]/10;//地址个位十位adres2=recv_data[0]%10;
dat1=recv_data[1]/10;//数据1个位十位dat2=re