[其他ST产品] stm32毕设 GSM的火灾与防盗报警系统

[复制链接]
2102|19
 楼主| 初级工程渣 发表于 2023-6-29 12:57 | 显示全部楼层 |阅读模式
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

2848649d0f2f676bd.png
 楼主| 初级工程渣 发表于 2023-6-29 12:59 | 显示全部楼层
主要功能
主要功能:一款基于单片机的智能防火防盗报警系统,主要可以实现火灾预警、防盗报警功能,当烟雾、温度传感器被触发时,会自动触发防火报警。当人体检测传感器被触发时,会自动触发防盗报警,触发警报后,GSM模块会自动给手机发送短信。

1.使用STC89C52RC单片机做主控制器。

2.使用LCD1602显示温度、烟雾、人体触发情况。

3.使用MQ-2检测烟雾值。

4.使用DS18B20检测温度值。

5.使用HC-SR501检测人体触发情况。

6.使用SIM900A模块给手机发送短信。

7.采集值超过预设阀值后,蜂鸣器报警提示。

8.四个按键进行布防功能和阀值设置。

该设计以单片机STC89C52为核心,作为控制器件。包括硬件和软件设计两个部分。
 楼主| 初级工程渣 发表于 2023-6-29 12:59 | 显示全部楼层
硬件部分:
采用SIM800c作为我们的GSM通信模块,LCD1602作为显示,喇叭作为报警装置。并辅之一些外围器件,用C语言控制单片机来完成防火防盗系统的设计。整个报警系统由电源、单片机控制部分、信号检测部分、通信部分以及报警装置等五部分组成
 楼主| 初级工程渣 发表于 2023-6-29 13:00 | 显示全部楼层
软件部分:
单片机作为主控芯片完成信息采集、处理、通信、显示、报警等功能。
系统设计框图如下: 26493649d0fe7d471e.png
 楼主| 初级工程渣 发表于 2023-6-29 13:01 | 显示全部楼层
硬件设计(原理图)
68131649d10194f14d.png
 楼主| 初级工程渣 发表于 2023-6-29 13:01 | 显示全部楼层
 楼主| 初级工程渣 发表于 2023-6-29 13:02 | 显示全部楼层
核心软件设计 23954649d1046b5e38.png
 楼主| 初级工程渣 发表于 2023-6-29 13:02 | 显示全部楼层
关键代码
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include "sim800.h"       
  4. #define uchar unsigned char
  5. #define uint  unsigned int
  6. #define K_MG_MV    120/66
  7. typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
  8. typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */

  9. /********测试GSM是否启动**********/
  10. int test_boot;
  11. /********测试GSM是否注册网络**********/
  12. int test_net_register;
  13. /********GSM串口接收数据缓存**********/
  14. unsigned char idata GSM_receive[60];
  15. /********GSM串口接收计数器**********/
  16. unsigned char  GSMDATA_count;
  17. unsigned char *content_temp =  "Warning: over temperature\r\n";
  18. unsigned char *content_smoke = "Warning: excessive smoke concentration\r\n";
  19. unsigned char *content_body =  "Warning: body entry\r\n";

  20. unsigned char str_yw[12];//烟雾值
  21. unsigned char T_baojing = 30;  //温度报警值
  22. unsigned int  C_baojing = 500; //烟雾浓度报警值

  23. unsigned char T_buff[3];  //报警缓存
  24. unsigned char H_buff[3];
  25. unsigned char C_buff[4];

  26. bit  sf_flag=0; //设防标志
  27. unsigned char moshi=0;
  28. unsigned char data1;
  29. long Value;

  30. sbit bADcs=P3^4;
  31. sbit bADcl=P3^6;
  32. sbit bADda=P3^5;

  33. sbit  sf_led = P1^3;//   设防指示灯
  34. sbit  shefang= P1^4;//   设防按键
  35. sbit  shezhi = P1^5; //  设置
  36. sbit  jia    = P1^6; //         加
  37. sbit  jian   = P1^7; //  减       
  38. sbit  BUZZER = P2^0; //  LED蜂鸣器
  39. sbit  Infra         = P3^2; //  人体红外模块


  40. unsigned char IntToString(unsigned char *str, int dat);
  41. extern bit Start18B20();
  42. extern bit Get18B20Temp(int *temp);                                //          ;;;;;、‘      
  43. extern void InitLcd1602();
  44. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  45. float intT, decT;  //温度值的整数和小数部分


  46. long kssj()   //开始收集
  47. {
  48.    unsigned char i;

  49.      bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.
  50.          bADcl=0;
  51.          bADda=1;
  52.          bADcl=1;
  53.          bADcl=0;//i down
  54.          bADda=1;
  55.          bADcl=1;
  56.          bADcl=0;        //   2 down
  57.          bADda=0;
  58.          bADcl=1;
  59.          bADcl=0;        //   3 down
  60.          bADda=1;
  61.          bADcl=1;
  62.          bADcl=0;        //   4 down

  63.          for(i=8;i>0;i--)
  64.                  {
  65.                
  66.                  data1<<=1;
  67.                  bADcl=0;
  68.                 bADcl=1;
  69.                 if(bADda==1) data1|=0x01;
  70.                            bADda=1;
  71.                  }
  72.                  bADcs=1;
  73.                 
  74.        Value=data1*1.0/256*500;
  75.           
  76.            Value=Value*K_MG_MV;
  77.            Value=Value-5;
  78.            if(Value<0)Value=0;
  79.            return Value;
  80. }


  81. void Key_set_scan()
  82. {
  83.          
  84.         if(shezhi==0)
  85.         {
  86.            Delay_Ms(10);
  87.                 if(shezhi==0)
  88.                 {  
  89.                    while(!shezhi);
  90.                    InitLcd1602();     //初始化液晶
  91.                    moshi++;
  92.                    if(moshi >= 3)moshi = 0;
  93.                    if(moshi == 0)
  94.                    {
  95.                      LcdShowStr(0, 0,"T:   C");
  96.              LcdShowStr(7, 0,"C:    PPM");
  97.                    }
  98.                    else if(moshi == 1)
  99.                    {
  100.                       LcdShowStr(0, 1,"Set_T:   C");
  101.                    }
  102.                    else if(moshi == 2)
  103.                    {
  104.                               LcdShowStr(0, 1,"Set_C:    PPM");
  105.                    }                          
  106.                 }
  107.         }
  108.        
  109.         if(jia==0)
  110.         {
  111.            Delay_Ms(10);
  112.                 if(jia==0)
  113.                 {        
  114.                         if(moshi==1)
  115.                         {
  116.                          T_baojing++ ;
  117.                          if( T_baojing>=99 )T_baojing =99;
  118.                         }
  119.                         if(moshi==2)
  120.                         {
  121.                          C_baojing++ ;
  122.                          if( C_baojing>=999 )C_baojing =999;
  123.                         }               
  124.                  }
  125.          }
  126.          if(jian == 0)
  127.          {
  128.             Delay_Ms(10);
  129.            if(jian == 0)
  130.            {
  131.                 if(moshi==1)
  132.                         {
  133.                          T_baojing-- ;
  134.                          if( T_baojing<=0 )T_baojing =0;
  135.                         }
  136.                         if(moshi==2)
  137.                         {
  138.                          C_baojing-- ;
  139.                          if( C_baojing<=0 )C_baojing =0;
  140.                         }
  141.            }
  142.          }
  143.          if(shefang == 0)
  144.          {
  145.            Delay_Ms(10);
  146.            if(shefang == 0)
  147.            {
  148.              while(!shefang);
  149.                  sf_flag =~ sf_flag;
  150.                  if(sf_flag == 1) sf_led = 0;
  151.                  else sf_led = 1;

  152.            }
  153.          }
  154.                  
  155. }
  156. void wendu()
  157. {
  158.   bit res;
  159.   int temp;  //读取到的当前温度值
  160.   
  161.   unsigned char len;
  162.   unsigned char str_wd[5];   //温度缓冲区
  163.             Get18B20Temp(&temp);  //读取当前温度
  164.             res = Get18B20Temp(&temp);  //读取当前温度
  165.             if (res)                    //读取成功时,刷新当前温度显示
  166.             {               
  167.                             intT = temp >> 4;          //分离出温度值整数部分
  168.                 decT = temp & 0xF;         //分离出温度值小数部分
  169.                 len = IntToString(str_wd, intT); //整数部分转换为字符串
  170.                 str_wd[len++] = '.';             //添加小数点
  171.                 decT = (decT*10) / 16;        //二进制的小数部分转换为1位十进制位
  172.                 str_wd[len++] = decT + '0';   //十进制小数位再转换为ASCII字符
  173.                 str_wd[len] = '\0';              //添加字符串结束符
  174.                 LcdShowStr(2, 0, str_wd);        //显示到液晶屏上
  175.                          }
  176.                     Start18B20();
  177. }
  178. /************主函数****************/
  179. void main()
  180. {
  181.   unsigned char i;
  182.   sf_flag = 0;
  183.   Uart_Init();
  184.   InitLcd1602();     //初始化液晶
  185.   Start18B20();
  186.   LcdShowStr(0, 0,"T:   C");
  187.   LcdShowStr(7, 0,"C:    PPM");
  188.   for(i = 0;i < 20;i++)//等待网络稳定
  189.         {
  190.                 Delay_Ms(1000);
  191.         }
  192.                 //测试是否已经开机,同时自适应波特率
  193.         while(test_boot==No)
  194.         {
  195.                 Send_String("AT\r\n");       
  196.                 Delay_Ms(100);
  197.         }
  198.                 test_boot=No;

  199.         //测试是否注册到网络
  200.         while(test_net_register==No)
  201.         {
  202.                 Send_String("AT+CREG?\r\n");         
  203.                 Delay_Ms(100);       
  204.         }
  205.         test_net_register=No;
  206.         Receive_message();      //配置成接受短信模式


  207.   while(1)
  208. {
  209.   Key_set_scan();//按键扫描
  210. if(moshi == 0)          //设置模式切换
  211. {
  212.    kssj();   //开始收集 ,电压采集检测烟雾浓度
  213.    Value =  Value-100;//烟雾浓度校准
  214.    IntToString(str_yw,Value); //转换成字符串
  215.    LcdShowStr(9, 0, str_yw); //烟雾浓度显示到液晶屏上
  216.    wendu();         //温度检测并显示
  217.    if(sf_flag == 1)
  218.    {
  219.       if(Value>=C_baojing||intT>T_baojing||Infra==1)
  220.      {
  221.               BUZZER = 0;                                                                                                     
  222.        if(intT > T_baojing)
  223.        {                           /*1234567890123456*/
  224.         LcdShowStr(0,1,"temp");
  225.             //   Send_message(content_temp);          //发温度超标短信
  226.        }  else  LcdShowStr(0, 1,"    ");       
  227.        if(Value >= C_baojing)     
  228.        {                                 /*1234567890123456*/
  229.          LcdShowStr(5,1,"smoke");  
  230.              //   Send_message(content_smoke);          //发烟雾浓度超标短信
  231.        }  else  LcdShowStr(5, 1,"     ");
  232.        if(Infra == 1)        
  233.        {                             /*1234567890123456*/
  234.          LcdShowStr(11, 1,"body");  
  235.              //   Send_message(content_body);          //发人体进入短信
  236.        }  else  LcdShowStr(11,1,"    ");

  237.      }
  238.    else
  239.      {
  240.            BUZZER = 1;          /*1234567890123456*/
  241.            LcdShowStr(0, 1," System normal  ");
  242.      }
  243.          }
  244. }
  245.    else if(moshi == 1)        //设置温度上限模式
  246.    {       
  247.    T_buff[0] = T_baojing/10+0x30;
  248.    T_buff[1] = T_baojing%10+0x30;
  249.    T_buff[2] = '\0';
  250.    LcdShowStr(6, 1,T_buff);
  251.    }
  252.    else if(moshi == 2)         //设置烟雾浓度上限模式
  253.    {
  254.    C_buff[0] = C_baojing/100+0x30;
  255.    C_buff[1] = C_baojing%100/10+0x30;
  256.    C_buff[2] = C_baojing%10+0x30;
  257.    C_buff[4] = '\0';
  258.    LcdShowStr(6, 1,C_buff);
  259.    }
  260.                                                                                                           
  261. }
  262. }
  263. /* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
  264. unsigned char IntToString(unsigned char *str, int dat)
  265. {
  266.     signed char i = 0;
  267.     unsigned char len = 0;
  268.     unsigned char buf[6];
  269.    
  270.     if (dat < 0)  //如果为负数,首先
  271.        
  272.     {
  273.         dat = -dat;
  274.         *str++ = '-';
  275.         len++;
  276.     }
  277.     do {          //先转换为低位在前的十进制数组
  278.         buf[i++] = dat % 10;
  279.         dat /= 10;
  280.     } while (dat > 0);
  281.     len += i;     //i最后的值就是有效字符的个数
  282.     while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上
  283.     {
  284.         *str++ = buf[i] + '0';
  285.     }

  286.     *str = '\0';  //添加字符串结束符
  287.    
  288.     return len;   //返回字符串长度
  289. }
  290. /*****************************************************************************
  291. 串口中断
  292. /****************************************************************************/
  293. void uart(void) interrupt 4
  294. {
  295. unsigned char UART_data;
  296.         if(RI)
  297.         {
  298.                 UART_data=SBUF;
  299.                 if(UART_data=='\n')
  300.                 {
  301.                         if(GSM_receive[0]=='O'&&GSM_receive[1]=='K')
  302.                         {
  303.                                  test_boot=Yes;
  304.                         }
  305.                     //else
  306.                         //        test_boot=No;
  307.                     if(GSM_receive[0]=='+'&&GSM_receive[1]=='C'&&GSM_receive[2]=='R'&&GSM_receive[3]=='E'&&GSM_receive[4]=='G')
  308.                     {
  309.                             if(GSM_receive[7]=='1'||GSM_receive[9]=='1'||GSM_receive[9]=='5')
  310.                            {
  311.                                  test_net_register=Yes;
  312.                            }
  313.                     }                  
  314.                     //        else
  315.                     //  test_net_register=No;

  316.                         if((GSM_receive[0]=='O')&&(GSM_receive[1]=='P')&&(GSM_receive[2]=='E')&&(GSM_receive[3]=='N'))          //大写OPEN
  317.                       {       
  318.                         //  CZ = 0;LcdShowStr(5, 1,"Open ");
  319.                           }
  320.                         if((GSM_receive[0]=='C')&&(GSM_receive[1]=='L')&&(GSM_receive[2]=='O')&&(GSM_receive[3]=='S')&&(GSM_receive[4]=='E'))
  321.                       {       
  322.                         //  CZ = 1;LcdShowStr(5, 1,"Close");
  323.                           }                                               
  324.                           GSMDATA_count=0;
  325.                   }
  326.                 else
  327.                 {
  328.                         GSM_receive[GSMDATA_count]=UART_data;
  329.                         GSMDATA_count++;
  330.                 }
  331.         }
  332.         RI=0;
  333. }
 楼主| 初级工程渣 发表于 2023-6-29 13:03 | 显示全部楼层
实现效果 29549649d1093f13fc.png 93047649d109890bea.png 7120649d109e38997.png
Undshing 发表于 2023-7-1 23:32 | 显示全部楼层
右下角什么模块啊?
公羊子丹 发表于 2023-12-30 07:17 | 显示全部楼层

应在操作时间内将胶料灌注完毕,否则影响流平
万图 发表于 2023-12-30 08:20 | 显示全部楼层

测试负载测试是在特定的测试条件下进行的
Uriah 发表于 2023-12-30 09:23 | 显示全部楼层

在测试中,可以改变负载电流,得到最大输出电流和输出电压
帛灿灿 发表于 2023-12-30 11:19 | 显示全部楼层

信号防雷电路应满足相应接口信号传输速率及带宽的需求,且接口与被保护设备兼容。
Bblythe 发表于 2023-12-30 12:22 | 显示全部楼层

随着对电路板模块的需求增加
周半梅 发表于 2023-12-30 14:18 | 显示全部楼层

防雷电路的输出残压值必须比被防护电路自身能够耐受的过电压峰值低,并有一定裕量
Pulitzer 发表于 2023-12-30 15:21 | 显示全部楼层

模信号是幅度相等且相位相同的信号
童雨竹 发表于 2023-12-30 17:17 | 显示全部楼层

Cfinal是CESD和人体电容的并联组合
Wordsworth 发表于 2023-12-30 18:20 | 显示全部楼层

构成各种滤波器对EMI进行滤波
Clyde011 发表于 2023-12-30 19:23 | 显示全部楼层

在动态测试之前,首先需要设定测试时间和测试频率
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

821

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部