找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机自动窗帘系统源程序+proteus仿真+设计详解(手动和自动模式)

  [复制链接]
跳转到指定楼层
楼主
本窗帘设计带手动和自动切换,自动模式LED亮,手动模式LED灭。

所有资料51hei提供下载:
基于单片机浴室窗帘控制系统-1.7z (77.33 KB, 下载次数: 385)

单片机自动窗帘仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. #include<reg51.h>
  2. #include"delay.h"
  3. #include"lcd602.h"
  4. #include"adc0832.h"
  5. /*****************************数组定义*******************************/
  6. uchar code tab1[]={"Now_G: "};         //
  7. uchar code tab5[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xff7,0xf6};  //1-2励磁顺序表 //半步
  8. /************************端口定义**************************/
  9. sbit k1 = P2^0;        // 手-正
  10. sbit k2 = P2^1;        // 手-反
  11. sbit k3 = P2^2;        // 手-停
  12. sbit k4 = P2^3;        // 自-上
  13. sbit k5 = P2^4;        // 自-下
  14. sbit led = P3^3; // 自-手-lED
  15. sbit k6 = P3^4; // 自-手
  16. /************************变量定义*****************************/
  17. uint sec,min,h;        //BCD码格式
  18. int second,minute,hour; //十进制
  19. double youliang = 0;
  20. uchar i = 0;
  21. bit flag = 0; //暂停开始标志
  22. bit flag1 = 0; //正反转标志
  23. bit flag2 = 0;
  24. bit flag3 = 0;
  25. bit mode = 1;
  26. /*************************按键*******************************/
  27. void key()
  28. {
  29.           if(k1==0)
  30.           {
  31.                      delayxms(5);
  32.                    while(k1==0);
  33.                    flag1 = 0; flag = 1;
  34.                    write_zifu(1,15,'Z');
  35.           }
  36.           if(k2==0)        
  37.           {
  38.                         delayxms(5);
  39.                         while(k2==0);
  40.                         flag1 = 1; flag = 1;
  41.                         write_zifu(1,15,'F');
  42.           }
  43.           if(k3==0)        
  44.           {
  45.                         delayxms(5);
  46.                         while(k3==0);
  47.                         flag = 0;
  48.           }
  49. }

  50. void key1()
  51. {
  52.           if(k4==0)
  53.           {
  54.                      delayxms(5);
  55.                    while(k4==0);
  56.                    flag = 0;
  57.                    write_zifu(1,15,'T');
  58.                    flag2 = 1; flag3 = 0;
  59.           }
  60.           if(k5==0)        
  61.           {
  62.                         delayxms(5);
  63.                         while(k5==0);
  64.                         flag = 0;
  65.                         write_zifu(1,15,'T');
  66.                         flag2 = 0; flag3 = 1;
  67.           }
  68. }
  69. /*******************定时器T0初始化********************/
  70. void T0_init()
  71. {
  72.           TMOD=TMOD | 0x01;              //设T0为方式1
  73.           TH0=(65535-50000)/256;       //计数50000个
  74.           TL0=(65535-50000)%256;
  75.           EA=1;                        //开启总中断         
  76.           ET0=1;                       //允许T0中断
  77.           //TR0=1;                       //启动
  78. }
  79. /**************************************************************
  80.                       主程序
  81. **************************************************************/
  82. void main()
  83. {
  84.   chushihua(); //LCD1602初始化
  85.   write_string(1,0,tab1);
  86.   T0_init();
  87.   while(1)
  88.   {
  89.                             /*自动和手动判断*/
  90.                             if(k6==0)
  91.                                 {
  92.                                              delayxms(5);
  93.                                            while(k6==0);
  94.                                            mode = ~mode;
  95.                                 }
  96.                                 /*重力计算 0-100*/
  97.                         youliang = adc0832()/2.55;
  98.                         write_num3(1,7,youliang); //重力显示
  99.                                 /*手动模式*/
  100.                                 if(mode == 1)
  101.                                 {
  102.                                    flag2 = 0; flag3 = 0;
  103.                                    led = 1; //LED关
  104.                                    key(); //按键检测
  105.                                    if(flag == 0)
  106.                                    {TR0 = 0; write_zifu(1,15,'T');}
  107.                                    else
  108.                                    {TR0 = 1;}
  109.                                 }
  110.                                 /*自动模式*/
  111.                                 if(mode == 0)
  112.                                 {
  113.                                    led = 0; //LED开
  114.                                    key1(); //按键检测
  115.                                    if(flag == 0)
  116.                                    {TR0 = 0;}
  117.                                    else
  118.                                    {TR0 = 1;}
  119.                                    /*根据重力判断正反转*/
  120.                                    if(youliang > 50 && flag2 == 0) //正转
  121.                                    {
  122.                                              flag = 1; flag1 = 0;
  123.                                           write_zifu(1,15,'Z');
  124.                                    }
  125.                                    if(youliang <= 50 && flag3 == 0) //反转
  126.                                    {
  127.                                              flag = 1; flag1 = 1;
  128.                                           write_zifu(1,15,'F');
  129.                                    }
  130.                                    if(flag == 0)
  131.                                    {TR0 = 0;}
  132.                                    else
  133.                                    {TR0 = 1;}
  134.                                 }
  135.   }
  136. }
  137. /**************************定时器T0中断服务函数************************************/
  138. void T0_time() interrupt 1   
  139. {
  140.           TR0 = 0;
  141.       TH0=(65535-50000)/256;      
  142.           TL0=(65535-50000)%256;     
  143.           if(i > 7)
  144.           {i = 0;}
  145.           if(flag1 == 0)
  146.           {P1 = tab5[i];} //正转
  147.           else
  148.           {P1 = tab5[7-i];} //反转
  149.           i += 1;
  150.           TR0 = 1;
  151. }
复制代码

随着人民生活水平的不断提高,人们对家庭生活舒适性的需求越来越强烈,窗帘作为每个家庭生活中最必须的家居用品之一,自然也需要满足人民更舒适性的需求。窗帘最基本的作用无非是保护业主的个人隐私以及遮阳挡尘等功能,但传统的窗帘您必须手动去开关,每天早开晚关也是挺麻烦的,特别是别墅或复式房的大窗帘,比较长,而且重,用时需要很大的力才能开关窗帘,特别不方便;于是遥控电动窗帘在最近几年被广泛应用于高级公寓,只要遥控器轻按一下,窗帘就自动开合,非常方便;当然,如果采用智能窗帘控制系统还可以实现窗帘的定时开关,场景控制等更多高级的窗帘控制功能,真正让窗帘成为现代家居的一道亮丽"风景线".

  1 系统总体设计与工作原理

  PWM是一种模拟控制方式,其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。

  本系统由单片机、红外接收、光敏测光、电机驱动、数码管显示以及鸣响提示模块组成。主要应用模块的选择包括电动机驱动模块的、PWM调速方式、PWM调脉宽方式、PWM软件实现方式的选择。其中,电机驱动模块的选择采用由达林顿管组成的H型PWM电路;PWM调速工作方式采用单极性工作制;PWM调脉宽方式选择采用定频调宽方式;PWM软件实现方式采用软件延时方式。系统总体框图如图1所示。

  AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。

  该窗帘控制系统采用AT89S52单片机的最小系统设计,可以实现使用红外遥控器进行远程手动开、手动关和手动停控制,数码管显示窗帘的开、关,可以通过自行设定相应的数字表示;也可以按事先输入的开启时间和关闭时间进行时间控制,但只能顺序显示,显示一遍后,略等片刻,再显示下一遍时间;还可以根据室外环境亮度实现光控,由驱动数码管显示出当时的状态。每一组数据由5个数字组成,前4个数字顺序显示时十位、时个位、分十位、分个位,第5个数字包含工作方式和工作状态:显示"一"(1横)表示手动方式;"二"(2横)表示半手动方式;"三"(3横)表示光控方式;不显示横则表示时控方式。左上角的"竖"点亮表示电机工作时发出鸣响提示,不点亮表示电机工作无提示;右上角的"竖"点亮表示整点报时开启,不点亮表示无整点报时。左下角"竖"点亮表示窗帘正在打开,右下角"竖"点亮表示窗帘正在关闭。

  2 硬件电路设计

  该窗帘控制系统电路分为8个部分:电源、显示、光控电路测光、电机控制执行、红外接收、鸣响提示、数据存储、单片机主控器件。其中,电源部分通过外接插座输入交流12 V或者直流13 V~14 V电压供电,经过三端集成稳压器稳压后输出5 V电压,为鸣响电路、红外接收电路、显示电路提供电源。使用2节5号普通电池提供直流电源。

  2.1 光采集电路设计

  测光电路如图2所示,由GM1、C3、V3组成。GM1采用光敏二极管[1],C3和GM1组成RC充放电回路。当P3.4处于高电平时,P3.4的高电压通过GM1的正向电阻向C3充电;当P3.4被单片机拉低为低电平时,C3通过光敏元件放电。光敏二极管工作在反向电压状态下,此时环境亮度决定了光敏二极管的光阻值,光阻值大,C3放电速度慢,反之放电速度快。适当控制P3.4的拉低脉冲宽度,使得C3放电工作在线性比较好的工作段上。P3.5用来检测C3在P3.4拉成低电平期间的放电电压状态,当C3电压降到小于1/2VCC后,P3.5测得数据"0",反之测得数据"1".

  2.2 红外接收电路及数据存储部分设计

  红外接收电路使用型号为HS3008的集成型红外接收器,静态时输出端输出高电平,当接收到红外信号后,按红外信号的数据波形输出负脉冲数据信号,红外信号输出到单片机的P3.2口,该口对应的第二功能是外部中断0(INT0),利用该功能,一旦红外信号到来,P3.2被拉成低电平,使单片机中止当前的工作并转到接收及处理红外信号。开启中断功能的目的是:既减轻了单片机的工作负担,又保证接收到的红外信号的完整性,同时在手动工作状态下,单片机进入睡眠后,利用外部中断功能完成对单片机的唤醒。红外接收电路和数据存储电路如图3所示。

  2.3 窗帘框架构造设计

  窗帘框架构造设计包括窗帘微动开关连接电路设计和窗帘架的制作与设计。本设计中的微动开关通过电容、电阻组成的复位电路与单片机的复位引脚相连,微动开关安装在窗帘滑杆上,当窗帘移动到预定位置时,触动微动开关,使单片机复位,此时电机停转,窗帘停到指定位置。窗帘架的制作方法如下:先加工两只滑轮作为主动轮和从动轮,轮子类似皮带轮,底径约为25 mm,槽宽和槽深约为4 mm;1根晒衣绳,直径约为4 mm;在主动轮的槽底用胶水粘一圈薄胶皮以增加摩擦力;将主动轮固定在电动机轴上,而将电动机固定在窗帘盒的一端,将从动轮固定在窗帘盒的另一端,固定时最好调节装置,用以绷紧拉绳。窗帘杆选用19 mm的不锈钢管,采用2根杆其目的在于左右窗帘能重合。窗帘架的构成及窗帘的布置如图4所示。

  3 系统软件设计

  本系统中单片机微处理器的主要任务是完成对HS3008接收到的红外信号的控制与处理,从而完成对相应控制单元的控制。主程序首先完成初始化,然后启动HS3008等待接收控制指令,进行相应的输出操作。系统流程图如图5所示。

  单片机对接收到的红外信号控制指令通过P3.2口来完成,其对应第二功能时为外部中断0(INT0),通过接收到不同的红外信号脉冲实现相应的操作。程序中重要的子程序有:串口初始化、串口接收中断以及红外信号处理子程序等。当串口设置完毕、程序初始化后,程序对P3.2口进行实时检测,一旦检测到有低脉冲到来,则进行解码后,提取相应的子程序以实现对电机的控制。当接收到手动控制信号时,则直接对电机进行控制,实现窗帘的拉开、关闭或停止;当接收到半自动控制信号时,操作者只需按下拉开或关闭按钮来程序执行,从而实现窗帘拉开或关闭。对于电机如何停止的问题,本设计在窗帘滑杆上安装了微动开关,一旦窗帘拉动到指定位置就会触碰微动开关,从而送给单片机一个低脉冲,单片机在接收到低脉冲后,则认为窗帘已完全拉开或关闭,调用程序实现电机的停止转动;当接收到光控信号时,单片机调用相应的程序,驱动光敏二极管检测环境亮度,根据检测结果,实现窗帘的拉开或关闭。

  基于单片机的智能遥控窗帘的设计,在实时性要求较低的测控与采集系统的应用中具有很好的发展前景和应用价值。在国内外,自动调光窗帘成为人们家居生活的首选布置。本文介绍的自动调光窗帘利用红外遥控实现了其控制功能,在设计过程中遇到了一些典型的问题,但采取了相应的措施:

  (1)电机驱动问题。电机的驱动电压为5 V,但是经过三极管的降压后,电机驱动能力明显下降,为了增大电机驱动能力,在控制部分与电机执行部分加了4N25光耦隔离,将两部分隔离开来,外接12 V电压,以增大电机的驱动能力。(2)电机停机问题。单独靠程序来实现电机的停机,对时间控制的要求非常高,且不易实现。如果通过继电器来实现停机也可以,但由于继电器响应时间慢、机械结构易损坏、寿命较短、可靠性不高,故采用了微动开关,通过送单片机低脉冲来实现电机停机,实时性也很好。



评分

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

查看全部评分

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

使用道具 举报

沙发
ID:417062 发表于 2018-10-29 13:58 | 只看该作者
设计很合理,谢谢楼主
回复

使用道具 举报

板凳
ID:436886 发表于 2018-12-1 22:26 | 只看该作者
楼主、您好 我想问一下您的那个自动窗帘设设计 就是图中有几个零件不是很懂 可以为我讲解下吗  
回复

使用道具 举报

地板
ID:349040 发表于 2018-12-2 18:02 | 只看该作者
楼主,有些问题想请教你,真诚,希望你可以指导一下
回复

使用道具 举报

5#
ID:661737 发表于 2019-12-11 21:23 | 只看该作者
多谢分享
回复

使用道具 举报

6#
ID:766592 发表于 2020-6-2 11:16 | 只看该作者
有详细的解答吗
回复

使用道具 举报

7#
ID:753910 发表于 2020-7-1 16:24 | 只看该作者
仿真运行怎么不亮呀
回复

使用道具 举报

8#
ID:1017407 发表于 2022-4-13 09:43 | 只看该作者
直接仿真不了啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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