1、基于单片机的智能家居安防系统设计(软件部分)摘 要认真分析了设计任务要求,进行了总体设计方案论证,提出了以单片机为控制核心并通过 PSTN 实现智能家居安防报警系统的方法,尝试了基于 keil 软件 C51 编程,结合 proteus 软件仿真硬件运行的新方法。设计了四种(盗、火、天然气、水)报警功能的智能家居安防远程报警系统,其中火、天然气、水的采集信号使用模拟开关替代,实现了防盗报警信号采集与报警功能。阐明了区别于通过检测铃流信号判别被叫用户是否摘机的另一种方法。主要进行了系统软件的设计、仿真、下载与调试,调试结果和分析表明,设计方案可行,方法正确,达到了设计指标要求。设计任务的完成也为后
2、续课题的开发研究提供了一种行之有效的手段和方法。关键词 单片机;智能安防;远程报警;公用电话网; C512The intelligent alarm system of security based on single-chip Microcomputer Abstract:KeywordsSingle-chip microcomputer; Intelligent alarm system; Long-distance security; PSTN; C51毕业设计说明书(论文)第 3 页 共 52 页目 录序言 第一章 设计任务的分析与系统的总体设计 1.1 设计任务的分析 1.2 系统的
3、总体设计 第二章 系统的软件设计 2.1 软件系统分析 2.2 程序设计 2.2.1 主程序 2.2.2 中断服务子程序 1int2.2.3 中断服务子程序 T02.2.4 中断服务子程序 it第三章 系统的硬件设计 3.1 AT89C52 单片机概述 3.2 硬件系统模块设计 第四章 系统调试 4.1 软件调试 4.2 硬件调试 44.3 综合调试 第五章 结束语 致谢 附录 1 附录 2 附录 3 参考文献 毕业设计说明书(论文)第 5 页 共 52 页基于单片机的智能家居安防系统设计(软件部分)序言随着现代人生活节奏的加快,人们在家中的时间越来越少。此时住宅中无人值守的状态会带来很多的安
4、全隐患,因此就需要一个设备能够让主人安心工作又不必担心家里发生了警情自己却不知道,错过了解决的黄金时间。针对这样的一个背景,设计出此类的系统就有它的必要性,而且这样的系统对于店面等夜间无人值守的地点同样都有它的用武之地。为解决此问题我们设计出这样的系统,该系统以单片机为核心通过 PSTN 实现智能家居安防报警功能,解决了家中无人值守所带来的各种安全隐患。一旦住宅中有警情(天然气、水、盗、火)发生,系统会第一时间检测、判别警情类型,并通过 PSTN远程报警让主人知道家中发生的具体情况,以便及时解决。预置的电话号码类型不受限制(手机号码亦可) 。系统还采用多次拨号的方式,以便解决主人未能及时接到的
5、报警电话。另外该系统还可以安装在拥有 PASN 接口的任何场合,而不仅仅局限于家庭。本论文共分 5 章。第一章为任务书的分析与总体设计;第二章为系统软件设计;第三章为系统硬件设计;第四章为系统调试;第五章为结束语。把系统软件设计放在系统硬件设计之前的原因是我们软件设计优先于硬件设计。设计过程中我们采取了分工与合作的方法,我负责软件的编写与调试。张峰同学负责硬件电路的设计、安装和调试,综合调试由我们共同完成。在设计过程中,软硬件的功能总是不断的调整,以便相适应。硬件设计和软件设计是不能截然分开的,硬件设计时应考虑软件设计的方法,而软件设计时应了解硬件的工作原理,在整个设计过程我们互相协调,提高了
6、工作效率。在本次毕业设计中我们的指导老师陶为戈为此次设计付出了大量辛勤的劳动,在很多问题上给予指导性的意见,同时在毕业设计的过程中得到了系各级领导的关心和指导,在此表示由衷的感谢!由于毕业设计时间紧工作量大,错误和不妥之处在所难免,敬请谅解。编者2007-6-76第一章 设计任务的分析与系统的总体设计1.1 设计任务的分析设计课题的技术指标是:1.软件设计环境。2.系统具有天然气、火、水、盗检测信号输入,实现一个检测信号,其他可用模拟开关代替。3.单片机控制自动摘机、拨号、摘机检测、语音提示。4.具有电话网接口。通过对设计任务书中的技术指标的分析,经过思考、总结后,得出如要完成上述要求主要在于
7、下述几个问题的解决:1.DTMF 的产生问题;2.电话号码的输入以及存储功能;3.自动摘挂机功能;4.被叫用户的摘挂机的检测;5.报警信号的检测;6.语音播放的控制问题。为了简化工作的难度、系统的成本以及系统的可嵌入问题,因此本设计直接利用电话机的所具有的以上所讲的 1、2 的两个功能。而 3、4、5 中的问题可以通过单片机为核心进行控制。1.2 系统的总体设计 4通过对设计任务分析,对系统做出如下总体设计。采用 89c52 作为控制器件,在其周围加入传感器电路,语音电路,被叫用户摘挂机判别电路等与电话机相结合,这样既方便系统移植同时又方便了对电话机的改造以便适合系统的需要,增强了系统的可嵌入
8、性同时又降低了成本、缩短了开发周期。见图 1.2 中所示:毕业设计说明书(论文)第 7 页 共 52 页图 1.2 系统总体设计方框图8第二章 系统软件设计2.1 系统软件分析第一章中已经阐述了由于受到开发周期的限制,同时也考虑到系统的可嵌入性,故采用电话机已有键盘输入显示功能与 DTMF 产生功能,而其它各项功能是通过单片机控制实现。此时系统软件主要解决摘挂机、报警信号检测、被叫用户摘挂机的检测以及语音播放功能四个问题。从软件的角度分析,其实就是一个如何运用好中断。系统工作流程是:首先在电话机上存储一个电话号码。然后开机,检测是否有报警信号,如果有则摘机并拨号。检测被叫用户是否摘机,如果被叫
9、用户摘机,则播放语音;如果没有摘机,则延时一段时间后,再次拨号,重复以上的步骤 4 次后回到检测是否有报警信号。而具体要拨几次号码、拨几个号码都是可以实现的。 (设计中只是以一个号码为例没有做那么多,后续课题可以增加该项功能。 )此时思路就比较清晰了,其关键问题在于解决被叫用户是否摘机上面。在大多数的解决方案中采用对铃流信号进行判别。也就是对铃流信号进行计时,看它持续几秒,短的铃流软件将判别为忙音,长的铃流软件判别为呼叫音,没有了铃流信号就作为通话双方接通状态处理。这种方法在过去能够实现,现在通过上述方法却很难实现了。问题在于现在的手机彩铃,铃流信号一旦是手机彩铃,而手机彩铃所产生的铃流信号是
10、没有规律的。所以上面检测铃流的方法就毫无用武之地了。因此要想让预设号码不受有彩铃的限制,上述方法就不能使用。通过查找大量的资料发现,在电话接通时和没有接通时是有区别的:未接通到接通电话线的极性刚好交换。所以可以通过这个变化来检测被叫用户是否摘机。这种原始的方法却很有效。通过对以上思路分析,总结出了系统软件流程,如图 2.2.1 所示。图 2.2.1 中报警信号检测子程序以及延时子程序和被叫用户摘机的判别子程序是选用了中断的方式而不是查询方式,这是考虑系统是在报警情况下所进行的应急处理对时间有一定的要求。此时就产生了另一个问题,就是如何解决这三个中断的优先级。(同一优先级下让谁优先。 )也就是如
11、果这三个中断同时出现先处理哪一个的问题。首先被叫用户摘机中断肯毕业设计说明书(论文)第 9 页 共 52 页定是优先级最高,因为此时肯定是有了警情处在报警状态,所以它的优先级最高。再次是拨号后延时中断服务子程序优先,同样是因为此时已经有报警信号需要处理正处于拨号的状态或者是被叫用户接听状态。那么报警类型判别中断服务子程序的优先级就最低。如图 2.1.1 所示。由于 89c52 单片机中有六个中断,现在只需要使用其中的三个中断:外部中断0,外部中断 1,定时器中断 0。这三个中在同一优先级里,由查询顺序确定的优先结构,其中外部中断 0 的最高,其次是定时器中断 0,再次是外部中断 1。这样可以将
12、被叫用户摘机中断设为外部中断 0,同一优先级下它最高;定时器中断使用定时器/计数器 0;报警信号处理中断设为外部中断 1,在这三个中断中它是最低的。 (同一优先级里)单片机的系统开发是一个软硬件相结合的项目。而软件在前还是硬件在前,还是同时开发,众说纷纭。本设计是采用软件设计优先与硬件的方法,但是必须先明确一下具体要用到哪几个口。通过对该设计总体分析以及上面中断优先级的分析。将 P3.2口( 口)定为被叫用户中断,P3.3 口( 口)定为报警信号处理中断。因为本0int 1int设计采用四声语音芯片,对于不同的警情类型对应的报警语音就需要进行选通,故定义 P2.0、P2.1、P2.2、P2.3
13、 口为语音播放选通口。P1.0 口用作控制继电器,从而控制电话的摘挂机;P1.1 口用来控制继电器,从而控制电话机的重拨;P1.2,P1.3,P1.4,P1.5口用来与外设传感器相连,从而使外设与单片机有机的结合。此时看似可以进行编写程序了,其实还是有一个问题。总体设计中表明被叫用户摘机检测电路是要与 PSTN 相连的,而电话机当然也是和 PSTN 相连的。这时被叫用户摘机检测电路就相当于另一个电话分机了,当电话机挂断以后,如果被叫用户摘机检测电路没有挂断,其实对于本地电话机还是相当于处于摘机状态,以至于影响下次电话机的使用或者影响下次远程报警,所以也要在被叫用户摘机判别电路中进行控制,使本地
14、话机挂断时被叫用户摘机判别电路也与 PSTN 断开。此时定义 P1.6 口为被叫用户摘机判别电路的控制口。现在就可以进行程序的编程了。10图 2.1.1 中断优先级2.2 程序设计通过软件流程图 2.2.1 与结构化程序的思想将程序分为如下几个模块:1. 主程序;2. 中断服务子程序;1int3. 定时器 中断服务子程序;04. 中断服务子程序。it图 2.2.1 程序流程图下面对上述模块分别进行设计:毕业设计说明书(论文)第 11 页 共 52 页2.2.1 主程序主程序对所要用到的外部中断以及某些端口进行初始化:定时器 0,外部中断 0,外部中断 1,摘挂机置初值,拨号键置初值等。Make
15、New() P10=0;P11=0;P16=0;TMOD=0x01;ET0=1;TF0=0;TR0=0;EX0=1;EX1=1;EA=1;2.2.2 中断服务子程序1int此部分要对哪种报警类型进行判别、本地的摘机与拨号,然后要对定时器置初值,即拨号后定时器的延时的初值,为进入定时器中断子程序做准备。如下图 3.2.2:图 2.2.2 外部中断 1 子程序根据流程图编写出以下程序:void int1() interrupt 2 using 0 12P26=1;if(P12=0)nKeyNumber=0x00;if(P13=0)nKeyNumber=0x01;if(P14=0)nKeyNumbe
16、r=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;毕业设计说明书(论文)第 13 页 共 52 页2.2.3 定时器 中断服务子程序t0这部分程序主要对拨号后的延时时间进行控制同时也要对播放语音时间进行控制。即在拨号后等待被叫用户摘机延时,若被叫用户摘机,语音播放延时后就停止拨号无需再次
17、进行拨号了。若被叫用户为摘机则进入下次拨号。通过此思路归纳出如下流程图:图 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;14P11=0;P16=0;k=0;P2=0xff;TMOD=0x01;ET0=1;TR0=0;TF0=0;EX1=1;EA=1;else if(k #include*定义并行口*sb
18、it P10=0x90; / P1.0 口控制摘挂机 sbit P11=0x91; / P1.1 口控制拨号sbit P12=0x92; / P1.2 口传感器信号输入口sbit P13=0x93; / P1.3 口传感器信号输入口sbit P14=0x94; / P1.4 口传感器信号输入口毕业设计说明书(论文)第 17 页 共 52 页sbit P15=0x95; / P1.5 口传感器信号输入口sbit P16=0x96;sbit P25=0xa5; sbit P26=0xa6; / P2.6 口用作置中断 1sbit P27=0xa7;sbit P21=0xa1; / P2.1 口控制
19、报警音类型sbit P32=0xb2; /外部中断 0sbit P33=0xb3; /外部中断 1sbit P20=0xa0; / P2.0 口控制报警音类型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 SoundP
20、lay(); /报警音播放函数int nCounter=0; /定时器溢出的计数变量int k=0; /拨号次数变量int nKeyNumber; /报警类型变量bit DisplayYN=0; /被叫用户摘机判别变量main() /主函数 MakeNew(); /初始化P27=1;P21=1;while(1) if(k=4) /拨号是否到达四次18 P10=0; /挂机P11=0; /停止拨号P2=0xff; / P2 置初值k=0; /重置拨号次数变量TMOD=0x01; /定时器 0 工作方式 1TH0=0x3c; /定时器初值TL0=0xaf; /定时器初值ET0=1; /开定时器 0
21、TR0=0; /允许定时器 0 复位TF0=0; /定时器 0 溢出复位EX0=1; /开外部中断 0EX1=1; /开外部中断 1EA=1; /开全局中断*初始化程序*MakeNew() P10=0; /挂机P11=0; /停止拨号TMOD=0x01; /定时器 0 工作方式 1ET0=1; /开定时器 0TR0=0; /允许定时器 0 复位TF0=0; /定时器 0 溢出复位EX0=1; /开外部中断 0EX1=1; /开外部中断 1EA=1; /开全局中断毕业设计说明书(论文)第 19 页 共 52 页*中断 1 进行判别报警类型和延时*void int1() interrupt 2 u
22、sing 0 P26=1; /置位停止外部中断 1if(P12=0) /是第 1 种报警信号吗?nKeyNumber=0x00; if(P13=0) /是第 2 种报警信号吗?nKeyNumber=0x01; if(P14=0) /是第 3 种报警信号吗?nKeyNumber=0x02;if(P15=0) /是第 4 种报警信号吗?nKeyNumber=0x03;EX1=0; /开外部中断 1nCounter=0; /定时器 0 溢出计数变量复位P10=1; /拨号Delay(); /延时P11=1; /重拨Delay(); /延时P11=0; TMOD=0x01; /定时器 0 工作方式 1
23、TH0=0x3c;TL0=0xaf;ET0=1; /开定时器 0TF0=0; /定时器 0 溢出复位TR0=1; /定时器 0 开始工作*20*定时器 0 中断进行延时以及拨号是否 4 次的判别*和被叫用户是否摘机的判别*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=0x0
24、1; /定时器 0 工作方式 1EX0=1; /开外部中断 0EX1=1; /开外部中断 1EA=1; /开全局中断else if(k4) /拨了四次了吗? EX1=1; /开外部中断 1P10=0; /挂机P11=0; /停止拨号Delay(); /延时P26=0; /触发中断k+=1; /拨号次数变量加 1else EX0=0; /关外部中断 0ET0=0; /关定时器 0毕业设计说明书(论文)第 21 页 共 52 页TF0=0; /定时器 0 溢出复位P27=0;DisplayYN=1; /被叫用户摘机变量置位TH0=0x3c;TL0=0xaf;EX1=1; /开外部中断 1ET0=1
25、; /开定时器 0TR0=0; /允许定时器工作位 0 复位TF0=0; /定时器 0 溢出复位EX0=1; /开外部中断 0EA=1; /开全局中断nCounter+; /十秒判别变量累加if(P25=1P10=0;P11=0;P2=0xff;TMOD=0x01;TH0=0x3c;TL0=0xaf;EX0=1;EX1=1;EA=1;22*中断 0 对被叫用户是否摘机进行判别*void int0() interrupt 0 using 0 k=0; /拨号次数变量复位EX0=0; /关外部中断 0ET0=0; /关定时器 0TF0=0; /定时器 0 溢出复位TR0=0; /允许定时器工作位
26、0 复位SoundPlay();KeyChoose(); /报警类型判别P27=0;DisplayYN=1; /被叫用户摘机判别变量置位TH0=0x3c;TL0=0xaf;EX1=1; /开外部中断 1ET0=1; /开定时器 0TR0=1; /允许定时器 0 工作EX0=1; /开外部中断 0EA=1; /开全局中断*扩展语音函数暂时没用*void SoundPlay() ;*毕业设计说明书(论文)第 23 页 共 52 页*延时函数用于短暂延时*void Delay() int n,m; for(n=0;n200;n+)for(m=0;m510;m+);*报警类别选择函数判别是哪种类型的报
27、警*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;24*1 号报警函数播放报警语音*Key1_Handler()P21=0;*2 号报警函数播放报警语音*Key2_Handler()P22=0;*3 号报警函数播放报警语音*Key3_Handler()P23=
28、0;毕业设计说明书(论文)第 25 页 共 52 页第三章 系统的硬件设计3.1 AT89C52 单片机概述一、 单片机的发展与构成现在计算机采用了大规模集成电路,具有功能强、结构紧凑、系统可靠等特征。随着半导体技术的发展,能够在一个硅片上制作几百万个晶体管,于是出现了大规模集成电路的中央处理器微处理器(CPU) ,以及大容量的半导体存储器,通用或专用输入/输出(I/O)接口电路,包含多种类型 I/O 的综合外围电路,由这些大规模集成电路组成各种类型的微型计算机。从 20 世纪 70 年代开始,半导体厂商把微型机的最基本的部件制作在一个硅片内,于是就出现了一个大规模集成电路为主组成的微型计算机
29、单片微型计算机(single chip microcomputer)简称单片机。由于单片机面向控制应用领域,装入到各种智能化产品之中,所以又称为嵌入式控制器(embedded microcontroller).如一般的计算机系统一样,单片机的应用系统由硬件和软件所组成。硬件指单片机扩展的存储器、输入/输出设备等硬部件组成的机器。软件是各种工作程序的总称。硬件和软件只有紧密配合、协调一致,才能组成高性能的单片机应用系统。在系统的研制过程中,软硬件的功能总是不断地调整,以便相互适应。硬件设计和软件设计不能截然分开,硬件设计时应考虑软件设计方法,而软件设计时应了解硬件的工作原理,在真个研制过程中互相
30、协调,以利于提高工作效率。在单片机内部包含计算机的基本功能部件:中央处理器(CPU) 、存储器(memory) 、 (I/O)接口电路。二、单片机类型的选择及开发步骤AT89C52 单片机是一种低功耗、高性能、内含 8KB 的闪速存储器(Flash Memory)的 8 位 CMOS 微控制器。这种器件系以 ATMEL 高密度非易失性的存储技术制造,与工业标准 MCS51 指令系统和引脚完全兼容。片内闪速存储器的程序代码或数据可在线写入,也可通过常规的编程器编程。常用的开发步骤如下图:26开始确定任务、系统功能、技术指标选择机型、划分软硬件功能硬件逻辑框图设计软件结构设计选择器件、完成逻辑设计
31、确定算法、程序流程设计加工组装样机编写程序样机静态测试插上器件 程序编译、部分软件调试联仿真器调试测试样机硬件有故障否?调整样机硬件仿真运行目标程序有错误否?调整硬件、修改软件毕业设计说明书(论文)第 27 页 共 52 页图.1 单片机应用系统研制过程283.2 硬件系统模块设计图 . 硬件电路图毕业设计说明书(论文)第 29 页 共 52 页第四章 系统调试4.1 软件调试程序编写要注意:检测是否有报警信号是通过门电路将四路报警信号与外部中断1 相接,如果有报警进入外部中断程序。在进入之前,首先要开中断 EX0=1,再开全局中断 EA=1。摘机与拨号之间需要一个延时程序,此延时对精确度要求
32、不高,因此就没必要用定时器中断延时,可以采用如下延时小程序:void Delay() int n,m; for(n=0;n200;n+)for(m=0;m510;m+);对于拨号后的长延时可以用定时器/计数器 0 中断编写。此时就要注意区分定时器与计数器,如果是定时器就不需要外设,而计数器模式就是通过 T0 口对外部的脉冲进行计数,进行这项控制的是 TMOD,如:TMOD=0x04;它就是计数器 0 模式,而TMOD=0x00;就是定时器模式,在编程时需要加以区分,如果使用不当会使定时器/计数器错误工作。判别对方是否摘机就是看是否进入外部中断 0 服务程序,这主要取决于硬件电路。我们通过对摘挂
33、机过程进户线的极性存在跳变这一现象进行的硬件检测配合软件中的外部中断 0 子程序实现的。通过软件的仿真发现软件中碰到了如下问题:1. 不能进行中断 1 的处理;2. 不能进行中断 0 的处理;303. 四次循环不能正常;4. 在进行某个中断时却可以进行其它的中断;对于问题 1,通过软件仿真和软件的查找发现对 P1 口置了 1,而我是用 0 表示中断的,1 碰到 0 发生冲突,所以不能够进行中断 1,也就是有报警信号却不能处理;问题 2 是因为硬件的问题,通过对硬件的改进,解决了这个问题;问题 3 的确是循环了四次,只是四次结束了之后,由于定时器没有关,处理中断之后就进行了再次的循环,所以不正常
34、。在四次循环结束后将定时器关断,这样就不会循环不止了。问题 4 其实和问题 3 差不多,及时关断不需要用的中断,这样就不会处理某个中断时还能处理其它中断了。总结:需要用某个中断功能时就将它打开,不用时就将它关闭,这样可以避免不必要的麻烦。可以编制单片机的软件有很多,我们选择了两款软件 keil 以及 proteus,尝试着配合使用它们,大大的缩短了研发时间。现在对 keil 和 proteus 进行一个简单的介绍。4.1.1 keil 的使用Keil 是 51 系列单片机编译的常用软件,特别在 c 语言与汇编的混合编程的方面的功能尤为强大。因为 c 语言的可读性强、可移植性好而且程序员不需要对
35、硬件了解的太多就可以编写,缺点在于它在时间要求比较严格的场合不能做到很精确,这恰恰是汇编语言的优点,所以这一部分可以用汇编编写,再将它们混合在一起。这样就结合了汇编语言与 c 语言的优点于一身了。Keil 还可以对编写的无其它硬件要求的程序仿真,极大地提高了开发周期。下面对 keil 的一般使用作一个简单的介绍。单击 File菜单下的 “new”菜单项中创建新工程,出现对话框后,提示输入工程名及选择保存的文件夹。选择文件夹 Test 并在文件名编辑框中输入 Test,表示工程名为 Test。保存完工程之后,弹出用于选择 CPU 期间的对话框,在这里选择 ATMEL 公司的 AT89C52,按确定按钮进入下一步骤。之后弹出对话框,提示是否将标准的 8051 启动代码文件拷贝到工程目录下,且把该文件加入到工程中,在这里选择“是”进入下一部。在 File菜单下选择“new”菜单项新建源文件,输入源文件如图 4.1.1 所示。