基于单片机的水平角度仪系统设计

目 录

摘 要 I

Abstract II

引 言 1

1控制系统设计 3

1.1系统方案设计 3

1.2系统工作原理 4

2硬件设计 6

2.1单片机 6

2.1.1单片机最小系统 6

2.1.2 STC89C52单片机的性能 7

2.2角度采集电路 8

2.2.1 ADXL345传感器的工作原理 9

2.2.2 ADXL345传感器倾角测量的原理 9

2.2.3 ADXL345寄存器的介绍 12

2.2.4 ADXL345传感器的通信设计 12

2.3温湿度采集电路 13

2.4 ATK-HC05蓝牙串口 14

2.5 LCD液晶显示器 14

2.6蜂鸣器报警电路 15

2.7按键电路 16

3软件设计 17

3.1软件环境 17

3.2程序设计 19

结 论 20

参考文献 21

附录1 主要源程序 22

附录2原理图 30

致 谢 31

摘 要

为了让水平仪成为生产制造过程中的得力助手,实现倾角的高精度、便捷测量的功能。使其拥有多种功能应对检测情况,在生产过程中可以有效地减小生产误差,保证产品质量,落实安全生产等等。本设计提出了一个将软硬件相结合,电路设计简单、稳定的系统设计。利用STC89C52单片机作为微处理器,与ADXL345加速度传感器和DHT11温湿度传感器组合,通过单片机进行控制以及运算并分析处理数据。实现对角度和温湿度的数据采集与检测,通过按键电路用户可自由设定角度报警值,由LCD显示屏显示,也可通过手机显示测量数值。结果表明,基于单片机的水平角度仪系统设计在技术上是可行的,并且整套系统的运行性能和安全性能表现良好。

关键词:STC89C52单片机;ADXL345加速度传感器;DHT11温湿度传感器;角度

Abstract

In order to make the level become a right-hand assistant in the production and manufacturing process, and realize the function of high precision and convenient measurement of the inclination angle. It has a variety of functions to deal with the testing situation. In the production process, it can effectively reduce production errors, ensure product quality, implement safety production and so on. This design puts forward a system design which combines hardware and software, and the circuit design is simple and stable. STC89C52 is used as microprocessor, which is combined with adxl345 three-axis acceleration sensor and DHT11 temperature and humidity sensor. The data is controlled, calculated and analyzed by single-chip microcomputer. Realize the data acquisition and detection of angle and temperature and humidity. Through the key circuit, the user can freely set the angle alarm value, which can be displayed by LCD screen or by mobile phone. The results show that the design of the system is feasible in technology, and the performance of the whole system is good.

Keywords: STC89C52 single chip microcomputer;ADX345 triaxial acceleration sensor; DHT11 temperature and humidity sensor;Angle

引 言

在科学技术高速发展的21世纪,现代生产控制设备也日新月异,许多的性能和结构都发生了翻天覆地的变化,为了保证所生产产品的精确度与实用性,测量技术也要不断的进步。由于我们已经进入了信息时代,测量技术更是十分重要。多个领域都需要应用它,例如建筑行业在设计高楼、桥梁时,可能需要连续几个月甚至一年以上的时间对建筑环境在水平面的倾斜度进行测量和处理,因此需要采样进度很高的数字水平仪系统。由此可见,传统的电子水平仪愈来愈不能满足高进度、高精度测量情况的要求。这样看来,设计一种具有高精度和低功耗功能的新式电子水平仪是目前的发展方向。同时,在国家的倡导下,各种行业都在执行精密制造技术,新式电子水平仪这种量具会越来越急需,新式电子水平仪的市场前景会更加广阔。

其实早在战国时期,我们伟大的祖先就用其博大精深的智慧发明了早期的水平仪,并应用于房屋建筑等日常生活中。对于水平这一定义的最早提出者就是墨子,也是我国著名的思想家、教育家。他说:"平,同高也"。可以理解为当物体在一样的高度时,这个状态就是水平状态。考古学家甚至认为,可能早在现存的文字记载之前,水平仪就已经实际应用于当时的城市建筑中了。最早的水平仪是运用水的流动性与地球间的吸引力这一特性发明的,当水在一定的地点、一定的时间位于一个相对水平的平面,即为水平。这种测量原理也一直沿用到今天,只不过不断的进行了优化和改进。

随着发展人们已经不再利用水来粗略的测取水平,取而代之的是更为精确的气泡式水平仪。它由一个长圆形玻璃管和底座构成,管内充满着酒精或者醚,结构简单轻巧,便于携带。它的工作原理是在管内充满酒精或者醚,并且留一小气泡,因为气泡会永远保持在再高点,就可用其测量倾斜的角度[1]。当系统越灵敏时它的气泡移动范围就会越大。

现在的电子式水平仪是经过多次更新后的,应用的范围也比以前广,在多个领域都出现了它们的身影。国内大部分的数显式电子水平仪的主要缺点有:灵敏度差、反应时间慢等,在生产与创新能力方面也相对落后,与国外有很大的差距。结果显而易见,目前国内水平仪技术的研发与应用已经相差了一定的距离。目前主要存在着系统智能化程度不高,缺乏多数据处理能力,无法快速测量等缺点。但是国内也有一些厂家在水平仪的研制与开发方面同国外一样取得了不小的进展。在国内的生产厂家中,台湾是做的比较好的,内地的华虹和海尔也不错。随着角度仪产业愈来愈蒸蒸日上,在这一大环境下,国内拥有种类齐全的厂家,产品向着速度越来越快,功耗越来越低,分辨率越来越高,性能越来越强的方向发展也指日可待。

本毕业设计的主要目标为:设计出一种拥有高精度、大角度范围、多功能测量、超预设值报警、手机端实时显示的便携式智能水平仪。该水平仪可以判断角度的倾斜方向,感测当前环境的温度和湿度,即使在恶劣的现场工业环境中,仍能表现出优秀可靠的性能。

通过查找相关的文献,在得到各种芯片和元件的资料后,确定设计方案。在硬件设计上,尽量选取可以减少设计时间,并且具有较好性能的元器件。在软件设计上,采用C语言在Keil软件中编程,通过I²C和单总线的通讯方式对数据进行传输。并且编译计算公式,计算测量角度,进行校准技术,减小测量的误差。这些功能的实现都是需要提前学习的,大都通过视频和资料的方式去自主学习,遇到不明白的地方及时请教指导老师。系统设计好后,利用仿真软件进行仿真处理,当所有的功能都成功实现后,就无需更改了。然后按照预先设计的小巧精致的外观做出实物模型,最后用多次实验来验证其合理性及实用性。

本文将围绕设计一个完整的系统设计过程展开,具体内容如下:

(1)第一章:系统方案设计。确定整体应用方案,并设计出结构框图。

(2)第二章:硬件设计。将各模块分别介绍,分析不同器件的性能和选型原因,工作原理等。

(3)第三章:软件设计。介绍程序软件的开发环境,程序的设计。

1控制系统设计

1.1系统方案设计

在设计初期,对智能水平仪的设计拟定了两种可行性方案,根据具体情况选择最适合本设计的方案,两种方案如下:

方案一:采用STM32单片机作为控制核心。采用MMA7455三轴加速度传感器与单片机共同作为倾角的测量系统,采用DS18B20与DHT11传感器,组成一个拥有复合式传感器的温湿度测量系统,一个用于检测环境温度的变化,另一个用于检测环境湿度的变化。最后交由单片机进行信号的处理。利用五位共阳极数码管以动态扫描的显示方式显示倾斜角度值及温湿度值。

方案二:采用ST89C52单片机作为控制核心,将ADXL345加速度传感器和DHT11温湿度传感器结合,共同作为一个测量系统。采集角度倾斜的数据。然后通过I²C通信方式实现单片机和传感器之间的数据传输。对外界环境的温度和湿度的变化进行数据实时采集,以单总线的方式传输。用户还可通过按键电路,自定义设置角度的界限值,然后转换为电信号传递到单片机中,当超过预设报警值时单片机会给三极管发送一个低电平,驱动蜂鸣器报警。通过单片机进行控制以及运算,由微控制器分析处理数据,将模拟信号转化为数字信号,最终将倾角值和温湿度值以数字的形式直接在LCD液晶显示屏上进行显示,并通过HC-05远程数据传输到手机端显示。实现了倾角与温湿度的高精度、多功能、便捷直观的测量与显示。

通过将两种方案多方面、多角度的进行对比,发现方案二更能贴近实现倾角与温湿度的高精度、多功能、便捷直观的测量与显示的设计初衷,故本次系统的设计为方案二。

相对于方案一,以ST89C52单片机作为控制器,数值不但可以显示,用户还可以自由设置角度的界限值,如果超过就会报警提醒。而且通过已经预先编译好的程序来判断温湿度值可以更加精确的掌握环境中的细微变化。不但如此,ST89C52单片机在资料和性能上较全面,足以满足使用。还有成本低、操作简单的优点。并且ADXL345传感器内部自带的AD转换器,可以直接将模拟信号转换为数字信号,减少了电路的繁琐。在倾角的测量上也有很多优点,它既可以在静态时生成重力加速度还可以在运动或者振动时生成动态加速度,以此保证产品无论在动态还是静态状态时均可以检测任何轴上是否有动作产生,且判断加速度是否超过用户的设置值。相较于方案一中采用的MMA7455加速度传感器更加适合本设计。对于温湿度的采集设计,方案一中采用的复合式传感器,用数字式集成温度传感器DS18B20去单独感测环境温度,测温范围广为:-55~+125 ℃,温度分辨力高,虽然可以极大地缩小温度误差,但对于正常外部作业环境的温度来说,往往温度只需要一个大概的范围值,此时的温度只是起到一个对作业环境参考的作用。单独采用一个DHT11传感器就足以满足情况,无需在将温度湿度分别检测,这样就简化了系统程序设计,减少不必要的麻烦和浪费。在显示电路的设计上,方案一中数码管显示时五个LED灯会逐个被点亮,缺点就是在显示时会有闪烁,不能达到良好的观察效果。而方案二中的LCD液晶显示屏就可以避免这一缺陷,LCD字符显示的外形非常优美,显示清晰,为了要考虑整体的效果,还是采用LCD液晶显示屏。方案二还额外增加了在实际中更加方便使用的功能,即蜂鸣器报警和手机端监控显示的功能。这也是以往水平仪设计中没有涉及到的。

1.2系统工作原理

本毕业设计系统由单片机、加速度传感器、温湿度传感器、数码显示屏、蜂鸣器、按键以及电源七部分构成[2]。设计框图如图1.1。

图1.1 整体设计框图

由ADXL345加速度传感器检测用户当前应用环境的三轴水平角度值,根据传感器产生的静态或动态加速度值与单片机内预先写好的程序去计算,判断出是否超过报警值。由DHT11温湿度传感器检测用户当前应用环境的空气温度和湿度变化值,方便用户可以确定当前作业环境温度与湿度的范围值,以此为依据去考虑对作业环境有没有影响,使角度仪不单单只可以测量倾斜角度,丰富了角度仪的应用功能。用户还可通过按键自主设置角度的上下限报警值,根据不同环境、不同要求结合情况自由设置。由传感器检测和用户设置的数据最终都传输到单片机中,由单片机按照预先编译好的程序输出到显示屏上显示,用户如有需要还可通过蓝牙连接将数据传输到手机端,将数据的显示多样化、便捷化。以此为设计原理完成一个智能化水平角度仪的设计。

2硬件设计

2.1单片机

在本设计中需要用到数据的运算与处理功能,还要对数据进行存储[3]。就像是一个电脑需要安装在PC主板上的CPU、RAM、ROM、I/O这些单独的芯片一样。而本设计为了优化电路设计,需要集合这些功能于同一芯片的器件。而单片机可以将这些芯片所有的功能集中在了一个芯片上,并且STC89C52单片机因为其功耗低、性能高、存储量大的特点,所以被选做了系统的控制器,控制所有的核心程序。对传感器检测的各种数据进行信号处理,然后才能执行后续的操作。起到一个类似人体大脑的作用。

2.1.1单片机最小系统

单片机最小系统包括了STC89C52单片机、时钟电路、和复位电路[4],可以用来控制时间和其他设备,还具备输出设备和通讯的接口等等。单片机最小系统框架如图2.1所示,其引脚接线图如图2.2所示。

图 2.1 单片机最小系统框架

图 2.2 单片机最小系统引脚接线图

一般情况下,复位电路是每个单片机系统中必须存在的,如果出现程序卡顿死机的情况,或者是出现其他未知的危害时,就可以通过这个复位电路来重新启动,保护系统的正常工作。本设计为简化电路的设计采用上电复位的方式。与复位电路一样在系统中起到至关重要的作用的就是时钟电路,在系统工作工程中,时钟电路就像是人的心脏一样,把握并控制着整个单片机的节奏[5]。

2.1.2 STC89C52单片机的性能

单片机经常作为一个微控制器被使用在各种智能产品中,以实现多种复杂的功能。相较于51单片机,STC89C52单片机具有更多优质的性能。例如拥有更大的数据存储功能,8K字节的FLASH存储器可以进行更多的计算缓存。521字节的RAM大大提高了反应速度,满足各种设情况和性能的需求。能更好地与其他的设备兼容,32个I/O口可以连接更多的外设和传感器,这是控制与连接外设的基础。实行串行并行接口同时使用的功能能够更加快速的工作。同时还具有掉电保护功能,当系统突然断电时,它可以把数据都存储保护起来,不会造成损失,防止系统崩溃。于此同时,单片机的烧录过程也非常便捷,将TX和RX口连接适配的编译器即可[6]。

STC89C52单片机是双列直插式设计,共有40个管脚,其引脚如图2.3所示。其中共设有32个外部端口可供用户使用。

图2.3 STC89C52引脚图

2.2角度采集电路

本设计需要设计一种可以测量相对水平倾角的器件,测量的结果必须精确,且测量的范围要尽可能的广泛。因为工业现场是此设计主要的应用环境,所以对于恶劣环境因素的影响必须考虑在内,使其性能得以发挥。ADXL345传感器小巧精致的外观下(如图2.4所示),却拥有超高的性能。可以直接以数字信号输出,且测量误差小,结果准确。因此非常适用在水平仪这种移动的设备中,它既能测量出由于物体运动或震动产生的动态加速度,又可测量出物体静止时的加速度,使测量的应用场景更加齐全。其拥有超高的分辨率,能够检测到低于1.0º的角度倾斜变化。并且可以通过判断三个轴的加速度正负值,检测倾斜的方向。

图2.4 ADXL345芯片

2.2.1 ADXL345传感器的工作原理

由ADXL345加速度传感器测得数据,它的信号特征为模拟信号。并通过ADX345传感器内部转换为数字信号。但由于输出的数字信号为二进制编码,而加速度为十进制编码,所以需要通过将两者进行转换[7]。最后进行数据的读取,依靠数字滤波器及中断逻辑单元,可以实现这些指令。电路原理图与ADXL345的芯片功能框图分别如图2.5和2.6所示。

图2.5 ADXl345传感器的电路原理图

图2.6 ADXL345芯片功能框图

2.2.2 ADXL345传感器倾角测量的原理

为了避免任何外加直流产生的加速度输出信号对计算结果的影响,每次在测量之前让物体在水平面静止一段时间,以保证物体没有产生其他的加速度,影响传感器接收信号的准确性[8]。同时在设计程序时,也要考虑到测量器件自身产生的向心加速度对测量结果准确性的影响。无论何时,保证加速度的大小只与重力相关。

ADXL345三轴加速度传感器通过X、Y、Z轴上的重力加速度计算倾斜角度的基本原理如下:

通过ADXL345测量出X、Y、Z轴上的重力加速度分量的大小,分别能得到X轴与水平面的夹角α,Y轴与水平面的夹角β,Z轴与水平面的夹角δ。设X轴的加速度分量为Ax,Y轴的加速度分量为Ay,Z轴的加速度分量为Az[9]。对重力进行力学分析可得如下公式[9]:

图2.7 水平仪数学测量模型图

如图2.7所示,DA代表X轴,DB代表Y轴,DG代表Z轴,DA⊥DB,假设X轴与水平面的夹角为α,Y轴与水平面的夹角为β,X轴与Y轴所组成的平面DAB与水平面的夹角为γ。过D点做水平面的垂线,垂足为点E,那么∠DAE=α。∠DBE=β。过E点做AB的垂线与AB交于C点,由几何知识得∠DCE是平面EAB与水平面的夹角γ,即水平仪要测量并显示的角度。下面推导α、β、γ之间的关系,假设DE=1,由DE⊥AE,DE⊥BE可知:

(2 -4)

因为△ADB为直角三角形,所以:

(2-5)

将AB代入得:

(2-6)

又因为△DEC为一直角三角形,所以可得:

(2-7)

将式代入式(2-4)得:

(2-8)

因为,,所以:

(2-9)

由,推出:

(2-10)

即可得出被测面与水平面间的夹角γ:

(2-11)

根据图2.7的数学模型,加速度传感器的Z轴与自然坐标系的Z轴间夹为γ。那么同理,加速度传感器的X轴与自然坐标系的X轴的夹角α为:

(2-12)

加速度传感器Y轴与自然坐标系Y轴的夹角β为:

(2-13)

根据以上结果,在单片机编写出对应程序,利用公式(2-10)的计算方法,算出可以直接显示使用的角度值。在本设计中,为了在使用过程中可以方便用户的读数。Z轴的加速度值无论是正数还是负数时,γ的值取永远保持在0º-90º之间[10]。

2.2.3 ADXL345寄存器的介绍

寄存器是ADX345中至关重要的部分,它的功能主要就是通过单片机控制寄存器的读写来实现的。根据不同情况的需求,运用不同功能的寄存器,实现对不同功能的控制。例如,如果系统中需要识别一些设备,就要用到只读寄存器去识别设备上的标识,以此来区分不同设备。

在本毕业设计中,ADX345用于存储数据的寄存器为OFSX、OFSY、OFSZ[11]。经测量得到的不同坐标的偏移量就存储在其中,然后添加到加速度计算的数据中,最后得到的结果就存储下来了。本设计在输出前进行了中断配置,通过设置位值,去使用相应功能,位值为1时就会生成中断,位值为0时就会阻止产生中断。然后读取寄存器内部数据。为了防止各寄存器间在进行读取指令时,系统数据发生变化,所以本设计使寄存器采用多字节的命令去进行读取[12]。寄存器字节格式见表2.1。

表2.1寄存器INT_ENABLE字节格式

D7 D6 D5 D4

DATA_READY SINGLE_TAP DOUBLE_TAP Activity

D3 D2 D1 D0

Inactivity FREE_FALL Watermark Overrun

2.2.4 ADXL345传感器的通信设计

本次设计DXL345的I2C通信连接方式如图2.8。为了适应I2C通信方式,选择了最恰当的输出数据速率,为12.5Hz。以此避免由于输出数据对通信速度造成的影响,避免通信效果不佳造成通信的失败。

图2.8 ADXL345的I2C通信连接方式

2.3温湿度采集电路

本系统中需要满足对环境温度和湿度变化的实时测量,并且保证测量结果准确有效,且具有较高的灵敏度和稳定性。基于以上要求,本设计采用了DHT11温湿度传感器,它同时具备两种采集功能,包括对环境温度的采集和环境湿度的采集。同时对于环境中外部因素的干扰抗击能力也表现很好,测量结果具有一定的稳定性,可以适合于多种场合。这款温度传感器转换时间为75ns,比传统DS1820传感器速度要快很多。检测精度为0.2,也满足本设计的需要,检测的结果采用单总线的数据传输方式到单片机进行控制。由于输出的是数字信号,无需转换,简化了电路的设计。电路图如图2.9所示。

图2.9温湿度传感器模块电路图

DHT11传感器通过感湿元件和NTC采集温湿度数据,然后经过处理器和存储器对采集到的数据进行处理和存储[13],并且,这些器件是传感器内部自带的,无需在外部添加,可以简化电路设计的复杂度。传感器的外部共有4个引脚。其引脚的功能见表2.2。

表2.2 DHT11引脚介绍

引脚号 引脚名称 引脚功能

1 VCC 供电电源正极

2 DATA 单总线串型数据线

3 NC 悬空脚

4 GND 接地脚

2.4 ATK-HC05蓝牙串口

本系统需要通过蓝牙功能,实现与手机设备的连接,而ATK-HC05作为蓝牙串口模块,性能较高,所支持的波特率范围大,并且可以兼容于本设计使用的单片机。极其方便、灵活。本设计中对于数据的传输采用的方式为无线传输。与传统通讯采用定频的方式不同,蓝牙采用的是跳频和时分多址技术[14],既可以传送模拟信号同时也可以传输数字信号。

2.5 LCD液晶显示器

本系统需要一个显示电路用来将经单片机处理后的数值显示出来,并保证显示屏的性能稳定,显示效果良好的要求。在这一基础上选取一种最为合适的显示器。以此为要求,本设计采用了LCD液晶显示器作为显示电路中的显示器件。LCD液晶显示器在显示时可以保持显示屏的色彩和光亮恒定,画质清晰,不会闪烁。并且接口简单,方便实物的连接。相较于传统的显示器还要轻很多,满足本设计简化电路的要求。单片机采集到信号后,经过运算处理,在液晶LCD1602上面显示出计算测量角度与温低湿度值。电路原理如图2.10。

图2.10显示电路原理图

液晶显示模块的读写功能也是通过预先做好的编程指令完成[15]。读写操作时序如图2.11和2.12所示。

图2.11 LCD读操作时序

图2.12 LCD写操作时序

2.6蜂鸣器报警电路

本系统需要一种报警装置,用来实现超出预设角度界限值就报警的功能。应用蜂鸣器作为报警元件[16]。将蜂鸣器的两个引脚分别连接三极管和地。本设计采用的PNP型三极管,可以起到放大电流和拉高电平的作用。由于本设计的单片机电路较小,不能提供给蜂鸣器所需的电流,所以三极管将电流放大200倍后,就可驱动蜂鸣器进行报警。同时三极管的上拉电阻起到限流的作用,因为单片机上电后引脚默认为高电平,所以为了防止三极管导通,只有我们想让三极管进行操作的时候才会给蜂鸣器一个低电平这样蜂鸣器才会进行报警。

电路图如图2.13所示。

图2.13蜂鸣器电路原理图

2.7按键电路

本次设计系统中,对于按键的要求只包括设置角度上限值和下限值,用于使用者自由设置报警值。其中共有三个按键,一个按键起到设置的作用,一个按键起到角度增加的作用,一个按键起到角度减少的作用。数量较少,所以采用了将按键单独接入电路的方式。电路连接如图2.14所示。

图2.14按键电路连接图

3软件设计

3.1软件环境

性能的高低才是一个系统智能化的表现,本系统拥有了稳定的硬件基础,在这个条件下,我才可以利用Keil软件来编译程序功能代码,实现对硬件系统中各元器件的控制。通过软件程序与硬件的搭配,对所得信息的处理与计算,实现本次设计要求的各项功能。与此同时,在编写程序的过程中可能会出现很多的问题,这就需要在编写过程中不断地进行修改。编译界面如图3.1所示。

图3.1编译界面

在本次程序设计中,经过了不断的调试与功能优化,最终当全部功能都完美实现后,将所编译的代码转换为HEX文件,执行到单片机系统中[17]。下载界面如图3.2。

图3.2下载界面

3.2程序设计

对于本毕业设计而言,整个程序设计中的主函数较为简单,主要的核心内容包括,蓝牙的初始化,DXL345加速度传感器的角度换算程序,LCD液晶显示驱动程序,以及角度报警值的自由设置和超值报警等程序的编译[18]。这些编写的程序在硬件上就体现为,单片机处理模块,蓝牙模块,角度检测模块,温度采集模块,按键模块以及显示模块等。以此提高了程序的可读性和可移植性,便于程序的调试,程序流程图如图3.3所示。

图3.3系统软件流程图

本系统程序的主要流程为:首先系统上电后,蓝牙串口进行初始化,ADX345传感器和DHT11传感器分别检测当前环境的倾斜角度值与温湿度值,然后有LCD显示屏显示,或者通过蓝牙传输到手机端显示,此时判断用户是否设置按键,如果未按下设置键,传感器继续根据环境实时检测并显示,如果按下设置按键,通过角度加和角度减按键来控制角度的上下限值。程序整个执行过程中系统会根据实时设定自动判断是否超过界限值,并由且由蜂鸣器报警提示。

结 论

经过这几个月的不懈努力,最终如期完成了本次毕业设计,并且达到了预先设计的功能要求。在整个的系统设计过程中,我一直力求可以实现电路简单、成本经济实惠,测量精度高、实用性强、易携带等要求。但是由于一些条件的限制,所设计系统可能仍然存在着某些不足,有待继续改进。

本水平仪的设计操作简单,有一定实际利用价值,虽然还存在一些细节问题有待优化,比如可以增加对于温湿度值进行上下限设置,超过预设值时就报警提示。还可以增添通过蓝牙进行手机端超值报警的功能,当用户一定时间没有查看到时,就将测量数值以短信的形式传到用户的手机中,这样对于报警的提示功能,就做到了更加全面的考虑。

本次设计过程中除了要积累硬件设计、电路调试的经验。对于电路原理和专业知识也要理解透彻,以避免设计过程中出现设计的电路的布局布线不合理,电路焊接不良,外观制作不够精美,多次返工等问题。经过多次实践操作,做到理论与实际的结合。

本设计还由于涉及到了众多的元器件,在本系统中应用的器件型号、芯片类型未必都是最佳的,还有许多的地方需要改进,以后我会继续努力学习电路设计,争取做到设计的产品无可挑剔。我也会多多地请教,多多地倾听别人提的优秀建议。无论做什么事情都坚持不懈,万事开头难,遇到困难勇敢的走下去,就会有不一样的收获与体验。最后希望我所设计的水平仪的可以真正帮助到人们的生活,可以给人们带来前所未有的智能享受。

参考文献

[1]牛燕雄,郭晓维等.激光水平仪理论模型的建立[J].光电子激光,1996,7(2):94-97

[2]张玉华,干安敏,干成江.差动电容式传感器在智能电子水平仪中的应用[J].传感器技术,2002,21(12):52-55

[3]夏家和,赵忠,卫育新.微型智能电子水平仪设计[J].测控技术,2005,24(1):69-71

[4]贾伯年,俞朴等.传感器技术[M].南京:东南大学出版社,2000.8:25-56

[5]马廷锋,耿世钧等.新型单片电容式新型传感器的研制[J].传感器技术.2003,22(6):25-26

[6]谭显裕.军用光纤陀螺的发展,关键技术和应用前景[J].现代防御技术,1998,26(4):55-61

[7]叶炜,倪永锋,赵为党等.闭环光纤陀螺全数字式信号检测方法研究[J].光子学报,1998,27(4):334-337

[8]张维胜.倾角传感器原理与发展[J].传感器世界,2002,8(8):l8-21

[9]何希才.传感器及其应用电路[M].北京:电子工业出版社,2001.1:12-36

[10]张友德,赵志英,涂时亮.单片微型机原理、应用与试验(第三版)[M].上海:复旦大学出版社,2002.8:56-68

[11]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,1999.8:18-59

[12]李维提,郭强.液晶显示应用技术[M].北京:电子工业出版社.2006. 20-35

[13]彭伟.单片机C语言程序设计实训100例[M].北京:电子工业出版社.2009.1:108-152

[14]霍孟友.单片机原理与应用[M].北京:机械工业出版社,2004.1:23-45

[15]周润景,徐宏伟,丁莉.单片机电路设计、分析与制作[M].北京:机械工业出版社,2010.8:89-96

[16]吴叶兰,王坚,王小艺,连晓峰.微机原理及接口技术[D].北京:机械工业出版社,2009.7

[17]康光华.电子技术基础(第四版)[D].北京: 高等教育出版社,2001.7

[18]孙立功,刘跃敏.电子技术[D].北京:高等教育出版社,2010.12

附录1 主要源程序

#include <REG52.H>

#include <math.h> //Keil library

#include <stdio.h> //Keil library

#include <INTRINS.H>

#include "common.h"

#include "lcd1602.h"

#include "uart.h"

#include "dht.h"

#define uchar unsigned char

#define uint unsigned int

sbit SCL=P1^0; //IIC时钟引脚定义

sbit SDA=P1^1; //IIC数据引脚定义

sbit KEY1=P3^5; //设置

sbit KEY2=P3^6; //加

sbit KEY3=P3^7; //减

sbit BEEP = P2^0;//蜂鸣器

#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改

//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A

typedef unsigned char BYTE;

typedef unsigned short WORD;

BYTE BUF[8]; //接收数据缓存区

uchar ge,shi,bai,qian,wan; //显示变量

int dis_data; //变量

uchar setnum = 0;//设置变量

short Angle_X = 0,Angle_Y = 0,Angle_Z = 0;//角度值

float aX,aY,aZ;//加速度值

bit fushux=0,fushuy=0,fushuz=0;//负值标志

char xdata UART_SEND_BUF[]="X: 00.0',Y: 00.0',Z: 00.0',T:00C,S:00%\r\n";

///报警值

char bjx1=-30,bjx2=30;

char bjy1=-30,bjy2=30;

char bjz1=0,bjz2=90;

void delay(unsigned int k);

void Init_ADXL345(void); //初始化ADXL345

void conversion(short temp_data);

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据

uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据

void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据

//------------------------------------

void Delay5us();

void Delay5ms();

void ADXL345_Start();

void ADXL345_Stop();

void ADXL345_SendACK(bit ack);

bit ADXL345_RecvACK();

void ADXL345_SendByte(BYTE dat);

BYTE ADXL345_RecvByte();

void ADXL345_ReadPage();

void ADXL345_WritePage();

//-----------------------------------

//*********************************************************

void conversion(short temp_data)

{

wan=temp_data/10000+0x30 ;

temp_data=temp_data%10000; //取余运算

qian=temp_data/1000+0x30 ;

temp_data=temp_data%1000; //取余运算

bai=temp_data/100+0x30 ;

temp_data=temp_data%100; //取余运算

shi=temp_data/10+0x30 ;

temp_data=temp_data%10; //取余运算

ge=temp_data+0x30;

}

/*******************************/

void delay(unsigned int k)

{

unsigned int i,j;

for(i=0;i<k;i++)

{

for(j=0;j<121;j++)

{;}}

}

/**************************************

延时5微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数

**************************************/

void Delay5us()

{
nop ();nop ();nop ();nop ();
nop ();nop ();nop ();nop ();
nop ();nop ();nop ();nop ();

}

/**************************************

延时5毫秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

**************************************/

void Delay5ms()

{

WORD n = 560;

while (n--);

}

/**************************************

起始信号

**************************************/

void ADXL345_Start()

{

SDA = 1; //拉高数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 0; //产生下降沿

Delay5us(); //延时

SCL = 0; //拉低时钟线

}

/**************************************

停止信号

**************************************/

void ADXL345_Stop()

{

SDA = 0; //拉低数据线

SCL = 1; //拉高时钟线

Delay5us(); //延时

SDA = 1; //产生上升沿

Delay5us(); //延时

}

/**************************************

发送应答信号

入口参数:ack (0:ACK 1:NAK)

**************************************/

void ADXL345_SendACK(bit ack)

{

SDA = ack; //写应答信号

SCL = 1; //拉高时钟线

Delay5us(); //延时

SCL = 0; //拉低时钟线

Delay5us(); //延时

}

/**************************************

接收应答信号

**************************************/

bit ADXL345_RecvACK()

{

SCL = 1; //拉高时钟线

Delay5us(); //延时

CY = SDA; //读应答信号

SCL = 0; //拉低时钟线

Delay5us(); //延时

return CY;

}

/**************************************

向IIC总线发送一个字节数据

**************************************/

void ADXL345_SendByte(BYTE dat)

{

BYTE i;

for (i=0; i<8; i++)         //8位计数器
{
    dat <<= 1;              //移出数据的最高位
    SDA = CY;               //送数据口
    SCL = 1;                //拉高时钟线
    Delay5us();             //延时
    SCL = 0;                //拉低时钟线
    Delay5us();             //延时
}
ADXL345_RecvACK();

}

/**************************************

从IIC总线接收一个字节数据

**************************************/

BYTE ADXL345_RecvByte()

{

BYTE i;

BYTE dat = 0;

SDA = 1;                    //使能内部上拉,准备读取数据,
for (i=0; i<8; i++)         //8位计数器
{
    dat <<= 1;
    SCL = 1;                //拉高时钟线
    Delay5us();             //延时
    dat |= SDA;             //读数据               
    SCL = 0;                //拉低时钟线
    Delay5us();             //延时
}
return dat;

}

//单字节写入*************************************

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)

{

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页

ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页

ADXL345_Stop(); //发送停止信号

}

//单字节读取 *********************************

uchar Single_Read_ADXL345(uchar REG_Address)

{ uchar REG_data;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

REG_data=ADXL345_RecvByte(); //读出寄存器数据

ADXL345_SendACK(1);

ADXL345_Stop(); //停止信号

return REG_data;

}

//*********************************************************

//

//连续读出ADXL345内部加速度数据,地址范围0x32~0x37

//

//*********************************************************

void Multiple_read_ADXL345(void)

{ uchar i;

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress); //发送设备地址+写信号

ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始

ADXL345_Start(); //起始信号

ADXL345_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF

{

BUF[i] = ADXL345_RecvByte(); //BUF[0]存储0x32地址中的数据

if (i == 5)

{

ADXL345_SendACK(1); //最后一个数据需要回NOACK

}

else

{

ADXL345_SendACK(0); //回应ACK

}

}

ADXL345_Stop(); //停止信号

Delay5ms();

//*****************************************************************

//初始化ADXL345,根据需要请参考pdf进行修改************************

void Init_ADXL345()

{

Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式

Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页

Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页

Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断

Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页

Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页

Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页

}

//***********************************************************************

//根据x,y,x的加速度计算角度值

void ADXL345_Get_Angle()

{

int dis_data_x,dis_data_y,dis_data_z;

bit flag_x=0,flag_y=0,flag_z=0;

  dis_data_x=(BUF[1]<<8)+BUF[0];  //合成数据  
  dis_data_y=(BUF[3]<<8)+BUF[2];  //合成数据   
  dis_data_z=(BUF[5]<<8)+BUF[4];  //合成数据   

  if(dis_data_x<0)
    {
            dis_data_x=-dis_data_x;
          flag_x = 1;
    }
    if(dis_data_y<0)
    {
            dis_data_y=-dis_data_y;
          flag_y = 1;
    }
    if(dis_data_z<0)
    {
            dis_data_z=-dis_data_z;
          flag_z = 1;
    }
    aX=(float)dis_data_x*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    aY=(float)dis_data_y*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    aZ=(float)dis_data_z*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    
Angle_X = atan2(aX,aZ)*(1800/3.14159);//获取X轴角度值,精度 0.1度
    if((flag_z==0 && flag_x==1)||(flag_x==1 && flag_z==1))//在第2,3象限,为负的角度
    {
            lcd_write_char(10,0,'-');//显示负号
          UART_SEND_BUF[2]='-';
    }
    else
    {
            lcd_write_char(10,0,' ');
          UART_SEND_BUF[2]=' ';
    }
    
    Angle_Y = atan2(aY,aZ)*(1800/3.14159);//获取Y轴角度值,精度 0.1度
    if((flag_z==0 && flag_y==1)||(flag_y==1 && flag_z==1))//在第2,3象限,为负的角度
    {
            lcd_write_char(2,1,'-');//显示负号
          UART_SEND_BUF[11]='-';
    }
    else
    {
            lcd_write_char(2,1,' ');
          UART_SEND_BUF[11]=' ';
    }
    
    Angle_Z = atan2(aZ,aX)*(1800/3.14159);//获取Z轴角度值,精度 0.1度
    if((flag_x==0 && flag_z==1)||(flag_x==1 && flag_z==1))//在第3,4象限,为负的角度
    {
            lcd_write_char(10,1,'-');//显示负号
          UART_SEND_BUF[20]='-';
    }
    else
    {
            lcd_write_char(10,1,' ');
          UART_SEND_BUF[20]=' ';
    }

}

void display_set_val(char dat1,char dat2)//显示报警值

{

if(dat1 < 0)//下限为负数

{

lcd_write_char(2,1,'-');

dat1 = -dat1;

}

附录2原理图

致 谢

时光荏苒,岁月如梭。转眼间我已经在美丽的沈阳城市学院度过了四个年头,这四年将是我人生中非常之重要的四年。在这四年中,我学到了很多,不仅包括书本上的知识还有很多为人之道,这是我在之前的学习生涯中不曾领略的。而这些都要感谢这四年中我接触到的许许多多的良师益友,他们不仅传授我知识与学问,还指导我的人生观与价值追求,让我的精神与思想达到一个更高的层次。在今后的漫漫人生路上,我可以更加坚定方向,更加有动力去追求成功。我非常感谢沈阳城市学院能给我学习的机会,感谢我的良师益友为我指点迷津,这四年我留下了大学生活中最美好的回忆。在此,我真诚地向我热爱的母校和尊敬的老师们表达深深的谢意。

本次的毕业设计是在孟军红老师和张有成老师的悉心指导下完成的。在设计过程中,孟老师和张老师提出了许多很好的建议,修正我的一些不成熟的想法,使本设计应用在实际应用中更加便捷,且在设计过程中及时指出了系统设计中的错误和不妥之处,让我少走很多弯路,节省设计时间。此外,在设计中老师们还向我推荐了许多优秀学者、专家的文章和著作,我可以更加精确的掌握第一手参考资料,为我的设计方案打下坚实的基础。在二位老师的耐心指导下毕业设计最终顺利如期完成。

经过这次毕业设计我收获了很多,做设计不仅仅需要对各种原理的熟练掌握还要有谦虚谨慎的态度,这样才能完成好的作品。同时,孟军红老师和张有成老师严谨的治学态度和高深的学术水平让我受益匪浅,他们身上的能量影响着我去发现、发挥自我更大的价值,回馈社会、母校、老师们对我的辛勤培养。谨此向孟军红老师和张有成老师表示衷心的感谢和崇高的敬意。

最后感谢学院的领导、老师、同学们在大学四年学习期间对我的关心、支持和帮助。我会铭记你们的教导,做一个优秀、正直对社会有贡献的人。

最后衷心祝愿母校的明天更加辉煌!美好!

相关推荐
m0_7482451722 分钟前
Web第一次作业
java
小码的头发丝、22 分钟前
Java进阶学习笔记|面向对象
java·笔记·学习
m0_5485147725 分钟前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang11 小时前
leetcode hot100 LRU缓存
java·开发语言
会说法语的猪1 小时前
springboot实现图片上传、下载功能
java·spring boot·后端
码农老起1 小时前
IntelliJ IDEA 基本使用教程及Spring Boot项目搭建实战
java·ide·intellij-idea
m0_748239831 小时前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot
时雨h1 小时前
RuoYi-ue前端分离版部署流程
java·开发语言·前端