找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6603|回复: 5
打印 上一主题 下一主题
收起左侧

基于51单片机的智能窗户设计与制作 附源程序

[复制链接]
跳转到指定楼层
楼主
本人在贵站第一次发帖,恳请前辈们多多包涵,谢谢。
近年来,随着科技的进步,智能家居正在悄然无声地应用到我们的生活中。但窗户作为住宅必不可少的部分,大部分依然采用原始的人工开闭模式,智能窗户有着非常大的发展空间。我利用单片机、语音识别、红外遥控等技术,设计出了一种基于单片机的智能窗户。
      我用STC89C52RC单片机为核心处理器,配以晶振等外围器件,设计出整个智能窗户的主控系统,将工业生产中常见的电动滑台用两颗螺丝固定在窗户下方,以驱动窗户运行,使用光电限位开关判断窗户位置情况,以实现窗户运行完成后准确停止归位。该设计通过语音识别模块和红外遥控接收模块给主控系统提供相应指令来控制开关窗户,通过雨滴传感器模块采集雨滴的有无,实现下雨天自动关窗的功能,利用可燃气体传感器对可燃气体敏感的特性,实现燃气浓度过高自动开窗的功能。单片机主控系统给语音播放模块发送播放指令,实现智能窗户工作过程中相应的语音提示。利用红外对管的原理,设计窗户行程内障碍物自动停止功能,以避免出现窗户夹到手的严重后果。最终效果符合预期,该智能窗户各种功能均成功实现。

智能窗户实物图

智能窗户控制盒实物图

红外遥控开关窗

限位开关

红外对管


单片机源程序如下:
  1. #include<reg52.h>  

  2. sbit CLK = P1^0; //TB6560步进电机驱动器输入控制端定义         步进电机 频率
  3. sbit ENA = P1^1; //TB6560步进电机驱动器输入控制端定义         步进电机 使能
  4. sbit DIR = P1^2; //TB6560步进电机驱动器输入控制端定义         步进电机 方向

  5. sbit k0 = P0^0; //窗户开启按键
  6. sbit k1 = P0^1; //窗户停止按键
  7. sbit k2 = P0^2; //窗户关闭按键
  8. sbit k3 = P0^3; //左边光电限位开关的信号(窗户完全关闭时候信号输出低电平)
  9. sbit k4 = P0^4; //右边光电限位开关的信号(窗户完全开启时候信号输出低电平)
  10. sbit k5 = P0^5; //防夹手光电对管信号(光线被手阻挡时候信号输出低电平)
  11. sbit k6 = P0^6; //雨滴传感器信号 (有雨滴时候输出低电平)
  12. sbit k7 = P0^7; //可燃气体传感器信号 (可燃气体浓度过高输出低电平)

  13. sbit r0 = P2^0;        //窗户打开提示
  14. sbit r1 = P2^1;        //窗户停止提示
  15. sbit r2 = P2^2;        //窗户关闭提示
  16. sbit r3 = P2^3;        //窗户打开成功提示
  17. sbit r4 = P2^4;        //窗户关闭成功提示
  18. sbit r5 = P2^5; //防夹手提示
  19. sbit r6 = P2^6; //外面下雨提示
  20. sbit r7 = P2^7; //可燃气体浓度过高报警提示

  21. unsigned int Run_Status; //运行状态标志
  22. unsigned int i;
  23. short int buf[3];
  24. unsigned int num=0;
  25. unsigned int flag[8]={1,1,1,1,1,1,1,1};

  26. void serinitial()                //串口程序初始化
  27. {
  28.         TMOD |= 0x20;
  29.         SCON = 0x50;
  30.         TH1=TL1=0xfd;
  31.         TR1=1;
  32.         ES=1;        
  33.         EA=1;
  34.         PS=1;
  35. }
  36. void open()           //打开窗户子程序
  37. {         

  38.         Run_Status = 0; //电机正在正转的状态标志,电机正转窗户开启
  39.         DIR = 0; //正转
  40.         ENA = 1; //步进电机使能信号
  41.         TMOD |= 0x01;
  42.         IE |= 0x82; //打开中断
  43.         TR0 = 1;
  44. }
  45. void close()   //关闭窗户子程序
  46. {
  47.         
  48.         Run_Status = 1; //电机正在反转的状态标志
  49.         DIR = 1; //反转
  50.         ENA = 1; //步进电机使能信号
  51.         TMOD |= 0x01;
  52.         IE |= 0x82; //打开中断
  53.         TR0 = 1;
  54. }
  55. void pause()   //窗户停止运行子程序
  56. {        
  57.     CLK = 0;
  58.         ENA = 0;
  59.         TR0 = 0;
  60. }
  61. void Delay10ms()                //@11.0592MHz
  62. {
  63.         unsigned char i, j;
  64.         i = 108;
  65.         j = 145;
  66.         do
  67.         {
  68.                 while (--j);
  69.         } while (--i);
  70. }

  71. void clearbuf()                 //清空串口接收数据缓存
  72. {        
  73.          for(i = 0; i < 3; i++)
  74.         {
  75.                  buf[i]=0;
  76.         }
  77. }

  78. void main(void)
  79. {
  80.         serinitial();  //红外串口接收程序初始化
  81.         while(1)
  82.         {
  83.                 if(((!k0)&&k4)||(buf[2]==0x43))  //判断右边光电限位开关是否输出低电平,即窗户是否已经是开启状态,当窗户没有完全开启时再判断窗户开启按键是否按下
  84.                 {
  85.                         clearbuf();
  86.                         num=0;
  87.                         r0 = 0;                    //输出语音提示:“正在打开窗户,请稍等”
  88.                         Delay10ms();    //输出语音提示:“正在打开窗户,请稍等”
  89.                         r0 = 1;                     //输出语音提示:“正在打开窗户,请稍等”
  90.                         for (i=0; i<8; i++){flag[i] = 1;};
  91.                         open();
  92.                 }
  93.                 if(buf[2]==0x42)
  94.                 {
  95.                                 Run_Status = 2;
  96.                                 pause();                 
  97.                                 num=0;
  98.                                 clearbuf();
  99.                         
  100.                                 
  101.                 }
  102.                 if(!k5)                 
  103.                 {           
  104.                                 pause();
  105.                                 r5 = 0;             //输出语音提示:“请小心夹手,请不要在电机运行时把手伸进窗户”
  106.                                 Delay10ms(); //输出语音提示:“请小心夹手,请不要在电机运行时把手伸进窗户”
  107.                                 r5 = 1;                 //输出语音提示:“请小心夹手,请不要在电机运行时把手伸进窗户”
  108.                 }
  109.                 if(((!k2)&&k3)||(buf[2]==0x40))        //判断左边光电限位开关是否输出低电平,即窗户是否已经是关闭状态,当窗户没有完全关闭时再判断窗户关闭按键是否按下
  110.                 {        
  111.                         
  112.                         clearbuf();
  113.                         num=0;
  114.                                                         r2 = 0;                   //输出语音提示:“正在关闭窗户,请稍等”
  115.                                                         Delay10ms();  //输出语音提示:“正在关闭窗户,请稍等”
  116.                                                         r2 = 1;                  //输出语音提示:“正在关闭窗户,请稍等”
  117.                                                         close();
  118.                 }
  119.                                        
  120.                 if(!k6)                 //该语句为避免重复执行,仅仅执行一次
  121.                         {
  122.                                                 if(flag[6])
  123.                                                 {        
  124.                                                         r6 = 0;             //输出语音提示:“外面下大雨,正在自动关闭窗户”
  125.                                                         Delay10ms(); //输出语音提示:“外面下大雨,正在自动关闭窗户”
  126.                                                         r6 = 1;                 //输出语音提示:“外面下大雨,正在自动关闭窗户”
  127.                                                         flag[6]=0;
  128.                                                         close();
  129.                                                 }
  130.                         }
  131.                 if(!k7)                 //该语句为避免重复执行,仅仅执行一次
  132.                         {
  133.                                                 if(flag[7])
  134.                                                 {        
  135.                                                         r7 = 0;             //输出语音提示:“外面下大雨,正在自动关闭窗户”
  136.                                                         Delay10ms(); //输出语音提示:“外面下大雨,正在自动关闭窗户”
  137.                                                         r7 = 1;                 //输出语音提示:“外面下大雨,正在自动关闭窗户”
  138.                                                         flag[7]=0;
  139.                                                         open();
  140.                                                 }
  141.                         }        
  142.         switch(Run_Status)
  143.                 {
  144.                         case 0:
  145.                                 if(!k4)         //判断窗户是否完全开启,完全开启后电机停止
  146.                                 {
  147.                                            pause();         
  148.                                         if(flag[3])                 //该语句为避免重复执行,仅仅执行一次
  149.                                         {
  150.                                                 r3 = 0;                 //输出语音提示:“窗户打开成功”
  151.                                                 Delay10ms(); //输出语音提示:“窗户打开成功”
  152.                                                 r3 = 1;                 //输出语音提示:“窗户打开成功”
  153.                                                 flag[3] = 0;
  154.                                         }
  155.                                 };
  156.                         break;
  157.                         case 1:
  158.                                 if(!k3)         //判断窗户是否完全关闭,完全关闭后电机停止
  159.                                 {
  160.                                            pause();
  161.                                         if(flag[4])                        //该语句为避免重复执行,仅仅执行一次
  162.                                                 {
  163.                                                 r4 = 0;                     //输出语音提示:“窗户关闭成功”
  164.                                                 Delay10ms();    //输出语音提示:“窗户关闭成功”
  165.                                                 r4 = 1;                    //输出语音提示:“窗户关闭成功”
  166.                                                 flag[4] = 0;
  167.                                                 }
  168.                                 };
  169.                         break;
  170.                         case 2:
  171.                                 {
  172.                                                 r1 = 0;                     //输出语音提示:“窗户关闭成功”
  173.                                                 Delay10ms();    //输出语音提示:“窗户关闭成功”
  174.                                                 r1 = 1;                    //输出语音提示:“窗户关闭成功”
  175.                                 }

  176.                 }
  177.         }
  178. }


  179. void Timer0_ISR(void) interrupt 1 using 1         //步进电机方波脉冲产生函数
  180. {
  181.         TL0 = 0xC3;                //设置定时初值
  182.         TH0 = 0xFC;                //设置定时初值
  183.         CLK = ~CLK;
  184. }


  185. void ser_isr() interrupt 4                 //串口通信中断服务函数
  186. {
  187.         TR0=0;
  188.         if(RI)
  189.         {               
  190.                 RI=0;
  191.                 buf[num]=SBUF;
  192.                 num++;
  193.                 if(num==3)num=0;
  194.         }
  195. }
复制代码
以上代码打包51hei下载地址:
smart window program.rar (36.65 KB, 下载次数: 77)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:745013 发表于 2020-5-6 14:04 | 只看该作者
请问,您有Proteus的仿真图吗,我想认真学习一下
回复

使用道具 举报

板凳
ID:614860 发表于 2020-5-7 16:11 来自手机 | 只看该作者
19970828 发表于 2020-5-6 14:04
请问,您有Proteus的仿真图吗,我想认真学习一下

请问有没有具体的仿真图,还有你所用的器件清单
回复

使用道具 举报

地板
ID:850270 发表于 2020-12-1 16:01 | 只看该作者
有详细的仿真图吗
回复

使用道具 举报

5#
ID:328014 发表于 2020-12-2 05:39 | 只看该作者
作者没有说有仿真图,所以没有,可能作者直接焊接的电路板
回复

使用道具 举报

6#
ID:553941 发表于 2020-12-2 08:40 | 只看该作者
说实话,这个仿真没有意义,传感器也都是些简单的信号,反而传感器安装的位置很重要。这个需要实物不断的调试。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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