|
给大家分享一个基于单片机GSM远程控制报警设计
1.本设计为家庭防火防盗GSM报警器;
2.采用STC89C51/52单片机为控制核心,SIM900A为GSM模块,MQ-2烟雾传感器、数模转换器ADC0832、人体红外热释电模块、1602液晶组成;
3.当检测到有烟雾或煤气时,MQ-2传感器会发出电压信号,单片机通过ADC0832检测到该信号,就会将烟雾浓度值显示到1602液晶上;
4.设置为布防状态时,1)烟雾浓度值大于设定值,GSM模块会发出短信报警,同时蜂鸣器报警。2)当人体红外模块检测到有人时,GSM模块会发出短信报警,同时蜂鸣器报警。
5. 一共有五个按键,一个复位按键、四个功能按键。分别为:打电话测试、发短信测试、布防、撤防。
GSM防盗报警器元清单
1. 7*9万用板 2. stc89c51 3. 40脚IC座 4. 10uf电解电容 5. 30pf瓷片电容*2 6. 11.0592MHz晶振 7. 3p母座 8. 8脚母座 9. 9013三极管 10. 9012三极管 11. 25V470uF电解电容 12. 10k电阻*2 13. 5V有源蜂鸣器 14. 3mm红色led 15. 3mm绿色led 16. 3mm黄色led 17. 1N4007二极管 18. 排针*4 19. 热释电模块 20. SIM900A GSM模块 21. 2.2k电阻*4 22. 220欧电阻 23. 按键*4 24. DC插座 25. 自锁开关 26. 焊锡 27. 导线 28. USB电源线(粗)
加烟雾模块 1.7*9万用板 烟雾传感器MQ-2 LM393 8脚IC座 103电位器 104独石电容 5.1Ω电阻 1k电阻 10k电阻 排针*6
单片机源程序:
- //文件包含
- #include "reg52.h"
- #include "uart.c"
- #include "lcd1602.h"
- #include "DHT11.C"
- //宏定义
- #define uchar unsigned char
- #define uint unsigned int
- //按键定义
- sbit KEY1= P1^6;
- sbit KEY2= P3^2;
- sbit KEY3= P3^3;
- sbit KEY4= P3^4;
- sbit BEE = P1^0;
- sbit HW = P1^3;
- //ADC定义
- sbit CS=P3^5;
- sbit CLK=P3^7;
- sbit DIO=P3^6;
- //字符数组
- uchar code Tab0[] = {"0123456789. "};
- uchar code Tab1[] = {" it is readying "};
- uchar code Tab2[] = {" it is ok "};
- uchar code Tab3[] = {"smoke is ppm"};
- //uchar code Tab3[] = {" the GSM system "};
- uchar code Tab4[] = {" 'C % "};
- uchar code Tab5[] = {"in calling "};
- uchar code Tab6[] = {"in sending "};
- uchar code Tab7[] = {" ON OFF"};
- uchar GSM_flag=0;
- uchar temp,Set_temp=40; //温度
- uchar shidu,Set_shidu=100; //湿度
- uchar smoke=0,Set_smoke=50; //烟雾
- uchar HW_reg=0;
- //设置短信接收人
- //uchar code PhoneNO[]= "00310035003700320039003300390030003100330037"; // 15729390137
- uchar code PhoneNO[]= "00310038003700350031003900310039003600350034 "; // 18751919654
- //设置电话接听人
- uchar code PhoneNO1[]= "18751919654";
- //uchar code PhoneNO1[]= "15729390137";
- //主人您好!我是您的管家!
- uchar code Text1[]= "4E3B4EBA60A8597DFF016211662F60A876847BA15BB6FF01";
- //主人,温度过高,可能着火了,快回家看看!
- uchar code Text2[]="4E3B4EBAFF0C6E295EA68FC79AD8FF0C5BB64E2D53EF80FD7740706B4E86FF015FEB56DE5BB6770B770BFF01";
- //主人,家中有人闯入,您的家可能被盗了!
- uchar code Text3[]="4E3B4EBA002C5BB64E2D67094EBA95EF5165FF0C60A876845BB653EF80FD88AB76D74E86FF01";
- //烟雾浓度过大,可能着火了!快回家看看吧!
- uchar code Text4[]="70DF96FE6D535EA68FC75927FF0C53EF80FD7740706B4E86FF015FEB56DE5BB6770B770B5427FF01";
- //ADC0832函数,带返回值
- unsigned int A_D()
- {
- unsigned char i,dat;
- CS=1; //一个转换周期开始
- CLK=0; //为第一个脉冲作准备
- CS=0; //CS置0,片选有效
-
- DIO=1; //DIO置1,规定的起始信号
- CLK=1; //第一个脉冲
- CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
- DIO=1; //DIO置1, 通道选择信号
- CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0
- CLK=0; //第二个脉冲下降沿
- DIO=0; //DI置0,选择通道0
- CLK=1; //第三个脉冲
- CLK=0; //第三个脉冲下降沿
- DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
- CLK=1; //第四个脉冲
- for(i=0;i<8;i++) //高位在前
- {
- CLK=1; //第四个脉冲
- CLK=0;
- dat<<=1; //将下面储存的低位数据向右移
- dat|=(unsigned char)DIO; //将输出数据DIO通过或运算储存在dat最低位
- }
- CS=1; //片选无效
- return dat; //将读出的数据返回
- }
- //主函数
- void main(void)
- {
- uchar G,S,B;
- LCD1602_Init(); //1602液晶屏初始化
- LCD1602_Display(LINE1,Tab1,0,16); //准备界面
- BEE=0; //开机提示
- Delay_ms(50);
- BEE=1;
- Uart_init();
-
- Delay_ms(500); //等待GSM模块稳定
- SendString("AT\r\n");
- BEE=0; //提示已稳定
- Delay_ms(50);
- BEE=1;
- while(1)
- {
- LCD1602_Display(LINE1,Tab3,0,16); //准备完毕
- LCD1602_Display(LINE2,Tab4,0,13); //准备完毕
- smoke=A_D();
- RH();
- temp=U8T_data_H; //温度
- shidu=U8RH_data_H; //湿度
- if(1)
- {
- B=temp/100;
- S=temp%100/10;
- G=temp%10;
- LCD1602_Display(LINE2,Tab0,B,1);
- LCD1602_Display(LINE2+1,Tab0,S,1);
- LCD1602_Display(LINE2+2,Tab0,G,1);
- B=shidu/100;
- S=shidu%100/10;
- G=shidu%10;
- LCD1602_Display(LINE2+7,Tab0,S,1);
- LCD1602_Display(LINE2+8,Tab0,10,1);
- LCD1602_Display(LINE2+9,Tab0,G,1);
- B=smoke/100;
- S=smoke%100/10;
- G=smoke%10;
- LCD1602_Display(LINE1+9,Tab0,B,1);
- LCD1602_Display(LINE1+10,Tab0,S,1);
- LCD1602_Display(LINE1+11,Tab0,G,1);
- }
- Delay_ms(100);
-
- //第一个按键,打电话测试
- if(KEY1==0)
- {
- Delay_ms(10);
- if(KEY1==0)
- {
- BEE=0; //提示进入按键
- Delay_ms(20);
- BEE=1;
- LCD1602_Display(LINE2,Tab5,0,16);
- SendString("ATD"); //打电话指令
- SendString(PhoneNO1);
- SendASC(';');
- SendASC('\r'); //发送回车指令
- SendASC('\n'); //发送回车指令
- Delay_ms(2000);
- SendString("ATH\r\n"); //主动挂断
- Delay_ms(100);
- }
- }
- //第二个按键
- if(KEY2==0)
- {
- Delay_ms(10);
- if(KEY2==0)
- {
- BEE=0; //提示进入按键
- Delay_ms(20);
- BEE=1;
- LCD1602_Display(LINE2,Tab6,0,16);
- SendString("AT+CMGF=1\r\n");
- Delay_ms(100);
- SendString("AT+CSCS=\"UCS2\"\r\n");
- Delay_ms(100);
- SendString("AT+CSMP=17,0,2,25\r\n");
- Delay_ms(100);
- SendString("AT+CMGS="); //信息发送指令 AT+CMGS=//
- SendASC('"');
- SendString(PhoneNO);
- SendASC('"');
- SendASC('\r'); //发送回车指令//
- SendASC('\n'); //发送回车指令//
- Delay_ms(100);
- SendString(Text1);
- Delay_ms(100);
- SendASC(0X1A);
- Delay_ms(1000);
- }
- }
- //第三个按键,布防
- if(KEY3==0)
- {
- Delay_ms(6);
- if(KEY3==0)
- {
- BEE=0; //提示进入按键
- Delay_ms(20);
- BEE=1;
- GSM_flag=1;
- LCD1602_Display(LINE2+13,Tab7,0,3);
- }
- }
- //第四个按键,撤防
- if(KEY4==0)
- {
- Delay_ms(6);
- if(KEY4==0)
- {
- BEE=0; //提示进入按键
- Delay_ms(20);
- BEE=1;
- GSM_flag=0;
- LCD1602_Display(LINE2+13,Tab7,4,3);
- }
- }
- //红外
- if(HW==1)
- {
- Delay_ms(10);
- if(HW==1)
- {
- BEE=0; //提示进入按键
- Delay_ms(100);
- BEE=1;
- if(GSM_flag==1)
- {
- HW_reg++;
- if(HW_reg>=10)
- HW_reg=10;
- }
- }
- }
- //进入布防模式
- if(GSM_flag==1)
- {
- //有人闯入
- if(HW_reg>=1)
- {
- HW_reg=0;
- SendString("AT+CMGF=1\r\n");
- Delay_ms(100);
- SendString("AT+CSCS=\"UCS2\"\r\n");
- Delay_ms(100);
- SendString("AT+CSMP=17,0,2,25\r\n");
- Delay_ms(100);
- SendString("AT+CMGS="); //信息发送指令 AT+CMGS=//
- SendASC('"');
- SendString(PhoneNO);
- SendASC('"');
- SendASC('\r'); //发送回车指令//
- SendASC('\n'); //发送回车指令//
- Delay_ms(100);
- SendString(Text3);
- Delay_ms(100);
- SendASC(0X1A);
- Delay_ms(1000);
- }
- //温度过高,可能着火了
- if(temp>=Set_temp)
- {
- SendString("AT+CMGF=1\r\n");
- Delay_ms(100);
- SendString("AT+CSCS=\"UCS2\"\r\n");
- Delay_ms(100);
- SendString("AT+CSMP=17,0,2,25\r\n");
- Delay_ms(100);
- SendString("AT+CMGS="); //信息发送指令 AT+CMGS=//
- SendASC('"');
- SendString(PhoneNO);
- SendASC('"');
- SendASC('\r'); //发送回车指令//
- SendASC('\n'); //发送回车指令//
- Delay_ms(100);
- SendString(Text2);
- Delay_ms(100);
- SendASC(0X1A);
- Delay_ms(1000);
- }
- //烟雾浓度过高,可能着火了
- if(smoke>=Set_smoke)
- {
- SendString("AT+CMGF=1\r\n");
- Delay_ms(100);
- SendString("AT+CSCS=\"UCS2\"\r\n");
- Delay_ms(100);
- SendString("AT+CSMP=17,0,2,25\r\n");
- Delay_ms(100);
-
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
程序.rar
(77.9 KB, 下载次数: 553)
2-原理图.rar
(104.56 KB, 下载次数: 456)
|
评分
-
查看全部评分
|