基于AT89S52单片机的安防系统指导老师:谭雄乐开发人员:林国友徐健俊任务分配:林国友(编写程序、硬件测试、硬件焊接、程序调试)。徐健俊(画PCB电路)。开发时间:2010年5月底到6月初一、功能介绍通过AT89S52单片机主控,扫描检测红外、烟雾、煤气等传感器信号达到监控家里情况的效果。当信号发生时,S52单片机就会通过串口通信连接GSM模块向预先设定好的手机号码发送相应的警报情况。此时,单片机控制的外围电路会发生警报声,同时亮灯。只有当单片机接收到目标号码发送过来的控制短信后,才会关闭警报和指示灯。(由于本人势单力薄,所以程序的功能并不完善。在控制方面没有用定时控制警报发生后每隔一段时间发送短信到目标号码,直到接收到相应的控制短信才停止。同时在解除警报后也没有再发送短信到目标号码以示情况。)警报发生:红外警报→发送“红外警报”短信燃气警报→发送“燃气警报”短信烟雾警报→发送“烟雾警报”短信收到短信:“家里情况”→发送短信“一切正常”(无警报时)“关闭红外”→关闭红外警报,关闭蜂鸣器,关红外指示灯“关闭燃气”→关闭燃气警报,关闭蜂鸣器,关燃气指示灯“关闭烟雾”→关闭烟雾警报,关闭蜂鸣器,关烟雾指示灯“关闭所有”→关所有警报,关蜂鸣器,关警报指示灯,开正常指示灯实物图:硬件接线图请参考:AT89S52单片机的安防系统硬件接线图.doc二、程序说明及流程图:烟雾探测器燃气探测器红外探测器1、主程序流程图响铃100ms提示开机上电lcd_disp0(),5110初始化I2C_Init(),I2C总线初始化开指示灯P0_4LCD显示:GSM安防系统init_interrupt(),外部中断初始化init_security(),警报扫描初始化关指示灯P0_4,开P0_5LCD显示:指导老师init_uart(),初始化串口connect_gsm()联机成功?关指示灯P0_5,开P0_6LCD显示:制作人init_gsm(),禁回显,设PDU模式关指示灯P0_6,开P0_7LCD显示:林国友徐健俊NYconnect_gsmnet()网络连接成功?N设置不接收广播信息读取目标号码,没有则按默认号码进行发送短信初始化(将要发送的短信初始化到SIM卡上)。scan_Security(),安全警报扫描key_out();判断按键发生后要跳出的条件。Chk_Read_Do(),检测是否有新短信,有则判断是否为有效地操作指令,是则执行相应操作2、键盘中断流程图三、硬件原理图及PCB:原理图:AT89S52外围I/O接口:P1.0~P1.7为矩阵键盘输入,P1.0~P1.3为行,P1.4~P1.7为列。P0.3为蜂鸣器(低电平有效),P0.4~P0.7为LED指示灯(低电平有效)P2.0~P2.2为安防信号扫描入口P2.1、P2.2、P2.0(高电平有效)P2.0接红外探测器,P2.1接燃气探测器,P2.2接烟雾探测器P3.0、P3.1用作串口接收发送,P3.2用作键盘外部中断输入,P3.6、P3.7分别接24C02的SCL和SDARST按键复位,XTAL1、XTAL2接12M晶振P0.0、P2.4~P2.7用作NOKIA5110显示屏。PCB(硬件在调试时有更改,但相差不大):四、程序部分代码:主函数代码:/************************************************************************************************************************************main.c主函数******************本程序都是采用PDU格式*************************************************************************************************************************************/#includeat89x52.h#includestring.h#includegsm-at.h#includekey.h#includelcd.h#includeat24c02.h#includedelayms.hexternbitscan_Security();//安全监控扫描//警报扫描初始化初始化所有检测电平,等待警报电平进入externvoidinit_security();externucharidataphonenum[15];//存放要发送对象的号码externucharNindex[];//存放发送到SIM卡中短信返回的indexexternvoidtest_code(ucharn_delay,ucharn_wait);/*测试函数*/voidinit_pho_msg();//号码和短信初始化voidmain(){lcd_disp0();I2C_Init();//I2C总线初始化P0_4=0;//LCD_clear();//清屏LCD_write_String(8,4,GSM);disp16_16(2,2,16);//安disp16_16(4,2,17);//防disp16_16(6,2,18);//系disp16_16(8,2,19);//统delayms_100ms();init_interrupt();//外部中断0初始化键盘init_security();//警报扫描初始化P0_4=1;//P0_5=0;//LCD_clear();//清屏disp16_16(0,0,29);//指disp16_16(2,0,30);//导disp16_16(4,0,31);//老disp16_16(6,0,32);//师LCD_write_char(':');disp16_16(2,2,33);//谭disp16_16(4,2,34);//雄disp16_16(6,2,35);//乐init_uart();//初始化串口while(!connect_gsm());//发送联机指令test_code(1,0);//P0_5=1;//P0_6=0;//LCD_clear();//清屏disp16_16(0,0,20);//制disp16_16(2,0,21);//作disp16_16(4,0,22);//人LCD_write_char(':');init_gsm();//禁止回显,设置为pdu模式P0_6=1;//P0_7=0;////LCD_clear();//清屏disp16_16(2,2,23);//林disp16_16(4,2,24);//国disp16_16(6,2,25);//友disp16_16(2,4,26);//徐disp16_16(4,4,27);//健disp16_16(6,4,28);//俊while(!connect_gsmnet());//获取网络注册情况init_sim();//不接受广播短信test_code(5,0);//响铃500ms提示初始化成功init_pho_msg();//号码和短信初始化P0_7=1;//test_code(1,0);//响铃100ms提示进入系统监控状态while(1){scan_Security();//安全监控扫描key_out();//键盘处理跳出Chk_Read_Do();//检测读取新短信执行控制命令}}//号码和短信初始化voidinit_pho_msg(){uchari,n_addr=0x0;//读取目标号码到phonenumfor(i=0,n_addr=0x0;i13;i++)I2C_On(I2C_SrRECV,0xA0,n_addr++,&phonenum[i],1);//读n_addr地址内容到phonenumphonenum[13]='\0';if(phonenum[12]0&&phonenum[12]9){strcpy(phonenum,8618998361948);//设定初始号码for(i=0,n_addr=0x0;i14;i++){I2C_On(I2C_SEND,0xA0,n_addr++,&phonenum[i],1);//写phonenum内容到n_addr地址delayms_10ms();}phonenum[13]='\0';while(!init_Send_sms_sim(phonenum));//初始化将所有要发送的短信写到SIM卡}LCD_clear();//清屏LCD_write_String(0,0,ReadPhonenumber);LCD_write_String(0,2,phonenum);delayms_1000ms();}