单片机 智能环境监测系统程序.docx

上传人:b****6 文档编号:8831995 上传时间:2023-02-02 格式:DOCX 页数:17 大小:17.77KB
下载 相关 举报
单片机 智能环境监测系统程序.docx_第1页
第1页 / 共17页
单片机 智能环境监测系统程序.docx_第2页
第2页 / 共17页
单片机 智能环境监测系统程序.docx_第3页
第3页 / 共17页
单片机 智能环境监测系统程序.docx_第4页
第4页 / 共17页
单片机 智能环境监测系统程序.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

单片机 智能环境监测系统程序.docx

《单片机 智能环境监测系统程序.docx》由会员分享,可在线阅读,更多相关《单片机 智能环境监测系统程序.docx(17页珍藏版)》请在冰豆网上搜索。

单片机 智能环境监测系统程序.docx

单片机智能环境监测系统程序

51单片机智能环境监测系统程序

王维进

#include

#include

#include

#include

#include"0832.h"

#defineucharunsignedchar

#defineuintunsignedint

#include"eeprom52.h"

sbitDATA=P3^7;//温湿度

sbitE=P2^5;//1602使能引脚

sbitRS=P2^7;//1602数据/命令选择引脚

sbitRW=P2^6;

sbitK1=P1^3;//设置键

sbitK2=P1^4;//加

sbitK3=P1^5;//减

sbitK4=P1^7;//人体

sbitK5=P1^6;//布防撤防按键

sbitLED1=P3^1;//烟雾报警

sbitLED2=P3^2;//温度上限

sbitLED3=P3^3;//温度下限

sbitLED4=P3^4;//湿度上限

sbitLED5=P3^5;//湿度下限

sbitLED6=P3^6;//红外报警

sbitalarm=P3^0;//蜂鸣器

ucharU8FLAG,U8temp,U8comdata,U8RH_data_H_temp,U8RH_data_L_temp,U8T_data_H_temp,U8T_data_L_temp,U8checkdata_temp;

ucharU8RH_data_H,U8RH_data_L,U8T_data_H,U8T_data_L,U8checkdata;

ucharMode,humidity,temperature,smog;

bitBJ_LED1=1,BJ_LED2=1,BJ_LED3=1,BJ_LED4=1,BJ_LED5=1,BJ_LED6=1;

bitbdataFlagStartRH;

ucharflag;//记录当前设置状态

uintcount;

//定时器0初始化

voidTimer0_Init()

{

ET0=1;//允许定时器0中断

TMOD=0x11;//定时器工作方式选择

TL0=0xFF;

TH0=0x4B;//定时器赋予初值

TH1=0xdc;

TL1=0x00;

ET1=1;

TR0=1;//启动定时器

}

//定时器0中断

voidTimer0_ISR(void)interrupt1using0

{

ucharRHCounter;

TL0=0xFF;

TH0=0x4B;//定时器赋予初值

RHCounter++;

if(RHCounter>=15)

{

FlagStartRH=1;

RHCounter=0;

}

}

voidDelay1(uintj)

{

uchari;

for(;j>0;j--)

{

for(i=0;i<27;i++);

}

}

voidDelay_10us(void)

{

uchari;

i--;

i--;

i--;

i--;

i--;

i--;

}

voidCOM(void)

{

uchari;

for(i=0;i<8;i++)

{

U8FLAG=2;

while((!

DATA)&&U8FLAG++);

Delay_10us();

Delay_10us();

Delay_10us();

U8temp=0;

if(DATA)U8temp=1;

U8FLAG=2;

while((DATA)&&U8FLAG++);

//超时则跳出for循环

if(U8FLAG==1)break;

//判断数据位是0还是1

//如果高电平高过预定0高电平值则数据位为1

U8comdata<<=1;

U8comdata|=U8temp;//0

}//rof

}

//--------------------------------

//-----温湿度读取子程序------------

//--------------------------------

//----以下变量均为全局变量--------

//----温度高8位==U8T_data_H------

//----温度低8位==U8T_data_L------

//----湿度高8位==U8RH_data_H-----

//----湿度低8位==U8RH_data_L-----

//----校验8位==U8checkdata-----

//----调用相关子程序如下----------

//----Delay();,Delay_10us();,COM();

//--------------------------------

ucharRH(void)

{

//主机拉低18ms

DATA=0;

Delay1(180);//原来为5

DATA=1;

//总线由上拉电阻拉高主机延时20us

Delay_10us();

Delay_10us();

Delay_10us();

Delay_10us();

//主机设为输入判断从机响应信号

DATA=1;

//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行

if(!

DATA)//T!

{

U8FLAG=2;

//判断从机是否发出80us的低电平响应信号是否结束

while((!

DATA)&&U8FLAG++);

U8FLAG=2;

//判断从机是否发出80us的高电平,如发出则进入数据接收状态

while((DATA)&&U8FLAG++);

//数据接收状态

COM();

U8RH_data_H_temp=U8comdata;

COM();

U8RH_data_L_temp=U8comdata;

COM();

U8T_data_H_temp=U8comdata;

COM();

U8T_data_L_temp=U8comdata;

COM();

U8checkdata_temp=U8comdata;

DATA=1;

//数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

if(U8temp==U8checkdata_temp)

{

U8RH_data_H=U8RH_data_H_temp;

U8RH_data_L=U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp;

}

return1;

}

else//传感器不响应

{

return0;

}

}

/********************************************************************

*文件名:

液晶1602显示.c

*描述:

该程序实现了对液晶1602的控制。

***********************************************************************/

/********************************************************************

*名称:

delay()

*功能:

延时,延时时间大概为140US。

*输入:

*输出:

***********************************************************************/

voiddelay()

{

inti,j;

for(i=0;i<=10;i++)

for(j=0;j<=2;j++);

}

/********************************************************************

*名称:

enable(uchardel)

*功能:

1602命令函数

*输入:

输入的命令值

*输出:

***********************************************************************/

voidwrite_1602com(uchardel)

{

P0=del;

RS=0;

E=1;

delay();

E=0;

delay();

}

/********************************************************************

*名称:

write(uchardel)

*功能:

1602写数据函数

*输入:

需要写入1602的数据

*输出:

***********************************************************************/

voidwrite_1602dat(uchardel)

{

P0=del;

RS=1;

E=1;

delay();

E=0;

delay();

}

/********************************************************************

*名称:

L1602_init()

*功能:

1602初始化,请参考1602的资料

*输入:

*输出:

***********************************************************************/

voidL1602_init(void)

{

write_1602com(0x38);

write_1602com(0x0c);

write_1602com(0x06);

write_1602com(0x01);//清屏要放在最后

}

voiddisplay()

{

write_1602com(0x83);

write_1602dat(temperature%100/10+0x30);

write_1602dat(temperature%100%10+0x30);

write_1602com(0x8c);

write_1602dat(humidity%100/10+0x30);

write_1602dat(humidity%100%10+0x30);

write_1602com(0xc3);

write_1602dat(smog%100/10+0x30);

write_1602dat(smog%100%10+0x30);

write_1602com(0x85);

write_1602dat(0xdf);

}

voiddisplay_1()

{

write_1602com(0x83);

write_1602dat(TH%100/10+0x30);

write_1602dat(TH%100%10+0x30);

write_1602com(0x8c);

write_1602dat(TL%100/10+0x30);

write_1602dat(TL%100%10+0x30);

write_1602com(0xc3);

write_1602dat(HH%100/10+0x30);

write_1602dat(HH%100%10+0x30);

write_1602com(0xcc);

write_1602dat(HL%100/10+0x30);

write_1602dat(HL%100%10+0x30);

}

voidwrite_string(uchar*str)

{

while(*str)

{

write_1602dat(*str);

str++;

}

}

/***按键函数***/

voidKEY()

{

if(K1==0)

{

Delay1(200);

if(K1==0)

{

flag++;

if(flag==1)

{

write_1602com(0x80);

write_string("TH:

CTL:

C");

write_1602com(0xc0);

write_string("HH:

%HL:

%");

write_1602com(0x85);

write_1602dat(0xdf);

write_1602com(0x8e);

write_1602dat(0xdf);

display_1();

write_1602com(0x84);

write_1602com(0x0f);

}

elseif(flag==2)

write_1602com(0x8d);

elseif(flag==3)

write_1602com(0xc4);

elseif(flag==4)

write_1602com(0xcd);

elseif(flag==5)

{

write_1602com(0xc0);

write_string("");

write_1602com(0x80);

write_string("Sg:

mg/m3");

write_1602com(0x83);

write_1602dat(SM/10+0x30);

write_1602dat(SM%10+0x30);

write_1602com(0x84);

}

else

{

write_1602com(0x80);

write_string("Te:

CHu:

%");

write_1602com(0xc0);

if(bufang==1)

write_string("Sg:

mg/m3B");

else

write_string("Sg:

mg/m3");

write_1602com(0x85);

write_1602dat(0xdf);

display();

write_1602com(0x0c);

flag=0;

write_eeprom();

}

while(!

K1);

}

}

if(K2==0)

{

Delay1(200);

if(K2==0)

{

switch(flag)

{

case1:

TH++;if(TH>99)TH=0;if(TH<=TL)TH=TL+1;write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30);write_1602com(0x84);break;

case2:

TL++;if(TL>98)TL=0;if(TL>=TH)TL=TH-1;write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d);break;

case3:

HH++;if(HH>99)HH=0;if(HH<=HL)HH=HL+1;write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30);write_1602com(0xc4);break;

case4:

HL++;if(HL>98)HL=0;if(HL>=HH)HL=HH-1;write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30);write_1602com(0xcd);break;

case5:

SM++;if(SM>9)SM=0;write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84);break;

}

while(!

K2);

}

}

if(K3==0)

{

Delay1(200);

if(K3==0)

{

switch(flag)

{

case1:

TH--;if(TH>99)TH=99;if(TH<=TL)TH=TL+1;write_1602com(0x83);write_1602dat(TH/10+0x30);write_1602dat(TH%10+0x30);write_1602com(0x84);break;

case2:

TL--;if(TL>99)TL=98;if(TL>=TH)TL=TH-1;write_1602com(0x8c);write_1602dat(TL/10+0x30);write_1602dat(TL%10+0x30);write_1602com(0x8d);break;

case3:

HH--;if(HH>99)HH=99;if(HH<=HL)HH=HL+1;write_1602com(0xc3);write_1602dat(HH/10+0x30);write_1602dat(HH%10+0x30);write_1602com(0xc4);break;

case4:

HL--;if(HL>99)HL=98;if(HL>=HH)HL=HH-1;write_1602com(0xcc);write_1602dat(HL/10+0x30);write_1602dat(HL%10+0x30);write_1602com(0xcd);break;

case5:

SM--;if(SM>99)SM=9;write_1602com(0x83);write_1602dat(SM/10+0x30);write_1602dat(SM%10+0x30);write_1602com(0x84);break;

}

while(!

K3);

}

}

if(K5==0)

{

Delay1(200);

if(K5==0&&flag==0)

{

if(bufang==2||bufang==1)

{

bufang=0;

count=0;

TR1=0;

write_eeprom();

write_1602com(0xcf);

write_1602dat('');

}

else

{

TR1=1;

write_1602com(0xcf);

write_1602dat('Z');

bufang=2;

}

while(K5==0);

}

}

}

voidOnealarm()

{

alarm=0;

Delay1(200);

alarm=1;

}

/********************************************************************

*名称:

Main()

*功能:

主函数

***********************************************************************/

voidmain()

{

uinttestnum;

EA=0;

Timer0_Init();//定时器0初始化

EA=1;

RW=0;

L1602_init();

write_1602com(0x85);

write_1602dat(0xdf);

write_1602com(0x80);

write_1602dat('T');

display();

init_eeprom();

read_eeprom();

write_1602com(0x80);

write_string("Te:

CHu:

%");

write_1602com(0xc0);

if(bufang==1)

write_string("Sg:

mg/m3B");

else

write_string("Sg:

mg/m3");

while

(1)

{

if(FlagStartRH==1)//温湿度转换标志检查

{

TR0=0;

testnum=RH();

FlagStartRH=0;

TR0=1;

humidity=U8RH_data_H;//读出温湿度,只取整数部分

temperature=U8T_data_H;

if(temperature>=TH)

{LED2=0;BJ_LED2=0;}

else

{LED2=1;BJ_LED2=1;}

if(temperature<=TL)

{LED3=0;BJ_LED3=0;}

else

{LED3=1;BJ_LED3=1;}

if(humidity>=HH)

{LED4=0;BJ_LED4=0;}

else

{LED4=1;BJ_LED4=1;}

if(humidity<=HL)

{LED5=0;BJ_LED5=0;}

else

{LED5=1;BJ_LED5=1;}

}

convdata(adc0832(0));

smog=(dis[1]*100+dis[2]*10+dis[3]+1)*10/250;

if(flag==0)

display();

KEY();

if(smog>=SM)

{LED1=0;BJ_LED1=0;}

else

{LED1=1;BJ_LED1=1;}

if(K4==0&&bufang==1)

{LED6=0;BJ_LED6=0;}

else

if(count==0||count==2000)

{LED6=1;BJ_LED6=1;}

if(BJ_LED1==0||BJ_LED2==0||BJ_LED3==0||

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

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1