基于89c52单片机陀螺仪mpu6050测试程序_第1页
基于89c52单片机陀螺仪mpu6050测试程序_第2页
基于89c52单片机陀螺仪mpu6050测试程序_第3页
基于89c52单片机陀螺仪mpu6050测试程序_第4页
基于89c52单片机陀螺仪mpu6050测试程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

君悦的三轴陀螺仪MPU6050测试程序。IIC接口,51单片机驱动,LCD1602同步显示。硬件原理图//****************************************//MPU6050IIC测试程序//使用单片机STC89C52//晶振:11.0592M//显示:LCD1602//编译环境KeiluVision2//参考宏晶网站24c04通信程序//功能:显示加速度计和陀螺仪的10位原始数据//时间:2013年3月1日//****************************************#include<REG52.H>#include<math.h>//Keillibrary#include<stdio.h>//Keillibrary#include<INTRINS.H>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内部地址//****************************************#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43#define GYRO_XOUT_L 0x44#define GYRO_YOUT_H 0x45#define GYRO_YOUT_L 0x46#define GYRO_ZOUT_H 0x47#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取//****************************************//定义类型及变量//****************************************uchardis[4]; //显示数字(-511至512)的字符数组int dis_data; //变量//int Temperature,Temp_h,Temp_l; //温度及高低位数据//****************************************//函数声明//****************************************voiddelay(unsignedintk); //延时//LCD相关函数//****************************************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);//读取温度// Temperatu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论