基于STC89C52单片机的自动窗帘控制系统设计

2023-05-24  

1.简介

自动窗帘控制系统核心采用的是单片机STC89C52,其次利用了光照传感器、按键、显示屏以及信号调理电路等外围电路,使整个系统在各模块的配合下可实现半自动控制、自动控制、定时控制等功能。 其主要功能有6个,分别为:


1.手动控制:该功能是根据用户的需求通过按键进行窗帘的开关,此功能可以使窗帘的开闭处于任何一种状态;
2.光照自动控制:系统可以根据用户设定的光照强度值通过感光器采集光照自动开关窗帘; 3.时间控制:此功能是根据用户设定的时间一次性开关窗帘,并显示当前温度。
4.温度报警系统:可以自行设置温度报警温度。
5.时间显示及闹钟系统:可以自行设置闹钟时间。
6.手动自动控制按键随时切换


2.硬件设计

自动窗帘控制系统的构成主要由STC89C52单片机最小系统、蜂鸣器报警电路、电源模块、按键电路、LCD1602液晶显示电路、步进电机驱动电路、DS1302时钟电路、光照检测模块和温度检测电路组成。 其系统框图如图:

在这里插入图片描述

(1)光照检测电路

窗帘自动控制系统的光控功能是可以根据光照的强弱来自动控制窗帘的开闭的,因此需要用到光照传感元器件,在本设计中采用了光敏电阻,并和一个常规电阻串联在一起,根据光线的变化改变光敏电阻的分压值,然后通过ADC0832数模转换芯片传输给单片机,经过单片机处理后在液晶上显示。 电路图如图:

在这里插入图片描述

(2)灯光驱动电路

灯光电路使用了3个LED灯作为光源,采用了三极管作为LED灯开关的控制芯片,同时也对驱动电流进行放大,以达到LED灯工作电流的要求。 原理图如图:

在这里插入图片描述

(3)步进电机驱动电路

本系统的设计目的为了高效控制步进电机的转动,因此需要将单片机发出的脉冲转化为步进角度,才能控制步进电机转动,我们在这里采用ULN2003作为步进电机的驱动芯片,其作用为增强单片机的驱动能力。 其工作原理为:根据单片机引脚的输出状态,使ULN2003与单片机连接的四个管脚中每时刻只有一个管脚处于导通状态(采用单拍方式对步进电机控制),其他管脚处于断开状态。 这样就使得与ULN2003连接的步进电机只有一个引出端导通。 驱动原理图如图:

在这里插入图片描述

(4)按键电路

按键在单片机应用系统中能实现向单片机输入数据,传送命令等功能,是人工干预单片机的主要手段。 本设计中的按键采用独立按键式,共有五个。 其中S2是自动和手动切换键,S3是设置退出键,S4是手动反转和设置参数减键,S5是手动正转和设置参数加键,S6是参数设置键。 电路图如图:

在这里插入图片描述

(5)DS1302时钟电路

本设计采用DS1302时钟芯片为系统提供时钟源,它通过串行方式与单片机进行数据传送,能够向单片机提供包括秒、分、时、日、月、年等在内的实时时间信息,并可对月末日期、闰年天数自动进行调整; 电路如图:

在这里插入图片描述

电路图中,Vcc1为后备电源,Vcc2为主电源。 VCC1在单电源与电池供电的系统中提供低电源并提供低功率的电池备份。 VCC2在双电源系统中提供主电源,在这种运用方式中VCC1连接到备份电源,以便在没有主电源的情况下能保存时间信息以及数据。

(6)总体电路图

截图20230301181746.png

3.软件设计

系统软件设计主要有几部分组成,主要分为主程序和各个模块子程序。

(1)主程序设计

主程序构成无限循环,主要完成单片机初始化,关中断,菜单显示内容初始化,按键扫描,电机运行,计时等功能。 流程图如图:

在这里插入图片描述

代码:

void main()

{  

  init_eepom();     //初始化EEPROM

  init_1602();     //lcd1602初始化

  init_1602_dis_csf(); //lcd1602初始化显示

  init_ds1302_io();   //初始化ds1302Io

  init_time0();     //初始化定时器

  menu_1_break();       //菜单初始界面

  init_ds1302();     //ds1302初始化

  temperature1 = read1_temp();  //读温度1

  delay_1ms(650);

  while(1)

  {

    key();       //按键程序

    if(key_can < 10)

    {

      key_with();  

    }

    shoudong_kaiguan();    //手动开关窗帘

    if(flag_200ms == 1)

    {    

      flag_200ms = 0;

      temperature1 = read1_temp();  //读温度1  环境温度

      if(temperature1 >= 99)

        temperature1 = 99;

      zinengchuanglian_dis();    //智能窗帘处理函数

      guanxian = ad0832read(1,0) * 9.0 / 255;

      if((menu_1 == 0))

      {

        read_time();      //读时间

        init_1602_ds1302();   //显示时钟

        write_sfm_18b20(2,13,temperature1);  //显示温度

        write_sfm1(2,0,guanxian);  //显示温度

            if(guanxian <= guanxian_set)

       LED=0;

      else

       LED=1;

        if(temperature1 >= t_high)

          beep =  ~beep;   //温度报警 ,蜂鸣器报警

        else 

          beep = 1;        

      }

    }

    bujindj();   //步进电机函数

  }

}


(2)步进电机驱动程序设计

步进电机程序设计主要实现的功能为判断旋转方向; 按顺序传送控制脉冲; 判断所要求的控制步数是否传送完毕。 程序流程图如图:

在这里插入图片描述

代码:

void bujindj()   //步进电机函数

{

  static uchar i;

  if(flag_z_f != 0)  

  {  

    if(flag_z_f == 1)     //开

    {

      if(bjdj_value >= 254)

      {

        flag_z_f = 0;

        bjdj_value = 254;

        P2 = P2 & 0xf0;  //让4个IO口都不输出

        write_eepom();  //保存

      }else 

        bjdj_value ++;  

    }

    if(flag_z_f == 2)     //关

    {        

      if(bjdj_value <= 1)

      {

        flag_z_f = 0;

        bjdj_value = 1;

        P2 = P2 & 0xf0;  //让4个IO口都不输出

        write_eepom();  //保存

      }else  

        bjdj_value --;

    }

    for(i=0;i<4;i++)          //4相

    {

      if(flag_z_f == 1)    //开

        P2=zheng[i];// & (P2 | 0xf0);         //

      else if(flag_z_f == 2)//关

        P2=fan[i];// & (P2 | 0xf0);          //

      delay_uint(500);        //改变这个参数可以调整电机转速

    }

  }

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。