stm32毕设分享 GSM的火灾与防盗报警系统(源码+硬件+论文)

news/2024/10/18 5:47:05/

文章目录

  • 0 前言
  • 1 主要功能
  • 2 硬件设计(原理图)
  • 3 核心软件设计
  • 4 实现效果
  • 5 最后


0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

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

🚩 毕业设计 单片机与GSM的火灾与防盗报警系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 项目分享:

https://gitee.com/sinonfin/sharing

在这里插入图片描述

1 主要功能

主要功能:一款基于单片机的智能防火防盗报警系统,主要可以实现火灾预警、防盗报警功能,当烟雾、温度传感器被触发时,会自动触发防火报警。当人体检测传感器被触发时,会自动触发防盗报警,触发警报后,GSM模块会自动给手机发送短信。

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

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

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

  • 4.使用DS18B20检测温度值。

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

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

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

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

该设计以单片机STC89C52为核心,作为控制器件。包括硬件和软件设计两个部分。

1、硬件部分:
采用SIM800c作为我们的GSM通信模块,LCD1602作为显示,喇叭作为报警装置。并辅之一些外围器件,用C语言控制单片机来完成防火防盗系统的设计。整个报警系统由电源、单片机控制部分、信号检测部分、通信部分以及报警装置等五部分组成

2、软件部分:
单片机作为主控芯片完成信息采集、处理、通信、显示、报警等功能。
系统设计框图如下:

在这里插入图片描述

2 硬件设计(原理图)

在这里插入图片描述

在这里插入图片描述

3 核心软件设计

在这里插入图片描述

关键代码

#include<reg52.h>
#include<intrins.h>
#include "sim800.h"	
#define uchar unsigned char
#define uint  unsigned int
#define K_MG_MV    120/66 
typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable 	  无符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable 	  无符号16位整型变量 *//********测试GSM是否启动**********/
int test_boot;
/********测试GSM是否注册网络**********/
int test_net_register;
/********GSM串口接收数据缓存**********/
unsigned char idata GSM_receive[60];
/********GSM串口接收计数器**********/
unsigned char  GSMDATA_count;
unsigned char *content_temp =  "Warning: over temperature\r\n";
unsigned char *content_smoke = "Warning: excessive smoke concentration\r\n";
unsigned char *content_body =  "Warning: body entry\r\n";unsigned char str_yw[12];//烟雾值
unsigned char T_baojing = 30;  //温度报警值
unsigned int  C_baojing = 500; //烟雾浓度报警值unsigned char T_buff[3];  //报警缓存
unsigned char H_buff[3];
unsigned char C_buff[4];bit  sf_flag=0; //设防标志
unsigned char moshi=0;
unsigned char data1;
long Value;sbit bADcs=P3^4;
sbit bADcl=P3^6;
sbit bADda=P3^5;sbit  sf_led = P1^3;//   设防指示灯
sbit  shefang= P1^4;//   设防按键
sbit  shezhi = P1^5; //  设置
sbit  jia    = P1^6; //	 加
sbit  jian   = P1^7; //  减	
sbit  BUZZER = P2^0; //  LED蜂鸣器
sbit  Infra	 = P3^2; //  人体红外模块unsigned char IntToString(unsigned char *str, int dat);
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);				//	  ;;;;;、‘       
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
float intT, decT;  //温度值的整数和小数部分long kssj()   //开始收集{unsigned char i;bADcs = 0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用.bADcl=0;bADda=1;bADcl=1;bADcl=0;//i downbADda=1;bADcl=1;bADcl=0;	//   2 downbADda=0;bADcl=1;bADcl=0;	//   3 downbADda=1;bADcl=1;bADcl=0;	//   4 downfor(i=8;i>0;i--){data1<<=1;bADcl=0;bADcl=1;if(bADda==1) data1|=0x01;bADda=1;}bADcs=1;Value=data1*1.0/256*500;Value=Value*K_MG_MV;Value=Value-5;if(Value<0)Value=0;return Value;}void Key_set_scan()
{if(shezhi==0){Delay_Ms(10);if(shezhi==0){  while(!shezhi);InitLcd1602();     //初始化液晶moshi++;if(moshi >= 3)moshi = 0;if(moshi == 0){LcdShowStr(0, 0,"T:   C");LcdShowStr(7, 0,"C:    PPM");}else if(moshi == 1){LcdShowStr(0, 1,"Set_T:   C");}else if(moshi == 2){LcdShowStr(0, 1,"Set_C:    PPM");}		   	}}if(jia==0){Delay_Ms(10);if(jia==0){ 	if(moshi==1){T_baojing++ ;if( T_baojing>=99 )T_baojing =99;}if(moshi==2){C_baojing++ ;if( C_baojing>=999 )C_baojing =999;}		}}if(jian == 0){Delay_Ms(10);if(jian == 0){if(moshi==1){T_baojing-- ;if( T_baojing<=0 )T_baojing =0;}if(moshi==2){C_baojing-- ;if( C_baojing<=0 )C_baojing =0;}}}if(shefang == 0){Delay_Ms(10);if(shefang == 0){ while(!shefang);sf_flag =~ sf_flag;if(sf_flag == 1) sf_led = 0;else sf_led = 1;}}}
void wendu()
{ bit res;int temp;  //读取到的当前温度值unsigned char len;unsigned char str_wd[5];   //温度缓冲区Get18B20Temp(&temp);  //读取当前温度res = Get18B20Temp(&temp);  //读取当前温度if (res)                    //读取成功时,刷新当前温度显示{		intT = temp >> 4;          //分离出温度值整数部分decT = temp & 0xF;         //分离出温度值小数部分len = IntToString(str_wd, intT); //整数部分转换为字符串str_wd[len++] = '.';             //添加小数点decT = (decT*10) / 16;        //二进制的小数部分转换为1位十进制位str_wd[len++] = decT + '0';   //十进制小数位再转换为ASCII字符str_wd[len] = '\0';              //添加字符串结束符LcdShowStr(2, 0, str_wd);        //显示到液晶屏上}Start18B20();
}
/************主函数****************/
void main()
{ unsigned char i;sf_flag = 0;Uart_Init();InitLcd1602();     //初始化液晶Start18B20();LcdShowStr(0, 0,"T:   C");LcdShowStr(7, 0,"C:    PPM");for(i = 0;i < 20;i++)//等待网络稳定{Delay_Ms(1000);}//测试是否已经开机,同时自适应波特率while(test_boot==No){Send_String("AT\r\n");	Delay_Ms(100);}test_boot=No;//测试是否注册到网络while(test_net_register==No){Send_String("AT+CREG?\r\n");	 Delay_Ms(100);	}test_net_register=No;Receive_message();      //配置成接受短信模式while(1){Key_set_scan();//按键扫描if(moshi == 0)	  //设置模式切换{kssj();   //开始收集 ,电压采集检测烟雾浓度Value =  Value-100;//烟雾浓度校准IntToString(str_yw,Value); //转换成字符串LcdShowStr(9, 0, str_yw); //烟雾浓度显示到液晶屏上wendu();	 //温度检测并显示if(sf_flag == 1){if(Value>=C_baojing||intT>T_baojing||Infra==1){ BUZZER = 0;												     if(intT > T_baojing){ 			  /*1234567890123456*/LcdShowStr(0,1,"temp");//   Send_message(content_temp);	  //发温度超标短信}  else  LcdShowStr(0, 1,"    ");	if(Value >= C_baojing)     { 				/*1234567890123456*/LcdShowStr(5,1,"smoke");  //   Send_message(content_smoke);	  //发烟雾浓度超标短信}  else  LcdShowStr(5, 1,"     ");if(Infra == 1)        { 			    /*1234567890123456*/LcdShowStr(11, 1,"body");  //   Send_message(content_body);	  //发人体进入短信}  else  LcdShowStr(11,1,"    ");}else {BUZZER = 1;	  /*1234567890123456*/LcdShowStr(0, 1," System normal  ");}}}else if(moshi == 1)	//设置温度上限模式{	T_buff[0] = T_baojing/10+0x30;T_buff[1] = T_baojing%10+0x30;T_buff[2] = '\0';LcdShowStr(6, 1,T_buff);}else if(moshi == 2)	 //设置烟雾浓度上限模式{C_buff[0] = C_baojing/100+0x30;C_buff[1] = C_baojing%100/10+0x30;C_buff[2] = C_baojing%10+0x30;C_buff[4] = '\0';LcdShowStr(6, 1,C_buff);}}
}
/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */
unsigned char IntToString(unsigned char *str, int dat)
{signed char i = 0;unsigned char len = 0;unsigned char buf[6];if (dat < 0)  //如果为负数,首先{dat = -dat;*str++ = '-';len++;}do {          //先转换为低位在前的十进制数组buf[i++] = dat % 10;dat /= 10;} while (dat > 0);len += i;     //i最后的值就是有效字符的个数while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上{*str++ = buf[i] + '0';}*str = '\0';  //添加字符串结束符return len;   //返回字符串长度
}
/*****************************************************************************
串口中断
/****************************************************************************/
void uart(void) interrupt 4
{
unsigned char UART_data;if(RI){UART_data=SBUF;if(UART_data=='\n'){if(GSM_receive[0]=='O'&&GSM_receive[1]=='K'){test_boot=Yes;}//else//	test_boot=No;if(GSM_receive[0]=='+'&&GSM_receive[1]=='C'&&GSM_receive[2]=='R'&&GSM_receive[3]=='E'&&GSM_receive[4]=='G'){if(GSM_receive[7]=='1'||GSM_receive[9]=='1'||GSM_receive[9]=='5'){test_net_register=Yes;}}		   //	else//  test_net_register=No;if((GSM_receive[0]=='O')&&(GSM_receive[1]=='P')&&(GSM_receive[2]=='E')&&(GSM_receive[3]=='N'))	  //大写OPEN{	//  CZ = 0;LcdShowStr(5, 1,"Open ");}if((GSM_receive[0]=='C')&&(GSM_receive[1]=='L')&&(GSM_receive[2]=='O')&&(GSM_receive[3]=='S')&&(GSM_receive[4]=='E')){	//  CZ = 1;LcdShowStr(5, 1,"Close"); }						GSMDATA_count=0;}else{GSM_receive[GSMDATA_count]=UART_data;GSMDATA_count++;}}RI=0;
}

4 实现效果

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5 最后

包含内容

在这里插入图片描述

🧿 项目分享:

https://gitee.com/sinonfin/sharing


http://www.ppmy.cn/news/349487.html

相关文章

物联网毕设分享 RFID门禁防盗报警系统(源码+论文)

文章目录 1 简介2 绪论2.1 课题背景与目的 3 射频识别3.1 射频识别技术3.2 射频识别模块3.2.1 RFID模块3.2.2 RFID模块组成 4 系统设计4.1 系统架构4.1.1 硬件部分4.1.2 软件部分 4.2 软件总体流程图4.3 密码子程序4.4 数据采集子程序4.5 显示子程序4.6 存储子程序 5 实现效果6…

242.有效的字母异位词

思路&#xff1a; 使用数组&#xff0c;还是好理解的&#xff0c;record[s[i] - ‘a’]表示将字母与0-25做映射 class Solution { public:bool isAnagram(string s,string t) {int record[26] { 0 };for (int i 0; i < s.size(); i) {record[s[i] - a];}for (int j 0; j …

英语学习:O开头

obey 服从 object 物&#xff0c; observe 观察 obtain 获得 obvious 显然 occupation 职业&#xff0c;工作 occur 发生 ocean 海洋 of 表所属&#xff0c; off 离开&#xff0c;脱离 offer 提供&#xff0c;建议 office 办公室 officer 军官 official 官员 off…

《实战AI低代码》:一场新的软件工程革命

目录 五十年前的软件危机 二十年前的软件危机 今天的软件危机 革命性的新技术 AI低代码开发宣言 AI低代码开发原则 一场新的软件工程革命 AI低代码开发不仅是继面向过程,面向对象之后的一种新的抽象方式,也是继瀑布开发,敏捷开发之后的一种新的开发方法。 五十年前的…

初识Notes Domino 14 Drop1

大家好&#xff0c;才是真的好。 周末花了点时间&#xff0c;安装了一下Notes Domino 14 Drop1版本。考虑到大多数人的习惯&#xff0c;没采用Docker或K8s方式来部署&#xff0c;也没采用一键配置功能&#xff0c;依旧通过传统方式一步一步进行安装和配置&#xff0c;这样大家…

怎样放低电脑椅

如果是气杆的&#xff0c;一般右手边有个调节器&#xff0c;人坐上面用力往上扳&#xff0c;就可以了。 椅子调好的&#xff0c;脖子就不疼了

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型

参考&#xff1a; B站教学视频【&#xff1a;AI绘画】新手向&#xff01;Lora训练&#xff01;训练集准备、tag心得、批量编辑、正则化准备】官方教程&#xff1a;https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…

华硕电脑改光驱启动计算机,华硕笔记本win7系统如何设置光驱为第一启动项

当我们要重装系统的时候&#xff0c;就需要设置第一启动项&#xff0c;有些华硕笔记本用户想要用光驱来安装win7系统&#xff0c;那么就需要设置光驱为第一启动项&#xff0c;那么华硕笔记本win7系统如何设置光驱为第一启动项呢&#xff1f;接下来给大家讲解一下具体的操作步骤…