基于单片机的防盗报警器的毕业设计_第1页
基于单片机的防盗报警器的毕业设计_第2页
基于单片机的防盗报警器的毕业设计_第3页
基于单片机的防盗报警器的毕业设计_第4页
基于单片机的防盗报警器的毕业设计_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于单片机的防盗报警器的设计摘要:本文介绍了基于AT89S52单片机控制的由EEPROM和LED组成的防盗报警器的控制电路和控制程序的设计。首先本文对AT89S52单片机和EEPROM的24C04存储器芯片原理做了介绍,同时分析了防盗报警器控制原理,经过分析,设计出能实现存储报警号码及自动报警的防盗报警0器硬件电路和单片机程序。最后利用Proteus仿真软件对该系统进行仿真,查看效果。关键词:单片机,24C04,ADesignofTheft-proofAlarmBasedonMCUAbstract:Thisarticledescribesadesignoftheft-proofalarmcontrolcircuitandcontrolproceduresbasedontheAT89S52MCU’controlingonEEPROM24c04andtheLED.First,thispaperintroducetheAT89S52andtheworkingprincipleoftheEEPROM24C04,andanalyzestheburglaralarmcontrolprinciple.Afteranalysis,thisarticledesignoutthecircuitandmicrocontrollerprocedureofthetheft-proofalarmtwhichcansavethealarmnumberandautosendoutthealarmsignal.Finally,thisarticleusetheProteussimulationsoftwaretosimulatethesystemtoviewtheresults.Keyword:MCU,24C04,Proteus目录1引言11.1防盗报警控制器研究背景11.1.1防盗报警器概述11.2单片机技术简介21.3Keil技术简介21.4Proteus技术简介41.5本课题的主要内容、要求及说明书安排41.5.1主要内容、要求41.5.2说明书安排52系统结构及硬件电路设计62.1系统的结构框图及工作原理62.2电源模块62.3AT89S52单片机最小系统72.4键盘模块82.5显示模块102.6EEPROM113程序设计133.1主程序流程133.2键盘输入模块的程序设计133.3数码管显示模块的程序设计153.4EEPROM的驱动程序设计163.2.124C04的I2C总线构成及其协议163.2.224C04的I2C总线根本操作183.2.224C04的驱动子程序194Proteus仿真204.1Proteus7.5SP3简介204.2仿真流程215结论25参考文献26致谢28附录A291引言本文详细介绍了一种基于单片机和EEPROM的防盗报警控制器的设计。以下对该系统所涉及的原理和应用到的技术,如:单片机技术、Keil技术、Proteus等做了简要的介绍。1.1防盗报警控制器研究背景随着社会的不断开展,人们对室内财产的平安要求也越来越高,而比拟普遍的防盗措施是安装防盗报警装置,而防盗报警器的控制电路和控制程序在整个防盗报警装置中处于重要地位。1.1.1防盗报警器概述防盗报警系统是用物理方法或电子技术,自动探测发生在布防监测区域内的侵入行为,产生报警信号,并提示值班人员发生报警的区域部位,显示可能采取对策的系统。防盗报警系统是预防抢劫、盗窃等意外事件的重要设施。一旦发生突发事件,就能通过声光报警信号在安保控制中心准确显示出事地点,使于迅速采取应急措施。防盗报警系统与出入口控制系统、闭路电视监控系统、访客对讲系统和电子巡更系统等一起构成了平安防范系统。防盗报警系统通常由:探测器和传输通道、报警控制器、报警装置三局部构成。报警探测器是由传感器和信号处理组成的,用来探测入侵者入侵行为的,由电子和机械部件组成的装置。传输通道是探测器与警控制器的之间的信道,用来传输探测器的信号给报警控制电路。报警装置那么是采用声、光、电等信号采取的报警措施。报警控制器经过分析探测器传来的信号,驱动报警装置,做出相应的处理。随着科学技术的进步,为对付不断升级的偷盗手段,人们研制开发了不同方式结构的防盗器。第一代是机械式防盗器第二代是电子式防盗器第三代是芯片式数码防盗器第四代是网络防盗系统采用不同原理的探测器、报警器就可以构成不同种类、不同用途、到达不同探测目的的报警探测装置。而报警控制器那么相对统一,变化不大,但又处于整个报警系统的重要地位。没有报警控制器那么无法对探测器的信号进行分析处理,同时无法控制报警装置发出报警信号。1.2单片机技术简介单片机简称单片微型计算机,是典型的嵌入式微控制器〔MicrocontrollerUnit〕,常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能〔可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路〕集成到一块硅片上构成的一个小而完善的计算机系统,使得计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的开展便分道扬镳。单片机是靠程序运行的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些那么是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!因为单片机的只要通过编写程序就可以可以实现高智能,高效率,以及高可靠性!单片机的应用目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的平安保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域。1.3Keil技术简介KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。单片机开发中除必要的硬件外,同样离不开软件,我们写的汇编语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断开展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断开展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境〔uVision〕将这些局部组合在一起。运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统。掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选〔目前在国内你只能买到该软件、而你买的仿真机也很可能只支持该软件〕,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。1.系统概述KeilC51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到KeilC51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能表达高级语言的优势。下面详细介绍KeilC51开发系统各局部功能和使用。2.KeilC51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51forWindows和forDos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及C51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创立生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。1.4Proteus技术简介Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2023年增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。Proteus软件提供了丰富的资源〔1〕Proteus可提供的仿真元器件资源:仿真数字和模拟、交流和直流等数千种元器件,有30多个元件库。〔2〕Proteus可提供的仿真仪表资源:示波器、逻辑分析仪、虚拟终端、SPI调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。理论上同一种仪器可以在一个电路中随意的调用。〔3〕除了现实存在的仪器外,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多。这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。这些都尽可能减少了仪器对测量结果的影响。〔4〕Proteus可提供的调试手段Proteus提供了比拟丰富的测试信号用于电路的测试。这些测试信号包括模拟信号和数字信号。1.5本课题的主要内容、要求及说明书安排1.5.1主要内容、要求本课题主要在研究单片机的工作原理后,选用适宜的单片机存取EEPROM存储器,设计相应的硬件电路,并配合相应的软件编程编写控制程序,最后使用Proteus仿真软件对防盗报警器的控制电路和控制程序进行仿真。工作内容:掌握一种单片机应用,如AT89S52;掌握EEPROM(24C04)的工作原理;掌握Keil程序设计软件;掌握Proteus仿真软件。工作要求:设计相应的报警控制器硬件电路;编写相应的报警控制器软件程序;使用Proteus仿真软件,实现系统功能仿真;1.5.2说明书安排本文详细介绍了防盗报警器的控制电路和控制程序的设计。共分为五章,内容安排如下:第一章:介绍了研究背景及利用到的主要技术。第二章:概括介绍了系统结构和工作原理,同时具体介绍了系统的硬件设计,详细介绍了整个系统的各个模块的电路设计、器件选型及理由。第三章:具体介绍了单片机程序的设计。第四章:具体介绍了如何利用Proteus进行系统仿真。第五章:总结了本次毕业设计取得的成果和心得2系统结构及硬件电路设计2.1系统的结构框图及工作原理EEPROMAT89S52最小系统电源模块EEPROMAT89S52最小系统电源模块显示模块键盘模块本系统采用单片机AT89S52为控制核心,系统主要由四个模块:电源模块、AT89S52最小系统、EEPROM存储模块、LED和数码管显示模块构成:1、电源模块作为整个系统的各个模块提供稳定的电源。2、AT89S52最小系统作为控制系统,控制着整个系统的功能实现。3、键盘模块提供了人机交流的输入控制功能。4、显示模块由LED和数码管组成,提供了人机交流的显示功能。2.2电源模块本系统中芯片的工作电压有5V。可以利用外部9V电池然后利用7805进行电压调整获得5V稳定电压值。7805为3端正稳压电路,提供固定的输出电压,应用范围广。内含过流、过热和过载保护电路。带散热片时,输出电流可达1A。虽然是固定稳压电路,但使用外接元件,可获得不同的电压和电流。其主要特点如下:输出电流可达1A输出电压有:5V过热保护短路保护输出晶体管SOA保护其TO-220封装结构如图2-2所示图2-27805封装结构图图2-35V电源模块图D1为电源指示灯,用以指示电源正常工作。图中C1电源滤波电容,稳定电源电压,亦为抗冲击电容,防止上电时产生的冲击电压过大而影响后续电路。C2为去耦电容,防止干扰信号返回电源影响其正常。2.3AT89S52单片机最小系统本设计的的单片机采用Atmel公司的AT89S52。AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。AT89S52最小系统包括晶体振荡电路、复位开关和电源局部。电源局部有电源模块提供稳定的电压。图2-4为AT89S52的最小系统原理图。如图2-4所示C4、C5、X1组成晶体振荡电路连接到单片机的XTAL1、XTAL2引脚上。C3、R11和按键开关组成复位电路连接到单片机的RST引脚上。图2-4AT89S52单片机最小系统2.4键盘模块在单片机应用系统中,特别是在工业测控和智能化仪器仪表中,通常都要有人人机对话功能,他包括人对应用系统的状态干预、数据的输入以及应用系统向人报告运行状态和运行结果,这就需要配接键盘和显示器等外设。本节结束键盘的接口技术。键盘电路的设计应使CPU能识别是否有键按下以及是哪一个键按下,并将此键所代表的信息翻译成所能接收的形式,例如ASCII码或预定的其他编码。键盘按接口原理可分为全编码方式和非编码方式两种。全编码方式有硬件逻辑来提供与被按键对应的编码。非编码方式只简单地提供输入按键连接电路,其他的工作靠软件来完成,具有经济实用的特点。对于一个键盘或一组按键,单片机系统利用一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无按键输入并检查是哪一个键按下,将该键号保存在某一变量中,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。按键一般是由机械触点构成的。当机械触点断开、闭合时,会有抖动,如下列图2-5所示。在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是屡次操作,这种情况是不允许出现的。所以就必须对按键进行消抖。常用的有硬件方法、软件方法两种。软件方法具有硬件设计简易、本钱低等特点。图2-5键盘抖动由上所述,考虑到本设计中按键不多,且单片机的接口较多,同时考虑简易经济性,本设计采用由软件消抖的非编码方式独立键盘电路,如图2-6所示。图2-6键盘输入模块在图2-6的电路中,按键输入都采用低电平有效,上拉电阻保证了按键断开时I/O口由确定的高电平。2.5显示模块在单片机应用系统中,为了观察单片机的运行情况,进行人机之间的交流,通常采用显示器作为其输出设备,用于显示输入键值中间信息及运算结果等。本设计采用常用的发光二极管〔LED=LightEmittingDiode〕显示器,即7段数码管和LED指示灯。他们具有耗电省、线路简单、价格低廉、安装方便、耐振动等优点。我们最常用的是七段式和八段式LED数码管,八段比七段多了一个小数点,其他的根本相同。所谓的八段就是指数码管里有八个小LED发光二极管,通过控制不同的LED的亮灭来显示出不同的字形。数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个LED的阴极连在一起,让其接地,这样给任何一个LED的另一端高电平,它便能点亮。而共阳极就是将八个LED的阳极连在一起。其原理图如下。图2-7数码管显示器外形结构及两种连接方式在本设计中采用共阴极连接方式,原理图如图2-8所示。图2-8数码管显示器连接电路在图2-8所示的数码管显示器连接电路中,考虑到单片机的输出电流有限,所以在P0端口与数码管之间接入一个上拉电阻到+5V,确使在P0口输出高电平时,VCC与P0口同时给数码管供电,这样可以减小P0口的输出电流保护端口。上拉电阻是用来限制电流的。对照图2-7所示的字段,字型码各位定义如表2-1所示。可以看出,如果要显示“7〞字形,a、b、c、三个字段应点亮,所以对应的字型码为00000111B,依此类推可写出所要显示的各字形码存放在程序存储器的固定区域中,构成显示代码表。表2-1P0.0P0.1P0.2P0.3P0.4P0.5P0.6abcdefg对于系统中的指示灯,本设计采用如图2-9所示的电路。图中D2为LED指示灯,R5作为限流电阻。P1口可输出5V电压,LED导通时压降为1.7V左右,通常电流限制在10mA以下,所以R5的阻值不小于330欧姆〔〔5-1.7〕V/10mA〕。在本设计中采用500欧姆。图2-9LED指示电路2.6EEPROMEEPROM(ElectricallyErasableProgrammableRead-OnlyMemory),电可擦可编程只读存储器,一种掉电后数据不丧失的存储芯片。EEPROM可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。在本设计中使用24C04。24C04是一个4K位串行CMOSEEPROM,内部含有512个8位字节。其内部有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作,同时有一个专门的写保护功能。与400KHzI2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能:当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期1,000,000编程/擦除周期可保存数据100年8脚DIP、SOIC或TSSOP封装图2-10为24C04的管脚配置,同时在表2-2给出了各管脚简易功能描述。图2-1024C04管脚配置表2-224C04管脚描述图2-11EEPROM电路原理图如图2-11所示为本设计的EEPROM电路原理图。3程序设计本系统的单片机程序利用KeiluVisionV4.02进行程序设计,以下介绍整个系统的程序流程,具体程序参见附录。主程序流程开始变量定义端口初始化开始变量定义端口初始化无操作?NoYes数码管初始化当前状态判断报警?显示、计时Yes输入?显示、保存Yes查找?显示、保存YesNoNoNo图3-1主程序流程图如3-1所示图所示为单片机的主程序流程图。首先进行各个模块的初始化工作,如变量定义、单片机端口和EERPOM端口初始化、显示模块初始化等。然后进入程序的主流程,判断系统的当前状态,扫描键盘输入确定状态后,执行相应的处理。键盘输入模块的程序设计本设计采用由软件消抖的非编码方式独立键盘电路,所以在进行键盘输入模块的程序设计时,需考虑两个过程:1、键盘按键的识别;2、消抖。首先在程序中定义各个键盘的输入信号管脚,如下所示。在key_input=0时代表输号键被按下,其他按键同此。sbitkey_input =P1^0; //输号sbitkey_find =P1^1; //查号sbitkey_reset =P1^2; //复位sbitkey_jingbao=P1^6; //警报信号然后在一个子程序中实现键盘的识别及消抖。本系统中把键盘的输入状态作为整个系统的状态,所以定义一个ucharstate(void)子程序,其返回值为键盘的当前状态,其定义如下:#definestate_null 0 //无按键状态#definestate_input 1 //输号键按下#definestate_find 2 //查询键按下#definestate_reset 3 //复位键按下#definestate_jingbao 4 //报警键按下在ucharstate(void)子程序中本设计利用变量keycount的条件自加来实现消抖和长短按键的识别过程。每次进入子程序时keycount清零,然后进入循环,keycount自加,同时查询按键状态:当keycount自加到N1时,表示长按,那么返回状态值,退出子程序;当无按键按下时,退出按键查询循环,并判断keycount是否小于于N2,即是否为抖动,当keycount<N2时,为抖动信号那么返回0,当keycount>=N2时,为有效按键返回状态值。整个ucharstate(void)子程序流程如图3-2所示。开始开始Keycount=0按键?YesKeycount自加返回按键值长按?返回按键值No保存按键值抖动?NoNo退出子程序YesYes图3-2主程序流程图数码管显示模块的程序设计由上章所述,本设计利用table数组保存字形码,作为显示代码表,如下所示:ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//0123456789 0x3e,0x73,0x7c,0x40//“U〞-10,“P〞-11,“b〞-12,“-〞-13};由table数组可知,总共可以显示0~9、U、P、b、-共14个字符。同时在程序中编写Display(uchardata_disp)函数,data_disp为要显示的字符,程序如下:voidDisplay(uchardata_disp){ if(data_disp>=13) //不在表内 P0=table[13]; //显示“-〞 else //表内 P0=table[data_disp]; //查表显示}对于LED指示灯,本设计中采用高电平点亮的方式,利用P0.7端口控制。由此在程序中定义sbitLed=P1^7,当LED=0时,输出低电平,LED灯灭,当LED=1时,输出高电平,LED灯亮。EEPROM的驱动程序设计本设计中利用EEPROM〔24C04〕来存储报警用的号码,24C04支持I2C总线数据传送协议,要在单片机系统中应用I2C总线的24C04做存储设备时,先要了解I2C总线的根本驱动方法,以下介绍24C04的I2C驱动程序3.4.124C04的I2C总线构成及其协议I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。I2C总线协议规定任何将数据传送到总线的器件作为发送器,任何从总线接收数据的器件为接收器,数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式。在本设计中AT89S52单片机作为主器件,通过器件地址输入端A0、A1的不同设置,可以实现将最多4个24C04器件连接到总线上。由上一章所述的电路设计,本设计中只用一个24C04,其地址为[A1、A0]为[0、0],写保护无效。242C04管脚描述如下:SCL:串行时钟输入管脚,用于产生器件所有数据发送或接收的时钟。SDA:双向串行数据/地址管脚,用于器件所有数据的发送或接收,SDA是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或〔wire-OR〕。A0、A1、A2:器件地址输入端,用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0WP:写保护管脚,如果WP管脚连接到Vcc,所有的内容都被写保护,只能读;当WP管脚连接到Vss或悬空,允许器件进行正常的读/写操作。I2C总线协议定义如下1、总线空闲时,SDA、SCL为高电平,只有在总线空闲时才允许启动数据传送。2、数据传输前,总线要求有一个START〔开始位〕位做为数据开始的标识,它的要求是SCL为高时,SDA有一个从高到低的电平跳变动作,完成这个动作后才可以进行数据传输,时序图参看图3-3中的“开始〞。3、数据传输时,总线要有一个稳定的数据状态,来保证数据为有效数据,它的要求是在SCL为高电平时,SDA必须保持电平稳定,不允许有跳变。编写单片机向总线送数据程序时那么可以在SCL还在低电平时,把数据电平送到SDA,然后拉高SCL,这时SDA不应有电平跳变,延时后拉低SCL,再进行下一位的数据传送直到完成。在总线上读数据时也是只有在SCL为高时,SDA为有效数据。时序参看图3-3的“保持〞。4、数据传输后,总线要有一个STOP〔结束位〕位,来通知总线本次传输已结束,它的要求是SCL为高时,SDA有一个从低到高的电平跳变动作,正好和START位相反。时序参看图3-3的“停止〞。图3-3I2C根本信号5、I2C总线在每接收完一个字节〔8个二进制位〕后,在第九个时钟信号时,会在SDA上回应一个低电平的ACK应答信号,以此说明当前受控的器件已接收完一个字节,可以开始下一个字节的传送了。假设未收到应答信号,由判断为受控单元出现故障。时序图可以参看图3-4。图3-4I2C的ACK信号6、I2C总线在操作受控器件时,需要先发送受控器件的器件地址,24C04也不例外,在每次命令前需要先发送一个字节的器件地址和读写标识,也可称为器件录址。图3-5是24C04的器件寻址命令中每个位所代表的意思。A1、A0位是器件地址,它是对应于芯片的A1、A0引脚。这样不难看出在同一总线可以挂4个24C04。器件地址字节中的R/W位是用于标识当前操作是读器件还是写器件,写器件时R/W位设置0,读器件时R/W位设置1。图3-524C04的器件寻址命令3.4.224C04的I2C总线根本操作24C04的I2C总线根本操作包括写入单个字节、页写入、读当前地址数据、读任意地址数据、连续读取数据等。在本设计中使用到了写入单个字节、读当前地址数据、读任意地址数据、连续读取数据等操作,以下对这1、单字节写入写入字节指令每次只能向芯片中的一个地址写入一个字节的数据。首先发送开始位来通知芯片开始进行指令传输,然后传送设置好的器件地址字节,R/W位应置0,接着是分开传送十六位地址的上下字节,再传送要写入的数据,最后发送停止位表示本次指令结束。图3-6是写入单个字节的时序图。图3-624C04的单字节写入时序2、读当前地址数据这种读取模式是读取当前芯片内部的地址指针指向的数据。每次读写操作后,芯片会把最后一次操作过的地址作为当前的地址。在这里要注意的是在微处理器接收完芯片传送的数据后不必发送给低电平的ACK给芯片,直接拉高SDA等待一个时钟后发送停止位。图3-7是读当前地址时序图。图3-724C04的读当前地址数据时序3、读任意地址数据"读当前地址"可以说是读的根本指令,读任意地址时只是在这个根本指令之前加一个'伪操作',这个伪操作传送一个写指令,但这个写指令在地址传送完成后就要结束,这时芯片内部的地址指针指到这个地址上,再用读当前地址指令就可以读出该地址的数据。图3-8是读任意地址的时序图。图3-824C04的读任意地址数据时序4、连续读取连续读取操作时只要在上面二种读取方式中芯片传送完读取数据后,微处理器回应给芯片一个低电平的ACK应答,那么芯片地址指针自动加一并传送数据,直到微处理器不回应并停止操作。图十二是连续读取的时序图。图3-924C04的读连续读取时序3.4.324C04的驱动子程序由上述的分析,可编写24C04的驱动子程序,首先利用_nop()定义空操作宏,作为等待延时操作。然后利用sbit定义数据和时钟引脚。最后根据时序编写子程序。具体的程序参见附录。4Proteus仿真本系统利用是英国Labcenterelectronics公司出版的EDA工具软件Proteus7.5SP3进行系统的仿真,来调试系统的功能完整性。本章介绍利用Proteus进行系统仿真的主要流程及操作,其余局部可参考Proteus的帮助文档。Proteus7.5SP3界面安装完Proteus后,翻开Proteus软就就会出现如图4-1所示的操作界面。图4-1Proteus操作界面图4-1中的原理图编辑窗口〔TheEditingWindow〕,是用来绘制原理图的。蓝色方框内为可编辑区,元件要放到它里面。注意,这个窗口是没有滚动条的,你可用预览窗口来改变原理图的可视范围。其余各局部可参考有关书籍。仿真流程1、添加元件到元件列表中本例要用到的元件有:AT89S52、7805、LED、24C04、LED等。单击如图4-2所示的“P〞按钮,出现挑选元件对话框,在对话框的KEYWORDS中输入AT89C52,即可得到图4-3所示结果图4-2Proteus的“P〞按钮图4-3Proteus的器件选取然后单击OK,关闭对话框,这时元件列表中列出AT89S52,以同样方式即可添加所需要的器件。最终结果如图4-4所示。图4-4Proteus中已选取的器件2、放置元件首先添加元器件:在元件列表中左键选取AT89S52,在原理图编辑窗口中单击左键,这样AT89S52就被放到原理图编辑窗口中了。以同样方式即可放置其他元件。然后添加“地〞:左键选择模型选择工具栏中的图标,出现如图4-5所示的终端,左键选择GROUND,并在原理图编辑窗口中左击,这样“地〞就被放置到原理图编辑窗口中了。再以同样方式可添加电源VCC的仿真端口。图4-5Proteus的终端选取3、连线在Proteus中元器件的VSS、VDD、VEE不需连接,默认VSS=0V、VDD=5V、VEE=-5V、GND=0V。其余电气节点,可在在需要连接的两个端点单击鼠标左键,就可连接两个电气节点。如图4-6即为连接完后的电路图。图4-6连接后的Proteus电路图4、添加仿真文件左键单击连好线的AT89S52,出现如图4-7所示的EditComponent界面,在ProgramFile中单击出现文件浏览对话框,找到Keil程序编译完成的dianzhen.hex文件,单击确定,完成添加文件;在ClockFrequency中把频率改为12MHz,单击OK退出,就完成仿真文件的添加工作,在Proteus进行仿真时,AT89S52即可以12M晶振运行dianzhen.hex里的程序。图4-7仿真文件添加界面5、仿真单击开始仿真。电气节点上的红色代表高电平,兰色代表低电平,灰色代表不确定电平〔floating〕。运行时,在Debug菜单中可以查看AT89S52的相关资源。图4-8为仿真运行时的整体效果图。图4-8仿真效果图5结论本设计详细介绍了基于单片机的防盗报警器的控制电路和控制程序设计过程,研究了24C04的I2C总线协议,同时对硬件电路,软件编程,做出了详细的说明,设计并仿真出根本符合课题要求的防盗报警器的控制电路和控制程序。本文首先介绍了本设计的设计要求,及所采用的器件和手段,并根据课题的实际要求提出了整体的设计方案和原理图。接着分别从硬件和软件两个方面对系统的设计做出了详细的说明,最后对仿真操作的流程作了详细介绍。在本次毕业设计中,掌握了AT89S52的结构原理和24C04的I2C总线的驱开工作原理,熟悉了Keil程序设计软件和Proteus仿真软件的使用。在整个系统的设计和调试仿真的过程中,我学到了许多课本上学不到的珍贵知识,增长了实践经验,体会到了科研工作不仅是知识的应用,更是知识不断积累的过程。它不仅需要有丰富的知识,冷静的头脑和分析能力,而且需要踏实、认真、严谨的科学态度,同时更要持之以恒的不懈精神和不断学习的进取精神。这一段时间的实践,必将给我今后的工作和人生带来积极的经验和影响。参考文献[1]王洪建,AT89C2051在小区防盗报警系统中的应用.《仪器仪表学报》,2005年8期[2]王芳,马幼军,蒋国平.智能化住宅防盗防火报警系统设计.《传感器技术》,2002年10期.[3]何立民.单片机实验与实践教程.北京航空航天大学出版社,2004.7[4]郭天祥.新概念51单片机C语言教程——入门、提高、开发、拓展.电子工业出版社,2023.1[5]彭伟.单片机C语言程序设计实训100例——基于8051+Proteus仿真.电子工业出版社,2023.6[6]朱清慧,张凤蕊,翟天嵩,王志奎.Proteus教程——电子线路设计、制版与仿真.清华大学出版社,2023.9[7]李学礼,林海峰.基于Proteus软件的单片机实验室建设[J];单片机与嵌入式系统应用,2005年09期

[8]王建敏,詹华群.单片机仿真实验的探讨与研究[J].江西科技师范学院学报,2005年04期

[9]周彬,刘晓燕.单片机实验的仿真教学[J].重庆职业技术学院学报,2006年03期

[10]方怡冰.单片机课程的教学与实验改革[J].电气电子教学学报;2006年03期

[11]邓力.PROTEUS51单片机的电路仿真[J].中国科技信息;2006年14期

[12]彭利军,郝海峰.基于Proteus的单片机系统的虚拟仿真[J].电子与封装,2006年07期

[13]宁成军,张江霞.基于Proteus和Keil接口的单片机外围硬件电路仿真[J].现代电子技术,2006年18期

[14]代启化.Proteus在单片机电路系统设计中的应用[J].自动化与仪器仪表,2006年06期

[15]宋国富,王玉叶;用Proteus实现51单片机的动态仿真[J].安徽职业技术学院学报;2006年04期

[16]李海鲲.Proteus在单片机课程设计中的应用[J].电脑知识与技术(学术交流),2006年35期

[17]Anon.Embeddedsystems.ElectronicDesign,2002,50(3):74~75[18]Iain.Liu,Steve.Real-timeembeddedsystems.ComputingandControlBate,EngineeringJournal,2002,13(4):154~155[19]Compatible8-BitA/DConverterwith8-ChannelMultiplexerDatasheet.[20]Jerraya,A.A.;Wolf,W.Hardware/softwareinterfacecodesignforembeddedsystems.Computer,2005,38(2):9~63.[21]KeilElektronicGmbH.KeilC51Manual.[22]LeiJian,LuoKelu.Architectureofembeddedsystemsimulationdevelopmentplatform.JournalofInformationandComputationScience,2004,1(3):129~134.[23]LabcenterElectronicsLtd.ProteusIntroduction.致谢附录A#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#defineNOP_nop_()#defineNNOPNOP;NOP;NOP;NOP;NOPvoidI2C_Start();voidI2C_Stop();voidAck_I2C();bitISendB(ucharsla,ucharc);bitIRcvB(ucharsla,uchar*c);bitISendStr(ucharsla,ucharsub,uchar*s,ucharn);bitIRcvStr(ucharsla,ucharsub,uchar*s,ucharn);voidDelay(uchar);ucharcodeledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};/*====================================全局变量定义&位定义====================================*/#defineWaitTime 3 //等待时间3s#definestate_null 0#definestate_input 1#definestate_find 2#definestate_reset 3#definestate_jingbao 4bitack;sbitSDA=P3^5 ;sbitSCL=P3^4 ;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,//012340x6d,0x7d,0x07,0x7f,0x6f,//56789 0x3e,//U-100x73,//P-11 0x7c,//b-12 0x40//- };uchartelephone[7]={0,1,2,3,4,5,6};ucharsec; //定义计数值,每过一秒加1uinttcnt; //定时中断次数sbitgewei=P2^0; //个位选通定义sbitshiwei=P2^1; //十位选通定义sbitkey_input =P1^0; //输号sbitkey_find =P1^1; //查号sbitkey_reset =P1^2; //复位sbitkey_jingbao=P1^6; //警报信号sbitLed =P1^7; //LEDuintkeycount=0;uchardata_tel; //数据ucharaddr_tel; //位/*====================================I2C驱动====================================*///n=1->10msvoidDelay(ucharn){ uchari,j; i=100; j=100; while(j--) { while(i--); };}/*====================================函数功能:开始入口参数:说明:=====================================*/voidI2C_Start(void){ SDA=1; NOP; SCL=1; NNOP; SDA=0; NNOP; SCL=0; NOP; NOP;}/*====================================函数功能:I2CSTOP入口参数:说明:=====================================*/voidI2C_Stop(void){ SDA=0; NOP; SCL=1; NNOP; SDA=1; NNOP;}/*====================================函数功能:送一字节入口参数:说明:=====================================*/voidSendB(ucharc){ uchari; for(i=0;i<8;i++) { if((c<<i)&0x80)SDA=1; elseSDA=0; NOP; SCL=1; NNOP; SCL=0; } NOP; NOP; SDA=1; //8位传完后释放SDA,也就SDA=1// SCL=0; NOP; NOP; SCL=1; NOP; NOP; NOP; if(SDA==1)ack=0;//noack elseack=1; //ack SCL=0; NOP; NOP;}/*====================================函数功能:接收来处SLA的数据入口参数:说明:操作后调用应答函数ACK_I2C();=====================================*/ucharRcvB(void){ ucharrete; uchari; rete=0; SDA=1; //置数据线为接收状态 for(i=0;i<8;i++) { NOP; SCL=0; NNOP; SCL=1; NOP; NOP; rete=rete<<1; if(SDA==1)rete++; NOP; NOP; } SCL=0; NOP; NOP; return(rete);}/*====================================函数功能:主控器件应答功能入口参数:说明:送0发0,送1发1,发1表示NOACK=====================================*/voidAck_I2C(bita){ if(a==0)SDA=0; //是不发出应答信号 elseSDA=1; NOP;NOP;NOP; SCL=1; //时钟高电平同期大于4us NNOP; SCL=0; NOP; NOP;}/*====================================函数功能:发送一字节的数据,返回ack入口参数:说明:ack=1,应答;ack=0,无应答=====================================*/bitISendB(ucharsla,ucharc){ I2C_Start(); SendB(sla); if(ack==0)return(0); SendB(c); if(ack==0)return(0); I2C_Stop(); return(1);}/*====================================函数功能:接收一字节数据入口参数:从器件地址,数据地址,操作数年地址,字节数说明:=====================================*/bitISendStr(ucharsla,ucharsub,uchar*s,ucharn){ uchari; I2C_Start(); SendB(sla); if(ack==0)return(0); SendB(sub); if(ack==0)return(0); for(i=0;i<n;i++) { SendB(*s); if(ack==0)return(0); s++; } I2C_Stop(); return(1);}/*====================================函数功能:收一字节的数据入口参数:slaveaddress说明:=====================================*/bitIRcvB(ucharsla,uchar*c){ I2C_Start(); SendB(sla+1); if(ack==0)return(0); *c=RcvB(); Ack_I2C(1); I2C_Stop(); return(1);}/*====================================函数功能:读取多字节数据入口参数:从器件地址,数据地址,操作数年地址,字节数说明:成功那么返回1=====================================*/bitIRcvStr(ucharsla,ucharsub,uchar*s,ucharn){ uchartemp; I2C_Start(); SendB(sla); if(ack==0)return(0); SendB(sub); if(ack==0)return(0); I2C_Start(); SendB(sla+1); if(ack==0)return(0); temp=n-1; while(temp--) { *s=RcvB(); Ack_I2C(0); s++; } *s=RcvB(); Ack_I2C(1); I2C_Stop(); return(1);}/********************************I2C驱动结束************************///SEG7显示voidDisplay(uchardata_disp){ if(data_disp>=13) P0=table[13]; else P0=table[data_disp];}///////////////////////////////////////////////////////T0中断子程序voidt0_init(){ TMOD=0x01; //定时器工作在方式一 ET0=1; EA=1; TH0=(65536-50000)/256; //对TH0TL0赋值 TL0=(65536-50000)%256; //0.05中断一次 tcnt=0; //每过500usttcnt加1}voidt0_start(){ TR0=1; //开始计时}voidt0_stop(){ TR0=0;}//定时0中断效劳程序voidt0(void)interrupt1using0{ TH0=(65536-50000)/256; //对TH0TL0赋值 TL0=(65536-50000)%256; //重装计数初值 tcnt++; //每过500usttcnt加1 if(tcnt==20) //记满20次〔即1s〕时 { tcnt=0; //重新再计 sec++; }}///////////////////////////////////////////////////////T0中断子程序完ucharstate(){ ucharstate_temp; keycount=0; while(1) { keycount++; if (!key_input) state_temp=state_input; elseif(!key_find) state_temp=state_find; elseif(!key_reset) state_temp=state_reset; elseif(!key_jingbao) state_temp=state_jingbao; else break; if(keycount>30000) returnstate_temp; } //Display(state_temp); if(keycount>100) returnstate_temp; else return0;}//voidinput()//{ ucharnum=0;// ucharcount=0;// bit key=0;// while(num<8)// { count=10;// while(!key_inputorcount--);// while()// }//}voidbohao(){ }voidjingbao(){ sec=0; bohao(); //拨号 Display(12); //显示b Led=1; //LED亮 t0_start(); while(sec!=WaitTime); //定时3s Display(10); Led=0;}voidinput_init(){ uchari; for(i=0;i<7;i++) telephone[i]=1; Led=0; data_tel=0; addr_tel=0; Display(0);}voidfind_init(){ uchari; addr_tel=0; Led=1; P3=0xff; IRcvStr(0xa0,0x00,telephone,7); }voidmain(){ //测试EEPROM// ucharSend_data[3]={1,5,9};// ucharRec_data[3];// uchar*s;// s=Send_data;// P1=0xff;// I2C_Start();// ISendStr(0xa0,0x20,s,3);// Delay(1);// P1=0xff;// s=Rec_data;// IRcvStr(0xa0,0x20,s,3); ucharcount=0; uchartemp=0; uchari=0; ucharstate_project=0; ucharstate_last=0; ucharstate_present=0; uchar*s; ucharSend_data[3]={1,5,9}; ucharRec_data[3]; t0_init(); sec=0;Display(10);Led=1;Delay(10); //测试键盘状态 while(0) { temp=state(); if(temp) { Led=1; Display(temp); } else Led=0; } //测试t0中断 while(0) { sec=0; t0_start(); while(sec!=3) Led=!Led; } //读取EEPROM中的号码 s=telephone;// P3=0xff;// I2C_Start();// ISendStr(0xa0,0x00,s,7);// Delay(1); P3=0xff; s=telephone; IRcvStr(0xa0,0x00,s,7); //初始状态设置 state_present=state_null; state_last=state_null; while(1) { switch(state_last) { casestate_null: casestate_jingbao: { state_present=s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论