找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机自动窗帘Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar code tab1[]={"Now_G: "};       
  5. uchar code tab5[]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xff7,0xf6};  
  6. sbit k1 = P2^0;         
  7. sbit k2 = P2^1;         
  8. sbit k3 = P2^2;
  9. sbit k4 = P2^3;
  10. sbit k5 = P2^4;
  11. sbit k7 = P2^5;
  12. sbit led = P3^3;
  13. sbit k6 = P3^4;
  14. uchar i = 0;
  15. bit flag = 0;
  16. bit flag1 = 0;
  17. bit flag2 = 0;
  18. bit flag3 = 0;
  19. bit mode = 1;
  20. void delayxms(uint ms)                                          
  21. {
  22.     uint a,j;

  23.     for(a=0;a<ms;a++)
  24.           for(j=0;j<110;j++);

  25. }
  26. void key()
  27. {
  28.           if(k1==0)
  29.           {
  30.                      delayxms(5);
  31.                    while(k1==0);
  32.                    flag1 = 0; flag = 1;
  33.           }
  34.           if(k2==0)       
  35.           {
  36.                         delayxms(5);
  37.                         while(k2==0);
  38.                         flag1 = 1; flag = 1;
  39.           }
  40.           if(k3==0)       
  41.           {
  42.                         delayxms(5);
  43.                         while(k3==0);
  44.                         flag = 0;
  45.           }
  46. }

  47. void key1()
  48. {
  49.            if(k4==0)
  50.           {
  51.                      delayxms(5);
  52.                    while(k4==0);
  53.                    flag1 = 0; flag = 1;
  54.           }
  55.           if(k5==0)       
  56.           {
  57.                         delayxms(5);
  58.                         while(k5==0);
  59.                         flag1 = 1; flag = 1;
  60.           }
  61.           if(k3==0)       
  62.           {
  63.                         delayxms(5);
  64.                         while(k3==0);
  65.                         flag = 0;
  66.           }
  67. }
  68. void T0_init()
  69. {
  70.           TMOD=TMOD | 0x01;              
  71.           TH0=(65535-50000)/256;      
  72.           TL0=(65535-50000)%256;
  73.           EA=1;                                 
  74.           ET0=1;                     
  75.           //TR0=1;                     
  76. }

  77. void main()
  78. {
  79.   
  80.   T0_init();
  81.   while(1)
  82.   {
  83.                             
  84.                             if(k6==0)
  85.                                 {
  86.                                              delayxms(5);
  87.                                            while(k6==0);
  88.                                            mode = ~mode;
  89.                                 }
  90.                                 if(mode == 1)
  91.                                 {
  92.                                    key(); //按键检测
  93.                                    if(flag == 0)
  94.                                    {TR0 = 0;}
  95.                                    else
  96.                                    {TR0 = 1;}
  97.                                    led = 1;
  98.                                 }
  99.                                 if(mode == 0)
  100.                                 {
  101.                                    key1(); //按键检测
  102.                                    if(flag == 0)
  103.                                    {TR0 = 0;}
  104.                                    else
  105.                                    {TR0 = 1;}
  106.                                    led = 0;
  107.                                 }
  108.   }
  109. }
  110. void T0_time() interrupt 1   
  111. {
  112.           TR0 = 0;
  113.       TH0=(65535-50000)/256;      
  114.           TL0=(65535-50000)%256;     
  115.           if(i > 7)
  116.           {i = 0;}
  117.           if(flag1 == 0)
  118.           {P1 = tab5[i];} //正转
  119.           else
  120.           {P1 = tab5[7-i];} //反转
  121.           i += 1;
  122.           TR0 = 1;
  123. }
复制代码

仿真工程51hei提供下载:
自动窗帘仿真.zip (94.33 KB, 下载次数: 65)

下面是文档的无图版(图片不提供哦)

本设计主要由STC89C52单片机控制系统、电机驱动模块、光敏检测模块、手动控制模块与检测模块等组成。处于光敏智能模式时,光敏电阻检测到光照强度的变化,将电阻变化转化为电压变化,并将该变化信号传输到单片机;正反转处于遥控控制时,单片机通过检测按键指令,作出相应的动作指令。单片机通过给驱动模块下达指令来控制电机的正反转,从而实现窗帘的打开和关闭,由此实现智能控制和手动遥控功能,使本设计更加方便和人性化,构成一个多功能自动窗帘控制系统,它将成为未来智能家居必不可少的一员。



一、综合实训任务
1.1 综合实训目的
21世纪是信息化的世纪,各种电信和互联网新技术推动了人类文明的巨大进步。智能家居控制系统可以定义为一个过程或者一个系统。利用先进的计算机技术、网络通讯技术、综合布线技术、将与家居生活有关的各种子系统,有机地结合在一起,通过统筹管理,让家居生活更加舒适、安全、有效。与普通家居相比,智能家居不仅具有传统的居住功能,提供舒适安全、高品位且宜人的家庭生活空间。还将原来的被动静止结构转变为具有能动智慧的工具,提供全方位的信息交换功能,帮助家庭与外部保持信息交换畅通,优化人们的生活方式,帮助人们有效安排时间,增强家居生活的安全性,甚至为各种能源费用节约资金。系统的网络化功能可以提供遥控、家电(空调,热水器等)控制、照明控制、室内外遥控、窗帘自控、防盗报警、电话远程控制、可编程定时控制及计算机控制等多种功能和手段。使生活更加舒适、便利和安全。因智能家居控制系统布线简单、功能灵活,扩展容易而被人们广泛接受和应用。
此次系统设计系统正是利用STC89C52 单片机的优点,顺利的完成了本设计的要求。并且实现了学习型定时和自动控制功能,为控制家居设备提供了良好的基础。
正是因为通信技术、计算机技术、网络技术、控制技术的迅猛发展与提高,促使了家庭实现了生活现代化,居住环境舒适化、安全化。这些高科技已经影响到人们生活的方方面面,改变了人们生活习惯,提高了人们生活质量,家居智能化也正是在这种形势下应运而生的。智能家居控制系统的主要功能包括通信、设备自动控制、安全防范三个方面。随着新技术和自动化的发展,传感器的使用数量越来越大,功能也越来越强,各种传感器都已经标准化、模块化,这给智能家居控制系统的设计提供极大方便。
1.2综合实训内容
为了能根据实际情况来实现对窗帘自动开合的控制,大致有三种方法:声控、光控、手动,最后我们采用了光控和手动相结合的设计方案,其优点有:一是可以根据室外光线明暗自动调节;二是可以根据个人实际需求进行手动控制;三是根据元器件的选择和后期的制作成本比较低。
设计要求:
(1)利用STC89C52单片机为核心来控制直流电机正反转实现窗帘的开关。
(2)利用上下两个限位开关实现最高点、最低点电机自动停止来防止窗帘的过卷,以达到防过卷功能。利用按键实现手动控制功能。
(3)实现智能化控制,窗帘的打开和关闭是通过光敏电阻检测环境亮度自动完成的,光线暗并关闭,光线强就打开,不产生误动作。
(4)利用按键实现手动控制功能。
(5)利用LED灯能够指示运行状态。
1.3 整体功能
本设计是由单片机控制系统、电源模块、电机驱动模块、自动光敏检测模块、手动遥控模块等模块组成。当处于自动模式下时,利用光敏电阻检测光照强度的变化,通过光敏电阻阻值得变化转化为电压变化,并将电压变化的信号送单片机,单片机通过电机驱动模块控制着电机的正反转实现窗帘的来回移动,构成一个多功能自动窗帘控制系统;当处于智能遥控模式时,通过遥控发射和接收模块,单片机通过遥控指令控制电机的正反转;当处于手动按键模式时,通过按键控制电机的正反转来实现窗帘的打开与关闭。其中,光敏控制模块室由光敏电阻和三极管组成的;电机驱动模块是利用了三极管和继电器的的通断实现电机的正转与反转;单片机用C语言编程,通过仿真调试,基本达到了我们所期望的系统功能。

第二章 窗帘机械部分设计
本章节主要介绍本设计中机械部分的结构设计及传动原理。进行综合的对比考虑选择最适合本设计的方案。
2.1 窗帘传动方案的选择
设计方案如图所示:
图2.1  手绘简图

通过市场调研、查阅资料以及小组讨论我们初步拟定了以下方案,最终决定选用齿轮齿条传动作为本设计的机械传动装置。齿轮齿条传动由于传动比可靠,适合远距离传动,所占空间小,造价较低,故适合。   
2.2 窗帘传动示意图
                  图2.2  窗帘传动示意图(打开状态)
2.2  窗帘传动示意图(打开状态)
2.3 窗帘传动示意图(关闭状态)
图2.4  窗帘装配图齿轮齿条
2.2 传动原理
如图1.1和1.2所示,窗帘采用左右双开的形式,通过单片机控制步进电机的正反转来带动齿轮的正反转进而使与齿轮啮合的两个齿条左右反向移动来实现窗帘的打开与关闭。
窗帘一端固定不动,中间部分由圆环连接串在圆柱形横杆上,另外一端通过“h”形卡扣固定在齿条的一端随着齿条在横杆上左右移动从而实现窗帘的打开与关闭。
在窗帘打开(关闭)到位时齿条所对应的位置安装有限位开关,每当窗帘全开(全关)时都会触发限位开关使步进电机停止转动,防止窗帘过度打开(关闭)导致损坏。
2.3 齿轮、齿条的选择2.3.1 选择齿轮材料及精度等级

直齿圆柱齿轮选用45钢调质,硬度为220HBW;矩形直齿齿条选用45钢正火,硬度为170HBW;选择8级精度 。详细数据见零件图
   
2.3.2 确定齿轮许用应力2.3.3 校核齿根弯曲疲劳强度
齿轮是长时间、高转速、大载荷(大功率)传动零件,对其承载能力计算方法有标准GB/T3480。齿轮齿条传动,不存在高转速、长时间工作条件(要求)。所以,就不存在轮齿弯曲疲劳强度、接触疲劳(点蚀等)强度计算问题。(应力循环次数比齿轮传动小的太多了)比起直齿轮传动,齿轮齿条传动的重合系数要高,每个齿承受的力相对要小。所以,对齿轮齿条传动进行强度校核,只要通过轮齿受力分析(不考虑齿面摩擦,齿面作用力方向是固定的,等于压力角“方向”),受力计算,满足轮齿弯曲强度即可。
                    =21.1127002.651.59/(10428)=105.11MPa;
                       =105.112.2151.785/(2.651.59)=98.63MPa;
均小于许用应力,故符合强度要求。
2.4 窗帘“h”形卡扣
“h”形卡扣材料为铝合金,具体尺寸见零件图。
形状如下:
图2.7 “h”形卡扣
2.5 窗帘外壳

第三章 系统硬件方案选择
本章节主要介绍系统所用到的器件的选择,进行综合的、考虑选择出最适合本设计的、方案。
3.1 硬件方案的选择
在硬件电路的搭建之前必须明确设计的方案,通过各个模块之间进行比较选择出最适合本设计的硬件,以发挥器件的最大功效。
3.1.1 主控芯片的选择
采用STC89C52单片机作为主控芯片。STC89C52是宏晶科技公司生产的一款低功耗、高性能的八位CMOS微处理器,片内具有8k在线编程Flash存储器。STC89C52单片机的内核采用的是MCS-51内核,指令完全兼容MCS-51,但是该单片机越做了升级使得芯片具有很多传统的51单片机不具备的功能,例如该芯片还有4K的EEPROM存储,在需要使用到掉电存储数据的时候就可以直接使用单片机内部的存储,不在需要在外接存储芯片进行存储。STC89C52单片机具有的开发简单、可在线编程下载、成本低是非常不错的选择。
综合上述的描述,考虑到资源的合理利用和成本以及开发的难易程度最终决定采用宏晶科技的STC89C52单片机作为主控芯片。
3.1.2 时钟器件的选择
采用单片机内部定时计数器作为计时。虽然定时器进行的计时精度有限,在短时间内精度还行,如果时间长了误差累计的越来越多时间也就偏差多了。但是采用该方法可以节省电路的搭建也节省了成本。
3.1.3 步进电机驱动的选择
选用ULN2003芯片。ULN2003是高耐压、大电流复合晶体管IC。由七个硅NPN 复合晶体管组成,内部每一路达林顿都加入了基准电阻所以可以直接和TTL或者CMOS电路直接相连接。输出还可以在高负载电流并行运行使用其驱动步进电机非常方便。
根据上述描述,最终选择了方案ULN2003作为电机的驱动。
3.2系统总体方案
通过上述对各个模块介绍,我们最终选择了采用STC89C52作为的主控芯片,采用光敏电阻采集环境光强通过,通过独立按键可以进行切换模式模式。同时具有两个限位开关防止窗帘电机过度转动而造成窗帘损坏。

第四章 系统硬件电路设计
本章节主要介绍本设计中各个部分电路的设计原理。通过各个模块的功能描述了解其工作原理以及在设计的中作用。
4.1 STC89C52单片机系统设计4.1.1 STC89C52的概述
STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、非常有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
4.1.2 STC89C52单片机的最小系统
单片机最小系统说的通熟易懂的话就是以最少的元器件组成能让单片机工作起来的系统,接下来开始介绍51单片机最小系统必备的器件及其作用。
首先电源这对于一个电子产品的话是必不可少,它提供能源给系统运作,在本设计中由于51单片机的工作电压在4.5~5.5V之间都可以正常工作所以我们采用了USB电源线连接手机充电器插头或者5V的移动电源给系统进行供电。
其次晶振电路,XTAL1和XTAL2 是独立的输入和输出反相放大器,它们可以被配置为使用石英晶振的片内振荡器,或者是器件直接由外部时钟驱动。图4.1中采用的是内时钟模式,即采用利用芯片内部的振荡电路,在XTAL1、XTAL2 的引脚上外接定时元件(一个石英晶体和两个电容),内部振荡器便能产生自激振荡。一般来说晶振可以在1.2~12MHz 之间任选,甚至可以达到24MHz 或者更高,但是频率越高功耗也就越大。在本实验套件中采用的12M 的石英晶振。和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。当采用石英晶振时,电容可以在20 ~40pF 之间选择(本设计使用30pF);当采用陶瓷
谐振器件时,电容要适当地增大一些,在30~50pF 之间。通常选取30pF 的陶瓷电容就可以了。
图4.1 晶振电路
再来就是复位电路,复位电路分为:上电自动复位和开关复位。图4.2 中所示的复位电路就包括了这两种复位方式。上电瞬间,电容两端电压不能突变,此时电容的负极和RESET 相连,电压全部加在了电阻上,RESET 的输入为高,芯片被复位。随之+5V电源给电容充电,电阻上的电压逐渐减小,最后约等于0,芯片正常工作。并联在电容的两端为复位按键,当复位按键没有被按下的时候电路实现上电复位,在芯片正常工作后,通过按下按键使RST管脚出现高电平达到手动复位的效果。一般来说,只要RST 管脚上保持10ms 以上的高电平,就能使单片机有效的复位。图中所示的复位电阻和电容为经典值,实际制作是可以用同一数量级的电阻和电容代替,读者也可自行计算RC 充电时间或在工作环境实际测量,以确保单片机的复位电路可靠。
图4.2 复位电路
完整的STC89C51单片机最小系统电路图如图4.3所示。
图4.3 STC89C52单片机最小系统
4.2 步进电机原理构造
步进电机是一种将电脉冲转化为角位移的执行机构。通俗的说:也就是当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。可以通过控制脉冲的个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲的频率来控制电机转动的速度和加速度,从而做到调速的目的。
步进电机28BYJ48型四相八拍电机,工作电压为:DC5V-DC12V。当对步进电机施加一系列连续不断地控制脉冲时,它可以连续不断转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单四拍(单相绕组通电):A-B-C-D-A….,双四拍(双相绕组通电):AB-BC-CD-DA-AB…;八拍:A-AB-B-BC-C-CD-D-DA-A…。
其中四相八拍的驱动方式如下表4-3所示。
4.3 ULN2003硬件设计4.3.1 ULN2003的概述与特点
高耐压、大电流复合晶体管IC—ULN2003,ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。ULN2003是大电流驱动阵列,多用于单片机、智能仪表、PLC、数字量输出卡等控制电路中。可直接驱动继电器等负载。
ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。
4.3.2 ULN2003与单片机的连接
本设计中采用ULN2003驱动步进电机,设计中将单片机的P1.0~P1.3引脚分别接到ULN2003的R1~R4上,输出端Q1~Q4接到28BYJ-48步进电机的蓝、粉、黄、橙四根线上也就是ABCD四相上。如图4.14所示。
图4.14 ULN2003与单片机和步进电机的连接

第五章 系统软件部分设计5.1 软件开发环境的介绍
本设计采用 Keil μVision4进行编程实现。Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
5.2 系统重要函数的介绍5.2.1 主函数的设计
主函数void main()是程序的入口函数,一个完整的程序必须要包含该函数。在该函数的开头一般都是先对单片机和一些外围器件需要进行初始化才能正常使用的器件进行初始化和重新赋值一些变量,初始化完后进去死循环,如果不进入死循环程序运行一次就会退出,如果加入死循环程序就会不断地进行循环达到实时检测执行的目的。在主程序的设计中需要注意的是主函数中不宜放过多的代码,具体的代码一般都是采用函数进行封装然后在主函数进行调用,这样也可以方便阅读修改。具体流程图如下5.1所示。
图5.1 主函数流程图
5.2.2 步进电机控制函数的设计
步进电机的控制在上一章节已经介绍过了采用四相八拍的方式,单片机I/O口每次发送一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度,在两个脉冲信号之间添加一个延时可以调节步进电机转动的快慢。步进电机正转流程图如图5.5所示,反转如图5.6所示。
       5.3 系统软件测试
测试所需的工具:Keil软件、Proteus仿真等。
系统的软件方面通过Keil软件进行编写,将编写好的程序生成.HEX文件后通过Proteus下载到单片机中。通过观察整个系统运行的状态,然后进行反复的修改调试程序,最终得到一个完善的程序。
在系统软件调试上主要遇到以下几个问题:
(1)步进电机不会转动。
解决方法:通过查阅资料四相八拍的控制方式和程序上的一致可是就是不会转动但是步进电机会发送响声,像是里面东西卡主转动不起来的样子。通过尝试调大延时后发现电机可以转动了,后又再次调大电机又不转动了,后面发现步进电机的控制脉冲的频率不能过快或过慢,过快过慢都会导致步进电机不工作。
(2)控制按钮功能实现。
解决办法:检查引脚输入是否正确,检查程序逻辑是否行得通。最后通过师兄帮助,成功解决问题。

第六章 设计总结与展望
经过制作设计的这段时间的努力终于将本设计方案要求基本实现。由于时间、水平和经验有限,设计的作品还存在着一些的不足之处。
对于这次设计来说既是一次机遇,又是一次挑战。在这次的设计过程中,我们学到了很多东西,通过自己的实践,增强了动手能力。通过实际工程的设计也使我们了解到书本知识和实际应用的差别。在实际应用中遇到很多的问题,这都需要我对问题进行具体的分析,并一步一步地去解决它。当然本设计也存在许多问题和不足,着也反映了自己能力不足,更加鞭策自己在以后的学习和生活中需要更加努力,需要多动手,多实践,将理论和实践相结合,已达到事半功倍的效果.

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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