温度湿度无线监测系统设计.docx

上传人:b****6 文档编号:15982327 上传时间:2023-07-09 格式:DOCX 页数:24 大小:277.22KB
下载 相关 举报
温度湿度无线监测系统设计.docx_第1页
第1页 / 共24页
温度湿度无线监测系统设计.docx_第2页
第2页 / 共24页
温度湿度无线监测系统设计.docx_第3页
第3页 / 共24页
温度湿度无线监测系统设计.docx_第4页
第4页 / 共24页
温度湿度无线监测系统设计.docx_第5页
第5页 / 共24页
温度湿度无线监测系统设计.docx_第6页
第6页 / 共24页
温度湿度无线监测系统设计.docx_第7页
第7页 / 共24页
温度湿度无线监测系统设计.docx_第8页
第8页 / 共24页
温度湿度无线监测系统设计.docx_第9页
第9页 / 共24页
温度湿度无线监测系统设计.docx_第10页
第10页 / 共24页
温度湿度无线监测系统设计.docx_第11页
第11页 / 共24页
温度湿度无线监测系统设计.docx_第12页
第12页 / 共24页
温度湿度无线监测系统设计.docx_第13页
第13页 / 共24页
温度湿度无线监测系统设计.docx_第14页
第14页 / 共24页
温度湿度无线监测系统设计.docx_第15页
第15页 / 共24页
温度湿度无线监测系统设计.docx_第16页
第16页 / 共24页
温度湿度无线监测系统设计.docx_第17页
第17页 / 共24页
温度湿度无线监测系统设计.docx_第18页
第18页 / 共24页
温度湿度无线监测系统设计.docx_第19页
第19页 / 共24页
温度湿度无线监测系统设计.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

温度湿度无线监测系统设计.docx

《温度湿度无线监测系统设计.docx》由会员分享,可在线阅读,更多相关《温度湿度无线监测系统设计.docx(24页珍藏版)》请在冰点文库上搜索。

温度湿度无线监测系统设计.docx

温度湿度无线监测系统设计

温度湿度无线监测系统

一、总述

  本系统由一个监测终端和多个监测点组成,可实现远程监测,传输距离可达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.

 толькодлялюдей,которыеиспользуютсядляобучения,исследованийинедолжныиспользоватьсявкоммерческихцелях. 

以下无正文

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2