版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、这个程序完成的功能为:使用msp430f5529在12864上串行显示 GY-521, MPU605所测量的角度。在IAR亲测成功。注意:我只给出了C文件,h文件自己去建立就好了。/* 主函数 */#include #include stdio.h#include math.h#include 6050.h#include LCD12864.h void Delays( uchar i) unsigned int j; while(i-)j=2000;while(j-);void main(void)关闭看门狗串口发送缓存WDTCTL = WDTPW + WDTHOLD; / char sum
2、110,sum210,sum310; /float a_x,a_y,a_z; int_port() ;/ lcdinit();InitMPU6050(); / display(1,1, display(2,1, display(3,1, while(1) / Delays(2);管脚初始化角度角度角度初始化模块X:);Y:);Z:);I;,仅供参考a_x = mpu6050_Angle(2);a_y = mpu6050_Angle(1);将测量倾角值转换为字符串a_z = mpu6050_Angle(0); sprintf(sum1,%.2f,a_x); / sprintf(sum2,%.2f
3、,a_y);sprintf(sum3,%.2f,a_z);display(1,4,sum1);display(2,4,sum2);display(3,4,sum3);/*6050IIC*/* *文件名:Mpu-6050.c* *编写者:黄建军* *描 述:三轴加速度,三轴陀螺仪传感器Mpu-6050的驱动程序,此处用于 149系歹U。* * 注意-此处MCLK 8Mhz* * 版本:2013-6 V1.0* */ #include msp430f5529.h#include mytype.h#include 6050.hstatic void I2C_Start();static void I
4、2C_Stop();static void I2C_SendACK(uchar ack);static uchar I2C_RecvACK();static void I2C_SendByte(uchar dat);static uchar I2C_RecvACK();short accData3=0;/*/I2C起始信号/* void I2C_Start() MPU_SCL_OUT(); SCL 设置为输出MPU_SDA_OUT(); SDA 设置为输出MPU_SDA_H(); /拉高数据线MPU_SCL_H(); /拉高时钟线DELAY_US(5); /延时MPU_SDA_L(); /产生
5、下降沿DELAY_US(5); /延时MPU_SCL_L(); /拉低时钟线*/I2C停止信号*void I2C_Stop() MPU_SCL_OUT(); SCL设置为输出MPU_SDA_OUT(); SDA设置为输出MPU_SDA_L();/拉低数据线MPU_SCL_H();/拉高时钟线DELAY_US(5);/延时MPU_SDA_H(); /产生上升沿DELAY_US(5);/延时/*/I2C发送应答信号/ 入口参数:ack (0:ACK 1:NAK)*void I2C_SendACK(uchar ack)MPU_SCL_OUT(); SCL MPU_SDA_OUT(); SDA if(
6、ack)MPU_SDA_H();else设置为输出设置为输出MPU_SDA_L();/ SDA = ack;/MPU_SCL_H();/DELAY_US(5);/MPU_SCL_L();/DELAY_US(5);/*/I2C接收应答信号 *写应答信号拉高时钟线延时拉低时钟线延时uchar I2C_RecvACK()uchar cy;MPU_SCL_OUT(); SCL设置为输出MPU_SDA_IN(); SDA设置为输入MPU_SCL_H();/拉高时钟线DELAY_US(5);/延时if(MPU_SDA_DAT() cy=1; else cy=0; / cy = SDA;/读应答信号MPU_
7、SCL_L();/拉低时钟线DELAY_US(5);/延时MPU_SDA_OUT(); / SDA设置为输出return cy;*/向I2C总线发送一个字节数据/*void I2C_SendByte(uchar dat) uchar i;MPU_SCL_OUT(); SCL 设置为输出MPU_SDA_OUT(); SDA 设置为输出位计数器送数据口拉高时钟线延时拉低时钟线延时for (i=0; i8; i+)8if(dati)&0x80)MPU_SDA_H(); else MPU_SDA_L();/ SDA = cy; / MPU_SCL_H();/DELAY_US(5);/MPU_SCL_L
8、();/DELAY_US(5);/I2C_RecvACK(); * /从I2C总线接收一个字节数据 /*uchar I2C_RecvByte() uchar i;uchar dat = 0,cy;MPU_SCL_OUT(); SCL设置为输出MPU_SDA_OUT(); SDA设置为输出MPU_SDA_H(); 使能内部上拉,准备读取数据,MPU_SDA_IN(); SDA 设置为输入,准备向主机输入数据for (i=0; i8; i+)/8位计数器dat = 1;MPU_SCL_H();/拉高时钟线DELAY_US(5); /延时if(MPU_SDA_DAT()cy=1;elsecy=0;d
9、at |= cy; /读数据MPU_SCL_L();DELAY_US(5);MPU_SDA_OUT(); return dat;/拉低时钟线延时*/向I2C设备写入一个字节数据*void ByteWrite6050(uchar REG_Address,uchar REG_data) I2C_Start();/I2C_SendByte(SlaveAddress); /I2C_SendByte(REG_Address); /I2C_SendByte(REG_data); /I2C_Stop(); /起始信号发送设备地址+写信号 内部寄存器地址,内部寄存器数据, 发送停止信号/*/从I2C设备读取一
10、个字节数据*uchar ByteRead6050(uchar REG_Address) uchar REG_data;I2C_Start();/I2C_SendByte(SlaveAddress);I2C_SendByte(REG_Address);/I2C_Start();/I2C_SendByte(SlaveAddress+1); /REG_data=I2C_RecvByte(); /I2C_SendACK(1);/I-I2C_Stop();/return REG_data;起始信号发送设备地址+写信号 发送存储单元地址,从 起始信号发送设备地址+ 读信号 读出寄存器数据接收应答信号停止信
11、号0开始*/合成数据*int Get6050Data(uchar REG_Address) char H,L;H=ByteRead6050(REG_Address);L=ByteRead6050(REG_Address+1);return (H=sinx,故乘以1.2适当放大*返回参数:测量的倾角值*传入参数:dir-需要测量的方向*ACCEL_XOUT - X力向*ACCEL_YOUT - Y力向*ACCEL_ZOUT - Z方向*/ -: i jr-T * j ufloat Mpu6050AccelAngle(uchar dir)float accel_agle;/测量的倾角值float
12、result; /测量值缓存变量result = (float)Get6050Data(dir); 测量当前方向的加速度值,转换为浮点数accel_agle = (result + MPU6050_ZERO_ACCELL); 去除零点偏移,计算得到角度(弧度)/ accel_agle = accel_agle*1.2*180/3.14;/弧度转换为度一 _ j I Ireturn accel_agle; /返回测量值/* * 函数名 :float Mpu6050GyroAngle(int8 dir)* *函数功能:输出陀螺仪测量的倾角加速度* *范围为 2000deg/s 时,换算关系:16.
13、4 LSB/(deg/s)* *返回参数:测量的倾角加速度值*传入参数:dir -需要测量的方向*GYROXOUT - X*GYROYOUT-Y*GYROZOUT - Z轴方向轴方向轴方向*/float Mpu6050GyroAngle(uchar dir) float gyro_angle;/ float Angle_gy;gyro_angle = (float)Get6050Data(dir); /检测陀螺仪的当前值gyro_angle = -(gyro_angle + MPU6050_ZERO_GYRO)/16.4; /去除零点偏移,计算角速度值,负号为方向处理/ Angle_gy +=
14、 gyro_angle*0.005; return gyro_angle; 返回测量值/采样10次去掉两个最大最小值求平均void MPU6050ReadAcc()int i=0,j=0;int x_buf10;int y_buf10;int z_buf10;int temp=0;long temp2=0;for(i=0;i10;i+)x_bufi = Get6050Data(ACCEL_XOUT); y_bufi = Get6050Data(ACCEL_YOUT);z_bufi = Get6050Data(ACCEL_ZOUT);I - - I . /for(i=0;i9;i+)for(j=
15、i+1;jx_bufi)产 L 一temp=x_bufj; i | 一 .、 jx_bufj=x_bufi; x_bufi=temp;if(y_bufjy_bufi)temp=y_bufj; y_bufj=y_bufi; y_bufi=temp;if(z_bufjz_bufi)temp=z_bufj; z_bufj=z_bufi; z_bufi=temp;temp2=0;for(i=2;i8;i+)temp2=temp2+x_bufi;accData0=temp2/6;temp2=0;for(i=2;i8;i+)temp2=temp2+y_bufi;accData1=temp2/6;temp2
16、=0;for(i=2;i8;i+)temp2=temp2+z_bufi; I XaccData2=temp2/6;/得到角度/x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)/dir:要获得白角度.0,与x轴的角度;1,与Y轴的角度;2,与Z轴的角度./返回值:角度值.单位0.1 .float mpu6050_Angle(uchar dir) / y- 8 0float temp,x,y,z;float res=0;MPU6050ReadAcc(); 得至U accData口 值x = accData0;V i |.、jy = accData1;z = accData2;
17、switch(dir)case 0: 与自然Z轴的角度temp=sqrt(x*x+y*y)/z;res=atan(temp);break;case 1: 与自然X轴的角度temp=x/sqrt(y*y+z*z);res=atan(temp);break;case 2: 与自然Y轴的角度temp=y/sqrt(x*x+z*z);res=atan(temp);break;设置平放的基础角度值return (res*180/3.14)+0;/*LCD12864*/#include #include LCD12864.h#define uchar unsigned char#define uint u
18、nsigned intextern unsigned char ADS1256_buf9;仅供参考void int_port(void) /P2SEL&=BIT4; /P2.4P2DIR|=BIT4;P2OUT&=BIT4;P2SEL&=BIT5; /P2.5P2DIR|=BIT5;P2OUT&=BIT5;管脚初始化模才S SID,设置为i/o 口输出方向模才S SCLK设置为i/o 口输出方向/*名称:delay()*输入:t输出:无*/void delay(uint t) 延时函数 /粗略延时,满足时序要求uint i,j;for(i=0; it; i+)for(j=0; j10; j+)
19、;名称 功能 输入 输出/* sendbyte()按照液晶的串口通信协议,发送数据zdata无*/数据传送函数void sendbyte(uchar zdata) / uchar code_seg7;uchar serial_clk;uchar serial_shift;code_seg7=zdata;serial_shift=0x80;for(serial_clk=0; serial_clk1; /准备发送下一位数据/* 名称:write_com()* 功能:写串口指令* 输入:cmdcode*输出:无*/ I X Avoid write_com(unsigned char cmdcode)
20、 /写命令函数/ 串口控制格式(11111AB0)/A数据方向控制,A=H时读,A=L时写/B数据类型选择,B=H时为显示数据,B=L时为命令sendbyte(0xf8); /MCU 向 LCD发命令sendbyte(cmdcode & 0xf0);/ 发高四位数据(数据格式 D7D6D5D4_0000)sendbyte(cmdcode 4) & 0xf0);/发低四位数据(数据格式 D3D2D1D0_0000)delay(2); / 延时等待/* 名称:write_data()* 功能:写串口数据* 输入:Dispdata* 输出:无*/ void write_data(uchar Disp
21、data)/写数据函数sendbyte(0xfa); /MCU 向 LCD发数据sendbyte(Dispdata & 0xf0); /发高四位数据sendbyte(Dispdata 4) & 0xf0);/发低四位数据delay(2);/* 名称:lcdinit()* 功能:初始化函数* 输入:cmdcode* 输出:无*仅供参考void lcdinit() /LCDdelay(20000); / write_com(0x30); delay(50); /write_com(0x0c); / delay(50);write_com(0x01); / delay(50);write_com(0x06); / delay(50);初始化复位等待(内部自带上电复位电路)功能设定:基本指令集操作延时等待整体显示,关游标清屏入口设置/*函数名称:LCD_1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉安市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(夺分金卷)
- 保山市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及参考答案详解一套
- 贵港市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(各地真题)
- 2026年铜陵市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(综合题)
- 阿克苏地区农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(模拟题)
- 自贡市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及1套完整答案详解
- 台北县农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(培优b卷)
- 泉州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解
- 临沧市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(新)
- 葫芦岛市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(达标题)
- 学校网评员能力提升培训体系
- 四川省绵阳市2024-2025学年上学期八年级期末数学试卷(含答案)
- 全国统一市政工程预算定额 第8册 路灯工程
- 桥梁涂装专项施工方案
- 园林绿化工程绿化施工法律法规考核试卷
- 【大学课件】证券发行市场
- 新农村太阳能路灯照明设计方案
- 中国高血压防治指南(2024年修订版)解读课件
- 租赁共同经营协议模板
- GB/T 19609-2024卷烟用常规分析用吸烟机测定总粒相物和焦油
- 公路工程标准施工招标文件(2018年版)
评论
0/150
提交评论