单片机 智能环境监测系统程序Word格式文档下载.docx
《单片机 智能环境监测系统程序Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机 智能环境监测系统程序Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
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;
RHCounter++;
if(RHCounter>
=15)
{
FlagStartRH=1;
RHCounter=0;
}
voidDelay1(uintj)
uchari;
for(;
j>
0;
j--)
{
for(i=0;
i<
27;
i++);
}
voidDelay_10us(void)
i--;
voidCOM(void)
for(i=0;
8;
i++)
U8FLAG=2;
while((!
DATA)&
&
U8FLAG++);
Delay_10us();
U8temp=0;
if(DATA)U8temp=1;
while((DATA)&
//超时则跳出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();
//主机设为输入判断从机响应信号
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!
DATA)//T!
U8FLAG=2;
//判断从机是否发出80us的低电平响应信号是否结束
while((!
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
while((DATA)&
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
U8RH_data_L_temp=U8comdata;
U8T_data_H_temp=U8comdata;
U8T_data_L_temp=U8comdata;
U8checkdata_temp=U8comdata;
//数据校验
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;
i<
=10;
i++)
for(j=0;
j<
=2;
j++);
enable(uchardel)
1602命令函数
输入的命令值
voidwrite_1602com(uchardel)
P0=del;
RS=0;
E=1;
delay();
E=0;
write(uchardel)
1602写数据函数
需要写入1602的数据
voidwrite_1602dat(uchardel)
RS=1;
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_1602dat(TH%100/10+0x30);
write_1602dat(TH%100%10+0x30);
write_1602dat(TL%100/10+0x30);
write_1602dat(TL%100%10+0x30);
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);
flag++;
if(flag==1)
write_1602com(0x80);
write_string("
TH:
CTL:
C"
);
write_1602com(0xc0);
HH:
%HL:
%"
write_1602com(0x85);
write_1602com(0x8e);
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)
"
Sg:
mg/m3"
write_1602dat(SM/10+0x30);
write_1602dat(SM%10+0x30);
else
Te:
CHu:
if(bufang==1)
mg/m3B"
else
display();
flag=0;
write_eeprom();
while(!
K1);
if(K2==0)
switch(flag)
case1:
TH++;
if(TH>
99)TH=0;
if(TH<
=TL)TH=TL+1;
write_1602dat(TH/10+0x30);
write_1602dat(TH%10+0x30);
break;
case2:
TL++;
if(TL>
98)TL=0;
if(TL>
=TH)TL=TH-1;
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);
case4:
HL++;
if(HL>
98)HL=0;
if(HL>
=HH)HL=HH-1;
write_1602dat(HL/10+0x30);
write_1602dat(HL%10+0x30);
case5:
SM++;
if(SM>
9)SM=0;
write_1602dat(SM/10+0x30);
write_1602dat(SM%10+0x30);
write_1602com(0x84);
}
K2);
if(K3==0)
case1:
TH--;
99)TH=99;
if(TH<
case2:
TL--;
99)TL=98;
case3:
HH--;
99)HH=99;
case4:
HL--;
99)HL=98;
case5:
SM--;
99)SM=9;
K3);
if(K5==0)
if(K5==0&
flag==0)
if(bufang==2||bufang==1)
bufang=0;
count=0;
TR1=0;
write_1602com(0xcf);
write_1602dat('
'
TR1=1;
write_1602com(0xcf);
Z'
bufang=2;
while(K5==0);
voidOnealarm()
alarm=0;
alarm=1;
Main()
主函数
voidmain()
uinttestnum;
EA=0;
Timer0_Init();
//定时器0初始化
EA=1;
RW=0;
L1602_init();
write_1602com(0x80);
T'
init_eeprom();
read_eeprom();
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;
{LED3=1;
BJ_LED3=1;
if(humidity>
=HH)
{LED4=0;
BJ_LED4=0;
{LED4=1;
BJ_LED4=1;
if(humidity<
=HL)
{LED5=0;
BJ_LED5=0;
{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||