51单片机智能家居环境检测 烟雾温度GSM短信提示报警器(原理图+程序+仿真+PCB)

您所在的位置:网站首页 智能烟雾报警器如何连接到手机 51单片机智能家居环境检测 烟雾温度GSM短信提示报警器(原理图+程序+仿真+PCB)

51单片机智能家居环境检测 烟雾温度GSM短信提示报警器(原理图+程序+仿真+PCB)

2024-06-30 18:11| 来源: 网络整理| 查看: 265

原理图:Altium Designer 仿真版本:proteus7.8 程序编译器:keil 4 设计编号:C0039

功能介绍: 1、单片机采用内置AD的51系列单片机,型号为STC89c52; 2、温度采集采用DS18B20传感器; 3、火灾烟雾检测采用MQ-2传感器,此传感器输出量也为模拟量,需接到单片机的AD端口上进行采集; 4、防盗检测采用HC-SR501热释电红外感应传感器,通过配合板载设防开关进行防盗的检测; 5、报警部分分为板载蜂鸣器鸣笛报警和GSM短信报警功能,GSM采用SIM800模块,当温度,烟雾浓度,防盗触发时GSM短信模块发送报警短信到指定的手机号码上。 6、手机可以发送指令关闭继电器或打开继电器,给单片机打电话会回复短信单片机检测的当前温度

资料下载链接(可点击):

仿真图(提供源文件): 在这里插入图片描述 在这里插入图片描述

原理图(提供源文件):

在这里插入图片描述

PCB(源文件): 在这里插入图片描述 在这里插入图片描述

程序(提供源文件源码):

#include void Waring_Processing(void) { //温度超标//烟雾超标 if((Temperature >= Temp_H) ||( MQ_Value>= MQ_2)) { BEEP_Cnt = 55; if(SMS_Enable_Time == 0) { SMS_States_Register |= (1 >=1; DQ = 0; // 将DQ脚拉低,表示写比特时序开始 _nop_(); _nop_(); // 保持低,1uS以上 (3uS) DQ = 1; // 将DQ脚拉高 Delay10(); // 延迟1uS~15uS (取10uS) if(DQ) value|=0x80;// 读取DQ的值 Delay30x(5); // wait for rest of timeslot RESTORE_INT; // 恢复中断 } return(value); } /**************************************************************************** * 名 称:OW_WriteByte() * 功 能:向 1-WIRE 总线上写一个字节。 * 入口参数:Val:写入的1字节数据 * 出口参数:无 ****************************************************************************/ void OW_WriteByte(unsigned char Val) { unsigned char i; for (i=8; i>0; i--) // 写入8比特循环8次,共计1字节 { DISABLE_INT; // 时序要求严格,不允许中断 DQ = 0; // 将DQ脚拉低保持1uS以上 (3uS) DQ = Val&0x01; // 先发低字节 Delay30x(3); // 保持数据 60~120uS (取85uS) DQ = 1; // DQ拉高 Val=Val>>1; // 取下一比特 Delay15(); // 比特间延迟1us以上(取15us) RESTORE_INT; // 恢复中断 } } /**************************************************************************** * 名 称:DS1820_Conv() * 功 能:向18B20发指令:开始温度测量与转换。 * 入口参数:无 * 出口参数:无 * 说 明: 该命令发出后,必须等待至少500-700ms才能测量完毕,之后才能读取数据。 ****************************************************************************/ void DS1820_Conv() { OW_Reset(); // 复位18B20 OW_WriteByte(0xCC); // Skip ROM(不进行序列号识别) OW_WriteByte(0x44); // 开始转换 } /**************************************************************************** * 名 称:DS1820_GetFamily() * 功 能:读取18x20的家族代码。 * 入口参数:无 * 出口参数:读回的家族号。 * 说 明: 0x10表示DS1820,0x28表示DS18B20,更多系列请参照官方数据手册 ****************************************************************************/ unsigned char DS1820_GetFamily() { unsigned char FamilyID; OW_Reset(); // 复位18B20 OW_WriteByte(0x33); // 发出获取家族代码命令 FamilyID=OW_ReadByte(); // 读取家族号 return(FamilyID); // 返回 } /**************************************************************************** * 名 称:DS1820_GetTemp() * 功 能:读取18x20的温度测量结果。注意要在DS1820_Conv()命令至少之后700ms以 后调用,才能读取准确的温度值。 * 入口参数:无 * 出口参数:温度数值,保留1位小数。 返回0x8001表示未检测到器件 返回0x8002表示无法识别的器件 * 范 例: 返回123表示12.3度;-345表示-34.5度,依此类推 ****************************************************************************/ int DS1820_GetTemp() { unsigned char tempH,tempL,Family; if(OW_Reset()==0) return(0x8001);// 若复位不成功说明无器件,返回0x8001 Family=DS1820_GetFamily(); // 读取1820的家族代码 OW_Reset(); // 复位,结束读取家族代码的操作 OW_WriteByte(0xCC); // Skip ROM(不进行序列号识别) OW_WriteByte(0xBE); // 发出读取数据的指令 Delay30x(5); // 略延迟 tempL=OW_ReadByte(); // 读取温度转换结果_低8位 tempH=OW_ReadByte(); // 读取温度转换结果_高8位 if (Family==0x28) // 如果是DS18B20系列 { return ((tempH*256+tempL)*(long)625/1000);//计算温度,保留1位小数 } else if(Family==0x10) // 如果是DS1820系列(比18B20更老的型号) { return ((tempH*256+tempL)*5);//计算温度,保留1位小数 } else return(0x8002); //其它型号无法识别 返回0x8002 } void DS18B20_Init(void) { DS1820_GetTemp(); //读取上次测温结果 // PutTemp(1,3,Temperature); //LED_DisplayDecimal(Temperature,1); //显示测温结果,保留1位小数 DS1820_Conv(); //发送下一次测温开始命令 DS1820_GetTemp(); //读取上次测温结果 // PutTemp(1,3,Temperature); //LED_DisplayDecimal(Temperature,1); //显示测温结果,保留1位小数 DS1820_Conv(); //发送下一次测温开始命令 DS1820_GetTemp(); //读取上次测温结果 // PutTemp(1,3,Temperature); //LED_DisplayDecimal(Temperature,1); //显示测温结果,保留1位小数 DS1820_Conv(); //发送下一次测温开始命令 } volatile int Temperature; void DS18B20_Processing(void) { if(Time0_2s_Flag) //2ms累加500次共计1秒 { Time0_2s_Flag = 0; //以下代码每隔2秒执行一次 Temperature = DS1820_GetTemp(); //读取上次测温结果 PutTemp(1,3,Temperature); //LED_DisplayDecimal(Temperature,1); //显示测温结果,保留1位小数 DS1820_Conv(); //发送下一次测温开始命令 } }

ADC0832驱动程序

#include unsigned char Get_AD_Result(bit CH) { unsigned char i; unsigned char dat; ADC0832_CS=1; //一个转换周期开始 ADC0832_CLK=0; //为第一个脉冲作准备 ADC0832_CS=0; //CS置0,片选有效 ADC0832_DIO=1; //DIO置1,规定的起始信号 ADC0832_CLK=1; //第一个脉冲 ADC0832_CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平 ADC0832_DIO=1; //DIO置1, 通道选择信号 ADC0832_CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道RH0 ADC0832_CLK=0; //第二个脉冲下降沿 ADC0832_DIO=CH; //DI置0,选择通道0 ADC0832_CLK=1; //第三个脉冲 ADC0832_CLK=0; //第三个脉冲下降沿 ADC0832_DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1 ADC0832_CLK=1; //第四个脉冲 for(i=0;i 25) //500ms进入连续触发 { if(KEY_Counter >= 2) //每秒触发 25 = 1000/20/2 { KEY_Counter = 0; KEY_Value = KEY_Cont; } else { KEY_Counter++; } } else { KEY_Wait++; } } else { KEY_States = 0; KEY_Wait = 0; } if(KEY_Value) { switch(KEY_Value) { case 0x00: KEY_Value = KEY_NOP; break; case 0x20: KEY_Value = KEY_SET; break; case 0x10: KEY_Value = KEY_UP; break; case 0x02: KEY_Value = KEY_DOW; break; default: KEY_Value = KEY_NOP; break; } } } volatile unsigned int Temp_H = 150; volatile unsigned char MQ_2 = 80; void KEY_Processing(void) { //按键扫描 if(Time0_20ms_Flag) { Time0_20ms_Flag = 0; KEY_Scan(); } if(KEY_Value == KEY_SET) { KEY_Value = KEY_NOP; } else if(KEY_Value == KEY_UP) { KEY_Value = KEY_NOP; PutNum(2,5,2); LcmClearTXT(); PutStr(0,0,"设置温度报警"); PutStr(1,0,"温度:"); while(1) { if(Time0_100ms_Flag) { Time0_100ms_Flag = 0; PutTemp(1,3,Temp_H); } //按键扫描 if(Time0_20ms_Flag) { Time0_20ms_Flag = 0; KEY_Scan(); } if(KEY_Value == KEY_SET) { KEY_Value = KEY_NOP; if(Temp_H 1) Temp_H--; } } LcmClearTXT(); PutStr(0,0,"设置烟雾报警"); PutStr(2,0,"烟雾:"); while(1) { if(Time0_100ms_Flag) { Time0_100ms_Flag = 0; PutNum(2,3,MQ_2); } //按键扫描 if(Time0_20ms_Flag) { Time0_20ms_Flag = 0; KEY_Scan(); } if(KEY_Value == KEY_SET) { KEY_Value = KEY_NOP; if(MQ_2 1) MQ_2--; } } LcmInit(); EEPROM_Save_Flag = 1; } else if(KEY_Value == KEY_DOW) { KEY_Value = KEY_NOP; } }

资料清单(提供资料清单所有文件):

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3