温度湿度无线监测系统设计.docx
- 文档编号:28254122
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:24
- 大小:277.22KB
温度湿度无线监测系统设计.docx
《温度湿度无线监测系统设计.docx》由会员分享,可在线阅读,更多相关《温度湿度无线监测系统设计.docx(24页珍藏版)》请在冰豆网上搜索。
温度湿度无线监测系统设计
温度湿度无线监测系统
一、总述
本系统由一个监测终端和多个监测点组成,可实现远程监测,传输距离可达2000米,支持最多225路多地同时监测。
监测点具有测量温度湿度以及发送信息的功能,监测终端能够接收各监测点的序号温度湿度信息,并通过液晶屏显示。
无线收发使用315M天线,主芯片为STC89C52,温度湿度传感器为DHT11,使用LCD1602显示接收到的监测点序号温度值和湿度值。
二、硬件电路设计
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
1、监测点电路设计
监测点电路方框图
2、监测终端电路设计
监测终端电路方框图
3、仿真图
检测端每次信号发送4遍。
数据由引导码加24位数据码组成,0码由01表示,1码由011表示。
上图中发送的数据为0x01(固定地址位),0x00(模拟温度值),0x00(模拟湿度值)。
程序中将P1.1和P1.0赋相同电平,在P1.1上接led,可以检查信号发送情况。
三、软件程序设计
1、程序流程图
N
Y
监测点程序流程图
监测终端程序流程图
2、程序源代码
(1)DHT11读温湿度程序
/************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总线由上拉电阻拉高主机延时20us
delay_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=P1^0;
sbitsend1=P1^1;//接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=P3^2;//无线接口标志
/*------------------------------------------------
全局变量声明
------------------------------------------------*/
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.256ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==25)//接收完头码和24位数据,数据自加到25
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/*------------------------------------------------
定时器0初始化
------------------------------------------------*/
voidTIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//重载值
TL0=0x00;//初始化值
ET0=1;//开中断
TR0=1;
}
/*------------------------------------------------
外部中断0初始化
------------------------------------------------*/
voidEX0init(void)
{
IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)
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.256
value|=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=recv_data[1]%10;
dat3=recv_data[2]/10;//数据2个位十位
dat4=recv_data[2]%10;
irpro_ok=1;//处理完毕标志位置1
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
EX0init();//初始化外部中断
TIM0init();//初始化定时器
LCD_Init();//初始化液晶
delayms(20);//延时有助于稳定
LCD_Clear();//清屏
LCD_Write_String(5,0,"RECEIVE");
LCD_Write_Char(9,1,0xdf);//右上角点
LCD_Write_Char(10,1,'C');//
LCD_Write_Char(15,1,'%');//用于显示温度湿度单位
while
(1)//主循环
{
if(irok)//如果接收好了进行数据处理
{
Ircordpro();
irok=0;
}
if(irpro_ok)//如果处理好后进行工作处理
{
LCD_Write_Char(1,1,display[adres1]);//写地址位
LCD_Write_Char(2,1,display[adres2]);
LCD_Write_Char(7,1,display[dat1]);//写数据1
LCD_Write_Char(8,1,display[dat2]);
LCD_Write_Char(13,1,display[dat3]);//写数据2
LCD_Write_Char(14,1,display[dat4]);
irpro_ok=0;//处理完成标志
delay500ms();delay500ms();
}
}
}
(4)监测终端液晶显示程序
#include"1602.h"
#include"delay.h"
sbitRS=P2^4;//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
delayms(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
delayms(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
delayms(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
四、心得体会
调试程序得出一个结论,要想完成一个工程,必须从基本模块调试开始,程序也是这样。
写程序时在没有接收成功的情况下,一开始就入手多位发送接收,致使程序难以调试,不知道问题出在哪里。
改从一位数据发送接收后,迅速实现了整个功能。
调试过程中老师给了很多支持和帮助,这是我走下去的动力。
系统仍可以进一步完善,使其工作更稳定,操作更灵活。
仅供个人用于学习、研究;不得用于商业用途。
Forpersonaluseonlyinstudyandresearch;notforcommercialuse.
NurfürdenpersönlichenfürStudien,Forschung,zukommerziellenZweckenverwendetwerden.
Pourl'étudeetlarechercheuniquementàdesfinspersonnelles;pasàdesfinscommerciales.
толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях.
以下无正文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 湿度 无线 监测 系统 设计