mpu6050三轴陀螺仪测试程序.docx

上传人:牧羊曲112 文档编号:4886644 上传时间:2023-05-21 格式:DOCX 页数:11 大小:125.44KB
返回 下载 相关 举报
mpu6050三轴陀螺仪测试程序.docx_第1页
第1页 / 共11页
mpu6050三轴陀螺仪测试程序.docx_第2页
第2页 / 共11页
mpu6050三轴陀螺仪测试程序.docx_第3页
第3页 / 共11页
mpu6050三轴陀螺仪测试程序.docx_第4页
第4页 / 共11页
mpu6050三轴陀螺仪测试程序.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《mpu6050三轴陀螺仪测试程序.docx》由会员分享,可在线阅读,更多相关《mpu6050三轴陀螺仪测试程序.docx(11页珍藏版)》请在三一办公上搜索。

1、InvenSense公司的三轴陀螺仪MPU6050测试程序。IIC接口,51单片机驱动,LCD1602同 步显示。硬件原理图/*/ MPU6050 IIC测试程序/使用单片机STC89C52晶振:11.0592M显示:LCD1602编译环境Keil uVision2参考宏晶网站24c04通信程序功能:显示加速度计和陀螺仪的10位原始数据时间:2013年3月1日/*#include #include /Keil library#include /Keil library#include typedef unsigned char uchar;typedef unsigned short usho

2、rt;typedef unsigned int uint;/*/定义51单片机端口/*#define DataPort P0/LCD1602 数据端口sbitSCL=P1A0;/IIC时钟引脚定义sbitSDA=P1A1;/IIC数据引脚定义sbitLCM_RS=P2A0;/LCD1602 命令端口sbitLCM_RW=P2A1;/LCD1602 命令端口sbitLCM_EN=P2A2;/LCD1602 命令端口/3 “/*/定义MPU6050内部地址 /3 “/*#define SMPLRT_DIV0x19陀螺仪采样率,典型值:0x07(125Hz)#define CONFIG0x1A/低通

3、滤波频率,典型值:0x06(5Hz)#define GYRO_CONFIG0x1B陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#defineACCEL_CONFIG 0x1C 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#defineACCEL_XOUT_H 0x3B#defineACCEL_XOUT_L 0x3C#defineACCEL_YOUT_H 0x3D#defineACCEL_YOUT_L 0x3E#defineACCEL_ZOUT_L 0x40#defineTEMP_OUT_H0x41#defineTEMP_OUT_L0x42

4、#defineGYRO_XOUT_H0x43#defineGYRO_XOUT_L0x44#defineGYRO_YOUT_H0x45#defineGYRO_YOUT_L0x46#defineGYRO_ZOUT_H0x47#defineGYRO_ZOUT_L0x48#definePWR_MGMT_10x6B电源管理,典型值:0x00(正常启用)#defineWHO_AM_I0x75/IIC地址寄存器(默认数值0x68,只读)#defineSlaveAddress 0xD0/IIC与人时的地址字节数据,+1为读取#defineACCEL_ZOUT_H 0x3F/*定义类型及变量/*uchar di

5、s4;显示数字(-511至512)的字符数组int dis_data;变量/int Temperature,Temp_h,Temp_l;/温度及高低位数据/*函数声明/*/延时void delay(unsigned int k);/LCD相关函数void InitLcd();/ 初始化lcd1602 void lcd_printf(uchar *s,int temp_data);void WriteDataLCM(uchar dataW);/LCD 数据void WriteCommandLCM(uchar CMD,uchar Attribc);/LCD 指令void DisplayOneCha

6、r(uchar X,uchar Yuchar DData);显示一个字符void DisplayListChar(uchar X,uchar Yuchar *DData,L); /显示字符串/MPU6050操作函数void InitMPU6050();/ 初始化MPU6050void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack);bit I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage()

7、;void I2C_WritePage();void display_ACCEL_x();void display_ACCEL_y();void display_ACCEL_z();uchar Single_ReadI2C(uchar REG_Address);读取 I2C 数据void Single_WriteI2C(uchar REG_Address,uchar REG_data); 向 I2C 写入数据/3 “/* /整数转字符串 /3 “/* void lcd_printf(uchar *s,int temp_data) if(temp_data0) temp_data=-temp_d

8、ata;*s=-;else *s=;*+s =temp_data/100+0x30;temp_data=temp_data%100;/取余运算*+s =temp_data/10+0x30;temp_data=temp_data%10;/取余运算*+s =temp_data+0x30; /* /延时/3 “ /*void delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);/*/LCD1602初始化/*void InitLcd()WriteCommandLCM(0x38,1);WriteCommandLCM(0

9、x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);DisplayOneChar(0,0,A);DisplayOneChar(0,1,G);/*/LCD1602写允许/*void WaitForEnable(void)DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;/3 “/*/LCD1602写入命令/3 “/*void WriteCommandLC

10、M(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;/3 “/*/LCD1602写入数据 /* void WriteDataLCM(uchar dataW) WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0; /* /LCD1602写入

11、一个字符 /* void DisplayOneChar(uchar X,uchar Yuchar DData) Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);/3 “/* /LCD1602显示字符串 /3 “/* void DisplayListChar(uchar X,uchar Yuchar *DData,L) uchar ListLength=0;Y&=0x1;X&=0xF;while(L-)DisplayOneChar(X,Y,DDataListLength);ListLength+;X

12、+; /* /延时 5 微秒(STC90C52RC12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数/* void Delay5us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/3 “ /* /I2C起始信号/3 “ /*voi

13、d I2C_Start() SDA = 1;SCL = 1;Delay5us();SDA = 0;Delay5us();SCL = 0;/* /I2C停止信号 /*void I2C_Stop() SDA = 0;SCL = 1;Delay5us();SDA = 1;Delay5us(); /3 “ /* /I2C发送应答信号/入口参数:ack (0:ACK 1:NAK) /* void I2C_SendACK(bit ack) SDA = ack;SCL = 1;Delay5us();SCL = 0;Delay5us(); /3 “ /* /I2C接收应答信号/3 “ /*拉高数据线拉高时钟线

14、延时产生下降沿延时拉低时钟线拉低数据线拉高时钟线延时产生上升沿延时写应答信号/拉高时钟线延时拉低时钟线延时bit I2C_RecvACK() SCL = 1;Delay5us();CY = SDA;SCL = 0;Delay5us();return CY;/* 向I2C总线发送一个字节数据 /*void I2C_SendByte(uchar dat) uchar i;for (i=0; i8; i+) 拉高时钟线延时读应答信号拉低时钟线延时/8位计数器dat = 1;SDA = CY;SCL = 1;Delay5us();SCL = 0;Delay5us();/移出数据的最高位送数据口拉高时钟

15、线延时拉低时钟线延时I2C_RecvACK();/*从I2C总线接收一个字节数据/*uchar I2C_RecvByte()uchar i;uchar dat = 0;SDA = 1;for (i=0; i8; i+)dat = 1;SCL = 1;Delay5us();dat 1= SDA;SCL = 0;Delay5us();return dat;使能内部上拉,准备读取数据,/8位计数器拉高时钟线延时读数据拉低时钟线延时/*向I2C设备写入一个字节数据/*void Single_WriteI2C(uchar REG_Address,uchar REG_data)起始信号发送设备地址+写信号

16、内部寄存器地址,内部寄存器数据,发送停止信号I2C_Start();I2C_SendByte(SlaveAddress);I2C_SendByte(REG_Address);I2C_SendByte(REG_data);I2C_Stop();/*从I2C设备读取一个字节数据/*uchar Single_ReadI2C(uchar REG_Address)uchar REG_data;I2C_Start();起始信号I2C_SendByte(SlaveAddress);发送设备地址+写信号I2C_SendByte(REG_Address);发送存储单元地址,从0开始I2C_Start();起始信

17、号I2C_SendByte(SlaveAddress+1);发送设备地址+读信号读出寄存器数据接收应答信号停止信号REG_data=I2C_RecvByte();I2C_SendACK(1);I2C_Stop();return REG_data;/*/初始化MPU6050/*void InitMPU6050()Single_WriteI2C(PWR_MGMT_1, 0x00); /解除休眠状态Single_WriteI2C(SMPLRT_DIV 0x07);Single_WriteI2C(CONFIG 0x06);Single_WriteI2C(GYRO_CONFIG 0x18);Single

18、_WriteI2C(ACCEL_CONFIG 0x01);/3 “/*/合成数据/3 “/*int GetData(uchar REG_Address)char H,L;H=Single_ReadI2C(REG_Address);L=Single_ReadI2C(REG_Address+1); return (H8)+L;/合成数据 /* /在1602上显示10位数据 /* void Display10BitData(int value,uchar x,uchar y) value/=64;转换为10位数据lcd_printf(dis, value);转换数据显示Temp_h=Single_R

19、eadI2C(TEMP_OUT_H); /读取温度Temp_l=Single_ReadI2C(TEMP_OUT_L); /读取温度Temperature=Temp_h8|Temp_l; /合成温度Temperature = 35+ (double) (Temperature + 13200) / 280; / 计算出温度lcd_printf(dis,Temperature);转换数据显示DisplayListChar(11,1,dis,4);启始列,行,显示数组,显示位数DisplayListChar(x,y,dis,4); 启始列,行,显示数组,显示长度 /* 显示温度 /* /void d

20、isplay_temp() / / / / / / / / /* 主程序 /* void main() delay(500);上电延时InitLcd();/液晶初始化InitMPU6050();/初始化 MPU6050delay(150); while(1) Display10BitData(GetData(ACCEL_XOUT_H),2,0); /显示 X 轴加速度 Display10BitData(GetData(ACCEL_YOUT_H),7,0); /显示 Y 轴加速度 Display10BitData(GetData(ACCEL_ZOUT_H),12,0); /显示 Z 轴加速度 Display10BitData(GetData(GYRO_XOUT_H),2,1); 显示 X 轴角速度 Display10BitData(GetData(GYRO_YOUT_H),7,1); 显示 Y 轴角速度 Display10BitData(GetData(GYRO_ZOUT_H),12,1); 显示 Z 轴角速度 delay(500);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号