久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10580|回復: 10
打印 上一主題 下一主題
收起左側

單片機智能窗戶系統溫度程序設計 濕度 亮度 紅外報警定時煙霧全功能

  [復制鏈接]
跳轉到指定樓層
樓主
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、按下紅外遙控上快進和后退鍵可打開或關閉窗戶。


單片機源程序如下:
  1.                                                                                                                                                                                                                                                             /***************   writer:shopping.w   ******************/
  2. #include <reg52.h>//庫函數
  3. #include <dht11.h> //庫函數//如果 實物 打開
  4. #include <adc0832.h> //AD轉換庫函數

  5. #define uchar unsigned char//宏定意
  6. #define uint  unsigned int//宏定意
  7. #define ulong unsigned long        //宏定意

  8. sbit rs=P2^0;//LCD 1602 引腳定意               
  9. sbit rd=P2^1;//LCD 1602 引腳定意               
  10. sbit lcden=P2^2;//LCD 1602 引腳定意

  11. sbit menu=P2^5;        //主功能鍵        
  12. sbit add=P2^4;//加鍵               
  13. sbit dec=P2^3;// 減鍵
  14. sbit open=P2^6;// 手動 開
  15. sbit close=P2^7;// 手動 關        
  16. sbit IR=P3^5; //紅外感 應
  17. sbit BEEP=P3^1;// 報警



  18. #define MOTORSTEP P1                         //宏定義,定義P1口為步進電機驅動端口

  19. uchar  dsflj,kval,lofl,menusw,con,befl,zhenfl,fanfl,brigfl;// 各種變量標記 正返轉標記
  20. uint sudu,dwbrigfl,humfl;  //電機速度 //光度下限/濕度標記
  21. uchar count0,second,zhenzhuan,fanzhuan,timeflg,opensw,closesw,keysw;//時鐘變量 正反轉 變量        
  22. uint adc0,adc1;
  23. uint upbrig,dwbrig,kwbrig,uphum,uptemp,upsmo; // 下限 亮度 上限濕度// 上限溫度

  24. uint hour,minit,secon,DSdat,VAldat ,time;//時鐘變量

  25. uint ONhour,ONminit,ONsecon; // 開窗時間變量
  26. uint OFhour,OFminit,OFsecon; // 關窗時間變量
  27. uchar   U8T_data_H,U8RH_data_H;


  28. #define Imax 14000    //此處為晶振為11.0592時的取值,
  29. #define Imin 8000    //如用其它頻率的晶振時,沒
  30. #define Inum1 1450    //要改變相應的取值。
  31. #define Inum2 700
  32. #define Inum3 3000

  33. uchar f=0;
  34. uchar Im[4]={0x00,0x00,0x00,0x00}; // 遙控碼存儲空間
  35. uchar show[2]={0,0};  // 變量申明
  36. ulong m,Tc;          // 變量申明
  37. uchar IrOK;                // 變量申明



  38. void delay(uint z);// 開窗時間變量

  39. void write_rvalue(); // 顯示函數
  40. //**************以下是各種字幕提示語數組************************
  41. uchar code logo1[]= "Welcome to use  ";
  42. uchar code logo2[]="window   system  ";
  43. uchar code logo3[]="S=253T=85oCU=85%";
  44. uchar code logo4[]="Br=     12:00:00 ";
  45. uchar code logo5[]="window open      ";
  46. uchar code logo6[]="window close     ";
  47. uchar code logo7[]="GWbrig=    LUX  ";
  48. uchar code logo8[]="UP-Hum=    %    ";
  49. uchar code logo9[]="Please input...  ";
  50. uchar code logo10[]="Please wait...  ";
  51. uchar code logo11[]="UP-TEM=    oC   ";
  52. uchar code logo12[]="SEtime  12:00:00";
  53. uchar code logo13[]="ONtime  12:00:00";
  54. uchar code logo14[]="OFtime  12:00:00";
  55. uchar code logo15[]="UP-SMO=         ";
  56. uchar code logo16[]="KWbrig=    LUX  ";



  57. void delaymoto()                                         //步進電機每一步間延遲函數
  58. {         
  59.         uint y=sudu;
  60.         while(y--);
  61. }



  62. uchar code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步進電機驅動值數組

  63. uchar code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //步進電機驅動值數組



  64. xdata num1 [4] =    {0x00,0x00,0x00,0x00,};                                
  65. xdata num2 [4] =    {0x00,0x00,0x00,0x00,};                        
  66. xdata num3 [4] =    {0x00,0x00,0x00,0x00,};                  
  67. xdata num4 [4] =    {0x00,0x00,0x00,0x00,};        // AD轉換變量組組
  68. xdata num5 [4] =    {0x00,0x00,0x00,0x00,};        // AD轉換變量組組




  69. void delaylog(uint z)//延時函數
  70. {
  71.         uint x,y;
  72.         for(x=z;x>0;x--)
  73.                 for(y=500;y>0;y--);
  74. }




  75. void delay(uint z)//延時函數
  76. {
  77.         uint x,y;
  78.         for(x=z;x>0;x--)
  79.                 for(y=10;y>0;y--);
  80. }






  81.   void SETP_MOTOR_FFW()         //反轉
  82. {
  83.                     uint i=0;

  84.                 for(i=0;i<8;i++) //8步一個循環
  85.                         {
  86.                                 MOTORSTEP=FFW[i]; //取值賦給P1驅動口
  87.                                 delaymoto();
  88.                         }

  89. }

  90. void SETP_MOTOR_REV()  //正轉
  91. {


  92.     uint i=0;

  93.                 for(i=0;i<8;i++) //8步一個循環
  94.                         {
  95.                                 MOTORSTEP=REV[i]; //取值賦給P1驅動口
  96.                                 delaymoto();
  97.                         }

  98. }

  99. void write_com(uchar com) //LCD 1602 寫指令
  100. {
  101.         rs=0;
  102.         lcden=0;
  103.         P0=com;
  104.         delay(5);
  105.         lcden=1;
  106.         delay(5);
  107.         lcden=0;        
  108. }

  109. void write_date(uchar date)//LCD 1602 寫數據
  110. {
  111.         rs=1;
  112.         lcden=0;
  113.         P0=date;
  114.         delay(5);
  115.         lcden=1;
  116.         delay(5);
  117.         lcden=0;        
  118. }

  119. void init1602()//LCD 1602 初始化
  120. {
  121.         uchar num;
  122.         rd=0;
  123.         lcden=0;
  124.         write_com(0x38);
  125.         write_com(0x0c);
  126.         write_com(0x06);
  127.         write_com(0x01);
  128.         write_com(0x80);



  129.          
  130.    
  131.         for(num=0;num<16;num++)
  132.                 {
  133.                         write_date(logo1[num]);//開機字幕
  134.                         delay(2);
  135.                 }

  136.         
  137.    

  138.         write_com(0x80+0x40);
  139.         for(num=0;num<16;num++)
  140.                 {
  141.                         write_date(logo2[num]);        //開機字幕
  142.                         delay(2);
  143.                 }

  144.                 delaylog(200);
  145. //***************************************************

  146.                   write_com(0x80);

  147.                           for(num=0;num<16;num++)        //開機字幕
  148.                 {
  149.                         write_date(logo6[num]);
  150.                         delay(2);
  151.                 }

  152.         
  153.    

  154.         write_com(0x80+0x40);
  155.         for(num=0;num<16;num++)
  156.                 {
  157.                         write_date(logo10[num]);//開機字幕
  158.                         delay(2);
  159.                 }


  160. }













  161. void write_sfm() // 拆分 個位 十位顯示

  162. {        uchar shi ,ge;

  163.         shi=DSdat/10;
  164.         ge=DSdat%10;
  165.         
  166.         write_date(0x30+shi);
  167.         write_date(0x30+ge);        


  168. }







  169. void keyscn()//按鍵掃描函數
  170. {
  171.   uchar num; //局部變量

  172. if(keysw==1)
  173. {
  174. if(opensw==1)
  175. {
  176. if(open==0)         // 手動開窗
  177.         {
  178.                     write_com(0x80);

  179.                           for(num=0;num<16;num++)//顯示提示語
  180.                 {
  181.                         write_date(logo5[num]);
  182.                         delay(2);
  183.                 }


  184.                   write_com(0x80+0x40);

  185.                           for(num=0;num<16;num++)//顯示提示語
  186.                 {
  187.                         write_date(logo10[num]);
  188.                         delay(2);
  189.                 }



  190.                  
  191.                  
  192.                  closesw=1;        // 已打開標記
  193.              delay(10);
  194.                 if(open==0)
  195.                 {
  196.                 while(!open);
  197.                 zhenzhuan=1;// 正轉 開啟
  198.                 fanzhuan=0;         // 返轉關閉
  199.                 second=0;// 秒清零 步進電機 會停
  200.                 keysw=0;
  201.                 menusw=0;
  202.                  }
  203.                
  204.                 }
  205.          
  206. }

  207.   if(closesw==1)//如果窗戶是打開的
  208.   {
  209. if(close==0)//按下手動開
  210.         {

  211.            write_com(0x80);

  212.                           for(num=0;num<16;num++)//顯示提示語
  213.                 {
  214.                         write_date(logo6[num]);
  215.                         delay(2);
  216.                 }

  217.                            write_com(0x80+0x40);

  218.                           for(num=0;num<16;num++)
  219.                 {
  220.                         write_date(logo10[num]);//顯示提示語
  221.                         delay(2);
  222.                 }


  223.                  
  224.              delay(10);
  225.                 if(close==0)
  226.                 {
  227.                 while(!close);
  228.                 zhenzhuan=0;  //正轉關
  229.                 fanzhuan=1;        // 反轉 開啟
  230.                 second=0;          // 定時清零
  231.                 keysw=0; // 標記請零
  232.                  menusw=0;
  233.                  }
  234.                
  235.                 }

  236. }

  237. }


  238. if(menusw==1)//如果窗戶運行完畢
  239. {
  240.   if(menu==0)// 如果主功能鍵按下
  241.         {

  242.                 lofl=1;        //字幕載入

  243.                

  244.              delay(10);        //延時消抖動
  245.                 if(menu==0)
  246.                 {
  247.                 while(!menu);//松手檢測
  248.                  dsflj=0;// 關主頁顯示
  249.                  kval++; // 按鍵變量++
  250.                  keysw=0;//不允許手動 開窗  和關窗
  251.                  }
  252.                  }

  253.                  

  254. //*************************************************************************8

  255.   if(kval==1)  // 如果變量==1  進入時間設定

  256. {
  257.   
  258.   if(lofl==1)
  259.   {
  260. write_com(0x80);

  261.                           for(num=0;num<16;num++)
  262.                 {
  263.                         write_date(logo12[num]);//顯示提示語
  264.                         delay(2);

  265.                
  266.                 }



  267.            write_com(0x80+0x40);

  268.                           for(num=0;num<16;num++)        //顯示提示語
  269.                 {
  270.                         write_date(logo9[num]);
  271.                         delay(2);

  272.                         lofl=0;
  273.                 }




  274.                    DSdat=hour;
  275.         write_com(0x80+8);        // 刷新 設定時間
  276.                 write_sfm();


  277.       
  278.                 DSdat=minit;
  279.             write_com(0x80+11);// 刷新 設定時間
  280.             write_sfm();

  281.                  DSdat=secon;
  282.                 write_com(0x80+14);        // 刷新 設定時間
  283.                 write_sfm();



  284. }


  285. }



  286. //uint hour,minit,secon;

  287.    if(kval==2)//如果變量=2 進入小時設定

  288. {DSdat=hour;          // 刷新顯示小時
  289.   
  290.   
  291.   write_com(0x40+0x40+8);// 顯示坐標
  292.   write_com(0x0e);
  293.                                            // 開關標

  294.   
  295. if(add==0)// 如果加鍵按下

  296. {

  297. while(!add); // 松手檢測


  298. hour++;        //小時++

  299. DSdat=hour; //送顯示
  300. write_sfm(); // 拆分
  301. if(hour==24)  //
  302. {hour=0;}



  303. }





  304. if( dec==0) // 如果減鍵按下

  305. {

  306. while(! dec);// 松手檢測


  307. hour--;         //小時--
  308. DSdat=hour;
  309. write_sfm(); //拆分限位
  310. if(hour==0)//限位
  311. {hour=23;}




  312. }

  313. }







  314. //**************************以下時 分鐘設 定 秒鐘設定 和上面小時一樣
  315. //只是就量不一樣 不作注釋*******************************************
  316. //********************************************************************

  317.    if(kval==3)

  318. {


  319. DSdat=minit;

  320.   write_com(0x40+0x40+11);
  321.   write_com(0x0e);


  322.   
  323. if(add==0)

  324. {

  325. while(!add);


  326. minit++;

  327. DSdat=minit;
  328. write_sfm();
  329. if(minit==60)
  330. {minit=0;}



  331. }





  332. if( dec==0)

  333. {

  334. while(! dec);


  335. minit--;

  336. DSdat=minit;
  337. write_sfm();
  338. if(minit==0)
  339. {minit=59;}



  340. }

  341. }














  342.    if(kval==4)

  343. {


  344. DSdat=secon;
  345.   
  346.   write_com(0x40+0x40+14);
  347.   write_com(0x0e);


  348.   
  349. if(add==0)

  350. {

  351. while(!add);


  352. secon++;

  353. DSdat=secon;
  354. write_sfm();
  355. if(secon==60)
  356. {secon=0;}



  357. }





  358. if( dec==0)

  359. {

  360. while(! dec);


  361. secon--;

  362. DSdat=secon;
  363. write_sfm();
  364. if(secon==0)
  365. {secon=59;}



  366. }

  367. }


  368. //uint ONhour,ONminit,ONsecon;
  369. //uint OFhour,OFminit,OFsecon;



  370. //**************************以下 開窗時  小時 分鐘設 定 秒鐘設定 和上面小時一樣
  371. //只是就量不一樣 不作注釋*******************************************
  372. //**************

  373. //*************************************設定開時****************************************

  374.    if(kval==5)

  375. {
  376.   
  377.    if(lofl==1)
  378.   {
  379. write_com(0x80);

  380.                           for(num=0;num<16;num++)
  381.                 {
  382.                         write_date(logo13[num]);
  383.                         delay(2);

  384.                
  385.                 }



  386.            write_com(0x80+0x40);

  387.                           for(num=0;num<16;num++)
  388.                 {
  389.                         write_date(logo9[num]);
  390.                         delay(2);

  391.                
  392.                 }



  393.                 DSdat=ONhour;
  394.         write_com(0x80+8);
  395.                 write_sfm();


  396.                   DSdat=ONminit;
  397.             write_com(0x80+11);
  398.             write_sfm();


  399.        DSdat=ONsecon;
  400.                 write_com(0x80+14);
  401.                 write_sfm();

  402.         
  403.                


  404.                   lofl=0;





  405. }





  406. }




  407.   if(kval==6)

  408. {
  409.   
  410.   write_com(0x80+0x08);
  411.   write_com(0x0e);


  412.   
  413. if(add==0)

  414. {

  415. while(!add);


  416. ONhour++;

  417. DSdat=ONhour;
  418. write_sfm();
  419. if(ONhour==24)
  420. {ONhour=0;}



  421. }





  422. if( dec==0)

  423. {

  424. while(! dec);


  425. ONhour--;

  426. DSdat=ONhour;
  427. write_sfm();
  428. if(ONhour==0)
  429. {ONhour=23;}



  430. }

  431. }






  432.    if(kval==7)

  433. {
  434.   
  435.   write_com(0x40+0x40+11);
  436.   write_com(0x0e);


  437.   
  438. if(add==0)

  439. {

  440. while(!add);


  441. ONminit++;

  442. DSdat=ONminit;
  443. write_sfm();
  444. if(ONminit==60)
  445. {ONminit=0;}



  446. }





  447. if( dec==0)

  448. {

  449. while(! dec);


  450. ONminit--;

  451. DSdat=ONminit;
  452. write_sfm();
  453. if(ONminit==0)
  454. {ONminit=59;}



  455. }

  456. }






  457.   if(kval==8)

  458. {
  459.   
  460.   write_com(0x40+0x40+14);
  461.   write_com(0x0e);


  462.   
  463. if(add==0)

  464. {

  465. while(!add);


  466. ONsecon++;

  467. DSdat=ONsecon;
  468. write_sfm();
  469. if(ONsecon==60)
  470. {ONsecon=0;}



  471. }





  472. if( dec==0)

  473. {

  474. while(! dec);


  475. ONsecon--;

  476. DSdat=ONsecon;
  477. write_sfm();
  478. if(ONsecon==0)
  479. {ONsecon=59;}



  480. }

  481. }


  482. //**************************以下 關窗時  小時 分鐘設 定 秒鐘設定 和上面小時一樣
  483. //只是就量不一樣 不作注釋*******************************************
  484. //**************


  485. //**************************************設定關時間**************************************
  486.         
  487.         

  488.    if(kval==9)

  489. {
  490.   
  491.    if(lofl==1)
  492.   {
  493. write_com(0x80);

  494.                           for(num=0;num<16;num++)
  495.                 {
  496.                         write_date(logo14[num]);
  497.                         delay(2);

  498.                
  499.                 }



  500.            write_com(0x80+0x40);

  501.                           for(num=0;num<16;num++)
  502.                 {
  503.                         write_date(logo9[num]);
  504.                         delay(2);

  505.                         lofl=0;
  506.                 }


  507.                 DSdat=OFhour;
  508.         write_com(0x80+8);
  509.                 write_sfm();


  510.                 DSdat=OFminit;
  511.             write_com(0x80+11);
  512.             write_sfm();

  513.                

  514.         DSdat=OFsecon;
  515.                 write_com(0x80+14);
  516.                 write_sfm();

  517.                

  518. }





  519. }        
  520.         
  521.         
  522.         
  523.         
  524.         
  525.         
  526.         
  527.         
  528.                
  529. if(kval==10)

  530. {
  531.   
  532.   write_com(0x80+0x08);
  533.   write_com(0x0e);


  534.   
  535. if(add==0)

  536. {

  537. while(!add);


  538. OFhour++;

  539. DSdat=OFhour;
  540. write_sfm();
  541. if(OFhour==24)
  542. {OFhour=0;}



  543. }





  544. if( dec==0)

  545. {

  546. while(! dec);


  547. OFhour--;

  548. DSdat=OFhour;
  549. write_sfm();
  550. if(OFhour==0)
  551. {OFhour=23;}



  552. }

  553. }






  554.    if(kval==11)

  555. {
  556.   
  557.   write_com(0x40+0x40+11);
  558.   write_com(0x0e);


  559.   
  560. if(add==0)

  561. {

  562. while(!add);


  563. OFminit++;

  564. DSdat=OFminit;
  565. write_sfm();
  566. if(OFminit==60)
  567. {OFminit=0;}



  568. }





  569. if( dec==0)

  570. {

  571. while(! dec);


  572. OFminit--;

  573. DSdat=OFminit;
  574. write_sfm();
  575. if(OFminit==0)
  576. {OFminit=59;}



  577. }

  578. }












  579.   if(kval==12)

  580. {
  581.   
  582.   write_com(0x40+0x40+14);
  583.   write_com(0x0e);


  584.   
  585. if(add==0)

  586. {

  587. while(!add);


  588. OFsecon++;

  589. DSdat=OFsecon;
  590. write_sfm();
  591. if(OFsecon==60)
  592. {OFsecon=0;}



  593. }





  594. if( dec==0)

  595. {

  596. while(! dec);


  597. OFsecon--;

  598. DSdat=OFsecon;
  599. write_sfm();
  600. if(OFsecon==0)
  601. {OFsecon=59;}



  602. }

  603. }












  604. //**************************以下 亮度會上設定  和上面小時一樣
  605. //只是就量不一樣 不作注釋*******************************************
  606. //**************


  607.   //********************************設定環境參數************************************

  608.   if(kval==13)

  609. {

  610.    write_com(0x0c);

  611.    num4[4]=dwbrig;
  612.    write_rvalue();
  613.   if(lofl==1)
  614.   {
  615. write_com(0x80);

  616.                           for(num=0;num<16;num++)
  617.                 {
  618.                         write_date(logo7[num]);
  619.                         delay(2);

  620.                
  621.                 }



  622.            write_com(0x80+0x40);

  623.                           for(num=0;num<16;num++)
  624.                 {
  625.                         write_date(logo9[num]);
  626.                         delay(2);

  627.                         lofl=0;
  628.                 }


  629. }


  630.     if(add==0)        
  631.         {
  632.            delay(10);

  633.             
  634.                 if(add==0)
  635.                 {
  636.                 while(!add);                                                               
  637.                  dwbrig++;
  638.                  num4[4]=dwbrig;
  639.                  write_rvalue();


  640.          if(dwbrig==250)
  641.           {dwbrig=0;}


  642.                  }
  643.                  }



  644.                 if(dec==0)        
  645.         {
  646.            delay(10);

  647.             
  648.                 if(dec==0)
  649.                 {
  650.                 while(!dec);                                                               
  651.                  dwbrig--;
  652.                  num4[4]=dwbrig;
  653.                  write_rvalue();


  654.          if(dwbrig==0)
  655.           {dwbrig=250;}


  656.                  }
  657.                  }


  658. }











  659. //*********************************************************************


  660.    //********************************設定環境參數************************************

  661.   if(kval==14)

  662. {

  663.    write_com(0x0c);

  664.    num4[4]=kwbrig;
  665.    write_rvalue();
  666.   if(lofl==1)
  667.   {
  668. write_com(0x80);

  669.                           for(num=0;num<16;num++)
  670.                 {
  671.                         write_date(logo16[num]);
  672.                         delay(2);

  673.                
  674.                 }



  675.            write_com(0x80+0x40);

  676.                           for(num=0;num<16;num++)
  677.                 {
  678.                         write_date(logo9[num]);
  679.                         delay(2);

  680.                         lofl=0;
  681.                 }


  682. }


  683.     if(add==0)        
  684.         {
  685.            delay(10);

  686.             
  687.                 if(add==0)
  688.                 {
  689.                 while(!add);                                                               
  690.                  kwbrig++;
  691.                  num4[4]=kwbrig;
  692.                  write_rvalue();


  693.          if(kwbrig==250)
  694.           {kwbrig=0;}


  695.                  }
  696.                  }



  697.                 if(dec==0)        
  698.         {
  699.            delay(10);

  700.             
  701.                 if(dec==0)
  702.                 {
  703.                 while(!dec);                                                               
  704.                  kwbrig--;
  705.                  num4[4]=kwbrig;
  706.                  write_rvalue();


  707.          if(kwbrig==0)
  708.           {kwbrig=250;}


  709.                  }
  710.                  }


  711. }














  712. //**************************以下 濕度會上設定  和上面小時一樣
  713. //只是就量不一樣 不作注釋*******************************************
  714. //**************               
  715. if(kval==15)

  716. {
  717.    num4[4]=uphum;
  718.    write_rvalue();
  719.   if(lofl==1)
  720.   {
  721. write_com(0x80);

  722.                           for(num=0;num<16;num++)
  723.                 {
  724.                         write_date(logo8[num]);
  725.                         delay(2);

  726.                
  727.                 }



  728.            write_com(0x80+0x40);

  729.                           for(num=0;num<16;num++)
  730.                 {
  731.                         write_date(logo9[num]);
  732.                         delay(2);

  733.                         lofl=0;
  734.                 }


  735. }


  736.            

  737.          




  738.     if(add==0)        
  739.         {
  740.            delay(10);

  741.             
  742.                 if(add==0)
  743.                 {
  744.                 while(!add);                                                               
  745.                  uphum++;
  746.                  num4[4]=uphum;
  747.                  write_rvalue();


  748.          if(uphum==100)
  749.           {uphum=0;}


  750.                  }
  751.                  }



  752.                 if(dec==0)        
  753.         {
  754.            delay(10);

  755.             
  756.                 if(dec==0)
  757.                 {
  758.                 while(!dec);                                                               
  759.                  uphum--;
  760.                  num4[4]=uphum;
  761.                  write_rvalue();


  762.          if(uphum==0)
  763.           {uphum=100;}


  764.                  }
  765.                  }


  766. }






  767. //**************************以下 溫度度會上設定  和上面小時一樣
  768. //只是就量不一樣 不作注釋*******************************************
  769. //**************                                
  770. if(kval==16)

  771. {
  772.    num4[4]=uptemp;
  773.    write_rvalue();
  774.   if(lofl==1)
  775.   {
  776. write_com(0x80);

  777.                           for(num=0;num<16;num++)
  778.                 {
  779.                         write_date(logo11[num]);
  780.                         delay(2);

  781.                
  782.                 }



  783.            write_com(0x80+0x40);

  784.                           for(num=0;num<16;num++)
  785.                 {
  786.                         write_date(logo9[num]);
  787.                         delay(2);

  788.                         lofl=0;
  789.                 }


  790. }


  791.            

  792.          




  793.     if(add==0)        
  794.         {
  795.            delay(10);

  796.             
  797.                 if(add==0)
  798.                 {
  799.                 while(!add);                                                               
  800.                  uptemp++;
  801.                  num4[4]=uptemp;
  802.                  write_rvalue();


  803.          if(uptemp==100)
  804.           {uptemp=0;}


  805.                  }
  806.                  }



  807.                 if(dec==0)        
  808.         {
  809.            delay(10);

  810.             
  811.                 if(dec==0)
  812.                 {
  813.                 while(!dec);                                                               
  814.                  uptemp--;
  815.                  num4[4]=uptemp;
  816.                  write_rvalue();


  817.          if(uptemp==0)
  818.           {uptemp=100;}


  819.                  }
  820.                  }


  821. }







  822. //**************************以下煙霧度會上設定  和上面小時一樣
  823. //只是就量不一樣 不作注釋*******************************************
  824. //**************                                
  825. if(kval==17)

  826. {
  827.    num4[4]=upsmo;
  828.    write_rvalue();
  829.   if(lofl==1)
  830.   {
  831. write_com(0x80);

  832.                           for(num=0;num<16;num++)
  833.                 {
  834.                         write_date(logo15[num]);
  835.                         delay(2);

  836.                
  837.                 }



  838.            write_com(0x80+0x40);

  839.                           for(num=0;num<16;num++)
  840.                 {
  841.                         write_date(logo9[num]);
  842.                         delay(2);

  843.                         lofl=0;
  844.                 }


  845. }


  846.            

  847.          




  848.     if(add==0)        
  849.         {
  850.            delay(10);

  851.             
  852.                 if(add==0)
  853.                 {
  854.                 while(!add);                                                               
  855.                  upsmo++;
  856.                  num4[4]=upsmo;
  857.                  write_rvalue();


  858.          if(upsmo==100)
  859.           {upsmo=0;}


  860.                  }
  861.                  }



  862.                 if(dec==0)        
  863.         {
  864.            delay(10);

  865.             
  866.                 if(dec==0)
  867.                 {
  868.                 while(!dec);                                                               
  869.                  upsmo--;
  870.                  num4[4]=upsmo;
  871.                  write_rvalue();


  872.          if(uptemp==0)
  873.           {upsmo=100;}


  874.                  }
  875.                  }


  876. }















  877.    

  878. //*****退出設定*********               


  879.   if(kval==18)

  880. {



  881.   
  882.    write_com(0x0c);


  883. kval=0;
  884.   
  885. dsflj=1;
  886. lofl=1;
  887. keysw=1;
  888.   if(lofl==1)
  889.   {
  890. write_com(0x80);

  891.                           for(num=0;num<16;num++)
  892.                 {
  893.                         write_date(logo4[num]);//字幕顯示
  894.                         delay(2);
  895.                 }


  896.            write_com(0x80+0x40);

  897.                           for(num=0;num<16;num++)//字幕顯示
  898.                 {
  899.                         write_date(logo3[num]);
  900.                         delay(2);
  901.                 }




  902.            lofl=0;

  903.           }






  904.   }





  905. }










  906. }


  907.         
  908. //步進電機函數
  909. void setmoto()
  910. {
  911.   char num;
  912. //zhenfl fanfl

  913.    if(zhenzhuan==1)         //正轉
  914.            {
  915.                  dsflj=0;
  916.                   SETP_MOTOR_REV();
  917.                  
  918.                 if(second==10)
  919.                 {
  920.                 zhenzhuan=0;
  921.                 P1=0X00;
  922.                 dsflj=1;
  923.                 opensw=0;
  924.                 closesw=1;
  925.                 keysw=1;
  926.            menusw=1;


  927.                   zhenfl=1;
  928.                 fanfl=0;
  929.                 brigfl=0;
  930.                  humfl=0;


  931.                 write_com(0x80);
  932.                           for(num=0;num<16;num++)
  933.                 {                                                   //字幕顯示
  934.                         write_date(logo4[num]);
  935.                         delay(2);
  936.                 }


  937.                         write_com(0x80+0x40);        //字幕顯示
  938.                           for(num=0;num<16;num++)
  939.                 {
  940.                         write_date(logo3[num]);
  941.                         delay(2);
  942.                 }



  943.                 }


  944.         

  945.            }
  946.         
  947.                   

  948.                
  949.      if(fanzhuan==1)  //反轉
  950.            { dsflj=0;
  951.                
  952.                   SETP_MOTOR_FFW();
  953.                  
  954.                 if(second==10)
  955.                 { second=0;
  956.                           P1=0X00;

  957.                     zhenfl=0;
  958.                      fanfl=1;        
  959.    
  960.                  fanzhuan=0;
  961.                  dsflj=1;
  962.                  
  963.                  dwbrigfl=0;
  964.                  brigfl=0;


  965.                 opensw=1;
  966.                 closesw=0;
  967.                 keysw=1;
  968.                 menusw=1;
  969.             humfl=1;
  970.          
  971.                     

  972.                 write_com(0x80);

  973.                           for(num=0;num<16;num++)         //字幕顯示
  974.                 {
  975.                         write_date(logo4[num]);
  976.                         delay(2);
  977.                 }

  978.                                 write_com(0x80+0x40);
  979.                           for(num=0;num<16;num++)
  980.                 {                                                          //字幕顯示
  981.                         write_date(logo3[num]);
  982.                         delay(2);
  983.                 }


  984.                  
  985.                 }



  986.                



  987.            }
  988.                

  989. }

  990. void TEMPHRDSPLAY()                    //顯示空氣溫濕度函數   寫入1602
  991. {  
  992.     num1[4]=U8T_data_H;                //溫度高8位,即是整數部分  
  993.     num1[1]=num1[4]/10;        //整數十位
  994.     num1[0]=num1[4]%10;        //整數個位
  995.         
  996.     write_com(0x80+0x40+7);                                 //顯示溫度
  997.         write_date(0x30+num1[1]);
  998.         write_date(0x30+num1[0]);





  999.         num2[4]=U8RH_data_H;         //濕度高8位,即是整數部分  
  1000.     num2[3]=num2[4]/10;        //整數十位
  1001.     num2[2]=num2[4]%10;        //整數個位

  1002.     write_com(0x80+0x40+13);                         //顯示濕度
  1003.         write_date(0x30+num2[3]);
  1004.         write_date(0x30+num2[2]);

  1005. }        


  1006.   




  1007. void SMOGDSPLAY()                    //顯示空氣溫濕度函數   寫入1602
  1008. {  
  1009.     num3[4]=adc0;                //溫度高8位,即是整數部分
  1010.          

  1011.    
  1012.          
  1013.     num3[0]=num3[4]%10;         //顯示ge位  
  1014.         num3[1]=num3[4]%100/10;   //顯示shi位
  1015.         num3[2]=num3[4]%1000/100;//顯示百位
  1016.         
  1017.     write_com(0x80+0X40+2);                                 
  1018.         write_date(0x30+num3[2]);
  1019.         write_date(0x30+num3[1]);
  1020.         write_date(0x30+num3[0]);

  1021. }

  1022.   








  1023. void BRDSPLAY()        
  1024. {  
  1025.    
  1026.          
  1027.         num5[4]=adc1;                //溫度高8位,即是整數部分
  1028.    
  1029.          
  1030.     num5[0]=num5[4]%10;         //顯示ge位  
  1031.         num5[1]=num5[4]%100/10;   //顯示shi位
  1032.         num5[2]=num5[4]%1000/100;//顯示百位

  1033.     write_com(0x80+3);                        
  1034.         write_date(0x30+num5[2]);
  1035.         write_date(0x30+num5[1]);
  1036.         write_date(0x30+num5[0]);

  1037.   }

  1038.   

  1039. void write_rvalue()

  1040. {   

  1041.    
  1042.          
  1043.     num4[0]=num4[4]%10;         //顯示ge位  
  1044.         num4[1]=num4[4]%100/10;   //顯示shi位
  1045.         num4[2]=num4[4]%1000/100;//顯示百位



  1046.     write_com(0x80+7);                                 //顯示溫度
  1047.         write_date(0x30+num4[2]);
  1048.         write_date(0x30+num4[1]);
  1049.         write_date(0x30+num4[0]);
  1050. }







  1051. void init()
  1052. {

  1053.          TMOD=0X11;                                           //定時器設置
  1054.         TH0=0X3C;                                        //定時器0置初值 0.05S
  1055.         TL0=0XBA;
  1056.         EA=1;                                                //開總中斷
  1057.         ET0=1;                                                //定時器0中斷開啟
  1058.         TR0=1;                                                //啟動定時0




  1059.           TL1=0X3C;                //定時初值
  1060.         TH1=0XBA;                //定時初值
  1061.                          //總中斷打開
  1062.         TR1=1;                 //啟動定時器
  1063.         ET1=1;                 //軟件沒用到
  1064.         


  1065.         RCAP2H =(0xFFFF-50000)/256;                //賦T2的預置值0x1000,溢出30次就是1秒鐘
  1066.     RCAP2L =(0xFFFF-50000)%256;   
  1067.     TR2=1;                       //啟動定時器
  1068.     ET2=1;   


  1069.     IT1=1;
  1070.         TH0=0;        //定時器0初值
  1071.         TL0=0;        //定時器0初值
  1072.     TR0=1;        //定時器0啟動           
  1073.         EX1=1;        //外部中斷 軟件沒用到


  1074.         
  1075. }



  1076. void main()//主函數
  1077. {
  1078.   init();
  1079.   init1602();

  1080.   sudu=200;        //電要速度
  1081.   zhenzhuan=0;//上電關正轉
  1082.   fanzhuan=1;//上電反轉打開
  1083.   dsflj=1;
  1084.                         // 顯示打開

  1085.   uptemp=38; //溫度上限
  1086.   uphum=80;         //濕度上限


  1087.   upbrig=120; // 光控值

  1088.   dwbrig=10;//光控下限
  1089.   kwbrig=180;
  1090.   upsmo=85;

  1091.   opensw=1;
  1092.   closesw=1;
  1093.   keysw=1;
  1094.   menusw=1;
  1095.   second=0;

  1096.                 zhenfl=0;
  1097.                      fanfl=0;


  1098.                         brigfl=1;
  1099.                         dwbrigfl=1;
  1100.                         humfl=0;

  1101. adc0 = ADC0832(1,0);  //差分模式,CH0-CH1
  1102. adc1 = ADC0832(1,1);  //差分模式,CH0-CH1




  1103. hour=12;
  1104. minit=5;
  1105. secon=10; // 系統時間          這些值可以按鍵修改


  1106. ONhour=12;        // 自動開窗時間  為了方便演示 設定 一分鐘后開 這些值可以按鍵修改
  1107. ONminit=6;
  1108. ONsecon=10;


  1109. OFhour=12;        // 自動關窗時間 為了方便演示 設定 一分鐘后關 這些值可以按鍵修改
  1110. OFminit=7;
  1111. OFsecon=10;



  1112.         while(1)//大循環

  1113.         {
  1114.   
  1115.          


  1116.          
  1117.          
  1118.             

  1119. keyscn();
  1120. setmoto();



  1121. if (dsflj==1 )
  1122. {

  1123. //get_temp(); //SHT10調用
  1124. //cal_wet();//SHT10調用

  1125. RH(); //DHT11 調用
  1126.    
  1127. //  U8T_data_H= SENSOR[k].temp;//SHT10調用
  1128. //  U8RH_data_H=SENSOR[k].wet;//SHT10調用         
  1129.          
  1130.          
  1131. TEMPHRDSPLAY();











  1132. adc0 = ADC0832(1,0);  //差分模式,CH0-CH1
  1133. SMOGDSPLAY();

  1134. adc1 = ADC0832(1,1);  //差分模式,CH0-CH1
  1135. BRDSPLAY();








  1136.          if(fanfl==1)
  1137.         {


  1138.      if(adc1> kwbrig )//如果際亮度小與設定值 關窗
  1139. {

  1140.   zhenzhuan=1;


  1141. }
  1142.    
  1143.    
  1144.    
  1145.    
  1146.    
  1147.             
  1148.    if(Im[2]==0x40)
  1149.          
  1150. {
  1151. Im[2]=0x00;
  1152. zhenzhuan=1;

  1153. }




  1154.    second=0;

  1155. if(U8T_data_H>uptemp )//如果際溫度大與設定值 開窗
  1156. {

  1157. zhenzhuan=1;

  1158. }



  1159. if(adc0>upsmo )//如果際溫度大與設定值 開窗
  1160. {

  1161. zhenzhuan=1;

  1162. }


  1163.   













  1164. }

  1165.         if(zhenfl==1)
  1166.         {

  1167.            if(Im[2]==0x44)
  1168.          
  1169. {
  1170. Im[2]=0x00;
  1171. fanzhuan=1;

  1172. }


  1173.         second=0;
  1174. if(U8RH_data_H>uphum )//如果際濕度大與設定值 關窗
  1175. {

  1176. fanzhuan=1;
  1177.   brigfl=0;
  1178.   dwbrigfl=0;
  1179.   
  1180.   }


  1181.     if(adc1<dwbrig )//如果際亮度小與設定值 關窗
  1182. {


  1183. fanzhuan=1;
  1184. }
  1185.   





  1186.   



  1187. if(IR==0)        
  1188.         {
  1189.            delay(10);

  1190.             
  1191.                 if(IR==0)
  1192.                 {
  1193.                 //while(!IR);        
  1194.                   befl=1;
  1195.                    ET2=1;
  1196.                   fanzhuan=1;
  1197.                   con=0;
  1198.                                                                         
  1199.                  }

  1200.                   


  1201.            }








  1202.   


  1203. }








  1204.                          if(dec==0)        
  1205.         {
  1206.            delay(10);

  1207.             
  1208.                 if(dec==0)
  1209.                 {
  1210.                 while(!dec);                                                               
  1211.                  befl=0;
  1212.                  BEEP=1;
  1213.                   

  1214.                  }


  1215.            }
  1216.    


  1217.                            
  1218.                







  1219.         DSdat=secon;
  1220.                 write_com(0x80+14);
  1221.                 write_sfm();

  1222.                 DSdat=minit;
  1223.             write_com(0x80+11);
  1224.             write_sfm();

  1225.                 DSdat=hour;
  1226.         write_com(0x80+0x08);
  1227.                 write_sfm();



  1228. ……………………

  1229. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
程序.7z (1.51 MB, 下載次數: 357)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏24 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:698723 發表于 2020-2-27 17:14 來自手機 | 只看該作者
樓主,想在自己家弄一個智能窗戶,能分享一下PCB嗎?
回復

使用道具 舉報

板凳
ID:711095 發表于 2020-3-21 20:58 | 只看該作者
Proteus仿真弄了半天才打開,原來只能用7.5的版本才能打開,其他版本都不行,目前完美運行
回復

使用道具 舉報

地板
ID:517951 發表于 2020-11-15 16:27 | 只看該作者
不錯,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

5#
ID:850270 發表于 2020-12-1 16:34 | 只看該作者
有proteus具體仿真圖嗎
回復

使用道具 舉報

6#
ID:850270 發表于 2020-12-2 12:36 | 只看該作者
為什么下載后,8.8版本仿真沒有結果?只能7.5嗎?
回復

使用道具 舉報

7#
ID:679337 發表于 2021-4-18 09:52 | 只看該作者
需要Proteus7.5才能打開
回復

使用道具 舉報

8#
ID:920783 發表于 2021-5-16 11:32 | 只看該作者
樓主能分享下PCB圖嗎
回復

使用道具 舉報

9#
ID:668925 發表于 2022-7-12 20:56 來自手機 | 只看該作者
51電子有你真好
回復

使用道具 舉報

10#
ID:1072104 發表于 2023-4-16 20:31 | 只看該作者
下載了,多謝大佬
回復

使用道具 舉報

11#
ID:92810 發表于 2025-1-15 10:57 | 只看該作者
下載了,多謝大佬
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91影院在线观看 | 粉嫩一区二区三区四区公司1 | av黄色片在线观看 | 国产精品伦理一区二区三区 | 欧美日韩一区二区三区不卡视频 | 国产一区二区在线看 | 暴草美女| 国产精品久久久久免费 | 91精品久久久久久久久久入口 | 爱爱免费视频 | 97人人干 | 亚洲一区二区久久久 | 一区二区三区精品视频 | 久久综合一区二区三区 | 亚洲欧美一区二区三区1000 | 天天色综 | 久久国产精品亚洲 | 日本精品视频一区二区 | 国产一区视频在线 | 超碰97av| 精品日韩在线 | 欧美极品在线观看 | 亚洲第一视频 | 国产又色又爽又黄又免费 | 亚洲三区视频 | 久久久久久久久久久久久久久久久久久久 | 男人的天堂中文字幕 | 青青久久av北条麻妃海外网 | 成人福利 | 日本淫视频 | av官网在线 | 久久国产一区 | 日日夜夜精品免费视频 | 在线观看视频91 | 亚洲巨乳自拍在线视频 | 久久久久久久久国产 | 欧美黄页 | 国产精品欧美一区二区三区不卡 | 久久亚洲精品久久国产一区二区 | 国产视频久久 | 久久久久亚洲 |