Android编程之加速度传感器
- 格式:ppt
- 大小:831.00 KB
- 文档页数:11
利用传感器实现微信的摇一摇功能现在的不少应用都用到了摇动手机改变内容的功能,比如微信中的“摇一摇”功能。
前两天要实现这个功能,稍微看了一下关于传感器Sensor的内容。
传感器有几种类型:方向传感器: Sensor.TYPE_ORIENTATION加速度(重力)传感器: Sensor.TYPE_ACCELEROMETER光线传感器: Sensor.TYPE_LIGHT磁场传感器: Sensor.TYPE_MAGNETIC_FIELD距离(临近性)传感器: Sensor.TYPE_PROXIMITY温度传感器: Sensor.TYPE_TEMPERATURE在摇动手机的功能中,我们只用加速度传感器就行了~~加速度传感器返回值的单位是加速度的单位 m/s^2(米每二次方秒),有三个方向的值分别是values[0]: x-axis 方向加速度values[1]: y-axis 方向加速度values[2]: z-axis 方向加速度其中x,y,z方向的定义是以水平放置在的手机的右下脚为参照系坐标原点x 方向就是手机的水平方向,右为正y 方向就是手机的水平垂直方向,前为正y 方向就是手机的空间垂直方向,天空的方向为正,地球的方向为负所以说,你的手机放置的空间位置不同,它三个方向的加速度也不同。
在这里,三个方向的加速度,与我们传统意义上的加速度(9.8m/s2)有所区别,需细细品味。
以下是摇动手机后清除TextView的文字的代码:package gy.lovers;import java.util.ArrayList;import java.util.List;import java.util.Random;import android.app.Activity;import android.app.Service;import android.content.res.Resources;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.os.Vibrator;import android.view.View;import android.widget.Button;//需要实现SensorEventListener接口public class LoversChoise extends Activity implements SensorEventListener{Button clear;//定义sensor管理器private SensorManager mSensorManager;//震动private Vibrator vibrator;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceSt ate);setContentView(yout.lovers choise);//获取传感器管理服务mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//震动vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);clear = (Button)findViewById(R.id.clear);clear.setListener(new Button.Listener(){@Overridepublic void (View arg0) {// TODO Auto-generated method stub//点击button后,给button按钮设置了textclear.setText("现在给button的text赋值喽~");});@Overrideprotected void onResume(){super.onResume();//加速度传感器mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),//还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等,//根据不同应用,需要的反应速率不同,具体根据实际情况设定SensorManager.SENSOR_DELAY_NORMAL);}@Overrideprotected void onStop(){mSensorManager.unregisterListener(this);super.onStop();}@Overrideprotected void onPause(){mSensorManager.unregisterListener(this);super.onPause();}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub//当传感器精度改变时回调该方法,Do nothing.}@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stubint sensorType = event.sensor.getType();//values[0]:X轴,values[1]:Y轴,values[2]:Z轴float[] values = event.values;if(sensorType == Sensor.TYPE_ACCELEROMETER){/*因为一般正常情况下,任意轴数值最大就在9.8~10之间,只有在你突然摇动手机*的时候,瞬时加速度才会突然增大或减少。
Android 传感器介绍一、Android 手机坐标系及角速度传感器TYPE_ACCELEROMETER 介绍在Android 坐标系统中,坐标原点位于屏幕的左下角,X 轴水平指向右侧,Y 轴垂直指向顶部,Z 轴指向屏幕前方。
在该系统中,屏幕后方的坐标具有负的Z 轴值。
Android 加速度计数据定义为:Sensor.TYPE_ACCELEROMETER图 1. 3 轴加速度计的Android 坐标系统所有数值都采用SI 标准单位(2/s m ),测量手机的加速度值,并减去重力加速度分量。
values[0]:x 轴上的加速度值减去Gx values[1]:y 轴上的加速度值减去Gy values[2]:z 轴上的加速度值减去Gz例如,当设备平放在桌上并推着其左侧向右移动时,x 轴加速度值为正。
当设备平放在桌上时,加速度值为+9.81,这是用设备的加速度值 (0 2/s m ) 减去重力加速度值 (-9.812/s mm/s2)得到的。
当设备平放在桌上放,并以加速度A m/s2 朝天空的方向推动时,加速度值等于A+9.81,这是用设备加速度值(+A 2/s m )减去重力加速度值(-9.81 2/s m )得到的。
表 1 列出了与设备的各个位置相对应的传感器的加速度值读数。
用户可以用下表检查加速度计的方向与系统坐标是否一致。
表 1. 不同位置上各轴的加速度值通过加速度传感器读取3 轴加速度值时,需要假设传感器的3 轴方向与系统坐标是一致的。
但是在实际的产品中,可能会使用不同的传感器芯片,或者采用不同的安装方向,因此数据方向也会不同。
图2 所示的是飞思卡尔MMA8452Q 3 轴加速度传感器的方向定义。
图2. MMA8452Q 的方向定义在图2 中,我们可以看到当安装芯片时,必须让引脚1 处于右下角的位置(PD),并安装在PCB 的前方,这样才能与Android 坐标系统的默认位置相符。
这样安装后,用户可确定数据方向与系统坐标定义是一致的。
专业工程综合实训设计报告目录第一章绪论 (1)1。
1课题的背景及意义 (1)1.2系统框架 (1)第二章系统分析 (3)2.1 系统可行性分析 (3)2.1.1 功能可行性分析 (3)2。
1.2 运行环境可行性分析 (3)2。
2 开发环境简介 (3)2。
2。
1 Java Development kit(JDK)介绍 (3)2.2.2 Android SDK 介绍 (3)2.2.3 Eclipse开发工具介绍 (4)2.2.4 Android Development Tools(ADT)介绍 (4)第三章 Android开发常用到的技术及环境搭建 (5)3.1 Android开发常用到的技术 (5)3。
1.1 Activity (5)3.1.2 Service (6)3。
1。
3 Content Provider 内容提供者 (7)3。
1。
4 Intent 信使 (7)3。
2环境搭建 (7)3.2.1安装JDK (7)3.2.2安装Eclipse (8)3。
2.3 Android SDK安装 (8)3.2。
4 ADT安装 (8)第四章手机计步器的设计与实现 (9)4.1计步器功能的设计 (9)4。
2计步器功能的实现 (11)4.2。
1 计步开始及暂停 (11)4。
2.2 复位键 (12)4.2。
3设置步长 (12)4.2。
4设置体重 (12)4.2。
5历史记录的查看及删除 (13)第五章计步器的界面效果 (19)5.1用户界面 (19)5.2设置界面 (20)5.3历史界面 (23)5.4日历选择界面 (24)5。
5用户离开界面 (25)第六章系统测试与分析 (26)6。
1 测试过程 (26)6。
2 测试分析 (39)结论 (40)参考文献 (41)第一章绪论1。
1课题的背景及意义当今社会,手机已经成为人们工作生活中必不可少的一项通讯和娱乐工具,随着手机的不断更新,手机的各种高层服务和应用层出不穷。
android计步器课程设计一、课程目标知识目标:1. 学生能理解Android计步器的基本工作原理,掌握计步器开发的必备知识。
2. 学生能掌握在Android平台上使用传感器获取数据的方法,了解计步算法的基本概念。
3. 学生了解Android开发中的界面设计与实现,能运用所学知识完成计步器界面设计。
技能目标:1. 学生能运用Android Studio编写计步器程序,实现计步功能,具备实际操作能力。
2. 学生能通过查阅资料、分析问题,解决计步器开发过程中遇到的技术难题,具备问题解决能力。
3. 学生能进行团队协作,共同完成项目开发,具备良好的沟通与协作能力。
情感态度价值观目标:1. 学生通过学习计步器开发,培养对编程的兴趣,激发学习动力。
2. 学生在项目实践过程中,树立正确的价值观,认识到科技对生活的积极作用。
3. 学生在团队协作中,学会尊重他人,培养合作精神,提高自身综合素质。
课程性质:本课程为实践性较强的课程,结合Android开发技术,以项目为导向,让学生在实际操作中掌握知识。
学生特点:学生具备一定的编程基础,对Android开发有一定了解,对实际项目开发充满兴趣。
教学要求:教师需结合学生特点,采用项目驱动法,引导学生自主探究、动手实践,注重培养学生的实际操作能力和团队协作精神。
在教学过程中,关注学生的学习反馈,及时调整教学策略,确保课程目标的达成。
二、教学内容1. Android开发基础回顾:介绍Android平台的基本架构,回顾Activity、Service、BroadcastReceiver等核心组件的使用,为学生后续学习计步器开发奠定基础。
(对应教材第一章)2. 传感器与计步算法:讲解Android平台传感器系统,重点介绍加速度传感器的工作原理及数据获取方法。
分析常见计步算法,如步数检测、步频计算等。
(对应教材第二章)3. 界面设计与实现:教授Android界面设计的基本知识,如布局、控件使用等,指导学生完成计步器界面的设计与实现。
基于App Inventor的陀螺仪、加速度传感器对比研究作者:卞云松来源:《科技视界》2019年第25期【摘要】基于手机传感器的行为识别与手势识别研究具有重要理论意义与实用价值,怎样方便初学者对手机里的传感器进行学习,本文介绍了一种方法。
通过用APP Inventor编程,对智能手机里的陀螺仪、加速度传感器进行对比研究。
【关键词】App Inventor;手机;陀螺仪;加速度传感器中图分类号: TN929.53 文献标识码: A 文章编号: 2095-2457(2019)25-0041-003DOI:10.19694/ki.issn2095-2457.2019.25.019Contrastive Study of Gyroscope and Acceleration Sensor Based on App InventorBIAN Yun-song(Jianghai polytechnic, Yangzhou Jiangsu 225000, China)【Abstract】The research of behavior recognition and gesture recognition based on mobile phone sensor has important theoretical significance and practical value.How to facilitate beginners to learn sensors in mobile phone is introduced in this paper.By programming with APP Inventor,the gyroscopes and accelerometers in smart phones are compared and studied.【Key words】App Inventor;Mobile Phone;Gyroscope;Acceleration Sensor0 概述陀螺仪、加速度传感器现在应用越来越广,智能手机上也有这两种传感器,如果在手机上通过编程APP程序来进行研究,对于非计算机专业的人士难度较大。
加速度传感器原理结构使用说明校准和参数解释
1.安装:将传感器固定在需要测量加速度的物体上,确保传感器与物
体的接触牢固。
2.接线:根据传感器的规格书和制造商提供的接线图,正确连接传感
器与测量设备或系统。
3.供电:根据传感器的工作电压要求,为传感器提供适当的电源。
4.编程:根据传感器的规格书和厂家提供的编程手册,编写适当的代
码来读取传感器的输出数据。
5.数据处理:根据应用需求,对传感器输出的数据进行处理和分析,
例如进行滤波、计算速度、位移等。
为了确保准确测量加速度,加速度传感器需要进行校准。
校准可分为
静态校准和动态校准两种方式。
1.静态校准:将加速度传感器放置在静止状态下,记录其输出值,然
后根据物理的力学原理进行校准,使传感器的输出与已知准确的加速度匹配。
2.动态校准:将加速度传感器暴露在已知加速度的环境中,比如进行
加速、减速、旋转等,通过比较传感器的输出与已知的加速度进行校准。
1.测量范围:指传感器能够测量的最大加速度范围。
2.灵敏度:指传感器对于单位加速度变化的输出变化。
3.频率响应:指传感器能够精确测量的频率范围。
4.噪声:指传感器输出的不确定性,通常以均方根值(RMS)来表示。
5.分辨率:指传感器能够区分的最小加速度变化。
6.非线性度:指传感器输出与输入之间的误差。
7.温度效应:指传感器输出与环境温度变化之间的关系。
总结:。
Android开发获取传感器数据的⽅法⽰例【加速度传感器,磁场传感器,光线传感器,⽅向传感器】本⽂实例讲述了Android开发获取传感器数据的⽅法。
分享给⼤家供⼤家参考,具体如下:package mobile.android.sensor;import java.util.List;import android.app.Activity;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.widget.TextView;public class Main extends Activity implements SensorEventListener {private TextView tvAccelerometer;private TextView tvMagentic;private TextView tvLight;private TextView tvOrientation;private TextView tvSensors;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);// 获得SensorManager对象SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);// 注册加速度传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_FASTEST);// 注册磁场传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);// 注册光线传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),SensorManager.SENSOR_DELAY_FASTEST);// 注册⽅向传感器sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);tvAccelerometer = (TextView) findViewById(Accelerometer);tvMagentic = (TextView) findViewById(Magentic);tvLight = (TextView) findViewById(Light);tvOrientation = (TextView) findViewById(Orientation);tvSensors = (TextView) findViewById(Sensors);// 获得当前⼿机⽀持的所有传感器List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);for (Sensor sensor : sensors) {// 输出当前传感器的名称tvSensors.append(sensor.getName() + "\n");}}@Overridepublic void onSensorChanged(SensorEvent event) {// 通过getType⽅法获得当前传回数据的传感器类型switch (event.sensor.getType()) {case Sensor.TYPE_ACCELEROMETER: // 处理加速度传感器传回的数据String accelerometer = "加速度\n" + "X:" + event.values[0] + "\n"+ "Y:" + event.values[1] + "\n" + "Z:" + event.values[2]+ "\n";tvAccelerometer.setText(accelerometer);break;case Sensor.TYPE_LIGHT: // 处理光线传感器传回的数据tvLight.setText("亮度:" + event.values[0]);break;case Sensor.TYPE_MAGNETIC_FIELD: // 处理磁场传感器传回的数据String magentic = "磁场\n" + "X:" + event.values[0] + "\n" + "Y:"+ event.values[1] + "\n" + "Z:" + event.values[2] + "\n";tvMagentic.setText(magentic);break;case Sensor.TYPE_ORIENTATION: // 处理⽅向传感器传回的数据String orientation = "⽅向\n" + "X:" + event.values[0] + "\n" + "Y:"+ event.values[1] + "\n" + "Z:" + event.values[2] + "\n";tvOrientation.setText(orientation);break;}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}}PS:这⾥获得的只是传感器采集数据,还需要对数据分析,变成有⽤的信息。
android传感器应用课程设计一、课程目标知识目标:1. 理解Android平台传感器的基本概念、种类和工作原理;2. 掌握在Android应用中使用传感器的编程方法;3. 学会分析传感器数据,实现相应的功能应用。
技能目标:1. 能够运用所学知识编写简单的Android传感器应用程序;2. 培养解决实际问题时运用传感器技术的思维和能力;3. 提高自主学习、合作探究和动手实践的能力。
情感态度价值观目标:1. 培养学生对Android传感器技术应用的兴趣,激发学习热情;2. 培养学生团队协作意识,学会共同解决问题;3. 增强学生对科技创新的认识,提高创新精神和实践能力。
课程性质:本课程为实践性较强的学科,结合Android传感器技术,注重培养学生的动手操作能力和实际问题解决能力。
学生特点:学生具备一定的编程基础,对Android应用开发感兴趣,具备一定的自主学习能力。
教学要求:教师需采用任务驱动、案例教学等方法,引导学生通过实践掌握传感器应用开发技巧,提高学生的综合运用能力。
教学过程中注重学生个体差异,鼓励学生相互交流、合作学习,实现共同提高。
通过本课程的学习,使学生能够达到课程目标,并在实际应用中展示所学成果。
二、教学内容1. 传感器基本原理:介绍传感器的作用、种类,重点讲解加速度传感器、磁场传感器、光线传感器和距离传感器的工作原理。
教材章节:第3章 传感器原理与应用2. Android传感器框架:学习Android系统中传感器框架的使用,包括SensorManager、SensorEventListener等核心类。
教材章节:第4章 Android传感器框架3. 传感器编程实践:a. 编写简单的传感器应用程序,如:计步器、指南针等;b. 分析传感器数据,实现功能应用,如:根据光线传感器自动调整屏幕亮度等。
教材章节:第5章 传感器编程实践4. 项目案例:分组进行项目实践,综合运用所学传感器知识,完成一个具有实际应用价值的Android传感器应用。
/** ADXL345模块** 用途:ADXL345模块IIC测试程序*/#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 P2 //LCD1602数据端口sbit SCL=P0^4; //IIC时钟引脚定义sbit SDA=P0^3; //IIC数据引脚定义sbit LCM_RS=P0^2; //LCD1602命令端口sbit LCM_RW=P0^1; //LCD1602命令端口sbit LCM_EN=P0^0; //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,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(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){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}/*******************************/void WriteCommandLCM(uchar CMD,uchar Attribc){if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_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_();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微秒(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轴void display_x(){ float temp;dis_data=(BUF[1]<<8)+BUF[0]; //合成数据if(dis_data<0){dis_data=-dis_data;DisplayOneChar(10,0,'-'); //显示正负符号位}else DisplayOneChar(10,0,' '); //显示空格temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据DisplayOneChar(8,0,'X');DisplayOneChar(9,0,':');DisplayOneChar(11,0,qian);DisplayOneChar(12,0,'.');DisplayOneChar(13,0,bai);DisplayOneChar(14,0,shi);DisplayOneChar(15,0,' ');}//*********************************************************************** //显示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; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据DisplayOneChar(0,1,'Y'); //第1行,第0列显示yDisplayOneChar(1,1,':');DisplayOneChar(3,1,qian);DisplayOneChar(4,1,'.');DisplayOneChar(5,1,bai);DisplayOneChar(6,1,shi);DisplayOneChar(7,1,' ');}//显示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; //计算数据和显示,查考ADXL345快速入门第4页conversion(temp); //转换出显示需要的数据DisplayOneChar(8,1,'Z'); //第0行,第10列显示ZDisplayOneChar(9,1,':');DisplayOneChar(11,1,qian);DisplayOneChar(12,1,'.');DisplayOneChar(13,1,bai);DisplayOneChar(14,1,shi);DisplayOneChar(15,1,' ');}//*********************************************************//******主程序********//*********************************************************void main(){uchar devid;delay(500); //上电延时InitLcd(); //液晶初始化ADXL345DisplayOneChar(0,0,'A');DisplayOneChar(1,0,'D');DisplayOneChar(2,0,'X');DisplayOneChar(3,0,'L');DisplayOneChar(4,0,'3');DisplayOneChar(5,0,'4');DisplayOneChar(6,0,'5');Init_ADXL345(); //初始化ADXL345devid=Single_Read_ADXL345(0X00); //读出的数据为0XE5,表示正确while(1) //循环{Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中display_x(); //---------显示X轴display_y(); //---------显示Y轴display_z(); //---------显示Z轴delay(200); //延时}}#include<reg52.h>#include<math.h>#include<stdio.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code shu[]={0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //00x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00, //10x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00, //20x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //30x40,0xB0,0x88,0xFC,0x80,0x00,0x00,0x00,0x00,0x03,0x02,0x00, //40x3C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //50xF8,0x24,0x24,0x2C,0xC0,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //60x0C,0x04,0xE4,0x1C,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00, //70xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00, //80x38,0x44,0x44,0x44,0xF8,0x00,0x00,0x03,0x02,0x02,0x01,0x00, //90x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00, //. 100x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //- 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 // 空白12 };uchar BUF[6]={0,0,0,0,0,0};int date;sbit SCL=P2^0; //IIC时钟引脚定义sbit SDA=P2^1; //IIC数据引脚定义sbit CE=P2^3; //片选sbit RES=P2^4; //复位sbit DC=P2^5; //数据1和命令0切换sbit DATE=P2^6; //数据输入端sbit CLK=P2^7; //同步时钟输入端void init_5110();void init_S51();void write_byte(uchar); //写入一个字节void write_add(uchar,uchar); //写位置地址void write_A(uchar);void write_B(uchar);void write_ID(uchar,uchar,uchar);void clear_5110();void delayms(uint);#define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS 地址引脚不同修改void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据void Multiple_Read_ADXL345(); //连续的读取内部寄存器数据//------------------------------------void Init_ADXL345();void ADXL345_Start();void ADXL345_Stop();void ADXL345_SendACK(bit ack);bit ADXL345_RecvACK();void ADXL345_SendByte(uchar dat);uchar ADXL345_RecvByte();void ADXL345_ReadPage();void ADXL345_WritePage();//-----------------------------------void main(){uchar devid;delayms(500); //上电延时init_5110();write_ID(0,0,1);// write_ID(0,2,2);Init_ADXL345(); //初始化ADXL345 // 4.5MS devid=Single_Read_ADXL345(0X00); //读出的数据为0XE5,表示正确// delayms(2000);BUF[2]=0x7f;BUF[3]=1;while(1) //循环{Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中读数据时间2毫秒多Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中读数据时间2毫秒多delayms(2);write_ID(0,0,1);write_ID(0,2,2);write_ID(0,4,3);delayms(400); //延时// clear_5110();// delayms(1000);}}/**************************************起始信号**************************************/void ADXL345_Start(){uchar i;SDA = 1; //拉高数据线SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usSDA = 0; //产生下降沿for(i=2;i>0;i--); //延时5usSCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void ADXL345_Stop(){uchar i;SDA = 0; //拉低数据线SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usSDA = 1; //产生上升沿for(i=2;i>0;i--); //延时5us}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void ADXL345_SendACK(bit ack){uchar i;SDA = ack; //写应答信号SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usSCL = 0; //拉低时钟线for(i=2;i>0;i--); //延时5us}/**************************************接收应答信号**************************************/bit ADXL345_RecvACK(){uchar i;SCL = 1; //拉高时钟线for(i=2;i>0;i--); //延时5usCY = SDA; //读应答信号SCL = 0; //拉低时钟线for(i=2;i>0;i--); //延时5usreturn CY;}/**************************************向IIC总线发送一个字节数据**************************************/void ADXL345_SendByte(uchar dat){uchar i,j;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线for(j=2;j>0;j--); //延时5usSCL = 0; //拉低时钟线for(j=2;j>0;j--); //延时5us}ADXL345_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/uchar ADXL345_RecvByte(){uchar i,j;uchar dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线for(j=2;j>0;j--); //延时5usdat |= SDA; //读数据SCL = 0; //拉低时钟线for(j=2;j>0;j--); //延时5us}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(); //停止信号for(i=2;i>0;i--); //延时5us}//*****************************************************************//初始化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页}void init_5110(){RES=1; //可以没有RES=0;RES=1;DC=0;write_byte(0x21);write_byte(0xc8);write_byte(0x20);write_byte(0x0c);clear_5110();}void write_byte(uchar add){uchar i;CE=0;for(i=0;i<8;i++){CLK=0;if(add&0x80)DATE=1;elseDATE=0;CLK=1;add<<=1;}CE=1;CLK=0;}void write_add(uchar x,uchar y) //横纵坐标X 0~83 Y 0~5{write_byte(0x80|x); //横坐标write_byte(0x40|y); //纵坐标}void clear_5110(){uint i;write_add(0,0);DC=1;for(i=0;i<504;i++){write_byte(0x00); //write_byte(0);}DC=0;}void write_ID(uchar x,uchar y,uchar z){uchar a;uint temp;if(z==1){date=(int)(BUF[1]<<8)+BUF[0];}if(z==2){date=(BUF[3]<<8)+BUF[2]; //}if(z==3){date=(BUF[5]<<8)+BUF[4];}if(date<0) // - 号{a=11;date=-date;}else{a=12;// date=date;}temp=(float)date*3.9; //计算数据和显示,查考ADXL345快速入门第4页// 空白// temp=(float)date*3.9; // 应该可以减少两个字节// temp=z;date=temp;/* temp=date;date=date/10;temp=temp*4+date; */// date=temp;write_add(x,y);DC=1;write_A(a);write_A(temp/10000);temp=temp%10000;write_A(temp/1000); temp=temp%1000;write_A(10); // 小数点write_A(temp/100);temp=temp%100;write_A(temp/10); temp=temp%10;write_A(temp);DC=0;temp=date; //确定temp 值不发生变化write_add(x,y+1);DC=1;write_B(a);write_B(temp/10000);temp=temp%10000;write_B(temp/1000); temp=temp%1000;write_B(10); // 小数点write_B(temp/100);temp=temp%100;write_B(temp/10); temp=temp%10;write_B(temp);DC=0;}void write_A(uchar date){uchar i,m;m=date*12;for(i=0;i<6;i++){write_byte(shu[m]);m++;}}void write_B(uchar date){uchar i,m;m=date*12+6;for(i=0;i<6;i++){write_byte(shu[m]);m++;}}void delayms(uint a){uchar x,y;uint z;for(z=a;z>0;z--)for(x=2;x>0;x--)for(y=226;y>0;y--); }。