51单片机的智能窗帘设计

硬件方案

        自动窗帘系统硬件电路主要由感光检测电路,时钟电路,电机控制电路、按键电路等外围电路构成。该设计则主要讨论了自动窗帘系统的设计过程,硬件电路设计,软件调试过程。通过本系统可以实现通过光照强度实现窗帘开关自动控制、定时控制和手动控制等不同的控制方式。
   硬件主要采用51单片机+LCD1602液晶显示+DS18B20+光敏电阻+DS1302+步进电机+ULN2003设计而成;原理图如图:

PCB及仿真图:

 

设计功能

  • 液晶实时显示目前的状态,包括温度、模式、光线强度、时间等信息。
  • 智能窗帘可以根据外界光线的强弱来进行自动开关窗户,光线强弱的上下限可以按键调节。
  • 具有手动控制功能,可以手动开/关窗户。
  • 可以通过按键设定窗帘开启的时间和自行关闭的时间。可以通过按键设定温度值,低于或者高于设定值进行开/关窗户。

软件设计

主程序源码

/*********************************************************/
// 主函数
/*********************************************************/
void main()
{
    uchar light;
    
    LcdInit();            // 执行液晶初始化    
    DS1302_Init();    // 时钟芯片的初始化
    LcdShowInit();    // 液晶显示内容的初始化
    
    if(DS1302_Read_Byte(0x81)>=128)            // 判断时钟芯片是否正在运行
    {
        DS1302_Write_Time();                            // 如果没有,则初始化一个时间
    }
    
    while(1)
    {
        DS1302_Read_Time();                // 获取当前时钟芯片的时间,存在数组time_buf中
        FlashTime();                            // 刷新时间显示

        light=Get_ADC0832();            // 读取光照强度
        light=light/2.5;                    // 缩小光照检测结果(在0-99)
        if(light>99)                            // 如果大于99
            light=99;                                // 则依然保持99
        LcdGotoXY(1,14);                    // 光标定位
        LcdPrintNum(light);                // 显示光照强度
        
        KeyScanf1();                            // 按键扫描(时间的设置)
        KeyScanf2();                            // 按键扫描(阈值的设置)
        KeyScanf3();                            // 按键扫描(模式切换)
    
        /*手动控制模式*/
        if(gMode==1)
        {
            if(KeyDown_P==0)        // 如果关窗帘键按下了    
            {
                if(Led_P==0)            // 如果窗帘当前是打开的
                {
                    Close();                // 则光标窗帘
                }
            }
            if(KeyUp_P==0)            // 如果开窗帘键按下了
            {
                if(Led_P==1)            // 如果窗帘当前是关闭的
                {
                    Open();                    // 则打开窗帘
                }
            }    
        }
        
        /*时间控制模式*/
        if(gMode==2)
        {
            if((TimeBuff[4]==CloseHour)&&(TimeBuff[5]==CloseMinute)&&(TimeBuff[6]==0))    // 如果到了关窗帘的时间    
            {
                if(Led_P==0)            // 如果窗帘当前是打开的
                {
                    Close();                // 则光标窗帘
                }
            }
            if((TimeBuff[4]==OpenHour)&&(TimeBuff[5]==OpenMinute)&&(TimeBuff[6]==0))        // 如果到了开窗帘的时间    
            {
                if(Led_P==1)            // 如果窗帘当前是关闭的
                {
                    Open();                    // 则打开窗帘
                }
            }    
        }
        
        /*光线控制模式*/
        if(gMode==3)
        {
            if(light<gLight)        // 当前光线小于设置的阈值
            {
                if(Led_P==0)            // 如果窗帘当前是打开的
                {
                    Close();                // 则光标窗帘
                }
            }
            else                                // 当前光线大于或等于设置的阈值
            {
                if(Led_P==1)            // 如果窗帘当前是关闭的
                {
                    Open();                    // 则打开窗帘
                }
            }    
        }
        
        DelayMs(100);                            // 延时0.1秒
    }
}

资料链接:https://pan.baidu.com/s/12wmK7sfYimJJYPWvzGJPeg?pwd=dmza 
提取码:dmza
 

猜你喜欢

转载自blog.csdn.net/m0_60790717/article/details/127949746