#include "reg51.h"
#include "ADC0832.h"
#include "lcd1602.h"
#include "DHT11.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P2^4;//按钮
sbit k2=P2^5;
sbit k3=P2^6;
sbit in1=P1^3;//雨水
sbit in2=P1^4;//车门
sbit led=P1^7;//led
sbit AA=P3^4;//电机
sbit BB=P3^5;
sbit CC=P3^6;
sbit DD=P3^7;
sbit AA1=P3^0;//电机2
sbit BB1=P3^1;
sbit CC1=P3^2;
sbit DD1=P3^3;
uchar time=0,mode=0;//系统变量
uchar yan=0;//烟雾
uchar shidu=0;//湿度
uchar wei=0;//电机状态
uchar wei1=0;//电机2状态
uchar disp[]="Y:00% Humi:00%";
uchar flag=0;
uchar flag1=0;
void main()//主函数
{
init_1602();//初始化LCD
TMOD|=0X01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
//手动控制
if(!k1)//开启
{
led=0;
mode=1;
}
if(!k2)//关闭
{
led=1;
mode=1;
}
if(!k3)//自动
{
mode=0;
}
}
}
//定时器中断
void Timer0() interrupt 1
{
uint i;
if(time<10)//0.5s
time++;
else
{
time=0;
i=ADC0832(0);//测量烟雾
yan=i*99/255;
dht11_recive();//测量湿度
shidu=dht11_dat[0];
//自动控制
if(mode==0)
{
if(!in1 ||(yan<60)||(shidu>80) || !in2)
led=1;
else
led=0;
}
//报警
//显示
disp[2]=yan/10+0x30;
disp[3]=yan%10+0x30;
disp[11]=shidu/10+0x30;
disp[12]=shidu%10+0x30;
write_string(1,0,disp);
if(!in1)
write_string(2,0,"rain");
else
write_string(2,0," ");
if(mode==0)
write_string(2,8,"auto");
else
write_string(2,8,"hand");
}
if(!led &&(wei<50)) //正转
{
switch(flag)
{
case 0:BB=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:BB=0;break;
case 4:DD=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:DD=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
wei++;
}
}
if(led &&(wei>0)) //反转
{
switch(flag)
{
case 0:DD=1;break;
case 1:AA=0;break;
case 2:CC=1;break;
case 3:DD=0;break;
case 4:BB=1;break;
case 5:CC=0;break;
case 6:AA=1;break;
case 7:BB=0;
}
if(flag<7)//下一个状态
flag++;
else
{
flag=0;
wei--;
}
}
if(!in1&&!in2 &&(wei1<50)) //正转
{
switch(flag1)
{
case 0:BB1=1;break;
case 1:AA1=0;break;
case 2:CC1=1;break;
case 3:BB1=0;break;
case 4:DD1=1;break;
case 5:CC1=0;break;
case 6:AA1=1;break;
case 7:DD1=0;
}
if(flag1<7)//下一个状态
flag1++;
else
{
flag1=0;
wei1++;
}
}
if(in1 &&(wei1>0)) //反转
{
switch(flag1)
{
case 0:DD1=1;break;
case 1:AA1=0;break;
case 2:CC1=1;break;
case 3:DD1=0;break;
case 4:BB1=1;break;
case 5:CC1=0;break;
case 6:AA1=1;break;
case 7:BB1=0;
}
if(flag1<7)//下一个状态
flag1++;
else
{
flag1=0;
wei1--;
}
}
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}