【单片机毕业设计】【mcuclub-dz-081】基于单片机的家居环境监测设计

最近设计了一个项目基于单片机的家居环境监测设计,与大家分享一下:

一、基本介绍

项目名:基于单片机的家居环境监测(实物+仿真)的设计
项目编号:mcuclub-dz-081
单片机:STC89C52
功能简介:
1、通过震动传感器检测门是否被撬动,如果撬动,进行声光报警
2、通过分离式红外对射管检测是否有人翻越围墙,当检测到有人翻越围墙,进行声光报警
3、通过MQ-5检测可燃气体值,当可燃气体值大于设置最大值,进行声光报警
4、通过MQ-2检测烟雾值,当烟雾值大于设置最大值,进行声光报警
5、通过按键设置各阈值
6、通过LCD1602显示测量值

二、51实物图

单片机型号:STC89C52

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

三、51仿真图

仿真软件版本:proteus8.9

电路连线方式:网络标号连线方式

注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样

 四、原理图

软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图

 五、PCB图

由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。

两层板,上下覆铜接地。

六、系统框图

本设计以单片机为核心控制器,加上其他模块一起组成此次设计智能家居环境监测的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由六部分组成,第一部分是烟雾检测模块,通过该模块检测当前环境的烟雾,通过模数转换芯片传入单片机中;第二部分是天然气检测模块,通过该模块检测当前环境的天然气浓度,通过模数转换芯片传入单片机中;第三部分是震动模块,通过该模块可以监测当前的门是否被撬动,如果发送撬动进行声光报警;第四部分是红外对射管模块,通过该模块监测是否有人翻墙;第五部分是按键模块,通过按键设置监测参数的阈值;第六部分是供电模块,通过该模块可给整个系统进行供电。输出由两个部分组成,第一部分是显示模块,通过该模块可以显示监测的数据以及设置的阈值;第二部分是声光报警模块,当监测值不在设置的阈值内或者监测到有人敲门或者翻墙时进行声光报警。具体系统框图如图3.1所示。

 七、软件设计流程

八、部分程序展示

软件版本:keil5

逻辑程序和驱动程序分开,分布于main.c和其他.c文件

*******监测函数
*****/
void Monitor_function(void)
{
    if(time_num % 10 == 0)                                //100ms检测一次
    {
        if(DO1 == 0)
            smog_value = 50*((Adc0832_Get_Value(0)/255.0)*5);                                    //获取烟雾浓度
        else
            smog_value = 0;
        if(DO2 == 0)
            fgas_value = 50*((Adc0832_Get_Value(1)/255.0)*5);                                    //获取燃气浓度
        else
            fgas_value = 0;
    }
}

/****
*******显示函数
*****/
void Display_function(void)
{
    switch(flag_display)                                    //根据不同的显示模式标志位,显示不同的界面
    {
        case 0:                                                            //界面0:显示
            lcd1602_display_str(1,0,"Smog:");    //显示烟雾值
            lcd1602_display_gas(1,5,smog_value);    
        
            lcd1602_display_str(2,0,"Fgas:");    //显示燃气值
            lcd1602_display_gas(2,5,fgas_value);            
            
        break;

        case 1:                                                            //界面1:显示设置烟雾最大值
            lcd1602_display_str(1,2,"Set Smog Max");
            if(time_num % 20 == 0)
            {
                lcd1602_display_num(2,7,smog_max);
            }
            if(time_num % 40 == 0)
            {
                lcd1602_display_str(2,7,"    ");
            }
        break;

        case 2:                                                            //界面2:显示设置燃气最大值
            lcd1602_display_str(1,2,"Set Fgas Max");
            if(time_num % 20 == 0)
            {
                lcd1602_display_num(2,7,fgas_max);
            }
            if(time_num % 40 == 0)
            {
                lcd1602_display_str(2,7,"    ");
            }
        break;
            
        default:
        break;
    }
}

/****
*******处理函数
*****/
void Manage_function(void)
{
    if(flag_display == 0)                                    //测量界面
    {
        if(smog_value > smog_max || fgas_value > fgas_max)        //烟雾值或燃气值大于设置的最大值
        {
            if(time_num % 20 == 0)
            {
                LED = ~LED;
                BEEP = ~BEEP;
            }
        }
        else if(ZD == 1 || FQ == 1)                    //或有人翻墙、撬锁
        {            
            LED = 0;
            BEEP = 0;
            Delay_function(200);
            LED = 1;
            BEEP = 1;    
            Delay_function(200);
        }    
        else
        {
            LED = 1;
            BEEP = 1;                        
        }            
    }
    else                                                                        //设置界面
    {
        LED = 1;
        BEEP = 1;    
    }
}