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

上传人:b****6 文档编号:4122271 上传时间:2022-11-28 格式:DOCX 页数:13 大小:420.45KB
下载 相关 举报
三轴陀螺仪mpu6050测试程序.docx_第1页
第1页 / 共13页
三轴陀螺仪mpu6050测试程序.docx_第2页
第2页 / 共13页
三轴陀螺仪mpu6050测试程序.docx_第3页
第3页 / 共13页
三轴陀螺仪mpu6050测试程序.docx_第4页
第4页 / 共13页
三轴陀螺仪mpu6050测试程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

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

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

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

三轴陀螺仪mpu6050测试程序

InvenSense公司的三轴陀螺仪MPU6050测试程序。

IIC接口,51单片机驱动,LCD1602同步显示。

硬件原理图

//****************************************

//MPU6050IIC测试程序

//使用单片机STC89C52

//晶振:

11.0592M

//显示:

LCD1602

//编译环境KeiluVision2

//参考宏晶网站24c04通信程序

//功能:

显示加速度计和陀螺仪的10位原始数据

//时间:

2013年3月1日

//****************************************

#include

#include//Keillibrary

#include//Keillibrary

#include

typedefunsignedcharuchar;

typedefunsignedshortushort;

typedefunsignedintuint;

//****************************************

//定义51单片机端口

//****************************************

#defineDataPortP0//LCD1602数据端口

sbitSCL=P1^0;//IIC时钟引脚定义

sbitSDA=P1^1;//IIC数据引脚定义

sbitLCM_RS=P2^0;//LCD1602命令端口

sbitLCM_RW=P2^1;//LCD1602命令端口

sbitLCM_EN=P2^2;//LCD1602命令端口

//****************************************

//定义MPU6050内部地址

//****************************************

#defineSMPLRT_DIV0x19//陀螺仪采样率,典型值:

0x07(125Hz)

#defineCONFIG0x1A//低通滤波频率,典型值:

0x06(5Hz)

#defineGYRO_CONFIG0x1B//陀螺仪自检及测量范围,典型值:

0x18(不自检,2000deg/s)

#defineACCEL_CONFIG0x1C//加速计自检、测量范围及高通滤波频率,典型值:

0x01(不自检,2G,5Hz)

#defineACCEL_XOUT_H0x3B

#defineACCEL_XOUT_L0x3C

#defineACCEL_YOUT_H0x3D

#defineACCEL_YOUT_L0x3E

#defineACCEL_ZOUT_H0x3F

#defineACCEL_ZOUT_L0x40

#defineTEMP_OUT_H0x41

#defineTEMP_OUT_L0x42

#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,只读)

#defineSlaveAddress0xD0//IIC写入时的地址字节数据,+1为读取

//****************************************

//定义类型及变量

//****************************************

uchardis[4];//显示数字(-511至512)的字符数组

intdis_data;//变量

//intTemperature,Temp_h,Temp_l;//温度及高低位数据

//****************************************

//函数声明

//****************************************

voiddelay(unsignedintk);//延时

//LCD相关函数

voidInitLcd();//初始化lcd1602

voidlcd_printf(uchar*s,inttemp_data);

voidWriteDataLCM(uchardataW);//LCD数据

voidWriteCommandLCM(ucharCMD,ucharAttribc);//LCD指令

voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示一个字符

voidDisplayListChar(ucharX,ucharY,uchar*DData,L);//显示字符串

//MPU6050操作函数

voidInitMPU6050();//初始化MPU6050

voidDelay5us();

voidI2C_Start();

voidI2C_Stop();

voidI2C_SendACK(bitack);

bitI2C_RecvACK();

voidI2C_SendByte(uchardat);

ucharI2C_RecvByte();

voidI2C_ReadPage();

voidI2C_WritePage();

voiddisplay_ACCEL_x();

voiddisplay_ACCEL_y();

voiddisplay_ACCEL_z();

ucharSingle_ReadI2C(ucharREG_Address);//读取I2C数据

voidSingle_WriteI2C(ucharREG_Address,ucharREG_data);//向I2C写入数据

//****************************************

//整数转字符串

//****************************************

voidlcd_printf(uchar*s,inttemp_data)

{

if(temp_data<0)

{

temp_data=-temp_data;

*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;

}

//****************************************

//延时

//****************************************

voiddelay(unsignedintk)

{

unsignedinti,j;

for(i=0;i

{

for(j=0;j<121;j++);

}

}

//****************************************

//LCD1602初始化

//****************************************

voidInitLcd()

{

WriteCommandLCM(0x38,1);

WriteCommandLCM(0x08,1);

WriteCommandLCM(0x01,1);

WriteCommandLCM(0x06,1);

WriteCommandLCM(0x0c,1);

DisplayOneChar(0,0,'A');

DisplayOneChar(0,1,'G');

}

//****************************************

//LCD1602写允许

//****************************************

voidWaitForEnable(void)

{

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_();

LCM_EN=1;_nop_();_nop_();

while(DataPort&0x80);

LCM_EN=0;

}

//****************************************

//LCD1602写入命令

//****************************************

voidWriteCommandLCM(ucharCMD,ucharAttribc)

{

if(Attribc)WaitForEnable();

LCM_RS=0;LCM_RW=0;_nop_();

DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

//****************************************

//LCD1602写入数据

//****************************************

voidWriteDataLCM(uchardataW)

{

WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_();

DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0;

}

//****************************************

//LCD1602写入一个字符

//****************************************

voidDisplayOneChar(ucharX,ucharY,ucharDData)

{

Y&=1;

X&=15;

if(Y)X|=0x40;

X|=0x80;

WriteCommandLCM(X,0);

WriteDataLCM(DData);

}

//****************************************

//LCD1602显示字符串

//****************************************

voidDisplayListChar(ucharX,ucharY,uchar*DData,L)

{

ucharListLength=0;

Y&=0x1;

X&=0xF;

while(L--)

{

DisplayOneChar(X,Y,DData[ListLength]);

ListLength++;

X++;

}

}

//**************************************

//延时5微秒(STC90C52RC@12M)

//不同的工作环境,需要调整此函数

//当改用1T的MCU时,请调整此延时函数

//**************************************

voidDelay5us()

{

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

}

//**************************************

//I2C起始信号

//**************************************

voidI2C_Start()

{

SDA=1;//拉高数据线

SCL=1;//拉高时钟线

Delay5us();//延时

SDA=0;//产生下降沿

Delay5us();//延时

SCL=0;//拉低时钟线

}

//**************************************

//I2C停止信号

//**************************************

voidI2C_Stop()

{

SDA=0;//拉低数据线

SCL=1;//拉高时钟线

Delay5us();//延时

SDA=1;//产生上升沿

Delay5us();//延时

}

//**************************************

//I2C发送应答信号

//入口参数:

ack(0:

ACK1:

NAK)

//**************************************

voidI2C_SendACK(bitack)

{

SDA=ack;//写应答信号

SCL=1;//拉高时钟线

Delay5us();//延时

SCL=0;//拉低时钟线

Delay5us();//延时

}

//**************************************

//I2C接收应答信号

//**************************************

bitI2C_RecvACK()

{

SCL=1;//拉高时钟线

Delay5us();//延时

CY=SDA;//读应答信号

SCL=0;//拉低时钟线

Delay5us();//延时

returnCY;

}

//**************************************

//向I2C总线发送一个字节数据

//**************************************

voidI2C_SendByte(uchardat)

{

uchari;

for(i=0;i<8;i++)//8位计数器

{

dat<<=1;//移出数据的最高位

SDA=CY;//送数据口

SCL=1;//拉高时钟线

Delay5us();//延时

SCL=0;//拉低时钟线

Delay5us();//延时

}

I2C_RecvACK();

}

//**************************************

//从I2C总线接收一个字节数据

//**************************************

ucharI2C_RecvByte()

{

uchari;

uchardat=0;

SDA=1;//使能内部上拉,准备读取数据,

for(i=0;i<8;i++)//8位计数器

{

dat<<=1;

SCL=1;//拉高时钟线

Delay5us();//延时

dat|=SDA;//读数据

SCL=0;//拉低时钟线

Delay5us();//延时

}

returndat;

}

//**************************************

//向I2C设备写入一个字节数据

//**************************************

voidSingle_WriteI2C(ucharREG_Address,ucharREG_data)

{

I2C_Start();//起始信号

I2C_SendByte(SlaveAddress);//发送设备地址+写信号

I2C_SendByte(REG_Address);//内部寄存器地址,

I2C_SendByte(REG_data);//内部寄存器数据,

I2C_Stop();//发送停止信号

}

//**************************************

//从I2C设备读取一个字节数据

//**************************************

ucharSingle_ReadI2C(ucharREG_Address)

{

ucharREG_data;

I2C_Start();//起始信号

I2C_SendByte(SlaveAddress);//发送设备地址+写信号

I2C_SendByte(REG_Address);//发送存储单元地址,从0开始

I2C_Start();//起始信号

I2C_SendByte(SlaveAddress+1);//发送设备地址+读信号

REG_data=I2C_RecvByte();//读出寄存器数据

I2C_SendACK

(1);//接收应答信号

I2C_Stop();//停止信号

returnREG_data;

}

//**************************************

//初始化MPU6050

//**************************************

voidInitMPU6050()

{

Single_WriteI2C(PWR_MGMT_1,0x00);//解除休眠状态

Single_WriteI2C(SMPLRT_DIV,0x07);

Single_WriteI2C(CONFIG,0x06);

Single_WriteI2C(GYRO_CONFIG,0x18);

Single_WriteI2C(ACCEL_CONFIG,0x01);

}

//**************************************

//在1602上显示10位数据

//**************************************

voidDisplay10BitData(intvalue,ucharx,uchary)

{

value/=64;//转换为10位数据value=value/64右移动六位

lcd_printf(dis,value);//转换数据显示

DisplayListChar(x,y,dis,4);//启始列,行,显示数组,显示长度

}

//**************************************

//合成数据

//**************************************

intGetData(ucharREG_Address)

{

charH,L;

H=Single_ReadI2C(REG_Address);

L=Single_ReadI2C(REG_Address+1);

return(H<<8)+L;//合成数据

}

//**************************************

//显示温度

//**************************************

//voiddisplay_temp()

//{

//Temp_h=Single_ReadI2C(TEMP_OUT_H);//读取温度

//Temp_l=Single_ReadI2C(TEMP_OUT_L);//读取温度

//Temperature=Temp_h<<8|Temp_l;//合成温度

//Temperature=35+((double)(Temperature+13200))/280;//计算出温度

//lcd_printf(dis,Temperature);//转换数据显示

//DisplayListChar(11,1,dis,4);//启始列,行,显示数组,显示位数

//}

//*********************************************************

//主程序

//*********************************************************

voidmain()

{

delay(500);//上电延时

InitLcd();//液晶初始化

InitMPU6050();//初始化MPU6050

delay(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);

}

}

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

当前位置:首页 > 初中教育 > 政史地

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1