1、單片機的智能窗戶采用51單片機+LCD1602液晶顯示+紅外探頭+DHT11+MQ2+步進電機+蜂鳴器設計而成。
2、液晶實時顯示目前的狀態,包括溫度、濕度、煙霧濃度、光線強度、時間等信息。
3、智能窗戶可以根據外接光線的強弱來進行自動開關窗戶,光線強弱的上下限可以按鍵調節。
4、不僅具有自動控制功能,還可以手動開關窗戶。
5、在開窗前提下,如果紅外探頭檢測到人體就會發出報警并且關閉窗戶。
6、可以通過遙控器來進行開關窗戶。
電路原理圖如下:
`KGJXP{{72)8FMG7VAJQ8PD.png (95.67 KB, 下載次數: 113)
下載附件
2020-2-1 01:52 上傳
一、實物介紹
51hei.png (460.94 KB, 下載次數: 78)
下載附件
2020-2-1 01:50 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (22.42 KB, 下載次數: 63)
下載附件
2021-3-31 23:03 上傳
二、功能介紹
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、按下紅外遙控上快進和后退鍵可打開或關閉窗戶。
51hei圖片20171130214045.jpg (70.64 KB, 下載次數: 68)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171130214022.jpg (89.29 KB, 下載次數: 65)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115246.jpg (69.45 KB, 下載次數: 88)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115242.jpg (97.49 KB, 下載次數: 68)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115238.jpg (62.39 KB, 下載次數: 71)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115233.jpg (83.23 KB, 下載次數: 81)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115229.jpg (86.38 KB, 下載次數: 76)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115225.jpg (106.98 KB, 下載次數: 74)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115221.jpg (81.92 KB, 下載次數: 78)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115216.jpg (77.89 KB, 下載次數: 82)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115212.jpg (97.85 KB, 下載次數: 74)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115202.jpg (99.17 KB, 下載次數: 87)
下載附件
2020-2-1 01:53 上傳
51hei圖片20171112115125.jpg (107.38 KB, 下載次數: 66)
下載附件
2020-2-1 01:53 上傳
單片機源程序如下:
- /*************** 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, 下載次數: 357)
2020-2-1 01:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|