您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 基于msp430的mpu6050陀螺仪程序
//includes.h#includemsp430x14x.h#includeLCD1602.h#includempu6050.h//main.c#includeincludes.hvoidmain(){WDTCTL=WDTPW+WDTHOLD;BCSCTL1&=~XT2OFF;do{IFG1&=~OFIFG;for(uinti=0xff;i0;i--);}while((IFG1&OFIFG));//等待时钟稳定BCSCTL2|=SELM_2+SELS;//主、从系统时钟均为高频DATA_DIR=0XFF;DATA_OUT=0X00;P6DIR=0XFF;P6OUT=0X00;init();InitMPU6050();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);delayms(300);}}//以下是传感器相关文件//mpu6050.h#defineCPU_F((double)8000000)#definedelayus(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))//宏定义延时函数#definedelayms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))#defineSCL1P5OUT|=BIT0#defineSCL0P5OUT&=~BIT0#defineSCLOUTP5DIR|=BIT0;#defineSDA1P5OUT|=BIT1//IIC数据引脚#defineSDA0P5OUT&=~BIT1#defineSDAINP5DIR&=~BIT1#defineSDAOUTP5DIR|=BIT1#defineSDADATA(P5IN&BIT1)//****************************************//定义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为读取//显示数字(-511至512)的字符数组voidI2C_Start();voidI2C_Stop();voidI2C_SendACK(ucharack);ucharI2C_RecvACK();voidI2C_SendByte(uchardat);ucharI2C_RecvByte();voidSingle_WriteI2C(ucharREG_Address,ucharREG_data);ucharSingle_ReadI2C(ucharREG_Address);voidInitMPU6050();voidlcd_printf(uchar*s,inttemp_data);voidDisplayListChar(ucharX,ucharY,uchar*DData,ucharL);intGetData(ucharREG_Address);voidDisplay10BitData(intvalue,ucharx,uchary);//mpu6050.c#includeincludes.huchardis[4];intdis_data;//**************************************//I2C起始信号//**************************************voidI2C_Start(){SDAOUT;SDA1;//拉高数据线SCLOUT;SCL1;//拉高时钟线delayus(5);//延时SDA0;//产生下降沿delayus(5);//延时SCL0;//拉低时钟线}//**************************************//I2C停止信号//**************************************voidI2C_Stop(){SDAOUT;SDA0;//拉低数据线SCLOUT;SCL1;//拉高时钟线delayus(5);//延时SDA1;//产生上升沿delayus(5);//延时}//**************************************//I2C发送应答信号//入口参数:ack(0:ACK1:NAK)//**************************************voidI2C_SendACK(ucharack){SDAOUT;SCLOUT;if(ack)SDA1;elseSDA0;//SDA=ack;//写应答信号SCL1;//拉高时钟线delayus(5);//延时SCL0;//拉低时钟线delayus(5);//延时}//**************************************//I2C接收应答信号//**************************************ucharI2C_RecvACK(){ucharcy;SCLOUT;SCL1;//拉高时钟线SDAIN;delayus(5);//延时if(SDADATA){cy=1;}else{cy=0;}//cy=SDA;//读应答信号SCL0;//拉低时钟线delayus(5);//延时SDAOUT;returncy;}//**************************************//向I2C总线发送一个字节数据//**************************************voidI2C_SendByte(uchardat){uchari;SDAOUT;for(i=0;i8;i++)//8位计数器{if((dati)&0x80){SDA1;}else{SDA0;}//SDA=cy;//送数据口SCLOUT;SCL1;//拉高时钟线delayus(5);//延时SCL0;//拉低时钟线delayus(5);//延时}I2C_RecvACK();}//**************************************//从I2C总线接收一个字节数据//**************************************ucharI2C_RecvByte(){uchari;uchardat=0,cy;SDAOUT;SCLOUT;SDA1;//使能内部上拉,准备读取数据,SDAIN;for(i=0;i8;i++)//8位计数器{dat=1;SCL1;//拉高时钟线delayus(5);//延时if(SDADATA){cy=1;}else{cy=0;}dat|=cy;//读数据SCL0;//拉低时钟线delayus(5);//延时}SDAOUT;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);}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;}//****************************************//LCD1602显示字符串//*************
本文标题:基于msp430的mpu6050陀螺仪程序
链接地址:https://www.777doc.com/doc-6297405 .html