三轴加速度传感器设计
- 格式:pdf
- 大小:1.22 MB
- 文档页数:40
基于ARM9 的三轴加速度传感器动作识别装置设计摘要:该装置以ARM9为核心,采用linux操作系统,驱动飞思卡尔的三轴陀螺仪mma7660fc 传感器采集外部动作的数据。
加以算法分析处理,即可得到方向的角度变化、震动、敲击的外部信息。
该装置可用于MP3、PDA、MID、智能手机等各种手持电子设备的人性化智能控制。
关键字:三轴加速度传感器、linux操作系统、ARM9ARM9-based three-axis acceleration sensor device designed to identify the actionAbstract:The device to ARM9 core, using linux operating system, drivers ofthree-axis gyroscope mma7660fc Freescale sensor data acquisition external action. To algorithm analysis and processing, can be obtained by changing the angle of orientation, vibration, percussion external information. The device can be used for MP3, PDA, MID, smart phones and other handheld electronic devices, human intelligent control.Keywords: three-axis accelerometer, linux operating system, ARM90 引言随着电子消费品性能和功能的不断发展,消费者对产品的各种人性化的操作的需求也不断提高,因此,在手持设备等便携电子产品上使用各种智能传感器采集外部各种信息,并用于完善设备本身功能的控制,使其更加人性化,具有现实意义。
±2G/±4G/±8G/±16G三轴微机械数字加速度计描述SC7A20是一款高精度12bit数字三轴加速度传感器芯片,内置功能更丰富,功耗更低,体积更小,测量更精确。
芯片通过I²C/SPI接口与MCU通信,加速度测量数据以中断方式或查询方式获取。
INT1和INT2中断管脚提供多种内部自动检测的中断信号,适应多种运动检测场合,中断源包括6D/4D方向检测中断信号、自由落体检测中断信号、睡眠和唤醒检测中断信号、单击和双击检测中断信号。
芯片内置高精度校准模块,对传感器的失调误差和增益误差进行精确补偿。
±2G、±4G、±8G和±16G四种可调整的全量程测量范围,灵活测量外部加速度,输出数据率1HZ和400HZ间可选。
芯片内置自测试功能允许客户系统测试时检测系统功能,省去复杂的转台测试。
芯片内置产品倾斜校准功能,对贴片和板卡安装导致的倾斜进行补偿,不占系统资源,系统文件升级不影响传感器参数。
主要特点宽电压范围1.71V-3.6V1.8V兼容数字IO口低功耗模式下电源电流低至2µA±2G/±4G/±8G/±16G动态全量程范围 12bit有效数据(HR)I²C/SPI数字输出接口6D/4D方向检测自由落体检测单击双击检测及运动检测可编程中断生成电路内嵌自测试功能内嵌FIFO10000g高G抗击能力应用手机平板室内导航图像旋转运动激活用户接口游戏产品规格分类产品名称 封装形式 打印名称 材料 包装形式 SC7A20TR LGA-12-2x2x1.0 SC7A20 无铅编带内部框图XY ZC-to-V Converter Gain数符号测试条件最小值V CC电路不损坏-0.3 3.6V P电路不损坏V in电路不损坏T OPR电路不损坏T STG电路不损坏(VDD=2.5V, T测试条件123FS=0 (HR mode)FS=1 (HR mode)FS=2 (HR mode)FS=3 (HR mode)参 数符 号测试条件最小值 典型值 最大值 单位 零漂 Ty Off0 FS =0 --±40--mg温漂TC Off 与25°C 的最大偏差 -- ±0.5 -- mg/°C 自测输出V st1FS=0, X 轴 -- 276 -- LSb V st2 FS=0, Y 轴 -- 276 -- LSb V st3FS=0, Z 轴-- 984 -- LSb 系统带宽 BW -- ODR/2 -- HZ 工作温度T OPR-40--+85°C注意:电路2.5V 出厂校准。
基于三轴加速度计SCA3000和LPC2210的倾斜角传感器设计倾斜角传感器设计基于三轴加速度计SCA3000和LPC2210的方案一、介绍倾斜角传感器是一种测量物体倾斜角度的装置,广泛应用于自动化控制、机器人、航天航空等领域。
在这篇文章中,我们将介绍一种基于三轴加速度计SCA3000和LPC2210的倾斜角传感器设计方案。
二、SCA3000的特点及原理SCA3000是一种高精度、低功耗的三轴加速度计传感器,可测量在x、y和z轴上的加速度。
其主要特点包括:1.可测量±2g、±4g或±8g范围内的加速度;2.14位的高精度模数转换器(ADC);3.SPI接口和I2C接口供数据传输;4.低功耗模式。
SCA3000的工作原理基于微机电系统(MEMS)技术,通过检测微小的结构变形来测量加速度。
当物体加速度发生变化时,其结构会发生微小的变形,SCA3000通过检测这些变形来确定加速度。
三、LPC2210的特点及原理LPC2210是一款高性能、低功耗的ARM处理器,具有以下特点:1.32位ARM7TDMI-S内核;2.高速时钟,最高工作频率为60MHz;3.多种外设接口,如SPI、I2C、GPIO等;4.低功耗待机和睡眠模式。
LPC2210用作倾斜角传感器的控制器,通过与SCA3000的SPI或I2C接口进行通信,读取和处理传感器的数据,并计算出倾斜角度。
四、设计方案1.硬件设计倾斜角传感器的硬件设计包括电源电路、SCA3000和LPC2210的连接、外部接口等。
电源电路需要提供稳定的直流电压供给传感器和控制器,同时还需要考虑低功耗设计。
SCA3000和LPC2210之间的连接可以通过SPI或I2C接口实现,根据具体需求选择合适的接口。
外部接口可以根据实际应用选择,比如UART、CAN或GPIO等。
2.软件设计倾斜角传感器的软件设计主要涉及LPC2210的程序设计。
程序需要通过SPI或I2C接口初始化SCA3000传感器,并定时读取其数据。
三轴位置传感器模块设计与实现目录摘要 (I)ABSTRACT (II)引言 (1)1 绪论 (2)1.1传感器技术 (2)1.1.1 什么是传感器 (2)1.1.2 传感器的分类 (3)1.1.3 传感器的基本特性 (3)1.2三轴加速度传感器 (4)1.2.1 加速度传感器的原理 (4)1.2.2 加速度传感器的应用 (5)2 三轴位置传感器模块设计方案 (6)2.1理论基础 (6)2.1.1 坐标分析 (6)2.1.2 静止到运动的判断 (7)2.1.3 位置的计算 (7)2.2系统框架 (9)2.2本章小结 (10)3 三轴位置传感器的硬件设计 (11)3.1系统的硬件架构 (11)3.2硬件设计 (11)3.2.1 8051单片机模块 (11)3.2.2 三轴加速度传感器 (13)3.2.3 单片机外围电路 (14)3.3电路设计 (15)3.3.1 I2C总线技术 (15)3.3.2 原理图设计 (17)3.4本章小结 (18)4 三轴位置传感器的软件设计 (19)4.1单片机常用操作 (20)4.1.1 系统的复位及初始化 (20)4.1.2 计数器/定时器 (20)4.1.3 中断 (22)4.2程序设计 (23)4.2.1 加速度采集 (23)4.2.2 位置计算 (24)4.2.3 显示模块 (26)4.3实验结果 (27)4.4本章小结 (45)5 结论与展望 (46)致谢 (47)参考文献 (48)摘要在电子技术高度发达的今天,加速度传感器扮演的角色也越来越重要。
加速度传感器在航天领域,汽车领域,以及人们的日常生活中都有着广泛的应用。
三轴加速度传感器是加速度传感器的一种,它可以测量三个坐标轴的加速度,从而准确反映物体的运动状态,确定物体的空间位置。
本课题主要的内容是用三轴加速度传感器结合单片机设计出基于人体位置变化的三轴位置传感器模块,并实现该模块。
传感器使用的是ADI公司的ADXL345,它小而薄、超低功耗,并且具有多个功能。
FREESCALE的三轴加速传感器设计方案
概述: 加速度传感器用于检测倾斜、运动、定位、振动和撞击力下产生的变化。
对那些需要以小型封装结构满足快速响应、高灵敏度、低电流消耗、低
电压操作和待机模式的消费电子客户来说飞思卡尔加速度传感器是理想的选
主要特性:
MMA7260QT 低成本微型电容式加速度传感器采用了信号调理、单极低通滤波器和温度补偿技术,并且提供4 个量程可选,用户可在4 个灵敏度中的选择。
该器件带有低通滤波并已做零g 补偿。
本产品还提供休眠模式,因而是电池充电的手持设备产品的理想之选。
特性
可选灵敏度(1.5g/2g/4g/6g)
低功耗:500 μA
休眠模式:3 μA
低压运行:2.2 V - 3.6 V
6mm x 6mm x 1.45 mm 的无引线四方扁平(QFN) 封装;
高灵敏度(800 mV/g @ 1.5g)
快速开启
低通滤波器具备内部信号调理
设计稳定、防震能力强
无铅焊接
环保封装
成本低
方案特性:。
静电悬浮式三轴加速度传感器设计及其空间应用前景论述摘要静电悬浮几三轴加速度计的针对太空的微重力水平设计的,理论分析表明加速度计最大的量程为35 μg0,分辨率为1ng,她可以满足多方面的太空应用。
同时分析了可能存在的误差源。
研究了一些相关技术和加工工艺。
基于设计一种高精度的加速度计,本文提出了一种用于低轨道卫星的测量重力加速度的加速度计的理论设计方案。
一般来讲,获得来自人造卫星的地球重力的方法如下所示:使用GPS数据获得作用于卫星的合力,非重力性质的力使用卫星上的微型加速度计检测,二者之差就是我们要求的重力,它与地球重力场有直接的联系。
最后我们得出如下结论:用于重力加速度检测的最适频宽为0.0008 Hz to 0.15 Hz。
理论结果将对将来卫星上重力场的检测具有一定的价值。
关键词:静电悬浮加速度计重力场检测分辨率GPS 频带引言微重力是太空环境的主要特性,为了精确的监控空间的微重力场,,必须设计一种低偏差,高分辨率的特殊加速度传感器,静电悬浮加速度计在低于1HZ的低频带具有很高的分辨率和精度。
因此,它在地球场检测和微重力科学中具有得天独厚的优势。
已经有好多种静电悬浮加速度计面世。
CHAMP公司的STAR加速度计,由法国的ONERA发展而来,用于检测卫星上的非重力加速度计其频带从足够的频带的交流电到0.05HZ。
这些力包括空气阻力,太阳射线压力。
地面返照率以及姿态调整力。
STAR 生产了一批量程为10 μg,在10-4 Hz 到 10-1 HZ内Z轴和Y轴分辨率小于0.3ng 的加速度计。
ASTRE加速度计,和 ESA合作。
在STS-78任务期间,检测了剩余的微重力干扰其频带从交流电到不到1 Hz。
ASTRE加速度计量程精确到1mg。
精度小于1ng是一种高性能的加速度计。
用于精确检测空间站或太空实验室的环境因素。
MACEK的加速度计,得到GRANT的大力支持,被用于STS-79 的仪表盘上用于检测微重力作用。
概述:ADXL345 是一款小而薄的超低功耗3 轴加速度计,分辨率高(13 位),测量范围达± 16g。
数字输出数据为16 位二进制补码格式,可通过SPI(3 线或4 线)或I2C 数字接口访问。
ADXL345 非常适合移动设备应用。
它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。
其高分辨率(3.9mg/LSB),能够测量不到1.0°的倾斜角度变化。
该器件提供多种特殊检测功能。
活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。
敲击检测功能可以检测任意方向的单振和双振动作。
自由落体检测功能可以检测器件是否正在掉落。
这些功能可以独立映射到两个中断输出引脚中的一个。
正在申请专利的集成式存储器管理系统采用一个32 级先进先出(FIFO)缓冲器,可用于存储数据,从而将主机处理器负荷降至最低,并降低整体系统功耗。
低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。
ADXL345 采用3 mm × 5 mm × 1 mm,14 引脚小型超薄塑料封装。
对比常用的飞思卡尔的MMZ7260三轴加速度传感器,ADXL345,具有测量精度高、可以通过SPI或I2C 直接和单片机通讯等优点。
特性:超低功耗:VS= 2.5 V 时(典型值),测量模式下低至23uA,待机模式下为0.1μA 功耗随带宽自动按比例变化用户可选的分辨率10 位固定分辨率全分辨率,分辨率随g 范围提高而提高,±16g 时高达13 位(在所有g 范围内保持4 mg/LSB 的比例系数)正在申请专利的嵌入式存储器管理系统采用FIFO 技术,可将主机处理器负荷降至最低。
单振/双振检测,活动/非活动监控,自由落体检测电源电压范围:2.0 V 至3.6 VI / O 电压范围:1.7 V 至VSSPI(3 线和4 线)和I2C 数字接口灵活的中断模式,可映射到任一中断引脚通过串行命令可选测量范围通过串行命令可选带宽宽温度范围(-40°C 至+85℃)抗冲击能力:10,000 g无铅/符合RoHS 标准小而薄:3 mm× 5 mm× 1 mm,LGA 封装模组尺寸:23*18*11mm(高度含插针高度应用:机器人控制、运动检测过程控制,电池供电系统硬盘驱动器(HDD)保护,单电源数据采集系统手机,医疗仪器,游戏和定点设备,工业仪器仪表,个人导航设备电路功能与优势ADXL345是一款小巧纤薄的低功耗三轴加速度计,可以对高达±16 g的加速度进行高分辨率(13位)测量。
机电工程学院毕业设计说明书设计题目: 基于LABVIEW和三轴加速度传感器的振动信号测量系统设计目录1. 绪论 (1)1.1研究背景 (1)1.2 研究意义 (1)1.3研究现状 (2)1.3.1 电机检测的研究现状 (2)1.3.2 三轴加速度传感器研究现状 (3)1.3.3基于Lab VIEW 的虚拟仪器研究现状 (3)1.4 存在的问题,我的方案 (4)2. 方案论证 (5)2.1整体设计方案 (5)2.1.1.振动信号采集部分 (5)2.1.2.振动信号处理部分 (6)2.1.3振动信号分析结果输出模块 (6)2.1.4软件部分 (7)2.2方案一 (8)2.3方案二 (9)2.4最终方案的确定 (10)2.5我的研究目标 (11)3.振动检测系统的硬件设计 (11)3.1 三轴加速度传感器部分 (12)3.1.1压电式ICP三轴加速度传感器原理 (12)3.1.2三轴加速度传感器的选型 (15)3.1.3三轴加速度传感器的安装 (13)3.2 IEPE恒流源部分 (14)3.3数据采集部分 (15)3.3.1数据采集卡的选型 (15)3.3.2数据采集卡的安装 (12)3.4 信号处理部分 (17)3.5硬件电路的连接 (17)本章小结 (18)4.振动检测系统软件设计 (20)4.1 NI LABVIEW软件简介 (19)4.2 LABVIEW 图形用户界面设置 (21)4.2.1 主界面设计 (20)4.2.2输出界面设置 (22)4.2.3回放界面设置 (23)4.2.4参数设置界面 (23)4.3 LABVIEW功能模块设计 (24)4.3.1 信号预处理模块 (24)4.3.2 烈度报警模块 (26)4.3.3 谱分析模块 (29)4.3.4 数据存储模块 (30)4.3.5信号数据的回放模块 (32)本章小结 (33)3.振动检测系统仿真测试 (35)5.1 仿真信号生成 (34)5.2仿真分析结果 (35)本章小结 (36)设计总结 (38)致谢 (40)参考文献 (41)附录 (42)基于Lab VIEW和三轴加速度传感器的振动信号测量系统的设计1. 绪论1.1研究背景随着近几十年来我国经济的快速发展,科学技术的进步,为了与生产方式进一步适应,满足大型高速拖动的需求(如拖动大型发电机的形式实验及拖动大型风机、水泵、轧钢机、球磨机等设备的高速运行),大型高速电机在我国也得到了迅速的发展。
中北大学课程设计说明书2013/2014 学年第 2 学期学院:专业:学生姓名:学号:课程设计题目:三轴加速度传感器设计起迄日期:课程设计地点:指导教师:专业负责人:下达任务书日期: 2014年6 月13 日目录1、课程设计目的 (1)2、课程设计内容和要求 (1)2、1设计要求 (1)2.2、设计要求 (1)3、设计方案及实现情况 (1)3.1、设计思路 (1)3.2、工作原理及框图 (1)3.3、主要电路模块的使用 (2)3.4、实物结果图 (6)4、课程设计总结 (7)5、参考文献·························· (7)6、附录················································································ (8)附录1 原理图····················································· (8)附录2 PCB版图····················································· (9)附录3 C语言代码····················································· (10)1、课程设计目的综合应用模电、数电、微机原理、单片机原理、传感器原理及应用和专业知识,通过理论与实践相结合,掌握所学知识的综合应用方法,培养和提高解决本专业实际工程问题的能力。
2、课程设计内容和要求2、1设计要求:1. 文献检索和综述;2. 掌握三轴加速度传感器的工作原理;3. 画出传感器装配结构图;用protel绘制原理图;4. 所写说明书格式规范,内容完整;5. 参加答辩。
2.2、设计内容:1. 设计传感器整体结构;4. 以ADXL345三轴加速度计为模型,设计测量电路,给出电路元件参数;5. 基于单片机的采集与显示电路方案设计;6. 用ADXL345搭建测试系统,仿真实验处理结果。
3、设计方案及实现情况3.1、设计思路根据题目要求,首先要对传感器整体结构进行设计,以满足ADXL345三轴加速度计运行的环境;其次,选择合适的通信方式使单片机与传感器能正常通信传输数据;最后,对单片机外围结构进行设计,使单片机能正常工作,编写合适的C 语言程序,使传感器传输的数据能够在外围器件上显示出来。
3.2、工作原理及框图(1)工作原理 ADXL345三轴加速度计能够将三个方向的加速度g 储存在其内部寄存其中,所以,通过适当控制指令以及与单片机通信,就可将其传输到单片机中,然后对其进行编译。
显示模块这里使用的是LCD1602,编译后的数据传送到与LCD1602相连的I/O口,通过读写指令就可显示出数据。
每当ADXL345三轴加速度计记录数据发生变化时,就更新LCD1602中显示的数据,这样就达到了基于单片机的采集与显示电路的设计。
(2)系统框图图1系统框图3.3、主要电路模块的使用(1)ADXL345电源模块由于ADXL345使用的是 3.3V 供电电源,所以要对5V 输入电源就行转化,这里使用的是RT9161 电源芯片,比 1117 更低的压降,更快的负载相应速度,非常适合高噪声电源环境。
如图2,ADXL34单片机1602显单片机当输入电压为5V时,输出为 3.3V,电路中所接的电容起滤波的作用。
图2 RT9161电源模块(2)ADXL345加速度计模块ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13)位,测量范围达±16g。
数字输出数据为16位二进制补码格式,可通过SPI或数字接口访问。
它可以在倾斜测量应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。
其高分辨率,能够测量不到 1.0°的倾斜角变化。
图3 ADXL345引脚图表1引脚功能表在本实验中,如图4,使用的是SPI通信,采用3线连接,片选接地,SDIO和SCLK与单片机相连进行通信。
ADXL345图4 SPI通信接口表2 存储数据所在寄存器地址如图5为本实验中ADXL345加速度计的原理图示意。
图5 ADXL345原理图(3)单片机模块在本实验中,使用到单片机的功能很少,因此,单片机工作在最小模块下。
图6 晶振模块图7 复位模块图8 单片机引脚连接图(4)LCD1602显示模块点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的000H——00FH 的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。
这就是LCD显示的基本原理。
表3 LCD1602管脚功能在此处,LCD1602的8个数据引脚需要上拉电阻来限制电流,同时3引脚可以接一个电位器用来调节显示屏背光亮度。
图9LCD1602原理图3.4、实物结果图由于在众多仿真软件中,没有ADXL345加速度计的模型,同时为了体现出ADXL345与MCU通信的过程,所以并不能用串行通信软件代替,所以此处通过,实物演示来例证。
图10实物结果图4、课程设计总结经过为期三周的课程设计,我对C语言有了更加深刻的认识。
在编写程序的时候,我才发现能看懂程序和能自己写程序是两个完全不同的概念,自己一开始写程序时,即便是一个很简单的功能模块,在编译时也可能产生很多错误,在不断的改错过程中,自己对C语言的语法结构有了深刻的理解,对编译过程中常见的错误也有了全面的认识。
通过这三周的课程设计,我在熟悉了EDA-V实验箱的操作同时,也学到了很多在学习课本知识时所体会不到的东西。
最初拿到课程设计任务书时,感觉每个模块都在做实验时用过,心想只要把各个模块组合到一起就可以实现系统功能了,但结果其实不然;同时,通过实际动手连接元件,更加加深了我对ADXL345的深刻认识。
完成此次设计后,我不仅能对PROTEUS仿真软件熟练操作,能达到学以致用,同时还掌握了ADXL345和LCD1602的工作原理。
经过这一过程,我发现平常的学习在注重理论知识的掌握同时,要加强实验环节,只有通过不断地实践,我们才能把知识掌握的更牢固,理解的更透彻。
5、参考文献[1]Creed Huddleston著,张鼎译.智能传感器设计.人民邮电出版社,2009[2]松井邦彦著.传感器实用电路设计与制作. 北京:科学出版社,2005[3]范茂军主编.互联网与传感器技术. 北京:机械工业出版社,2012[4]刘爱华、满宝元主编.传感器原理与应用技术.北京:人民邮电出版社,2010[5]张宪主编.传感器与测控电路.北京:化学工业出版社,2011附录1、原理图附图1 ADXL345与单片机原理图2、PCB版图附图2 PCB版图3、C语言代码#include <REG51.H>#include <math.h> //Keil library#include <stdio.h> //Keil library#include <INTRINS.H>#define uchar unsigned char#define uint unsigned int#define DataPort P0 //LCD1602数据端口sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义sbit LCM_RS=P2^0; //LCD1602命令端口sbit LCM_RW=P2^1; //LCD1602命令端口sbit LCM_EN=P2^2; //LCD1602命令端口#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改//ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3Atypedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区uchar ge,shi,bai,qian,wan; //显示变量int dis_data; //变量void delay(unsigned int k);void InitLcd(); //初始化lcd1602void Init_ADXL345(void); //初始化ADXL345void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void conversion(uint temp_data);void Single_Write_ADXL345(uchar REG_Address,ucharREG_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(uint 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++){;}}}/*******************************/void WaitForEnable(void)void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;_nop_();_nop_();}/*******************************/void WriteCommandLCM(uchar CMD,uchar Attribc){if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();_nop_();_nop_();_nop_();LCM_EN=1;_nop_();_nop_();_nop_();_nop_();LCM_EN=0; /*******************************/void WriteDataLCM(uchar dataW)WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_();LCM_EN=1;__nop_();_nop_();_nop_();_nop_(); LCM_EN=0;}/***********************************/ void InitLcd(){WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1);}/***********************************/void DisplayOneChar(uchar X,uchar Y,uchar DData) {Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}/**************************************延时5微秒**************************************/void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒**************************************/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); //内部寄存器地址, ADXL345_SendByte(REG_data); //内部寄存器数据,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 Single_Write_ADXL345(0x2D,0x08); //选择电源模式Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断Single_Write_ADXL345(0x1E,0x00); //X偏移量根据测试传感器的状态写入Single_Write_ADXL345(0x1F,0x00); //Y 偏移量根据测试传感器的状态写入Single_Write_ADXL345(0x20,0x05); //Z 偏移量根据测试传感器的状态写入}//***********************************************************************//显示x轴void display_x(){ float temp;dis_data=(BUF[1]<<8)+BUF[0]; //合成数据if(dis_data<0){dis_data=-dis_data;DisplayOneChar(2,0,'-'); //显示正负符号位}else DisplayOneChar(2,0,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,conversion(temp); //转换出显示需要的数据DisplayOneChar(0,0,'X'); //第0行,第0列显示X DisplayOneChar(1,0,':');DisplayOneChar(3,0,qian);DisplayOneChar(4,0,'.');DisplayOneChar(5,0,bai);DisplayOneChar(6,0,shi);DisplayOneChar(7,0,'g');}//***********************************************************************//显示y轴void display_y(){ float temp;dis_data=(BUF[3]<<8)+BUF[2]; //合成数据if(dis_data<0){dis_data=-dis_data;DisplayOneChar(2,1,'-'); //显示正负符号位}else DisplayOneChar(2,1,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,conversion(temp); //转换出显示需要的数据DisplayOneChar(0,1,'Y'); //第1行,第0列显示y DisplayOneChar(1,1,':');DisplayOneChar(3,1,qian);DisplayOneChar(4,1,'.');DisplayOneChar(5,1,bai);DisplayOneChar(6,1,shi);DisplayOneChar(7,1,'g');}//***********************************************************************//显示z轴void display_z(){ float temp;dis_data=(BUF[5]<<8)+BUF[4]; //合成数据if(dis_data<0){dis_data=-dis_data;DisplayOneChar(10,1,'-'); //显示负符号位}else DisplayOneChar(10,1,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,conversion(temp); //转换出显示需要的数据DisplayOneChar(10,0,'Z'); //第0行,第10列显示Z DisplayOneChar(11,0,':');DisplayOneChar(11,1,qian);DisplayOneChar(12,1,'.');DisplayOneChar(13,1,bai);DisplayOneChar(14,1,shi);DisplayOneChar(15,1,'g');}//*********************************************************//******主程序********//*********************************************************void main(){uchar devid;delay(500); //上电延时InitLcd(); //液晶初始化5Init_ADXL345(); //初始化ADXL345devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确while(1) //循环{Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中display_x(); //---------显示X轴 display_y(); //---------显示Y轴 display_z(); //---------显示Z轴 delay(200); //延时}}。