mpu6050三轴陀螺仪测试程序.docx
- 文档编号:25774924
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:16
- 大小:420.23KB
mpu6050三轴陀螺仪测试程序.docx
《mpu6050三轴陀螺仪测试程序.docx》由会员分享,可在线阅读,更多相关《mpu6050三轴陀螺仪测试程序.docx(16页珍藏版)》请在冰豆网上搜索。
mpu6050三轴陀螺仪测试程序
InvenSense公司的三轴陀螺仪MPU6050测试程序。
IIC接口,51单片机驱动,LCD1602同步显示。
硬件原理图
//****************************************
//MPU6050IIC测试程序
//使用单片机STC89C52
//晶振:
11.0592M
//显示:
LCD1602
//编译环境KeiluVision2
//参考宏晶网站24c04通信程序
//功能:
显示加速度计和陀螺仪的10位原始数据
//时间:
2013年3月1日
//****************************************
#include
#include
#include
#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); } //************************************** //合成数据 //************************************** intGetData(ucharREG_Address) { charH,L; H=Single_ReadI2C(REG_Address); L=Single_ReadI2C(REG_Address+1); return(H<<8)+L;//合成数据 } //************************************** //在1602上显示10位数据 //************************************** voidDisplay10BitData(intvalue,ucharx,uchary) { value/=64;//转换为10位数据 lcd_printf(dis,value);//转换数据显示 DisplayListChar(x,y,dis,4);//启始列,行,显示数组,显示长度 } //************************************** //显示温度 //************************************** //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); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mpu6050 陀螺仪 测试 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)