原理图: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 <main.h>void Waring_Processing(void)
{   //温度超标//烟雾超标    if((Temperature >= Temp_H) ||( MQ_Value>= MQ_2)){       BEEP_Cnt = 55;if(SMS_Enable_Time == 0){SMS_States_Register |= (1 << SMS_TXD_ENA); SMS_Enable_Time = 30; //30秒内只发一条短信SMS_Retry = 3;SMS_Type = 0;}           }
}void main(void)
{   alarm_1 = 0;   EEPROM_Init();LcmInit();DS18B20_Init();Time0_Init();UART0_Init();KEY_Init();EA = 1;    while(1){Waring_Processing();KEY_Processing();UART0_Processing();SMS_Processing();DS18B20_Processing();ADC0832_Processing();IR_Processing();EEPROM_Processing();}
}
/*DS1820/DS18B20 数字温度传感器通用程序库说明:该模块化程序库包含了数字温度传感器DS1820/DS18B20测温所需的相关函数。可以作为各种测温程序的底层硬件驱动使用。要使用该库函数,需要将本文件(18x20.c)添加进工程,并在需要调用测温相关函数的文件开头处包含"18x20.h"注意,本程序适用的晶振频率范围为8-14MHz(指令周期1us左右)。如果时钟频率差别较大,需要修改Delay10()函数,使之大约10us左右,并修改Delay15()函数,使之大约15us左右。*///
//                                          VCC
//                   MCU=89x51/52           ---  长线时DQ脚要上拉
//               +---------------+           |
//               |               |           |     数字温度传感器
//               |               |       +---+------------------+
//               |               |       |                      |
//               |          P3.7 |<----->|   DS18B20 / DS1820   |
//               |               |   DQ  |                      |
//               |               |       +----------------------+
//               |               |           |
//               |               |           |
//               |               |           |
//               +---------------+          ---
//                                          GND#include <18X20.h>sbit DQ=P3^7;         /* DS18B20数据引脚定义         */bit TEMP_EA;
#define DISABLE_INT;  TEMP_EA=EA;  EA=0;  /*关闭中断的宏定义*/
#define RESTORE_INT;  EA=TEMP_EA;         /*恢复中断的宏定义*//****************************************************************************
* 名    称:Delay10()
* 功    能:延迟10us
* 入口参数:无
* 出口参数:无
* 说    明: 指令周期1us时,延迟恰好10us,晶振改变延迟时间也会随之改变
****************************************************************************/
void Delay10()
{ _nop_();_nop_();_nop_();_nop_();_nop_();   // 6个NOP + 3周期LCALL(调用该函数) +1周期RET(返回)_nop_();   // = 10个指令周期
}/****************************************************************************
* 名    称:Delay15()
* 功    能:延迟15us
* 入口参数:无
* 出口参数:无
* 说    明: 指令周期1us时,延迟恰好15us,晶振改变延迟时间也会随之改变
****************************************************************************/
void Delay15()
{ _nop_();_nop_();_nop_();_nop_();_nop_();   // 11个NOP + 3周期LCALL(调用该函数) +1周期RET(返回)_nop_();   // = 15个指令周期_nop_();_nop_();_nop_();_nop_();_nop_();
}/****************************************************************************
* 名    称:Delay30x()
* 功    能:延迟30us的倍数(会差几个周期)
* 入口参数:Time:30us的倍数
* 出口参数:无
* 范    例: Delay30x(3); //延迟90us左右
****************************************************************************/
void Delay30x(unsigned char Time)
{  if(Time==0) return;  //Time=0次,不执行for(;Time>0;Time--)  //循环Time次{ Delay15();        //每次延迟15us,加上循环,大约28us。}
}/****************************************************************************
* 名    称:OW_Reset()
* 功    能:向1-Wire总线上发送一个复位指令。
* 入口参数:无
* 出口参数:1:表示复位操作成功0:表示复位操作失败
****************************************************************************/
bit OW_Reset(void)//复位
{ unsigned char i;DISABLE_INT;  // 时序要求严格,不允许中断 DQ = 0;       //pull DQ line lowDelay30x(30); // leave it low for 480~960us  (700uS)DQ = 1;       // allow line to return highDelay30x(2);  // wait for presence 15~60uS    ( 56uS)  for(i=0;i<30;i++)  { if (DQ==0) {while(!DQ) {};// 复位成功,等待复位结束RESTORE_INT;return(1);   // 并返回1,表示有器件} Delay15(); // 不成功,可能是1820反应慢,重试30次} RESTORE_INT;return(0);//  到达240uS等待最大值,放弃.返回0,表示无器件
}  /****************************************************************************
* 名    称:OW_ReadByte()
* 功    能:从 1-wire 总线上读取一个字节。
* 入口参数:无
* 出口参数:读回的1字节数据
****************************************************************************/
unsigned char OW_ReadByte(void)
{unsigned char i;unsigned char value = 0;for (i=8;i>0;i--)     // 读取8比特循环8次,组成1字节{DISABLE_INT;        // 时序要求严格,不允许中断value>>=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();         // 复位18B20OW_WriteByte(0xCC); // Skip  ROM(不进行序列号识别)OW_WriteByte(0x44); // 开始转换
}/****************************************************************************
* 名    称:DS1820_GetFamily()
* 功    能:读取18x20的家族代码。
* 入口参数:无
* 出口参数:读回的家族号。
* 说    明: 0x10表示DS1820,0x28表示DS18B20,更多系列请参照官方数据手册
****************************************************************************/
unsigned char DS1820_GetFamily()
{ unsigned char FamilyID;OW_Reset();               // 复位18B20OW_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);// 若复位不成功说明无器件,返回0x8001Family=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 <ADC0832.H>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,选择通道0ADC0832_CLK=1;    //第三个脉冲ADC0832_CLK=0;    //第三个脉冲下降沿 ADC0832_DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1ADC0832_CLK=1;    //第四个脉冲for(i=0;i<8;i++)  //高位在前{ADC0832_CLK=1;         //第四个脉冲ADC0832_CLK=0; dat<<=1;       //将下面储存的低位数据向右移dat|=(unsigned char)ADC0832_DIO;    //将输出数据DIO通过或运算储存在dat最低位 }                 ADC0832_CS=1;          //片选无效 return dat;   //将读书的数据返回     }volatile unsigned char MQ_Value;void ADC0832_Processing(void)
{if(Time0_1s_Flag2){Time0_1s_Flag2 = 0;MQ_Value = Get_AD_Result(0);PutNum(2,3,MQ_Value);}
}

按键扫描函数


#include <KEY.H>volatile unsigned char KEY_Value = 0;void KEY_Init(void)
{P1  |= 0X20;P3  |= 0X24;
}unsigned char KEY_Read(void)
{unsigned char a;a = (P1 & 0x20) + ((P3&0x24)>>1);return a;
}void KEY_Scan(void)  //每20m调用一次
{unsigned char KEY_Data;static unsigned char KEY_Cont = 0;static unsigned char KEY_Counter = 0;static unsigned char KEY_States = 0;static unsigned char KEY_Wait = 0;KEY_Data =  KEY_Read();KEY_Value = KEY_Data & (KEY_Data ^ KEY_Cont);KEY_Cont = KEY_Data;if(KEY_Cont && (KEY_Cont != 0x08))  //连续按下禁止SET连续触发{if(KEY_Wait > 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 <990)Temp_H++;}else if(KEY_Value == KEY_UP){KEY_Value = KEY_NOP;break;}else if(KEY_Value == KEY_DOW){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 <250)MQ_2++;}else if(KEY_Value == KEY_UP){KEY_Value = KEY_NOP;break;}else if(KEY_Value == KEY_DOW){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;}}

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

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

  1. 基于51单片机智能家居监控系统设计仿真(proteus仿真+源码+报告)

    本设计: 仿真版本:proteus 8.9 程序编译器:keil 4 设计编号:C0040 功能介绍: 以提高家居生活的安全性.舒适度.人性化为目的,设计智能家居监控系统. (1)设计必须实现家居温度 ...

  2. 17、基于51单片机智能饮水机带温度水位检测APP控制系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.设计方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.Proteus仿真 七.程序源码 八.资料包括 摘要 本设计基于STC8 ...

  3. 基于51单片机智能家居家电继电器开关插座定时WiFi无线proteus仿真原理图PCB

    功能: 0.本系统采用STC89C52作为单片机 1.手机通过wifi控制4路继电器的开和关以及定时: 手机发送OA,继电器全部打开, 手机发送CA,继电器全部关闭, 手机发送O14,继电器14打开, ...

  4. 基于51单片机的智能家居安防系统(程序+仿真+PCB)

    @TOC 一.基于51单片机的智能家居安防系统 1.主要功能 通过人体红外检测模块.光敏传感器.蜂鸣器.继电器模块模拟智能家居安防功能. 2.实验结果 3.实验仿真 4.程序源码 /********* ...

  5. 51单片机智能远程遥控温控PWM电风扇系统红外遥控温度速度定时关机

    实践制作DIY- GC0033-智能远程遥控温控 一.功能说明: 基于51单片机设计-智能远程遥控温控 功能介绍: STC89C51单片机+LCD1602显示器+红外遥控器(接收和发射)+5V风扇+D ...

  6. 51单片机智能语音温控摇头电风扇落地扇可红外遥控可PWM调速定时温度显示

    实践制作DIY- GC0073-智能语音温控摇头电风扇 一.功能说明: 基于51单片机设计-智能语音温控摇头电风扇 功能介绍: 硬件组成:STC89C52单片机+语音识别模块+DS18B20温度传感器 ...

  7. 基于51单片机智能浇花自动浇水灌溉

    基于51单片机智能浇花自动浇水灌溉(源程序+原理图+论文+实物图) 资料编号:004 功能介绍: 51单片机控制的自动浇水系统,实现室内盆花浇水的自动化系统. 该系统可对土壤的湿度进行监控,并对作物进 ...

  8. 基于51单片机智能农业大棚恒温恒湿Proteus仿真(源码+仿真+全套资料)

    资料编号:134 视频讲解: 134-基于51单片机智能农业大棚监测恒温恒湿Proteus仿真(源码+仿真+全套资料) 功能介绍: 采用51单片机作为主控芯片,可以采集当前的温湿度,并且LCD1602 ...

  9. 基于51单片机智能农业大棚恒温恒湿Proteus仿真

    资料编号:134  下面是相关功能视频演示: 134-基于51单片机智能农业大棚监测恒温恒湿Proteus仿真(源码+仿真+全套资料) 功能介绍: 采用51单片机作为主控芯片,可以采集当前的温湿度,并 ...

最新文章

  1. C++ map的使用
  2. 查看linux java home_查看Linux中自带的jdk,设置JAVA_HOME
  3. 如何为SFP光模块搭配对应的光纤跳线?
  4. No.3小白的HTML+CSS心得篇
  5. layuimini tab切换刷新解决方案
  6. 中国美女黑客攻击4G网络?详解
  7. Python常用库urllib中urllib.request模块使用详解
  8. 蜗牛星际 完美安装 ESXI6.7 全面教程(一)
  9. 从非洲血库到热带雨林:为什么普惠联接是社会的数字化支点?
  10. 字节跳动2021批笔试题解
  11. linux命令pp,linux命令 $- 是什么意思
  12. 如何应对 DDoS 勒索攻击?
  13. mysql:triggers
  14. 计算机毕设(附源码)JAVA-SSM金牛社区疫情防控系统
  15. PCB走线和过孔通流能力的标准、影响因素及其计算软件
  16. DirectX FAQ 翻译(Graphics 部分)
  17. Java程序猿搬砖笔记(七)
  18. 构建信用风险综合评价体系——基于主成分与因子分析
  19. Feitian's rockey4 API Monitor Driver by softcrk
  20. 《天龙八部3D》Unity技术方案揭秘

热门文章

  1. 华南农业大学汇编语言综合性实验-将自己的姓名用多种颜色动态显示
  2. Ambarella SDK build 步骤解析
  3. java 计算日期时间差_Java计算日期和时间差
  4. 关系网络lbs的应用_冒泡网王江:熟人关系将成LBS最重要商业模式
  5. linux下打印pdf文件很慢,打印机打印pdf文件特别慢怎么解决
  6. NameError: name ‘weights‘ is not defined
  7. find:paths must precede expression问题及解决
  8. 引导区坏 计算机无法启动,小白告诉你Win10无法正常启动修复引导文件教程
  9. 关于WEB页面处谷歌验证的接入
  10. 喜欢这样的游戏---流畅的俯视坦克射击游戏