找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8869|回复: 9
收起左侧

单片机智能窗户系统温度程序设计 湿度 亮度 红外报警定时烟雾全功能

  [复制链接]
ID:329781 发表于 2020-1-31 21:36 | 显示全部楼层 |阅读模式
1、单片机的智能窗户采用51单片机+LCD1602液晶显示+红外探头+DHT11+MQ2+步进电机+蜂鸣器设计而成。
2、液晶实时显示目前的状态,包括温度、湿度、烟雾浓度、光线强度、时间等信息。
3、智能窗户可以根据外接光线的强弱来进行自动开关窗户,光线强弱的上下限可以按键调节。
4、不仅具有自动控制功能,还可以手动开关窗户。
5、在开窗前提下,如果红外探头检测到人体就会发出报警并且关闭窗户。
6、可以通过遥控器来进行开关窗户。

电路原理图如下:
`KGJXP{{72)8FMG7VAJQ8PD.png

一、实物介绍
51hei.png

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

二、功能介绍
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 51hei图片20171130214022.jpg 51hei图片20171112115246.jpg 51hei图片20171112115242.jpg 51hei图片20171112115238.jpg 51hei图片20171112115233.jpg 51hei图片20171112115229.jpg 51hei图片20171112115225.jpg 51hei图片20171112115221.jpg 51hei图片20171112115216.jpg 51hei图片20171112115212.jpg 51hei图片20171112115202.jpg 51hei图片20171112115125.jpg

单片机源程序如下:
  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, 下载次数: 337)
回复

使用道具 举报

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有你更精彩!!
回复

使用道具 举报

ID:850270 发表于 2020-12-1 16:34 | 显示全部楼层
有proteus具体仿真图吗
回复

使用道具 举报

ID:850270 发表于 2020-12-2 12:36 | 显示全部楼层
为什么下载后,8.8版本仿真没有结果?只能7.5吗?
回复

使用道具 举报

ID:679337 发表于 2021-4-18 09:52 | 显示全部楼层
需要Proteus7.5才能打开
回复

使用道具 举报

ID:920783 发表于 2021-5-16 11:32 | 显示全部楼层
楼主能分享下PCB图吗
回复

使用道具 举报

ID:668925 发表于 2022-7-12 20:56 来自手机 | 显示全部楼层
51电子有你真好
回复

使用道具 举报

ID:1072104 发表于 2023-4-16 20:31 | 显示全部楼层
下载了,多谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表