51地震震动报警

更新时间:2024-01-08 01:57:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机课程设计报告

项目名称专业班级学生姓名指导教师

基于51的地震震动报警器

基于51的地震震动报警器

摘 要

本课程设计提出基于8051核心的单片机来控制MMA7455加速度传感器芯片通过测量运动状态来进行地震报警的方案。项目思路为通过单片机不断给MMA7455模块下达指令测量x、y、z三轴方向的加速度值,并不断通过MCU判断前后连续两次测量的差值变化是否超过程序设定阀值,进行运动判决是否产生了突发性运动,比如地震或者其他剧烈震动,从而选择是否报警,达到了对地震震动进行报警的效果。方案实施过程中主要采用了使用keil软件进行编程、Altium Design10进行电路设计,手工焊接的方法完成了基于51单片机的地震震动报警器的设计制作。本设计具有成本低廉、方便携带、低功耗长期运行、检测敏锐等特点,在同类产品中较为少见,特别是能够提醒地震发生时仍在睡眠中的人,具有防范灾害的应用意义。

关键词:8051单片机; 加速度传感器; 地震报警; 运动判决; 低功耗;

I

基于51的地震震动报警器

Abstract

The design proposed a suggestion alerting the earthquake to people with measuring the motion status by MMA7455 acceleration sensor based on the 8051 single chip microcomputer. We order MMA7455 to measure the value of acceleration transmitted to MCU in x\\y\\z axis constantly. When the MCU get every two series of data in x\\y\\z axis, it will calculate the difference between every two data and judge whether the difference beyond the threshold have been set. The system will alert when it find the value exceed the threshold for the feature express the site where this alertor was displaced have a series of shake abruptly. To achieve the design, we used KEIL to program software and designed circuit with Altium Design10. Finally, I weld it by hand. The project has the merit like cheap cost, being easy to carry about, low power dissipation and acute detection. It can alert the people when the earthquake erupt especially the sleeping thus this alertor has significance about preventing disaster.

Keywords: 8051 single chip microcomputer; Acceleration sensor; Alerting earthquake; Motion judgment; Low power dissipation

II

基于51的地震震动报警器

目 录

摘 要········································································································································ I Abstract ····································································································································· II 第1章 绪论···························································································································· 1

1.1 概述····························································································································· 1 1.2 地震报警技术的研究现状························································································· 1 1.3 本文研究的意义········································································································· 2 第2章 地震报警系统的基本理论························································································ 3

2.1 单片机技术················································································································· 3 2.2 单片机概述················································································································· 3

2.2.1 单片机技术········································································································ 3 2.2.2 单片机技术的特点···························································································· 3 2.2.3 AT89S52系列单片机概述 ··············································································· 3

第3章 系统的I2C协议········································································································ 8

3.1 协议概述····················································································································· 8 3.2 硬件结构····················································································································· 8 3.3 数据传输····················································································································· 9 3.4 应用····························································································································· 9 第4章 MMA7455加速度传感器······················································································· 11

4.1 三轴加速度传感器··································································································· 11

4.1.1 简介·················································································································· 11 4.1.2 特点·················································································································· 11 4.1.3 原理·················································································································· 11 4.1.4 优点·················································································································· 11 4.2 MMA7455三轴数字加速度传感器········································································ 11

4.2.1 简介·················································································································· 11 4.2.2 参数·················································································································· 12 4.2.3 目标应用·········································································································· 12 4.3 MMA7455的使用···································································································· 12 第5章 系统的硬软件设计·································································································· 21

5.1 系统结构框图··········································································································· 21 5.2 单片机最小系统原理图··························································································· 21

III

基于51的地震震动报警器

5.3 MMA7455三轴数字加速度传感器模块电路························································ 22 5.4 蜂鸣器发声原理电路······························································································· 22 5.5 系统原理电路图······································································································· 23 5.6 系统软件程序的思想······························································································· 23 结论·········································································································································· 25 参考文献·································································································································· 26 附录1······································································································································· 27 项目创新及特色······················································································································ 35

IV

基于51的地震震动报警器

第1章 绪论

1.1 概述

地震又称地动、地振动,是地壳快速释放能量过程中造成振动,期间会产生地震波的一种自然现象。地震常常造成严重人员伤亡,能引起火灾、水灾、有毒气体泄漏、细菌及放射性物质扩散,还可能造成海啸、滑坡、崩塌、地裂缝等次生灾害。为了将地震的灾害减小到最小,常有以下几种对地震的报警检测办法:地壳形变观测、地磁测量、地电观测、重力观测、地应力观测。

本方案通过对at89s52单片机的运用,借助IIC协议与MMA7455加速度传感器芯片之间进行不断的数据检测提取,从而判定是否产生震动。系统在三个方向上每次连续进行两次数据测量,将提取的原始数据做处理后,计算前后两次差值的绝对值,如果这个变化量超过了事先确定的阀值,那么就可以判定发生了震动。在方案中阀值作为一个关键量,进行了多次的实验调整,使得系统足够灵敏,能够胜任在轻微震动时就立即警报的任务。

1.2 地震报警技术的研究现状

目前常有以下几种对地震的报警检测办法:

(1)地壳形变观测:许多地震在临震前,震区的地壳形变增大,是平时的几倍到几十倍。测量断层两侧的相对垂直升降或水平位移的参数,是地震检测重要的依据。

(2)地磁测量:地球基本磁场可以直接反映地球各种深度乃至地核的物理过程,地磁场及其变化是地球深部物理过程信息的重要来源之一。

(3)地电观测:地震孕育过程中,将伴随有地下介质(主要是岩石)电阻率的变化及大地电流和自然电场的变化,因此提取这一信息可以检测地震。

(4)重力观测:地球重力场是一种比较稳定的地球物理场之一,它与观测点的位置和地球内部介质密度有关。因此,通过重力场变化可以了解到地壳的变形、岩石密度的变化,从而检测地震。

(5)地应力观测:地震孕育不论机制如何,其实质是一个力学过程,是在一定构造背景条件下,地壳体中应力作用的结果。观测地壳应力的变化,可以捕捉地震的信息。

由上可见,本方案所提出的方法是有一定的实际意义与创新性的。

1

基于51的地震震动报警器

1.3 本文研究的意义

虽然目前有各种检测地震的方法,但是大多都难以在日常家庭中使用。本方案“基于51的地震震动报警器”则具有成本低廉、制作简便、使用方便的特点,这样可以最大限度的运用在普通家庭中,为日常生活中可能遇见的地震情况进行安全防护。

同时通过课程设计,进一步熟悉和掌握AT89C52单片机的结构及工作原理,掌握以单片机为核心的电路设计的基本方法和技术,了解有关电路参数的计算方法。通过完成一个包括电路设计和程序开发的完整过程,进一步了解开发单片机应用系统的全过程,通过此综合训练,为以后毕业设计打下一定的基础。

2

基于51的地震震动报警器

第2章 地震报警系统的基本理论

2.1 单片机技术

单片机是微型机的一个主要分支,在结构上的最大特点是把CPU、存储器、定时器和多种输入/输出接口电路集成在一块超大规模集成电路芯片上。就其组成和功能而言,一块单片机芯片就是一台计算机。

2.2 单片机概述

2.2.1 单片机技术

通过内部总线把计算机的各主要部件接为一体,其内部总线包括地址总线、数据总线和控制总线。其中,地址总线的作用是在进行数据交换时提供地址,CPU通过它们将地址输出到存储器或I/O接口;数据总线的作用CPU与存储器或I/O接口之间,或存储器与外设之间交换数据;控制总线包括CPU发出的控制信号线和外部送入CPU的应答信号线等。

2.2.2 单片机技术的特点

(1)有优异的性能价格比。

(2)集成度高、体积小、有很高的可靠性。单片机把各功能部件集成在一块芯片上,内部采用总线结构,减少了各芯片之间的连线,大大提高了单片机的可靠性与抗干扰能力。另外,其体积小,对于强磁场环境易于采取屏蔽措施,适合在恶劣环境下工作。

(3)控制功能强。为了满足工业控制的要求,一般单片机的指令系统中均有极丰富的转移指令、I/O口的逻辑操作以及位处理功能。单片机的逻辑控制功能及运行速度均高于同一档次的微机。

(4)低功耗、低电压,便于生产便携式产品。

(5)外部总线增加了IC(Inter-IntegratedCircuit)及SPI(SerialPeripheralInterface)等串行总线方式,进一步缩小了体积,简化了结构。

(6)单片机的系统扩展和系统配置较典型、规范,容易构成各种规模的应用系统。

2.2.3 AT89S52系列单片机概述

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯

3

基于51的地震震动报警器

片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

引脚结构

4

基于51的地震震动报警器

VCC:电源 GND:地

P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。

P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,p1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。在flash编程和校验时,P1口接收低8位地址字节。

5

基于51的地震震动报警器

P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。在flash编程和校验时,P3口也接收一些控制信号。

RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。

ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52

6

基于51的地震震动报警器

从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。

EA/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在flash编程期间,EA也接收12伏VPP电压。

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。

XTAL2:振荡器反相放大器的输出端。

存储器结构:MCS-51器件有单独的程序存储器和数据存储器。外部程序存储器和数据存储器都可以64K寻址。

程序存储器:如果EA引脚接地,程序读取只从外部存储器开始。对于89S52,如果EA接VCC,程序读写先从内部存储器(地址为0000H~1FFFH)开始,接着从外部寻址,寻址地址为:2000H~FFFFH。数据存储器:AT89S52有256字节片内数据存储器。高128字节与特殊功能寄存器重叠。也就是说高128字节与特殊功能寄存器有相同的地址,而物理上是分开的。当一条指令访问高于7FH的地址时,寻址方式决定CPU访问高128字节RAM还是特殊功能寄存器空间。直接寻址方式访问特殊功能寄存器(SFR)。例如,下面的直接寻址指令访问0A0H(P2口)存储单元MOV0A0H,#data使用间接寻址方式访问高128字节RAM。例如,下面的间接寻址方式中,R0内容为0A0H,访问的是地址0A0H的寄存器,而不是P2口(它的地址也是0A0H)。MOV@R0,#data堆栈操作也是简介寻址方式。因此,高128字节数据RAM也可用于堆看门狗定时器WDT是一种需要软件控制的复位方式。WDT由13位计数器和特殊功能寄存器中的看门狗定时器复位存储器(WDTRST)构成。WDT在默认情况下无法工作;为了激活WDT,户用必须往WDTRST寄存器(地址:0A6H)中依次写入01EH和0E1H。当WDT激活后,晶振工作,WDT在每个机器周期都会增加。WDT计时周期依赖于外部时钟频率。除了复位(硬件复位或WDT溢出复位),没有办法停止WDT工作。当WDT溢出,它将驱动RSR引脚一个高个电平输出。

7

基于51的地震震动报警器

第3章 系统的I2C协议

3.1 协议概述

IIC即Inter-IntegratedCircuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS),IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源。这种方式简化了信号传输总线。

3.2 硬件结构

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。

所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。而串行时钟线也应是双向的,作为控制总线数据传送的主机,一方面要通过SCL输出电路发送时钟信号,另一方面还要检测总线上的SCL电平,以决定什么时候发送下一个时钟脉冲电平;作为接受主机命令的从机,要按总线上的SCL信号发出或接收SDA上的信号,也可以向SCL线发出低电平信号以延长总线时钟信号周期。总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。

总线对设备接口电路的制造工艺和电平都没有特殊的要求(NMOS、CMOS都可以兼容)。在I2C总线上的数据传送率可高达每秒十万位,高速方式时在每秒四十万位以上。另外,总线上允许连接的设备数以其电容量不超过400pF为限。

总线的运行(数据传输)由主机控制。所谓主机是指启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号的设备,通常主机都是微处理器。被主机寻访的设备称为从机。为了进行通讯,每个接到I2C总线的设备都有一个唯一的地址,以便于主机寻访。主机和从机的数据传送,可以由主机发送数据到从机,也可以由从机发到主机。凡是发送数据到总线的设备称为发送器,从总线上接收数据的设备被称为接受器。

I2C总线上允许连接多个微处理器以及各种外围设备,如存储器、LED及LCD驱动器、A/D及D/A转换器等。为了保证数据可靠地传送,任一时刻总线只能由某一台主机

8

基于51的地震震动报警器

控制,各微处理器应该在总线空闲时发送启动数据,为了妥善解决多台微处理器同时发送启动数据的传送(总线控制权)冲突,以及决定由哪一台微处理器控制总线的问题,I2C总线允许连接不同传送速率的设备。多台设备之间时钟信号的同步过程称为同步化。

3.3 数据传输

在I2C总线传输过程中,将两种特定的情况定义为开始和停止条件(见图3):当SCL保持“高”时,SDA由“高”变为“低”为开始条件;当SCL保持“高”且SDA由“低”变为“高”时为停止条件。开始和停止条件均由主控制器产生。使用硬件接口可以很容易地检测到开始和停止条件,没有这种接口的微机必须以每时钟周期至少两次对SDA取样,以检测这种变化。

SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答ACK。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。I2C数据总线传送时序如图4所示。

数据传送具有应答是必须的。与应答对应的时钟脉冲由主控制器产生,发送器在应答期间必须下拉SDA线。当寻址的被控器件不能应答时,数据保持为高并使主控器产生停止条件而终止传输。在传输的过程中,在用到主控接收器的情况下,主控接收器必须发出一数据结束信号给被控发送器,从而使被控发送器释放数据线,以允许主控器产生停止条件。合法的数据传输格式如下:

I2C总线在开始条件后的首字节决定哪个被控器将被主控器选择,例外的是“通用访问”地址,它可以在所有期间寻址。当主控器输出一地址时,系统中的每一器件都将开始条件后的前7位地址和自己的地址进行比较。如果相同,该器件即认为自己被主控器寻址,而作为被控接收器或被控发送器则取决于R/W位。

3.4 应用

I2C总线是各种总线中使用信号线最少,并具有自动寻址、多主机时钟同步和仲裁等功能的总线。因此,使用I2C总线设计计算机系统十分方便灵活,体积也小,因而在各类实际应用中得到广泛应用。

I2C的运用比如在铁电存储器中,用铁电存储数据就是用的I2C总线协议。 通用I/O端口作为I2C总线接口

目前,51、96系列的单片机应用很广,但是由于它们都没有I2C总线接口,从而限

9

基于51的地震震动报警器

制了在这些系统中使用具有I2C总线接口的器件。通过对I2C总线时序的分析,可以用51单片机的两根I/O线来实现I2C总线的功能。接I2C总线规定:SCL线和SDA线是各设备对应输出状态相“与”的结果,任一设备都可以用输出低电平的方法来延长SCL的低电平时间,以迫使高速设备进入等待状态,从而实现不同速度设备间的时钟同步。因此,即使时钟脉冲的高、低电平时间长短不一,也能实现数据的可靠传送,可以用软件控制I/O口做I2C接口。

在单主控器的系统中,时钟线仅由主控器驱动,因此可以用51系列的一根I/O线作为SCL的信号线,将其设备为输出方式,并由软件控制来产生串行时钟信号。在实际系统中使用了P1.3。另一根I/O线P1.2作为I2C总线的串行数据线,可在软件控制下在时钟的低电平期间读取或输出数据。系统传输数据的过程如下:先由单片机发出一个启始数据信号,接着送出要访问器件的7位地址数据,并等待被控器件的应答信号。当收以应答信号后,根据访问要求进行相应的操作。如果是读入数据,则数据线可一直设为输入方式,中间不需要改变SDA线的工作方式,每读入一个字节均应依次检测应答信号;如果是输出数据,则首先将SDA设置为输出方式,当发送完一个字节后,需要改变SDA线为输入方式,此时读入被控器件的应答信号就完成了一个字节的传送。当所有数据传输完毕后,应向SDA发出一个停止信号,以结束该次数据传输。

10

基于51的地震震动报警器

第4章 MMA7455加速度传感器

4.1 三轴加速度传感器

4.1.1 简介

在加速度传感器中有一种是三轴加速度传感器,同样的它是基于加速度的基本原理去实现工作的,加速度是个空间矢量,一方面,要准确了解物体的运动状态,必须测得其三个坐标轴上的分量;另一方面,在预先不知道物体运动方向的场合下,只有应用三轴加速度传感器来检测加速度信号。由于三轴加速度传感器也是基于重力原理的,因此用三轴加速度传感器可以实现双轴正负90度或双轴0-360度的倾角,通过校正后期精度要高于双轴加速度传感器大于测量角度为60度的情况。

4.1.2 特点

三轴加速度传感器具有体积小和重量轻特点,可以测量空间加速度,能够全面准确反映物体的运动性质,在航空航天、机器人、汽车和医学等领域得到广泛的应用。

4.1.3 原理

目前的三轴加速度传感器大多采用压阻式、压电式和电容式工作原理,产生的加速度正比于电阻、电压和电容的变化,通过相应的放大和滤波电路进行采集。这个和普通的加速度传感器是基于同样的一个原理,所以在一定的技术上三个单轴就可以变成一个三轴。对于多数的传感器应用来看,两轴的加速度传感器已经能满足多数应用。但是有些方面的应用还是集中在三轴加速度传感器中例如在数采设备,贵重资产监测,碰撞监测,测量建筑物振动,风机,风力涡轮机和其他敏感的大型结构振动。

4.1.4 优点

三轴加速度传感器的好处就是在预先不知道物体运动方向的场合下,只有应用三维加速度传感器来检测加速度信号。三维加速度传感器具有体积小和重量轻特点,可以测量空间加速度,能够全面准确反映物体的运动性质。

4.2 MMA7455三轴数字加速度传感器

4.2.1 简介

MMA745是一款数字输出(I2C/SPI)、低功耗、紧凑型电容式微机械加速度计,具有信号调理、低通滤波器、温度补偿、自测、可配置通过中断引脚(INT1 或INT2)

11

基于51的地震震动报警器

检测0g、以及脉冲检测,无需外部器件。使用者可使用指定的0g寄存器和g-Select量程选择对0g偏置进行校准, 量程可通过命令选择3个加速度范围(2g/4g/8g)。MMA745xL系列具备待机模式,使它成为以电池为电源的手持式电子器件的理想选择。

MMA7455数字三轴加速度传感器模块核心为飞思卡尔公司的MMA7455L数字三轴加速度传感器,该模块设计使用官方推荐设计,板卡线路经过高电磁兼容设计和优化,具有输出精确,体积小,工作可靠,各种标识清晰,扩展性好等特点。MMA7455L芯片安装在带DIP插脚的印刷电路板(PCB)上,它允许使用者将其集成到特定的设计应用对产品进行评估。这样使用者就能够在他们自己硬件和软件环境内灵活地评估器件。

4.2.2 参数

? Z 轴自测

? 低压操作:2.4V – 3.6V

? 用于偏置校准的用户指? 定寄存器 ? 可编程阀值中断输出

? 电平检测模式运动识别(冲击、震动、自由下落) ? 脉冲检测模式单脉冲或双脉冲识别 ? 灵敏度64 LSB/g /2g /8g 10位模式

? 8位模式的可选灵敏度(±2g、±4g、±8g) ? 可靠的设计、高抗震性(5000g) ? 环保型产品 ? 低成本

4.2.3 目标应用

? 手机/PMP/PDA:图像稳定性, 文字滚动 ? 移动拨号 ? 点击静音

? 硬盘驱动(HDD):自由下落检测 ? 笔记本电脑:自由下落检测 ? 防盗 ? 计步器 ? 运动传感 ? 故障记录仪

4.3 MMA7455的使用

加速度和输出数值关系如下表所示

12

基于51的地震震动报警器

由上表可见,数值输出为补码形式,以2g量程为例,测量范围为-2g~+2g,数值输出为-128~+127。

INT1引脚一般作为数据准备好中断DRDY,用于提示测量数据已经准备好,同时在状态寄存器(STATUS地址0X09)中的DRDY位也会置位,中断时输出高电平,并一直维持高电平直到三个输出寄存器中的一个被读取。如果下一个测量数据在上一个数据被读取前写入,那么状态寄存器中的DOVR位将被置位。默认情况下,三轴XYZ都被启用,也可被禁用。可以选择检测信号的绝对值或信号的正负值。

检测运动时,可采用XorYorZ>阈值。检测自由落体,可采用X&Y&Z<阈值。 电平检测模式下,一旦一个加速度电平达到了设定阈值,中断引脚将变为高电平并一直维持高电平,直到中断被清除。

可以检测绝对值或正/负值,在CONTROL1寄存器中(地址0x18)设置,阈值在LDTH寄存器(地址0x1A)中设置。如果Control寄存器中的THOPT位为0,则LDTH中的数为无符号数,表示绝对值。反之,LDTH中的数为有符号数。

应用一:运动检测

条件X轴>阈值 或 Y轴>阈值 或 Z轴>阈值

THOPT=1(有符号数) LDPL=0(检测极性为正且检测条件为3轴做或运算),若阈值为3g,量程为8g(127,0x7F),则可设置LDTH寄存器=0X2F(地址0x1A)

应用二:运动检测

条件 |X|轴>阈值 或 |Y|轴>阈值 或 |Z|轴>阈值

THOPT=0(无符号数) LDPL=0(检测极性为正且检测条件为3轴做或运算),若阈值为3g,量程为8g(127,0x7F),则可设置LDTH寄存器=0X2F(地址0x1A)

应用三:自由落体检测

条件 X轴<阈值 且 Y轴<阈值 且 Z轴<阈值

THOPT=1(有符号数),LDPL=1(检测极性为负,检测条件为三轴做与运算),若阈值为0.5g,量程为8g,则可设置LDTH寄存器=0X07(地址0x1A)

13

基于51的地震震动报警器

应用四:自由落体检测

条件 |X|轴<阈值 且 |Y|轴<阈值 且 |Z|轴<阈值

THOPT=0(无符号数),LDPL=1(检测极性为负,检测条件为三轴做与运算),若阈值为0.5g,量程为8g,则可设置LDTH寄存器=0X07(地址0x1A)

脉冲检测

在脉冲检测模式下,所有功能都可以使用,包括测量电平,电平检测中断。有两个中断引脚分别分配给电平检测中断和脉冲检测中断。

中断引脚的分配在寄存器Control1中指定,中断引脚的分配有三种组合形式,通过Control1寄存器中的INTREG[1:0]设置。

INTREG[1:0] 00 01 10 INT1 电平检测 脉冲检测 单个脉冲检测 INT2 脉冲检测 电平检测 单个或双个脉冲检测 MMA7455有一个10位的ADC进行采样、转换并在得到请求的时候传回数据。在时钟信号的下降沿,8位的命令字开始传输,传输命令字需要8个时钟。数据回传的时候,高位在前,低位在后。

MMA7455可以使用SPI接口进行通信。在通信时,MMA7455作为slave(从属)设备,单片机作为master设备,单片机提供时钟信号scl和片选信号cs。

SPI接口包含两根控制线和两根数据线。分别是片选线CS,时钟线SCL,输入线SDI和输出线SDO。片选线CS低电平有效,由单片机提供片选信号。传输结束后,片选线回到高电平。SCL线提供传输时的同步时钟脉冲。SDO和SDI线上的数据在时钟信号下降沿时启动,并在上升沿的时候被读取。

读写寄存器命令至少需要16个时钟脉冲,如多字节传送则,则需要8的倍数个时钟脉冲才能完成。

SPI读操作:一次SPI读操作的传输包括一个bit的读/写信号和6个bit地址,和一个多余的bit。在下一次传送时,被读取的数据将由SPI接口送出。如下图所示。

SPI写操作:写寄存器需要先想MMA7455发送一个8bit的写命令。该写命令包括最高位一个bit(0表示读,1表示写)用于表示操作类型,后续6个bit表示地址,还有一个多余的bit。如下图所示。

14

基于51的地震震动报警器

MAA7455的各寄存器地址和用途如下图所示 MC9S12XS128的SPI设置

首先需要设置Module Routing Register MODRR MODRR6 MODRR5 MODRR4 MODRR3 MODRR2 MODRR1 MODRR0 其中MODRR4制定spi0使用s口还是m口 具体设置如下

PS4----------MISO 主入从出,mcu的输入端 PS5----------MOSI 主出从入,mcu的输出端 PS6----------SCK 时钟

PS7----------SS 从机片选,低电平有效,作为主机时若不用可接高电平,也可做普通IO,也可作为单一外设的CS片选(需设置MODFEN和SSOE位)

若MODRR_MODRR4 =1;//选中m口作为spi0 PM2----------MISO 主入从出,mcu的输入端 PM4----------MOSI 主出从入,mcu的输出端 PM5----------SCK 时钟

PM3----------SS 从机片选,低电平有效,作为主机时若不用可接高电平,也可做普通IO,也可作为单一外设的CS片选(需设置MODFEN和SSOE位)

15

基于51的地震震动报警器

M口和MMA7455卡各引脚的连接 PM5---------------------SCK,时钟

PM4---------------------MOSI(单片机输出数据,从机外设接收)

PM3---------------------SS,从机选择,接片选(需设置MODFEN和SSOE位) PM2---------------------MISO(单片机输入,接收从机外设输出数据)

寄存器1 XOUTL(10bit输出X轴输出低8位) 地址00 只读

D7 0 D6 0 D5 0 D4 0 D3 0 D2 0 D1 0 D0 0 XOUT[7] XOUT[6] XOUT[5] XOUT[4] XOUT[3] XOUT[2] XOUT[1] XOUT[0] 读取XOUTL,将锁定XOUTH以完成10位数据的读取。 XOUTH在XOUTL读取完毕后直接读取。

寄存器2 XOUTL(10bit输出X轴输出高2位) 地址0X01 只读

D7 -- 0 D6 -- 0 D5 -- 0 D4 -- 0 D3 -- 0 D2 -- 0 D1 0 D0 0 XOUT[9] XOUT[8] 寄存器3 YOUTL(10bit输出Y轴输出低8位) 地址0X02 只读 寄存器4 YOUTH(10bit输出Y轴输出高2位) 地址0X03 只读

16

基于51的地震震动报警器

寄存器5 ZOUTL(10bit输出Z轴输出低8位) 地址0X04 只读 寄存器6 ZOUTH(10bit输出Z轴输出高2位) 地址0X05 只读 (Y轴和Z轴的寄存器参考X轴即可)

寄存器7 XOUT8(8bit输出X轴) 地址0X06 只读

D7 0 D6 0 D5 0 D4 0 D3 0 D2 0 D1 0 D0 0 XOUT[7] XOUT[6] XOUT[5] XOUT[4] XOUT[3] XOUT[2] XOUT[1] XOUT[0] 寄存器8 YOUT8(8bit输出Y轴) 地址07 只读 寄存器9 ZOUT8(8bit输出Z轴) 地址08 只读 寄存器10 STATUS(状态寄存器) 地址0X09 只读

D7 -- 0 D6 -- 0 D5 -- 0 D4 -- 0 D3 -- 0 D2 PERR 0 D1 DOVR 0 D0 DRDY 0 (1) DRDY 1:数据准备好 0:数据未准备好 (2) PERR 1: Parity error is detected in trim data. Then, self-test is disabled

0: Parity error is not detected in trim data

(3) DOVR 1:数据被覆盖 0:数据未被覆盖

寄存器11 DETSRC(检测源寄存器) 地址0X0A 只读

D7 LDX 0 D6 LDY 0 D5 LDZ 0 D4 PDX 0 D3 PDY 0 D2 PDZ 0 D1 INT2 0 D0 INT1 0 LDX 1:正在检测X轴 0:没有检测X轴 LDY

1:正在检测Y轴 0:没有检测Y轴 LDZ

1:正在检测Z轴 0:没有检测Z轴 PDX

1:X轴检测到脉冲 0:X轴没有检测到脉冲 PDY

1:Y轴检测到脉冲 0:Y轴没有检测到脉冲 PDZ

1:Z轴检测到脉冲 0:Z轴没有检测到脉冲

17

基于51的地震震动报警器

INT1 INT2(参考寄存器Control1内容,地址0x18) 1:检测到中断 0:没有检测到中断

寄存器14 I2CAD(I2C地址寄存器) 地址0X0D读/写

D7 I2CDIS 0 D6 0 D5 0 D4 1 D3 1 D2 1 D1 0 D0 1 DVAD[6] DVAD[5] DVAD[4] DVAD[3] DVAD[2] DVAD[1] DVAD[0] I2CDIS 0:I2C和SPI都可以使用 1:I2C被禁用

DVAD[6]:[0]:I2C地址,默认0X1D

寄存器15 USRINF(用户信息寄存器) 地址0E 只读

D7 UI[7] 0 D7 ID[7] 0 D7 XOFF[7] 0 D6 UI[6] 0 D6 ID[6] 0 D6 XOFF[6] 0 D5 UI[5] 0 D5 ID[5] 0 D5 XOFF[5] 0 D4 UI[4] 0 D4 ID[4] 0 D4 XOFF[4] 0 D3 UI[3] 0 D3 ID[3] 0 D3 XOFF[3] 0 D2 UI[2] 0 D2 ID[2] 0 D2 XOFF[2] 0 D1 UI[1] 0 D1 ID[1] 0 D1 XOFF[1] 0 D0 UI[0] 0 D0 ID[0] 0 D0 XOFF[0] 0 寄存器16 WHOAMI(我是谁寄存器) 地址0X0F 只读 寄存器17 XOFFL(X轴漂移补偿低字节) 地址0X10 只读 这些寄存器是用来设置并存储0g时的漂移补偿校准的,可参考freescale应用指南AN3745以获得详细过程。

寄存器18 XOFFH(X轴漂移补偿高字节) 地址0X11 只读

D7 -- 0 D7 YOFF[7] 0 D6 -- 0 D6 YOFF[6] 0 D5 -- 0 D5 YOFF[5] 0 D4 -- 0 D4 YOFF[4] 0 D3 -- 0 D3 YOFF[3] 0 D2 0 D2 YOFF[2] 0 D1 0 D1 YOFF[1] 0 D0 XOFF[8] 0 D0 YOFF[0] 0 XOFF[10] XOFF[9] 寄存器19 YOFFL(Y轴漂移补偿低字节) 地址0X12 只读

这些寄存器是用来设置并存储0g时的漂移补偿校准的,可参考freescale应用指南AN3745以获得详细过程。

寄存器20 YOFFH(X轴漂移补偿高字节) 地址0X13 只读

D7 -- 0 D6 -- 0 D5 -- 0 D4 -- 0 D3 -- 0 D2 0 D1 0 D0 YOFF[8] 0 YOFF[10] YOFF[9] 寄存器21 ZOFFL(Z轴漂移补偿低字节) 地址14 只读 18

基于51的地震震动报警器

D7 ZOFF[7] 0 D6 ZOFF[6] 0 D5 ZOFF[5] 0 D4 ZOFF[4] 0 D3 ZOFF[3] 0 D2 ZOFF[2] 0 D1 ZOFF[1] 0 D0 ZOFF[0] 0 这些寄存器是用来设置并存储0g时的漂移补偿校准的,可参考freescale应用指南AN3745以获得详细过程。

寄存器22 ZOFFH(Z轴漂移补偿高字节) 地址0X15 只读

D7 -- 0 D7 -- 0 D6 -- 0 D6 DRPD 0 D5 -- 0 D5 SPI3W 0 D4 -- 0 D4 STON 0 D3 -- 0 D3 GLVL[1] 0 D2 0 D2 GLVL[0] 0 D1 0 D1 0 D0 ZOFF[8] 0 D0 0 ZOFF[10] ZOFF[9] 寄存器23 MCTL(模式控制寄存器) 地址0X16 读/写 MODE[1] MODE[0] DRPD 0: Data ready status is output to INT1/DRDY PIN 1: Data ready status is not output to INT1/DRDY PIN SPI3W

0: SPI is 4 wire mode 1: SPI is 3 wire mode STON

0: Self-test is not enabled 1: Self-test is enabled GLVL [1:0]测量范围

00: 8g is selected for measurement range. 10: 4g is selected for measurement range. 01: 2g is selected for measurement range. MODE[1:0]模式 00:standby模式 01:测量模式 10:电平平检测模式 11:脉冲检测模式

寄存器24 INTRST(中断锁定复位寄存器) 地址0X17 读/写

D7 -- 0 D6 -- 0 D5 -- 0 D4 -- 0 D3 -- 0 D2 -- 0 D1 0 D0 0 CLR_INT2 CLR_INT1 CLR_INT1 1: 清除 “INT1” 和 LDX/LDY/LDZ 或者 PDX/PDY/PDZ bits in Detection Source Register ($0A) depending on Control1($18) INTREG[1:0] setting.

0: Do not clear “INT1” LDX/LDY/LDZ or PDX/PDY/PDZ bits in Detection Source Register ($0A)

19

基于51的地震震动报警器

CLR_INT2

1: Clear “INT2” and LDX/LDY/LDZ or PDX/PDY/PDZ bits in Detection Source Register ($0A) depending on Control1($18) INTREG[1:0] setting.

0: Do not clear “INT2” and LDX/LDY/LDZ or PDX/PDY/PDZ bits in Detection Source Register ($0A)

寄存器25 CTL1(控制寄存器1) 地址0X18 读/写

D7 DFBW 0 D6 THOPT- 0 D5 ZDA 0 D4 YDA 0 D3 XDA 0 D2 0 D1 0 D0 0 INTREG[1] INTREG[0] INTPIN DFBW 0: Digital filter band width is 62.5 Hz 1: Digital filter band width is 125 Hz

THOPT (This bit is valid for level detection only, not valid for pulse detection)

0: Threshold value is absolute only 1: Integer value is available XDA

1: X-axis is disabled for detection. 0: X-axis is enabled for detection. YDA

1: Y-axis is disabled for detection. 0: Y-axis is enabled for detection. ZDA

1: Z-axis is disabled for detection. 0: Z-axis is enabled for detection INTREG[1:0]00:

20

基于51的地震震动报警器

第5章 系统的硬软件设计

5.1 系统结构框图

5.2 单片机最小系统原理图

21

基于51的地震震动报警器

5.3 MMA7455三轴数字加速度传感器模块电路

5.4 蜂鸣器发声原理电路

22

基于51的地震震动报警器

5.5 系统原理电路图

5.6 系统软件程序的思想

系统在首先定义了一些变量与引脚,之后分别编写了如下子函数:延时函数部分、蜂鸣器工作部分、IIC通信协议、MMA7455部分。

IIC部分包括:通信开始、通信停止、通信查应答位、向IIC从机写入一个字节、读出一个字节、按地址写入一字节数据、按地址读出一字节数据子函数。

MMA7455部分包括:自检子函数、读取x轴加速度子函数、读取y轴加速度子函数、读取z轴加速度子函数。

本项目程序采用模块化的办法将需要用到的程序段写为子函数,方便后期直接调用,提高了编写的效率。

主程序开始后,首先进行加速度传感器mma7455的自检,如果没有检查到传感器正常则蜂鸣器长鸣,直到检测到传感器正常。之后通过iic_write函数向传感器芯片的xyz三轴加速度数值所在的寄存器写入数值,以矫正三个轴的初始值,初始化完毕后,进入测量的永远循环。在循环内部分别把前面读取加速度函数返回的值扩大10倍后,赋给a、b、c(分别对应x、y、z方向)。

以sendx()为例,首先发出指令让MMA7455进入2g量程的测量模式,之后等待测量完毕,测量完毕后读取0x06H寄存器的x轴加速度值,之后进行第二次同样测量,取二者差的绝对值并返回此数。

23

基于51的地震震动报警器

之后,在主程序将上述取得的三个方向的差值分别与程序之初宏定义确定的阀值“check”进行比较,小于阀值可视为测量误差或可以接受的变化范围,大于阀值这表明传感器测到的该方向的加速度该变量超过了预设值,即产生了较大的震动。然后只要三个方向有其中任意一个超过阀值,则启动蜂鸣器报警子函数。单次报警结束后又回到循环体开始处进行数值测量读取。

24

基于51的地震震动报警器

结论

本文给出了基于AT892S52单片机的地震检测报警系统的一种设计方法。该系统设计方法简单,易于实现,成本低廉,精度能够满足一般的应用场合,可以为工业生产和人民的生活提供依据。设计所选AT892S52是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程Flash 存储器,与工业80C51 产品指令和引脚完全兼容。AT89S52在众多嵌入式控制应用系统中得到广泛应用。方案的传感模块,MMA7455是一款数字输出(I2C/SPI)、低功耗、紧凑型电容式微机械加速度计,本方案通过I2C协议使用2g量程模式进行检测。MMA745xL系列具备待机模式,使它成为以电池为电源的手持式电子器件的理想选择。

通过本次设计,复习巩固我们以前所学习的数字、模拟电子技术、单片机原理及应用等课程知识,加深对各门课程及相互关系的理解,并成功使用了AD10、Keil和两款电子设计软件,使理论知识系统化、实用化,系统地掌握微机应用系统的一般设计方法,培养较强的编程能力、开发能力。

同时,在设计的过程中,我也发现了本系统的许多不足和可以改进的地方。但因时间紧迫等原因没能改进。比如对于振动阀值的精确设定,虽然存在不足,但本设计的基于51的地震震动报警器仍具有它的实用性。

25

基于51的地震震动报警器

参考文献

[1] 马忠梅等.单片机C语言应用程序设计.北京航空航天大学出版社, 1997:201-211 [2] 谭浩强 C程序设计 2005 ,07 :(219-278).

[3] 戴佳. 单片机C51语言应用程序设计. 电子工业出版社, 2006.7:168-169 [4] 朱民雄.计算机语言技术. 北京航空航天大学出版社,2002.1:103-105 [5] 李鸿. 单片机原理及应用. 湖南大学出版社. 2004:8:72-73 [6] 刘建清. 单片机技术. 国防工业出版社, 2006.8: 104-105

[7] 杨宁,胡学军.单片机与控制技术.北京航空航天大学出版社,2005-03:306-322 [8] 刘宝元,张玉红等.基于单片机系统设计[J].中国科技核心期刊,2009,28(12).77-83 [9] 梁发强,曾志钻,梁辛征.现代单片机系统[J].湖南工业大学学报,2007,21(6):64-66.

26

基于51的地震震动报警器

附录1

项目源程序,如下:

/*************************************************************************/ /*********** 头文件部分 **********/ /*************************************************************************/ #include #include //要用到_nop_();函数

/*************************************************************************/ /*********** 变量宏定义 **********/ /*************************************************************************/ #define uchar unsigned char #define uint unsigned int #define check 33 //out*10 判决阀值 uchar ack_sign; //I2C 应答标志

/*************************************************************************/ /*********** 单片机引脚定义 **********/ /*************************************************************************/ sbit fmq=P2^1;

sbit sda=P2^7; //I2C 数据传送位 sbit scl=P2^6; //I2C 时钟传送位

/**************************************************************************/ /********** 数据部分 模块器件地址定义 *****/ /**************************************************************************/ #define IIC_READ 0x1D //定义读指令 器件地址 野火是 0x3a #define IIC_WRITE 0x1D //定义写指令 器件地址 野火是 0x3a

/**************************************************************************/ /************ 各延时 子函数 **************/ /**************************************************************************/ void iic_delay() //5us延时 { _nop_(); _nop_(); _nop_(); _nop_(); }

27

基于51的地震震动报警器

void delay() //消除按键抖动 { unsigned int i; for(i=0;i<20000;i++); }

void delay_50us(uint t) {

uchar j; for(;t>0;t--) for(j=19;j>0;j--); }

void delay_50ms(uchar t) {

uint j; for(;t>0;t--) for(j=6245;j>0;j--); }

void delay1ms(unsigned int i) //1ms基准延时程序 { unsigned char j; while(i--) { for(j=0;j<115;j++) {;} } }

/**************************************************************************/ /************ 蜂鸣器 子函数 **************/ /**************************************************************************/ void delay500us() { unsigned char j;

for(j=0;j<32;j++) //500us基准延时程序 { ; } }

void beep() //产生1KHZ频率声音的函数 {

fmq=0; delay500us(); fmq=1;

28

基于51的地震震动报警器

delay500us(); }

/*********************************************************************/ /************** I2C通信部分 子函数 ***************/ /*********************************************************************/ void iic_start() //函数功能:I2C通信开始 { sda=1; iic_delay(); scl=1;

iic_delay(); sda=0; iic_delay(); }

void iic_stop() //函数功能:I2C通信停止 { sda=0; iic_delay(); scl=1; iic_delay(); sda=1; iic_delay(); }

void iic_ack() //函数功能:I2C通信查应答位 {

sda=1; scl=1; iic_delay(); ack_sign=sda; scl=0; }

void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节 {

uchar i,temp,temp1; temp1=wdata; for(i=0;i<8;i++) {

29

基于51的地震震动报警器

scl = 0; iic_delay(); temp=temp1; temp=temp&0x80; if(temp==0x80) {sda=1;} else { sda=0; iic_delay(); scl=1; iic_delay(); scl=0; iic_delay(); temp1=temp1<<1; } } }

char iic_read_byte(void) //函数功能:从I2C从机中读出一个字节 {

uchar x; char data_data; for(x=0;x<8;x++) { data_data=data_data<<1; sda=1; iic_delay(); scl=0; iic_delay(); scl=1; iic_delay(); if(sda==1) {data_data|=0x01;} else {data_data&=0xfe;} } return data_data; }

void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据 {

uchar t;

30

基于51的地震震动报警器

t=(IIC_WRITE<<1); iic_start(); iic_write_byte(t); iic_ack(); iic_write_byte(byte_add); iic_ack(); iic_write_byte(wdata); iic_ack(); iic_stop(); }

char iic_read(uchar byte_add) //函数功能:按地址读出一字节数据 {

uchar t; char x; t=(IIC_WRITE<<1); iic_start(); iic_write_byte(t); iic_ack(); iic_write_byte(byte_add); iic_ack(); t=((IIC_READ<<1)|0x01); iic_start(); iic_write_byte(t); iic_ack(); x=iic_read_byte(); iic_ack(); iic_stop(); return x; }

/*********************************************************************/ /************** MMA7455自检 子函数 ***************/ /*********************************************************************/

void self_test7455() //函数功能:检测7455有没有插好,如果没有插好,蜂鸣器长鸣 { uchar j; char t; delay_50us(10); iic_write(0x16,0x05); delay_50us(20); t=iic_read(0x16); if(t!=0x05)

31

基于51的地震震动报警器

{ beep(); } }

/*********************************************************************/ /************** 读取xyz加速度 子函数 ***************/ /*********************************************************************/ char sendx() //函数功能:测量并返回连续两次x轴测量数据的差值 { uchar x1,x2,x3,xsign; char x; int i; char xa,xb,wx; iic_write(0x16,0x05); //MMA进入 2g 量程测试模式 while(!(iic_read(0x09)&0x01)); //DRDx标置位,等待测试完毕 x=iic_read(0x06); //0x06H x轴加速度值 寄存器地址 xa=x; //第一次测量值 while(!(iic_read(0x09)&0x01)); //DRDx标置位,等待测试完毕 x=iic_read(0x06); xb=x; //第二次测量值 if(xa-xb<0) //求得两次差的绝对值 {wx=-1*(xa-xb);} else {wx=xa-xb;} return(wx); //返回前后两次测量的差值 }

char sendy() //函数功能:函数功能:测量并返回连续两次y轴测量数据的差值 { uchar y1,y2,y3,ysign; char y; char ya,yb,wy; iic_write(0x16,0x05); while(!(iic_read(0x09)&0x01)); y=iic_read(0x07); //0x07H y轴加速度值 寄存器地址

32

基于51的地震震动报警器

ya=y; while(!(iic_read(0x09)&0x01)); y=iic_read(0x07); yb=y; if(ya-yb<0) {wy=-1*(ya-yb);} else {wy=ya-yb;} return(wy); }

char sendz() //函数功能:测量并返回连续两次z轴测量数据的差值 { uchar z1,z2,z3,zsign; char z; char za,zb,wz; iic_write(0x16,0x05); while(!(iic_read(0x09)&0x01)); z=iic_read(0x08); //0x08H z轴加速度值 寄存器地址 za=z; while(!(iic_read(0x09)&0x01)); z=iic_read(0x08); zb=z; if(za-zb<0) {wz=-1*(za-zb);} else {wz=za-zb;} return(wz); }

/*********************************************************************/ /************** 主函数 ***************/ /*********************************************************************/ void main() { uchar j; int t; char a,b,c;

33

基于51的地震震动报警器

}

self_test7455(); //对模块进行自检

//校正x值为 00 //校正y值为 48

//校正Z值为 -30的补码

//校正Z值,校正值为负数,要把高位写 1

iic_write(0x10,0x00); iic_write(0x12,0x30); iic_write(0x14,0xE2); iic_write(0x15,0xFF);

delay_50ms(20);

while(1) { a=sendx()*10; // 乘10 是为了扩大返回的前后两次的测量差异 b=sendy()*10; //方便进行更精确的阀值设定 c=sendz()*10; }

if((a>check)||(b>check)||(c>check)) { for(t=0;t<1000;t++) { beep(); } fmq=1; }

//如果变量abc或xyz三个轴中 //有任意一个变动幅度超过阀值check //循环执行蜂鸣器报警程序

//关闭蜂鸣器

34

基于51的地震震动报警器

项目创新及特色

本项目创新点有:

1.使用51单片机作为MCU,制作简易,成本低廉。 2.基于加速度测量进行监控,测量方法比较少见

3.整机系统低功耗,方便摆放或携带,易于普通环境的监控报警

35

本文来源:https://www.bwwdw.com/article/np3x.html

Top