您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 基于89c52单片机陀螺仪mpu6050测试程序文件
专业资料参考word格式整理君悦的三轴陀螺仪MPU6050测试程序。IIC接口,51单片机驱动,LCD1602同步显示。硬件原理图//****************************************//MPU6050IIC测试程序//使用单片机STC89C52//晶振:11.0592M//显示:LCD1602//编译环境KeiluVision2//参考宏晶网站24c04通信程序//功能:显示加速度计和陀螺仪的10位原始数据//时间:2013年3月1日//****************************************#includeREG52.H#includemath.h//Keillibrary#includestdio.h//Keillibrary#includeINTRINS.Htypedefunsignedcharuchar;typedefunsignedshortushort;typedefunsignedintuint;//****************************************//定义51单片机端口专业资料参考word格式整理//****************************************#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相关函数专业资料参考word格式整理voidInitLcd();//初始化lcd1602voidlcd_printf(uchar*s,inttemp_data);voidWriteDataLCM(uchardataW);//LCD数据voidWriteCommandLCM(ucharCMD,ucharAttribc);//LCD指令voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示一个字符voidDisplayListChar(ucharX,ucharY,uchar*DData,L);//显示字符串//MPU6050操作函数voidInitMPU6050();//初始化MPU6050voidDelay5us();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_data0){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;}//****************************************//延时//****************************************专业资料参考word格式整理voiddelay(unsignedintk){unsignedinti,j;for(i=0;ik;i++){for(j=0;j121;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写入数据专业资料参考word格式整理//****************************************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_();专业资料参考word格式整理_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停止信号//*********************
本文标题:基于89c52单片机陀螺仪mpu6050测试程序文件
链接地址:https://www.777doc.com/doc-4628508 .html