《基于单片机的智能家居安防系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能家居安防系统设计.docx(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、基于单片机的智能家居安防系统设计(软件部分)摘 要认真分析了设计任务要求,进行了总体设计方案论证,提出了以单片机为控制核心并通过PSTN实现智能家居安防报警系统的方法,尝试了基于keil软件C51编程,结合proteus软件仿真硬件运行的新方法。设计了四种(盗、火、天然气、水)报警功能的智能家居安防远程报警系统,其中火、天然气、水的采集信号使用模拟开关替代,实现了防盗报警信号采集与报警功能。阐明了区别于通过检测铃流信号判别被叫用户是否摘机的另一种方法。主要进行了系统软件的设计、仿真、下载与调试,调试结果和分析表明,设计方案可行,方法正确,达到了设计指标要求。设计任务的完成也为后续课题的开发研究
2、提供了一种行之有效的手段和方法。关键词 单片机;智能安防;远程报警;公用电话网; C51The intelligent alarm system of security based on single-chip Microcomputer Abstract:KeywordsSingle-chip microcomputer; Intelligent alarm system; Long-distance security; PSTN; C51目 录序言第一章 设计任务的分析与系统的总体设计1.1 设计任务的分析1.2系统的总体设计第二章 系统的软件设计2.1软件系统分析2.2程序设计2.2.1
3、 主程序2.2.2 中断服务子程序2.2.3 中断服务子程序2.2.4 中断服务子程序第三章 系统的硬件设计3.1 AT89C52单片机概述3.2 硬件系统模块设计第四章 系统调试4.1软件调试4.2硬件调试4.3综合调试第五章 结束语致谢附录1附录2附录3参考文献基于单片机的智能家居安防系统设计(软件部分)序言随着现代人生活节奏的加快,人们在家中的时间越来越少。此时住宅中无人值守的状态会带来很多的安全隐患,因此就需要一个设备能够让主人安心工作又不必担心家里发生了警情自己却不知道,错过了解决的黄金时间。针对这样的一个背景,设计出此类的系统就有它的必要性,而且这样的系统对于店面等夜间无人值守的地
4、点同样都有它的用武之地。为解决此问题我们设计出这样的系统,该系统以单片机为核心通过PSTN实现智能家居安防报警功能,解决了家中无人值守所带来的各种安全隐患。一旦住宅中有警情(天然气、水、盗、火)发生,系统会第一时间检测、判别警情类型,并通过PSTN远程报警让主人知道家中发生的具体情况,以便及时解决。预置的电话号码类型不受限制(手机号码亦可)。系统还采用多次拨号的方式,以便解决主人未能及时接到的报警电话。另外该系统还可以安装在拥有PASN接口的任何场合,而不仅仅局限于家庭。本论文共分5章。第一章为任务书的分析与总体设计;第二章为系统软件设计;第三章为系统硬件设计;第四章为系统调试;第五章为结束语
5、。把系统软件设计放在系统硬件设计之前的原因是我们软件设计优先于硬件设计。设计过程中我们采取了分工与合作的方法,我负责软件的编写与调试。张峰同学负责硬件电路的设计、安装和调试,综合调试由我们共同完成。在设计过程中,软硬件的功能总是不断的调整,以便相适应。硬件设计和软件设计是不能截然分开的,硬件设计时应考虑软件设计的方法,而软件设计时应了解硬件的工作原理,在整个设计过程我们互相协调,提高了工作效率。在本次毕业设计中我们的指导老师陶为戈为此次设计付出了大量辛勤的劳动,在很多问题上给予指导性的意见,同时在毕业设计的过程中得到了系各级领导的关心和指导,在此表示由衷的感谢!由于毕业设计时间紧工作量大,错误
6、和不妥之处在所难免,敬请谅解。 编者2007-6-7第一章 设计任务的分析与系统的总体设计1.1 设计任务的分析设计课题的技术指标是:1.软件设计环境。2.系统具有天然气、火、水、盗检测信号输入,实现一个检测信号,其他可用模拟开关代替。3.单片机控制自动摘机、拨号、摘机检测、语音提示。4.具有电话网接口。通过对设计任务书中的技术指标的分析,经过思考、总结后,得出如要完成上述要求主要在于下述几个问题的解决:1.DTMF的产生问题;2.电话号码的输入以及存储功能;3.自动摘挂机功能;4.被叫用户的摘挂机的检测;5.报警信号的检测;6.语音播放的控制问题。为了简化工作的难度、系统的成本以及系统的可嵌
7、入问题,因此本设计直接利用电话机的所具有的以上所讲的1、2的两个功能。而3、4、5中的问题可以通过单片机为核心进行控制。1.2 系统的总体设计4通过对设计任务分析,对系统做出如下总体设计。采用89c52作为控制器件,在其周围加入传感器电路,语音电路,被叫用户摘挂机判别电路等与电话机相结合,这样既方便系统移植同时又方便了对电话机的改造以便适合系统的需要,增强了系统的可嵌入性同时又降低了成本、缩短了开发周期。见图1.2中所示:图1.2 系统总体设计方框图第二章 系统软件设计2.1 系统软件分析第一章中已经阐述了由于受到开发周期的限制,同时也考虑到系统的可嵌入性,故采用电话机已有键盘输入显示功能与D
8、TMF产生功能,而其它各项功能是通过单片机控制实现。此时系统软件主要解决摘挂机、报警信号检测、被叫用户摘挂机的检测以及语音播放功能四个问题。从软件的角度分析,其实就是一个如何运用好中断。系统工作流程是:首先在电话机上存储一个电话号码。然后开机,检测是否有报警信号,如果有则摘机并拨号。检测被叫用户是否摘机,如果被叫用户摘机,则播放语音;如果没有摘机,则延时一段时间后,再次拨号,重复以上的步骤4次后回到检测是否有报警信号。而具体要拨几次号码、拨几个号码都是可以实现的。(设计中只是以一个号码为例没有做那么多,后续课题可以增加该项功能。)此时思路就比较清晰了,其关键问题在于解决被叫用户是否摘机上面。在
9、大多数的解决方案中采用对铃流信号进行判别。也就是对铃流信号进行计时,看它持续几秒,短的铃流软件将判别为忙音,长的铃流软件判别为呼叫音,没有了铃流信号就作为通话双方接通状态处理。这种方法在过去能够实现,现在通过上述方法却很难实现了。问题在于现在的手机彩铃,铃流信号一旦是手机彩铃,而手机彩铃所产生的铃流信号是没有规律的。所以上面检测铃流的方法就毫无用武之地了。因此要想让预设号码不受有彩铃的限制,上述方法就不能使用。通过查找大量的资料发现,在电话接通时和没有接通时是有区别的:未接通到接通电话线的极性刚好交换。所以可以通过这个变化来检测被叫用户是否摘机。这种原始的方法却很有效。通过对以上思路分析,总结
10、出了系统软件流程,如图2.2.1所示。图2.2.1中报警信号检测子程序以及延时子程序和被叫用户摘机的判别子程序是选用了中断的方式而不是查询方式,这是考虑系统是在报警情况下所进行的应急处理对时间有一定的要求。此时就产生了另一个问题,就是如何解决这三个中断的优先级。(同一优先级下让谁优先。)也就是如果这三个中断同时出现先处理哪一个的问题。首先被叫用户摘机中断肯定是优先级最高,因为此时肯定是有了警情处在报警状态,所以它的优先级最高。再次是拨号后延时中断服务子程序优先,同样是因为此时已经有报警信号需要处理正处于拨号的状态或者是被叫用户接听状态。那么报警类型判别中断服务子程序的优先级就最低。如图2.1.
11、1所示。由于89c52单片机中有六个中断,现在只需要使用其中的三个中断:外部中断0,外部中断1,定时器中断0。这三个中在同一优先级里,由查询顺序确定的优先结构,其中外部中断0的最高,其次是定时器中断0,再次是外部中断1。这样可以将被叫用户摘机中断设为外部中断0,同一优先级下它最高;定时器中断使用定时器/计数器0;报警信号处理中断设为外部中断1,在这三个中断中它是最低的。(同一优先级里) 单片机的系统开发是一个软硬件相结合的项目。而软件在前还是硬件在前,还是同时开发,众说纷纭。本设计是采用软件设计优先与硬件的方法,但是必须先明确一下具体要用到哪几个口。通过对该设计总体分析以及上面中断优先级的分析
12、。将P3.2口(口)定为被叫用户中断,P3.3口(口)定为报警信号处理中断。因为本设计采用四声语音芯片,对于不同的警情类型对应的报警语音就需要进行选通,故定义P2.0、P2.1、P2.2、P2.3口为语音播放选通口。P1.0口用作控制继电器,从而控制电话的摘挂机;P1.1口用来控制继电器,从而控制电话机的重拨;P1.2,P1.3,P1.4,P1.5口用来与外设传感器相连,从而使外设与单片机有机的结合。此时看似可以进行编写程序了,其实还是有一个问题。总体设计中表明被叫用户摘机检测电路是要与PSTN相连的,而电话机当然也是和PSTN相连的。这时被叫用户摘机检测电路就相当于另一个电话分机了,当电话机
13、挂断以后,如果被叫用户摘机检测电路没有挂断,其实对于本地电话机还是相当于处于摘机状态,以至于影响下次电话机的使用或者影响下次远程报警,所以也要在被叫用户摘机判别电路中进行控制,使本地话机挂断时被叫用户摘机判别电路也与PSTN断开。此时定义P1.6口为被叫用户摘机判别电路的控制口。现在就可以进行程序的编程了。图2.1.1 中断优先级2.2 程序设计通过软件流程图2.2.1与结构化程序的思想将程序分为如下几个模块:1. 主程序;2. 中断服务子程序;3. 定时器中断服务子程序;4. 中断服务子程序。图2.2.1 程序流程图下面对上述模块分别进行设计:2.2.1 主程序主程序对所要用到的外部中断以及
14、某些端口进行初始化:定时器0,外部中断0,外部中断1,摘挂机置初值,拨号键置初值等。MakeNew() P10=0; P11=0; P16=0; TMOD=0x01; ET0=1; TF0=0; TR0=0; EX0=1; EX1=1; EA=1; 2.2.2 中断服务子程序此部分要对哪种报警类型进行判别、本地的摘机与拨号,然后要对定时器置初值,即拨号后定时器的延时的初值,为进入定时器中断子程序做准备。如下图3.2.2:图2.2.2 外部中断1子程序根据流程图编写出以下程序:void int1() interrupt 2 using 0 P26=1; if(P12=0) nKeyNumber=
15、0x00; if(P13=0) nKeyNumber=0x01; if(P14=0) nKeyNumber=0x02; if(P15=0) nKeyNumber=0x03; Delay(); Delay(); EX1=0; nCounter=0; P10=1; Delay(); P10=0; Delay(); Delay(); Delay(); P11=1; Delay(); P11=0; TMOD=0x01; TH0=0x3c; TL0=0xaf; ET0=1; TF0=0; TR0=1; EX0=1; 2.2.3 定时器中断服务子程序这部分程序主要对拨号后的延时时间进行控制同时也要对播放语
16、音时间进行控制。即在拨号后等待被叫用户摘机延时,若被叫用户摘机,语音播放延时后就停止拨号无需再次进行拨号了。若被叫用户为摘机则进入下次拨号。通过此思路归纳出如下流程图:图2.2.3 定时器0中断子程序按此流程图编写出如下程序:void Timer0_Overflow() interrupt 1 using 0 TH0=0x3c; TL0=0xaf; if(nCounter=400) P10=0; Delay(); if(DisplayYN=1) DisplayYN=0; P10=1; Delay(); P10=0; P11=0; P16=0; k=0; P2=0xff; TMOD=0x01;
17、ET0=1; TR0=0; TF0=0; EX1=1; EA=1;else if(k4) EX1=1; P10=1; Delay(); P10=0; P11=0; P16=0; Delay(); P26=0; k+=1; else k=0; P10=1; P2=0xff; Delay(); P10=0; P11=0; P16=0; EX0=0; ET0=0; TF0=0; TMOD=0x01; TH0=0x3c; TL0=0xaf; EX1=1; ET0=1; TR0=0; EX0=0; EA=1; nCounter+; 2.2.4 中断服务子程序一旦被叫用户摘机就要调用对应的语音函数,这种情
18、况下就需要进行延时,此时使用定时器0实现该功能。按此思路归纳出如下流程图3.2.4:图2.2.4 外部0中断子程序根据流程图编写出如下程序:void int0() interrupt 0 using 0 EX0=0; k=0; P16=1; DisplayYN=1; SoundPlay(); KeyChoose(); P27=0; TMOD=0x01; TH0=0x3c; TL0=0xaf; EX1=0; TF0=0; ET0=1; TR0=1; EA=1;完整的程序如下:#include #include*定义并行口*sbit P10=0x90; / P1.0口控制摘挂机 sbit P11=
19、0x91; / P1.1口控制拨号sbit P12=0x92; / P1.2口传感器信号输入口sbit P13=0x93; / P1.3口传感器信号输入口sbit P14=0x94; / P1.4口传感器信号输入口sbit P15=0x95; / P1.5口传感器信号输入口sbit P16=0x96;sbit P25=0xa5; sbit P26=0xa6; / P2.6口用作置中断1sbit P27=0xa7;sbit P21=0xa1; / P2.1口控制报警音类型sbit P32=0xb2; /外部中断0sbit P33=0xb3; /外部中断1sbit P20=0xa0; / P2.0
20、口控制报警音类型sbit P22=0xa2; / P2.2口控制报警音类型sbit P23=0xa3; / P2.3口控制报警音类型void Delay(); /短延时函数MakeNew(); /初始化函数KeyChoose(); /报警音选择函数Key0_Handler(); /0号报警音Key1_Handler(); /1号报警音Key2_Handler(); /2号报警音Key3_Handler(); /3号报警音void SoundPlay(); /报警音播放函数int nCounter=0; /定时器溢出的计数变量int k=0; /拨号次数变量int nKeyNumber; /报警
21、类型变量bit DisplayYN=0; /被叫用户摘机判别变量main() /主函数 MakeNew(); /初始化 P27=1; P21=1; while(1) if(k=4) /拨号是否到达四次 P10=0; /挂机 P11=0; /停止拨号 P2=0xff; / P2置初值 k=0; /重置拨号次数变量 TMOD=0x01; /定时器0工作方式1 TH0=0x3c; /定时器初值 TL0=0xaf; /定时器初值 ET0=1; /开定时器0 TR0=0; /允许定时器0复位 TF0=0; /定时器0溢出复位 EX0=1; /开外部中断0 EX1=1; /开外部中断1 EA=1; /开全
22、局中断 *初始化程序* MakeNew() P10=0; /挂机 P11=0; /停止拨号 TMOD=0x01; /定时器0工作方式1 ET0=1; /开定时器0 TR0=0; /允许定时器0复位 TF0=0; /定时器0溢出复位 EX0=1; /开外部中断0 EX1=1; /开外部中断1 EA=1; /开全局中断 *中断1进行判别报警类型和延时* void int1() interrupt 2 using 0 P26=1; /置位停止外部中断1 if(P12=0) /是第1种报警信号吗? nKeyNumber=0x00; if(P13=0) /是第2种报警信号吗? nKeyNumber=0x
23、01; if(P14=0) /是第3种报警信号吗? nKeyNumber=0x02; if(P15=0) /是第4种报警信号吗? nKeyNumber=0x03; EX1=0; /开外部中断1 nCounter=0; /定时器0溢出计数变量复位 P10=1; /拨号 Delay(); /延时 P11=1; /重拨 Delay(); /延时 P11=0; TMOD=0x01; /定时器0工作方式1 TH0=0x3c; TL0=0xaf; ET0=1; /开定时器0 TF0=0; /定时器0溢出复位 TR0=1; /定时器0开始工作 *定时器0中断进行延时以及拨号是否4次的判别*和被叫用户是否摘机
24、的判别*void Timer0_Overflow() interrupt 1 using 0 TH0=0x3c; TL0=0xaf; if(nCounter=200) /是否延时十秒了 P10=0; /挂机 Delay(); /延时 if(DisplayYN=1) /被叫用户是否接通判别 DisplayYN=0; /被叫用户摘机判别变量复位 P10=0; P11=0; /停止拨号 TMOD=0x01; /定时器0工作方式1 EX0=1; /开外部中断0 EX1=1; /开外部中断1 EA=1; /开全局中断else if(k4) /拨了四次了吗? EX1=1; /开外部中断1 P10=0; /
25、挂机 P11=0; /停止拨号 Delay(); /延时 P26=0; /触发中断 k+=1; /拨号次数变量加1 else EX0=0; /关外部中断0 ET0=0; /关定时器0 TF0=0; /定时器0溢出复位 P27=0; DisplayYN=1; /被叫用户摘机变量置位 TH0=0x3c; TL0=0xaf; EX1=1; /开外部中断1 ET0=1; /开定时器0 TR0=0; /允许定时器工作位0复位 TF0=0; /定时器0溢出复位 EX0=1; /开外部中断0 EA=1; /开全局中断 nCounter+; /十秒判别变量累加 if(P25=1&P27=0) P27=1; P
26、10=0; P11=0; P2=0xff; TMOD=0x01; TH0=0x3c; TL0=0xaf; EX0=1; EX1=1; EA=1; *中断0 对被叫用户是否摘机进行判别*void int0() interrupt 0 using 0 k=0; /拨号次数变量复位 EX0=0; /关外部中断0 ET0=0; /关定时器0 TF0=0; /定时器0溢出复位 TR0=0; /允许定时器工作位0复位 SoundPlay(); KeyChoose(); /报警类型判别 P27=0; DisplayYN=1; /被叫用户摘机判别变量置位 TH0=0x3c; TL0=0xaf; EX1=1;
27、/开外部中断1 ET0=1; /开定时器0 TR0=1; /允许定时器0工作 EX0=1; /开外部中断0 EA=1; /开全局中断*扩展语音函数暂时没用*void SoundPlay() ;*延时函数用于短暂延时*void Delay() int n,m; for(n=0;n200;n+) for(m=0;m510;m+) ; *报警类别选择函数判别是哪种类型的报警*KeyChoose() switch(nKeyNumber) case(0x00):Key0_Handler(); break; case(0x01):Key1_Handler(); break; case(0x02):Key2_Handler(); break; case(0x03):Key3_Handler(); break; *0号报警函数播放报警语音* Key0_Handler() P20=0;*1号报警函数播放报警语音* Key1_Handler() P21=0;*2号报警函数播放报警语音*