三轴加速度传感器设计

合集下载

基于ARM9 的三轴加速度传感器动作识别装置设计

基于ARM9 的三轴加速度传感器动作识别装置设计

基于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 引言随着电子消费品性能和功能的不断发展,消费者对产品的各种人性化的操作的需求也不断提高,因此,在手持设备等便携电子产品上使用各种智能传感器采集外部各种信息,并用于完善设备本身功能的控制,使其更加人性化,具有现实意义。

杭州士兰微电子股份有限公司 SC7A20 三轴微机械数字加速度传感器说明书

杭州士兰微电子股份有限公司 SC7A20 三轴微机械数字加速度传感器说明书

±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和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,它小而薄、超低功耗,并且具有多个功能。

最新基于三轴重力加速度的倾斜角传感器课件PPT

最新基于三轴重力加速度的倾斜角传感器课件PPT

5.介绍三种常见的传感器
MEMS高精度单轴倾角传感器SCA103T-D05
5.1 MEMS高精度单轴倾角传感器SCA103T-D05
产品介绍: 高精度单轴倾角传感器SCA103T-D05是基于3D MEMS的高精度单轴倾角传感器, 它提供了水平测量仪表级别的性能。传感器的传感元件在测量时需要与测量平台保 持平行,并且传感器双轴需相互垂直。低温度依赖性、高分辨率、低噪声和健全的 传感元件设计让SCA103T-D05倾角传感器成为水平测量仪器的不二选择。VTI的倾 角传感器对于振动不灵敏,因为他们都在传感元件内部增加了阻尼,并且能承受高 达20,000g的机械冲击力。
5.1 MEMS高精度单轴倾角传感器SCA103T-D05
SCA103T-D05应用范围: 平台水准测量与稳定 水准仪器 旋转激光仪 施工水准设备
5.2 BOSCH数字式三轴加速度传感器BMA250
产品介绍:
Bosch Sensortec的BMA250是为电子消费市场设计的一款数字输出的低功耗三轴 加速度传感器,BMA250加速度传感器2mmX2mm的小型封装和数字接口使其满 足众多消费电子制造商的需求,尤其是在便携式手持设备上。BMA250加速度传感 器具有从±2g到±16g四个可编程的测量范围,提供应用程序设计者更多的开发弹 性,较高的测量精度,其十位的数据可提供最高精确度小于4mg
3.倾斜角传感器的应用
高层建筑安全监测 目前世界上摩天大楼越来越多,为了监测大楼的安全性能,可以应用SSA03系列高 精度倾角传感器,该系列倾角传感器可以感应微小角度的变化, 可以用于大楼摆幅、震动、倾斜等监测。
汽车四轮定位 随着电子技术的发展和应用,汽车的安全性、舒适性和智能性越来越高。汽车侧向 倾斜角度传感器的应用是防止汽车在行驶中发生倾翻事过的一种有效方法。是提高 汽车安全性的重要措施,特别是越野车。双层客车等重心较高的 汽车更有必要性。汽车倾翻的实质是:行驶中向外的倾翻力矩大于向里的稳定力矩 ,当重心高度一定时,倾斜力矩油倾翻力(向外的侧向力)决定。

基于三轴加速度计的倾斜角传感器的研究与设计_郭敏

基于三轴加速度计的倾斜角传感器的研究与设计_郭敏

传感器技术
郭 敏等 :基于三轴加速度计的倾斜角传感器的研究与设计
当 θ※0 时 :
lim
θ※0
ddFθ=-g
lim
θ※0
sin
θ=0
(3)
所以当倾斜角 θ太小时 , 测量的分辨率就会太小 , 当
角度足够大时精度才会上升 。所以对一轴倾斜角传感器 的运用是 :把它的传感方向与重力加速度方向垂直时的
间时 , F(θz )>(2/ 2)g , 反之 F(θz)<(2/ 2)g , 这里以 F(θz )的值作为划分档次的依据 。在一档中 F(θx),F(θy ) 的分辨率很高 , 此时相当于运用一个 两轴加速度传感器 测量全方位 , 低摆幅倾斜角 , 运用式(15)可以计算倾斜 角 。在二档中 F(θz )的分辨率都很高 , 此时相当于运用 一个一轴加速度传感器测量全方位 , 高倾斜角度的倾斜 角 , 运用式(1)可以计算倾斜角 。
所以 :
θx =θx′
(13)
sin θy =sin θy′cos θx′
(14)
而传感器实际倾斜角为 :
cos θ=cos θx′cos θy′
= co s2 θx -sin2 θy = cos2 θy -sin2 θx (15)
所以只要得出两轴加速度传感器测量结果 F(θx )和 F(θy)就可以计算出 θx 和 θy , 进而知道总的倾斜度 。
1 倾斜角测量原理
对于轴加速度传感器 , 当它的传感方向和重力加速 度方向一致时 , 假如此时为零倾斜角度 , 设加速度传感器 测量结果为 F(θ), θ为倾斜角度 , g 为重力加速度 , 如图 1 所示 。
F(θ)=gcos θ
(1)
对 F(θ)求导得 : ddFθ=-gsin θ

FREESCALE的三轴加速传感器设计方案

FREESCALE的三轴加速传感器设计方案

FREESCALE的三轴加速传感器设计方案
概述: 加速度传感器用于检测倾斜、运动、定位、振动和撞击力下产生的变化。

对那些需要以小型封装结构满足快速响应、高灵敏度、低电流消耗、低
电压操作和待机模式的消费电子客户来说飞思卡尔加速度传感器是理想的选
主要特性:
MMA7260QT 低成本微型电容式加速度传感器采用了信号调理、单极低通滤波器和温度补偿技术,并且提供4 个量程可选,用户可在4 个灵敏度中的选择。

该器件带有低通滤波并已做零g 补偿。

本产品还提供休眠模式,因而是电池充电的手持设备产品的理想之选。

特性
可选灵敏度(1.5g/2g/4g/6g)
低功耗:500 &mu;A
休眠模式:3 &mu;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 的仪表盘上用于检测微重力作用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中北大学课程设计说明书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); //延时}}。

相关文档
最新文档