600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 基于51单片机的火灾烟雾浓度检测报警GSM短信通知proteus仿真原理图PCB

基于51单片机的火灾烟雾浓度检测报警GSM短信通知proteus仿真原理图PCB

时间:2018-11-09 10:02:19

相关推荐

基于51单片机的火灾烟雾浓度检测报警GSM短信通知proteus仿真原理图PCB

0.本系统采用STC89C52作为单片机

1.LCD1602液晶实时显示当前温度和烟雾浓度

2.超过温度阈值和烟雾浓度阈值,蜂鸣器报警

3.按键可更改温度阈值和烟雾浓度阈值

4.报警超过10s,向目标号码发送短信

原理图:

PCB:

主程序:

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <stdio.h>#include "18b20.h"#include "tlc0832.h"#include "lcd1602.h"#include "delay.h"#include "uart.h"#include "gsm_at.h"#include "eeprom52.h"#include "data_unit.h"sbit KEY_SET = P3^4; //引脚定义sbit KEY_SUB = P3^6;sbit KEY_ADD = P3^5;sbit KEY_ENTER = P3^7;sbit BUZZER = P2^0;#define BUZZER_ON (BUZZER = 0)#define BUZZER_OFF (BUZZER = 1)unsigned char dispFlag = 0; //更新显示标志unsigned char setFlag = 0; //设置参数标志int tempBuf = 0;//读取温度值float temperature; //实际温度值int temperatureMax = 50; //温度阈值unsigned char time500msCnt = 0; bit readTempFlag = 0; //定义读温度标志bit sendFlag = 0;int Conc = 0;int MaxConc = 40;unsigned char dis0[16]; //定义显示区域临时存储数组unsigned char err_num = 0;void CheckKey(void);void Timer0_Init(void); //定时器初始化void main(void){bit ack = 0;LCD_Init(); //初始化液晶DelayMs(200); //延时有助于稳定LCD_Clear(); //清屏LCD_DispStr(0, 0, " Welcome! ");DelayS(1);LCD_DispStr(0, 0, " Waiting... ");DelayS(3);Uart_Init();err_num = GSM_Init(); //GSM初始化DelayMs(10);if (gsm_init_flag) //初始化完成{err_num = GSM_Text_Mode(); //GSM 设置Text模式}DelayMs(10);if (gsm_config_flag){err_num = GSM_Delete_Sms("1"); //删除短信1}DelayMs(10);if (!(gsm_init_flag || gsm_config_flag || gsm_delete_flag)) // AT命令报错{BUZZER_ON;LCD_DispStr(0, 0, " Init Err Num ");LCD_WriteData((int)err_num+'0');DelayS(1);BUZZER_OFF;}else{LCD_DispStr(0, 0, " Init OK! ");}DelayS(3);LCD_DispStr(0, 0, "T:C S: %");LCD_DispOneChar(7, 0, 0xdf); //写入温度右上角点sprintf(dis0, " ST:%3d SS:%3d%%", temperatureMax, MaxConc); //打印温度值LCD_DispStr(0, 1, dis0); //显示第二行EEPROM52_Init(); //初始化电话号码Timer0_Init(); //定时器0初始化while (1) //主循环{CheckKey(); //检测按键gsm_receive_process(); //gsm接收处理if (sendFlag == 1){sendFlag = 0;if(GSM_Send_Sms(phone1, "Fire!!!") == 7){//发送失败则报警,可能没有设定初始号码DelayMs(10);BUZZER_ON;DelayS(1);BUZZER_OFF;}}if (readTempFlag == 1) //读取温度标志{readTempFlag = 0;TR0 = 0;DS18B20_Start();ack = DS18B20_GetTemp(&tempBuf);if (ack == 1){temperature = (float)tempBuf * 0.0625; //温度值转换}else {temperature = 0;} sprintf(dis0, "%5.1f", temperature); //打印温度值LCD_DispStr(2, 0, dis0); //显示第二行TR0 = 1;}if (dispFlag == 1){dispFlag = 0;TR0 = 0;Conc = ReadADC(AIN0_GND);if (Conc <= 29){Conc = 29;}Conc = (100 * (Conc - 29)) / 227; //计算有害气体浓度百分比sprintf(dis0, "%3d", Conc); //打印浓度值LCD_DispStr(12, 0, dis0); //显示第二行if (setFlag == 1){sprintf(dis0, ">ST:%3d SS:%3d%%", temperatureMax, MaxConc); //打印温度值LCD_DispStr(0, 1, dis0); //显示第二行}else if (setFlag == 2){sprintf(dis0, " ST:%3d >SS:%3d%%", temperatureMax, MaxConc); //打印温度值LCD_DispStr(0, 1, dis0); //显示第二行}else{sprintf(dis0, " ST:%3d SS:%3d%%", temperatureMax, MaxConc); //打印温度值LCD_DispStr(0, 1, dis0); //显示第二行}if ((temperature > temperatureMax) || (Conc > MaxConc)) //温度超高{BUZZER_ON;time500msCnt++;if (time500msCnt >= 20) //10s发送一次{time500msCnt = 0;sendFlag = 1;}}else //正常温度{time500msCnt = 0;BUZZER_OFF;}TR0 = 1;}}}void CheckKey(void){static unsigned char rekey = 0;if ((KEY_SET == 0) || (KEY_SUB == 0) || (KEY_ADD == 0) || (KEY_ENTER == 0)) //检测到按键按下{DelayMs(10); //小抖动if (rekey == 0){if (KEY_SET == 0) //检测是否按下{rekey = 1;setFlag++; //设置标志if (setFlag >= 3){setFlag = 1;}}else if (KEY_SUB == 0) //减值键{rekey = 1;if (setFlag == 1) //处于设置1{if (temperatureMax > -45){temperatureMax = temperatureMax - 1;}}else if (setFlag == 2) //处于设置2{if (MaxConc > 0){MaxConc = MaxConc - 1;}}sprintf(dis0, " ST:%3d SS:%3d%%", temperatureMax, MaxConc); //打印温度值LCD_DispStr(0, 1, dis0); //显示第二行}else if (KEY_ADD == 0) //加值键{rekey = 1;if (setFlag == 1) //处于设置1{if (temperatureMax < 128){temperatureMax = temperatureMax + 1;}}else if (setFlag == 2) //处于设置2{if (MaxConc < 99){MaxConc = MaxConc + 1;}}sprintf(dis0, " ST:%3d SS:%3d%%", temperatureMax, MaxConc); //打印温度值LCD_DispStr(0, 1, dis0); //显示第二行}else if (KEY_ENTER == 0) //检测是否按下 确认按键按下{rekey = 1;setFlag = 0; //设置标志// sendFlag = 1;}}}else{rekey = 0; //防止重复检测到按键}}

仿真演示视频:

/video/BV1Bt4y1W7zZ/

实物演示视频:

/video/BV1yU4y1o7fE/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。