1、单片机的智能窗户采用51单片机+LCD1602液晶显示+红外探头+DHT11+MQ2+步进电机+蜂鸣器设计而成。
2、液晶实时显示目前的状态,包括温度、湿度、烟雾浓度、光线强度、时间等信息。
3、智能窗户可以根据外接光线的强弱来进行自动开关窗户,光线强弱的上下限可以按键调节。
4、不仅具有自动控制功能,还可以手动开关窗户。
5、在开窗前提下,如果红外探头检测到人体就会发出报警并且关闭窗户。
6、可以通过遥控器来进行开关窗户。
电路原理图如下:
一、实物介绍
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
二、功能介绍
1、单片机的智能窗户采用51单片机+LCD1602液晶显示+红外探头+DHT11+MQ2+步进电机+蜂鸣器设计而成。
2、液晶实时显示目前的状态,包括温度、湿度、烟雾浓度、光线强度、时间等信息。
3、智能窗户可以根据外接光线的强弱来进行自动开关窗户,光线强弱的上下限可以按键调节。
4、不仅具有自动控制功能,还可以手动开关窗户。
5、在开窗前提下,如果红外探头检测到人体就会发出报警并且关闭窗户。
6、可以通过遥控器来进行开关窗户。
三、操作步骤
1、上电后窗户默认人关闭状态,步进电机转动。同时液晶上显示如下:
Window close
Please wait....
2、等步进电机停止后,屏幕上开始显示数据,具体如下:
光照强度 时间
烟雾燃气值 温度 湿度
3、按键功能如下:
设置 加 减/取消报警 开窗 关窗
4、按下设置按键进入设置数据具体如下:(数字代表按下“设置键”次数) 按下“加”“减”按键进行修改
①:设置当前时间,显示如下
SEtime 12:37:08
Please input...
②:设置当前时间“时”
③:设置当前时间“分”
④:设置当前时间“秒”
⑥:设置关窗时间,显示如下
ONtime 12:31:10
Please input...
⑦~⑨:设置关窗时间“时”“分”“秒”
10:设置开窗时间
14:设置光照强度低位报警值(关窗)
15:设置光照强度高位报警值(开窗)
16:设置湿度报警值(高于湿度值开窗)
17:设置温度报警值(高于温度开窗)
18:设置烟雾报警值(高于此值蜂鸣器报警,打开风扇)
5、当在开窗状态下,红外光电开关检测到有人,启动报警关闭窗户。
6、按下红外遥控上快进和后退键可打开或关闭窗户。
单片机源程序如下:
- /*************** writer:shopping.w ******************/
- #include <reg52.h>//库函数
- #include <dht11.h> //库函数//如果 实物 打开
- #include <adc0832.h> //AD转换库函数
- #define uchar unsigned char//宏定意
- #define uint unsigned int//宏定意
- #define ulong unsigned long //宏定意
- sbit rs=P2^0;//LCD 1602 引脚定意
- sbit rd=P2^1;//LCD 1602 引脚定意
- sbit lcden=P2^2;//LCD 1602 引脚定意
- sbit menu=P2^5; //主功能键
- sbit add=P2^4;//加键
- sbit dec=P2^3;// 减键
- sbit open=P2^6;// 手动 开
- sbit close=P2^7;// 手动 关
- sbit IR=P3^5; //红外感 应
- sbit BEEP=P3^1;// 报警
- #define MOTORSTEP P1 //宏定义,定义P1口为步进电机驱动端口
- uchar dsflj,kval,lofl,menusw,con,befl,zhenfl,fanfl,brigfl;// 各种变量标记 正返转标记
- uint sudu,dwbrigfl,humfl; //电机速度 //光度下限/湿度标记
- uchar count0,second,zhenzhuan,fanzhuan,timeflg,opensw,closesw,keysw;//时钟变量 正反转 变量
- uint adc0,adc1;
- uint upbrig,dwbrig,kwbrig,uphum,uptemp,upsmo; // 下限 亮度 上限湿度// 上限温度
- uint hour,minit,secon,DSdat,VAldat ,time;//时钟变量
- uint ONhour,ONminit,ONsecon; // 开窗时间变量
- uint OFhour,OFminit,OFsecon; // 关窗时间变量
- uchar U8T_data_H,U8RH_data_H;
- #define Imax 14000 //此处为晶振为11.0592时的取值,
- #define Imin 8000 //如用其它频率的晶振时,没
- #define Inum1 1450 //要改变相应的取值。
- #define Inum2 700
- #define Inum3 3000
- uchar f=0;
- uchar Im[4]={0x00,0x00,0x00,0x00}; // 遥控码存储空间
- uchar show[2]={0,0}; // 变量申明
- ulong m,Tc; // 变量申明
- uchar IrOK; // 变量申明
- void delay(uint z);// 开窗时间变量
- void write_rvalue(); // 显示函数
- //**************以下是各种字幕提示语数组************************
- uchar code logo1[]= "Welcome to use ";
- uchar code logo2[]="window system ";
- uchar code logo3[]="S=253T=85oCU=85%";
- uchar code logo4[]="Br= 12:00:00 ";
- uchar code logo5[]="window open ";
- uchar code logo6[]="window close ";
- uchar code logo7[]="GWbrig= LUX ";
- uchar code logo8[]="UP-Hum= % ";
- uchar code logo9[]="Please input... ";
- uchar code logo10[]="Please wait... ";
- uchar code logo11[]="UP-TEM= oC ";
- uchar code logo12[]="SEtime 12:00:00";
- uchar code logo13[]="ONtime 12:00:00";
- uchar code logo14[]="OFtime 12:00:00";
- uchar code logo15[]="UP-SMO= ";
- uchar code logo16[]="KWbrig= LUX ";
- void delaymoto() //步进电机每一步间延迟函数
- {
- uint y=sudu;
- while(y--);
- }
- uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步进电机驱动值数组
- uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //步进电机驱动值数组
- xdata num1 [4] = {0x00,0x00,0x00,0x00,};
- xdata num2 [4] = {0x00,0x00,0x00,0x00,};
- xdata num3 [4] = {0x00,0x00,0x00,0x00,};
- xdata num4 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
- xdata num5 [4] = {0x00,0x00,0x00,0x00,}; // AD转换变量组组
- void delaylog(uint z)//延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=500;y>0;y--);
- }
- void delay(uint z)//延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=10;y>0;y--);
- }
- void SETP_MOTOR_FFW() //反转
- {
- uint i=0;
- for(i=0;i<8;i++) //8步一个循环
- {
- MOTORSTEP=FFW[i]; //取值赋给P1驱动口
- delaymoto();
- }
- }
- void SETP_MOTOR_REV() //正转
- {
-
- uint i=0;
- for(i=0;i<8;i++) //8步一个循环
- {
- MOTORSTEP=REV[i]; //取值赋给P1驱动口
- delaymoto();
- }
- }
- void write_com(uchar com) //LCD 1602 写指令
- {
- rs=0;
- lcden=0;
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date)//LCD 1602 写数据
- {
- rs=1;
- lcden=0;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init1602()//LCD 1602 初始化
- {
- uchar num;
- rd=0;
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
-
-
- for(num=0;num<16;num++)
- {
- write_date(logo1[num]);//开机字幕
- delay(2);
- }
-
-
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo2[num]); //开机字幕
- delay(2);
- }
- delaylog(200);
- //***************************************************
- write_com(0x80);
- for(num=0;num<16;num++) //开机字幕
- {
- write_date(logo6[num]);
- delay(2);
- }
-
-
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo10[num]);//开机字幕
- delay(2);
- }
- }
- void write_sfm() // 拆分 个位 十位显示
- { uchar shi ,ge;
- shi=DSdat/10;
- ge=DSdat%10;
-
- write_date(0x30+shi);
- write_date(0x30+ge);
- }
- void keyscn()//按键扫描函数
- {
- uchar num; //局部变量
- if(keysw==1)
- {
- if(opensw==1)
- {
- if(open==0) // 手动开窗
- {
- write_com(0x80);
- for(num=0;num<16;num++)//显示提示语
- {
- write_date(logo5[num]);
- delay(2);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)//显示提示语
- {
- write_date(logo10[num]);
- delay(2);
- }
-
-
- closesw=1; // 已打开标记
- delay(10);
- if(open==0)
- {
- while(!open);
- zhenzhuan=1;// 正转 开启
- fanzhuan=0; // 返转关闭
- second=0;// 秒清零 步进电机 会停
- keysw=0;
- menusw=0;
- }
-
- }
-
- }
- if(closesw==1)//如果窗户是打开的
- {
- if(close==0)//按下手动开
- {
- write_com(0x80);
- for(num=0;num<16;num++)//显示提示语
- {
- write_date(logo6[num]);
- delay(2);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo10[num]);//显示提示语
- delay(2);
- }
-
- delay(10);
- if(close==0)
- {
- while(!close);
- zhenzhuan=0; //正转关
- fanzhuan=1; // 反转 开启
- second=0; // 定时清零
- keysw=0; // 标记请零
- menusw=0;
- }
-
- }
- }
- }
- if(menusw==1)//如果窗户运行完毕
- {
- if(menu==0)// 如果主功能键按下
- {
- lofl=1; //字幕载入
-
- delay(10); //延时消抖动
- if(menu==0)
- {
- while(!menu);//松手检测
- dsflj=0;// 关主页显示
- kval++; // 按键变量++
- keysw=0;//不允许手动 开窗 和关窗
- }
- }
-
- //*************************************************************************8
- if(kval==1) // 如果变量==1 进入时间设定
- {
-
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo12[num]);//显示提示语
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++) //显示提示语
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- DSdat=hour;
- write_com(0x80+8); // 刷新 设定时间
- write_sfm();
-
- DSdat=minit;
- write_com(0x80+11);// 刷新 设定时间
- write_sfm();
- DSdat=secon;
- write_com(0x80+14); // 刷新 设定时间
- write_sfm();
- }
- }
- //uint hour,minit,secon;
- if(kval==2)//如果变量=2 进入小时设定
- {DSdat=hour; // 刷新显示小时
-
-
- write_com(0x40+0x40+8);// 显示坐标
- write_com(0x0e);
- // 开关标
-
- if(add==0)// 如果加键按下
- {
- while(!add); // 松手检测
-
- hour++; //小时++
- DSdat=hour; //送显示
- write_sfm(); // 拆分
- if(hour==24) //
- {hour=0;}
- }
- if( dec==0) // 如果减键按下
- {
- while(! dec);// 松手检测
-
- hour--; //小时--
- DSdat=hour;
- write_sfm(); //拆分限位
- if(hour==0)//限位
- {hour=23;}
- }
- }
- //**************************以下时 分钟设 定 秒钟设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //********************************************************************
-
- if(kval==3)
- {
- DSdat=minit;
- write_com(0x40+0x40+11);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- minit++;
- DSdat=minit;
- write_sfm();
- if(minit==60)
- {minit=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- minit--;
- DSdat=minit;
- write_sfm();
- if(minit==0)
- {minit=59;}
- }
- }
-
- if(kval==4)
- {
-
-
- DSdat=secon;
-
- write_com(0x40+0x40+14);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- secon++;
- DSdat=secon;
- write_sfm();
- if(secon==60)
- {secon=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- secon--;
- DSdat=secon;
- write_sfm();
- if(secon==0)
- {secon=59;}
- }
- }
- //uint ONhour,ONminit,ONsecon;
- //uint OFhour,OFminit,OFsecon;
-
- //**************************以下 开窗时 小时 分钟设 定 秒钟设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //**************
- //*************************************设定开时****************************************
-
- if(kval==5)
- {
-
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo13[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
-
- }
- DSdat=ONhour;
- write_com(0x80+8);
- write_sfm();
- DSdat=ONminit;
- write_com(0x80+11);
- write_sfm();
- DSdat=ONsecon;
- write_com(0x80+14);
- write_sfm();
-
-
- lofl=0;
- }
- }
-
- if(kval==6)
- {
-
- write_com(0x80+0x08);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- ONhour++;
- DSdat=ONhour;
- write_sfm();
- if(ONhour==24)
- {ONhour=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- ONhour--;
- DSdat=ONhour;
- write_sfm();
- if(ONhour==0)
- {ONhour=23;}
- }
- }
- if(kval==7)
- {
-
- write_com(0x40+0x40+11);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- ONminit++;
- DSdat=ONminit;
- write_sfm();
- if(ONminit==60)
- {ONminit=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- ONminit--;
- DSdat=ONminit;
- write_sfm();
- if(ONminit==0)
- {ONminit=59;}
- }
- }
- if(kval==8)
- {
-
- write_com(0x40+0x40+14);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- ONsecon++;
- DSdat=ONsecon;
- write_sfm();
- if(ONsecon==60)
- {ONsecon=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- ONsecon--;
- DSdat=ONsecon;
- write_sfm();
- if(ONsecon==0)
- {ONsecon=59;}
- }
- }
-
- //**************************以下 关窗时 小时 分钟设 定 秒钟设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //**************
- //**************************************设定关时间**************************************
-
-
-
- if(kval==9)
- {
-
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo14[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- DSdat=OFhour;
- write_com(0x80+8);
- write_sfm();
- DSdat=OFminit;
- write_com(0x80+11);
- write_sfm();
-
- DSdat=OFsecon;
- write_com(0x80+14);
- write_sfm();
-
- }
- }
-
-
-
-
-
-
-
-
-
- if(kval==10)
- {
-
- write_com(0x80+0x08);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- OFhour++;
- DSdat=OFhour;
- write_sfm();
- if(OFhour==24)
- {OFhour=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- OFhour--;
- DSdat=OFhour;
- write_sfm();
- if(OFhour==0)
- {OFhour=23;}
- }
- }
- if(kval==11)
- {
-
- write_com(0x40+0x40+11);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- OFminit++;
- DSdat=OFminit;
- write_sfm();
- if(OFminit==60)
- {OFminit=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- OFminit--;
- DSdat=OFminit;
- write_sfm();
- if(OFminit==0)
- {OFminit=59;}
- }
- }
- if(kval==12)
- {
-
- write_com(0x40+0x40+14);
- write_com(0x0e);
-
- if(add==0)
- {
- while(!add);
-
- OFsecon++;
- DSdat=OFsecon;
- write_sfm();
- if(OFsecon==60)
- {OFsecon=0;}
- }
- if( dec==0)
- {
- while(! dec);
-
- OFsecon--;
- DSdat=OFsecon;
- write_sfm();
- if(OFsecon==0)
- {OFsecon=59;}
- }
- }
-
- //**************************以下 亮度会上设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //**************
- //********************************设定环境参数************************************
-
- if(kval==13)
- {
- write_com(0x0c);
- num4[4]=dwbrig;
- write_rvalue();
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo7[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- }
- if(add==0)
- {
- delay(10);
-
- if(add==0)
- {
- while(!add);
- dwbrig++;
- num4[4]=dwbrig;
- write_rvalue();
- if(dwbrig==250)
- {dwbrig=0;}
- }
- }
- if(dec==0)
- {
- delay(10);
-
- if(dec==0)
- {
- while(!dec);
- dwbrig--;
- num4[4]=dwbrig;
- write_rvalue();
- if(dwbrig==0)
- {dwbrig=250;}
- }
- }
- }
- //*********************************************************************
- //********************************设定环境参数************************************
-
- if(kval==14)
- {
- write_com(0x0c);
- num4[4]=kwbrig;
- write_rvalue();
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo16[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- }
- if(add==0)
- {
- delay(10);
-
- if(add==0)
- {
- while(!add);
- kwbrig++;
- num4[4]=kwbrig;
- write_rvalue();
- if(kwbrig==250)
- {kwbrig=0;}
- }
- }
- if(dec==0)
- {
- delay(10);
-
- if(dec==0)
- {
- while(!dec);
- kwbrig--;
- num4[4]=kwbrig;
- write_rvalue();
- if(kwbrig==0)
- {kwbrig=250;}
- }
- }
- }
-
- //**************************以下 湿度会上设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //**************
- if(kval==15)
- {
- num4[4]=uphum;
- write_rvalue();
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo8[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- }
-
-
- if(add==0)
- {
- delay(10);
-
- if(add==0)
- {
- while(!add);
- uphum++;
- num4[4]=uphum;
- write_rvalue();
- if(uphum==100)
- {uphum=0;}
- }
- }
- if(dec==0)
- {
- delay(10);
-
- if(dec==0)
- {
- while(!dec);
- uphum--;
- num4[4]=uphum;
- write_rvalue();
- if(uphum==0)
- {uphum=100;}
- }
- }
- }
-
- //**************************以下 温度度会上设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //**************
- if(kval==16)
- {
- num4[4]=uptemp;
- write_rvalue();
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo11[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- }
-
-
- if(add==0)
- {
- delay(10);
-
- if(add==0)
- {
- while(!add);
- uptemp++;
- num4[4]=uptemp;
- write_rvalue();
- if(uptemp==100)
- {uptemp=0;}
- }
- }
- if(dec==0)
- {
- delay(10);
-
- if(dec==0)
- {
- while(!dec);
- uptemp--;
- num4[4]=uptemp;
- write_rvalue();
- if(uptemp==0)
- {uptemp=100;}
- }
- }
- }
-
- //**************************以下烟雾度会上设定 和上面小时一样
- //只是就量不一样 不作注释*******************************************
- //**************
- if(kval==17)
- {
- num4[4]=upsmo;
- write_rvalue();
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo15[num]);
- delay(2);
-
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- write_date(logo9[num]);
- delay(2);
- lofl=0;
- }
- }
-
-
- if(add==0)
- {
- delay(10);
-
- if(add==0)
- {
- while(!add);
- upsmo++;
- num4[4]=upsmo;
- write_rvalue();
- if(upsmo==100)
- {upsmo=0;}
- }
- }
- if(dec==0)
- {
- delay(10);
-
- if(dec==0)
- {
- while(!dec);
- upsmo--;
- num4[4]=upsmo;
- write_rvalue();
- if(uptemp==0)
- {upsmo=100;}
- }
- }
- }
-
-
-
- //*****退出设定*********
- if(kval==18)
- {
-
- write_com(0x0c);
-
- kval=0;
-
- dsflj=1;
- lofl=1;
- keysw=1;
- if(lofl==1)
- {
- write_com(0x80);
- for(num=0;num<16;num++)
- {
- write_date(logo4[num]);//字幕显示
- delay(2);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)//字幕显示
- {
- write_date(logo3[num]);
- delay(2);
- }
- lofl=0;
- }
- }
- }
- }
-
- //步进电机函数
- void setmoto()
- {
- char num;
- //zhenfl fanfl
- if(zhenzhuan==1) //正转
- {
- dsflj=0;
- SETP_MOTOR_REV();
-
- if(second==10)
- {
- zhenzhuan=0;
- P1=0X00;
- dsflj=1;
- opensw=0;
- closesw=1;
- keysw=1;
- menusw=1;
- zhenfl=1;
- fanfl=0;
- brigfl=0;
- humfl=0;
- write_com(0x80);
- for(num=0;num<16;num++)
- { //字幕显示
- write_date(logo4[num]);
- delay(2);
- }
- write_com(0x80+0x40); //字幕显示
- for(num=0;num<16;num++)
- {
- write_date(logo3[num]);
- delay(2);
- }
- }
-
- }
-
-
-
- if(fanzhuan==1) //反转
- { dsflj=0;
-
- SETP_MOTOR_FFW();
-
- if(second==10)
- { second=0;
- P1=0X00;
- zhenfl=0;
- fanfl=1;
-
- fanzhuan=0;
- dsflj=1;
-
- dwbrigfl=0;
- brigfl=0;
- opensw=1;
- closesw=0;
- keysw=1;
- menusw=1;
- humfl=1;
-
-
- write_com(0x80);
- for(num=0;num<16;num++) //字幕显示
- {
- write_date(logo4[num]);
- delay(2);
- }
- write_com(0x80+0x40);
- for(num=0;num<16;num++)
- { //字幕显示
- write_date(logo3[num]);
- delay(2);
- }
-
- }
-
- }
-
-
- }
-
- void TEMPHRDSPLAY() //显示空气温湿度函数 写入1602
- {
- num1[4]=U8T_data_H; //温度高8位,即是整数部分
- num1[1]=num1[4]/10; //整数十位
- num1[0]=num1[4]%10; //整数个位
-
- write_com(0x80+0x40+7); //显示温度
- write_date(0x30+num1[1]);
- write_date(0x30+num1[0]);
- num2[4]=U8RH_data_H; //湿度高8位,即是整数部分
- num2[3]=num2[4]/10; //整数十位
- num2[2]=num2[4]%10; //整数个位
- write_com(0x80+0x40+13); //显示湿度
- write_date(0x30+num2[3]);
- write_date(0x30+num2[2]);
- }
-
-
-
- void SMOGDSPLAY() //显示空气温湿度函数 写入1602
- {
- num3[4]=adc0; //温度高8位,即是整数部分
-
-
-
- num3[0]=num3[4]%10; //显示ge位
- num3[1]=num3[4]%100/10; //显示shi位
- num3[2]=num3[4]%1000/100;//显示百位
-
- write_com(0x80+0X40+2);
- write_date(0x30+num3[2]);
- write_date(0x30+num3[1]);
- write_date(0x30+num3[0]);
- }
-
- void BRDSPLAY()
- {
-
-
- num5[4]=adc1; //温度高8位,即是整数部分
-
-
- num5[0]=num5[4]%10; //显示ge位
- num5[1]=num5[4]%100/10; //显示shi位
- num5[2]=num5[4]%1000/100;//显示百位
- write_com(0x80+3);
- write_date(0x30+num5[2]);
- write_date(0x30+num5[1]);
- write_date(0x30+num5[0]);
- }
-
- void write_rvalue()
- {
-
-
- num4[0]=num4[4]%10; //显示ge位
- num4[1]=num4[4]%100/10; //显示shi位
- num4[2]=num4[4]%1000/100;//显示百位
- write_com(0x80+7); //显示温度
- write_date(0x30+num4[2]);
- write_date(0x30+num4[1]);
- write_date(0x30+num4[0]);
- }
- void init()
- {
- TMOD=0X11; //定时器设置
- TH0=0X3C; //定时器0置初值 0.05S
- TL0=0XBA;
- EA=1; //开总中断
- ET0=1; //定时器0中断开启
- TR0=1; //启动定时0
- TL1=0X3C; //定时初值
- TH1=0XBA; //定时初值
- //总中断打开
- TR1=1; //启动定时器
- ET1=1; //软件没用到
-
- RCAP2H =(0xFFFF-50000)/256; //赋T2的预置值0x1000,溢出30次就是1秒钟
- RCAP2L =(0xFFFF-50000)%256;
- TR2=1; //启动定时器
- ET2=1;
- IT1=1;
- TH0=0; //定时器0初值
- TL0=0; //定时器0初值
- TR0=1; //定时器0启动
- EX1=1; //外部中断 软件没用到
-
- }
- void main()//主函数
- {
- init();
- init1602();
- sudu=200; //电要速度
- zhenzhuan=0;//上电关正转
- fanzhuan=1;//上电反转打开
- dsflj=1;
- // 显示打开
- uptemp=38; //温度上限
- uphum=80; //湿度上限
- upbrig=120; // 光控值
- dwbrig=10;//光控下限
- kwbrig=180;
- upsmo=85;
- opensw=1;
- closesw=1;
- keysw=1;
- menusw=1;
- second=0;
-
- zhenfl=0;
- fanfl=0;
- brigfl=1;
- dwbrigfl=1;
- humfl=0;
- adc0 = ADC0832(1,0); //差分模式,CH0-CH1
- adc1 = ADC0832(1,1); //差分模式,CH0-CH1
- hour=12;
- minit=5;
- secon=10; // 系统时间 这些值可以按键修改
- ONhour=12; // 自动开窗时间 为了方便演示 设定 一分钟后开 这些值可以按键修改
- ONminit=6;
- ONsecon=10;
- OFhour=12; // 自动关窗时间 为了方便演示 设定 一分钟后关 这些值可以按键修改
- OFminit=7;
- OFsecon=10;
- while(1)//大循环
- {
-
-
-
-
-
- keyscn();
- setmoto();
- if (dsflj==1 )
- {
- //get_temp(); //SHT10调用
- //cal_wet();//SHT10调用
- RH(); //DHT11 调用
-
- // U8T_data_H= SENSOR[k].temp;//SHT10调用
- // U8RH_data_H=SENSOR[k].wet;//SHT10调用
-
-
- TEMPHRDSPLAY();
-
-
-
- adc0 = ADC0832(1,0); //差分模式,CH0-CH1
- SMOGDSPLAY();
- adc1 = ADC0832(1,1); //差分模式,CH0-CH1
- BRDSPLAY();
-
- if(fanfl==1)
- {
- if(adc1> kwbrig )//如果际亮度小与设定值 关窗
- {
- zhenzhuan=1;
- }
-
-
-
-
-
-
- if(Im[2]==0x40)
-
- {
- Im[2]=0x00;
- zhenzhuan=1;
- }
- second=0;
- if(U8T_data_H>uptemp )//如果际温度大与设定值 开窗
- {
- zhenzhuan=1;
-
- }
-
- if(adc0>upsmo )//如果际温度大与设定值 开窗
- {
- zhenzhuan=1;
-
- }
-
- }
- if(zhenfl==1)
- {
- if(Im[2]==0x44)
-
- {
- Im[2]=0x00;
- fanzhuan=1;
- }
- second=0;
- if(U8RH_data_H>uphum )//如果际湿度大与设定值 关窗
- {
- fanzhuan=1;
- brigfl=0;
- dwbrigfl=0;
-
- }
- if(adc1<dwbrig )//如果际亮度小与设定值 关窗
- {
- fanzhuan=1;
- }
-
-
-
- if(IR==0)
- {
- delay(10);
-
- if(IR==0)
- {
- //while(!IR);
- befl=1;
- ET2=1;
- fanzhuan=1;
- con=0;
-
- }
-
- }
-
-
- }
-
-
- if(dec==0)
- {
- delay(10);
-
- if(dec==0)
- {
- while(!dec);
- befl=0;
- BEEP=1;
-
- }
- }
-
-
-
- DSdat=secon;
- write_com(0x80+14);
- write_sfm();
- DSdat=minit;
- write_com(0x80+11);
- write_sfm();
- DSdat=hour;
- write_com(0x80+0x08);
- write_sfm();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
程序.7z
(1.51 MB, 下载次数: 337)
|