单片机智能环境监测系统程序.docx
- 文档编号:25319770
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:20
- 大小:17.50KB
单片机智能环境监测系统程序.docx
《单片机智能环境监测系统程序.docx》由会员分享,可在线阅读,更多相关《单片机智能环境监测系统程序.docx(20页珍藏版)》请在冰豆网上搜索。
单片机智能环境监测系统程序
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||B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 智能 环境监测 系统 程序