mpu6050读出数据都是1为什么读到的是ff

查看: 9916|回复: 9
MPU6050使用问题
小弟刚拿到6050的芯片,和51单片机开发板连接后,通过串口得到的数据全是 -1,现在不清楚到底是模块本身有问题,还是程序有错误设置。先把程序贴出来,各位大侠帮我看看。
//****************************************
// 定义51单片机端口
//****************************************
sbit& & SCL=P1^0;& & & & & & & & & & & & //IIC时钟引脚定义
sbit& & SDA=P1^1;& & & & & & & & & & & & //IIC数据引脚定义
//****************************************
// 定义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为读取
//****************************************
//定义类型及变量
//****************************************
uchar dis[6];& & & & & & & & & & & & & & & & & & & & & & & & & & & & //显示数字(-511至512)的字符数组
int& & & & dis_& & & & & & & & & & & & & & & & & & & & & & & & //变量
//int& & & & Temperature,Temp_h,Temp_l;& & & & //温度及高低位数据
//****************************************
//函数声明
//****************************************
void&&delay(unsigned int k);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时& & & & & & & & & & & & & & & & & & & & & & & &
void&&lcd_printf(uchar *s,int temp_data);
//MPU6050操作函数
void&&InitMPU6050();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //初始化MPU6050
void&&Delay5us();
void&&I2C_Start();
void&&I2C_Stop();
void&&I2C_SendACK(bit ack);
bit& &I2C_RecvACK();
void&&I2C_SendByte(uchar dat);
uchar I2C_RecvByte();
void&&I2C_ReadPage();
void&&I2C_WritePage();
void&&display_ACCEL_x();
void&&display_ACCEL_y();
void&&display_ACCEL_z();
uchar Single_ReadI2C(uchar REG_Address);& & & & & & & & & & & & & & & & & & & & & & & & //读取I2C数据
void&&Single_WriteI2C(uchar REG_Address,uchar REG_data);& & & & //向I2C写入数据
//****************************************
//整数转字符串
//****************************************
void lcd_printf(uchar *s,int temp_data)
& & & & if(temp_data&0)
& & & & & & & & temp_data=-temp_
& & & & & & & & *s='-';
& & & & else *s=' ';
& & & & *++s =temp_data/;
& & & & temp_data=temp_data%10000;& &&&//取余运算
& & & & *++s =temp_data/;
& & & & temp_data=temp_data%1000;& &&&//取余运算
& & & & *++s =temp_data/100+0x30;
& & & & temp_data=temp_data%100;& &&&//取余运算
& & & & *++s =temp_data/10+0x30;
& & & & temp_data=temp_data%10;& && &//取余运算
& & & & *++s =temp_data+0x30; & & & &
//****************************************
void&&SeriPushSend(uchar send_data)
& & SBUF=send_&&
& & & & while(!TI);TI=0;& & & && &
//****************************************
//****************************************
void delay(unsigned int k)& & & &
{& & & & & & & & & & & & & & & & & & & & & & & &
& & & & unsigned int i,j;& & & & & & & & & & & & & & & &
& & & & for(i=0;i&k;i++)
& & & & {& & & & & & & & & & & &
& & & & & & & & for(j=0;j&121;j++);
& & & & }& & & & & & & & & & & & & & & & & & & & & & & &
//**************************************
//延时5微秒(STC90C52RC@12M)
//不同的工作环境,需要调整此函数
//当改用1T的MCU时,请调整此延时函数
//**************************************
void Delay5us()
& & & & _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起始信号
//**************************************
void I2C_Start()
& & SDA = 1;& && && && && && &&&//拉高数据线
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SDA = 0;& && && && && && &&&//产生下降沿
& & Delay5us();& && && && && &&&//延时
& & SCL = 0;& && && && && && &&&//拉低时钟线
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
& & SDA = 0;& && && && && && &&&//拉低数据线
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SDA = 1;& && && && && && &&&//产生上升沿
& & Delay5us();& && && && && &&&//延时
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(bit ack)
& & SDA =& && && && && && &//写应答信号
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SCL = 0;& && && && && && &&&//拉低时钟线
& & Delay5us();& && && && && &&&//延时
//**************************************
//I2C接收应答信号
//**************************************
bit I2C_RecvACK()
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & CY = SDA;& && && && && && & //读应答信号
& & SCL = 0;& && && && && && &&&//拉低时钟线
& & Delay5us();& && && && && &&&//延时
& & return CY;
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
& & for (i=0; i&8; i++)& && && &//8位计数器
& && &&&dat &&= 1;& && && && &&&//移出数据的最高位
& && &&&SDA = CY;& && && && && &//送数据口
& && &&&SCL = 1;& && && && && & //拉高时钟线
& && &&&Delay5us();& && && && & //延时
& && &&&SCL = 0;& && && && && & //拉低时钟线
& && &&&Delay5us();& && && && & //延时
& & I2C_RecvACK();
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
& & uchar dat = 0;
& & SDA = 1;& && && && && && &&&//使能内部上拉,准备读取数据,
& & for (i=0; i&8; i++)& && && &//8位计数器
& && &&&dat &&= 1;
& && &&&SCL = 1;& && && && && & //拉高时钟线
& && &&&Delay5us();& && && && & //延时
& && &&&dat |= SDA;& && && && & //读数据& && && && && &
& && &&&SCL = 0;& && && && && & //拉低时钟线
& && &&&Delay5us();& && && && & //延时
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
& & I2C_Start();& && && && && && &//起始信号
& & I2C_SendByte(SlaveAddress);& &//发送设备地址+写信号
& & I2C_SendByte(REG_Address);& & //内部寄存器地址,
& & I2C_SendByte(REG_data);& && & //内部寄存器数据,
& & I2C_Stop();& && && && && && & //发送停止信号
//**************************************
//从I2C设备读取一个字节数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
& & & & uchar REG_
& & & & 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();& && && && && && &&&//停止信号
& & & & return REG_
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
& & & & 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);
//**************************************
//合成数据
//**************************************
int GetData(uchar REG_Address)
& & & & uchar H,L;
& & & & H=Single_ReadI2C(REG_Address);
& & & & L=Single_ReadI2C(REG_Address+1);
& & & & return (H&&8)+L;& &//合成数据
//**************************************
//在1602上显示10位数据
//**************************************
void Display10BitData(int value,uchar x,uchar y)
& & & & lcd_printf(dis, value);& & & & & & & & & & & & //转换数据显示
& & & & for(i=0;i&6;i++)
& && &&&SeriPushSend(dis[i]);
//**************************************
//显示温度
//**************************************
//void display_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);& &&&//启始列,行,显示数组,显示位数
void init_uart()
& & & & TMOD=0x21;& & & & & & & & & & & & & & & &
& & & & TH1=0& & & & & & & & & & & & & & & &
& & & & TL1=0& & & & & & & &
& & & & & & & &
& & & & SCON=0x50;
& & & & PS=1;& && &//串口中断设为高优先级别
& & & & TR0=1;& & & && & //启动定时器& & & & & & & & & & & &
& & & & TR1=1;
& & & & ET0=1;& &&&//打开定时器0中断& & & & & & & & & & & &
& & & & ES=1;& & & &
& & & & EA=1;
//*********************************************************
//*********************************************************
void main()
& & & & delay(500);& & & & & & & & //上电延时& & & & & & & &
& & & & init_uart();
& & & & 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轴角速度
& & & & & & & & SeriPushSend(0x0d);
& && &&&SeriPushSend(0x0a);//换行,回车
& & & & & & & & delay(100);
本帖最后由 voidgod 于
23:39 编辑
已经解决了,很撞墙的一个狗血问题。搞了半天是排针和芯片的连接不是很好,压紧一点就好了。还以为芯片是坏的。网上买的芯片因为模块和排针是分开的,用的时候要自己插上,所以才出现这种问题。老是怀疑软件有问题,瞎倒腾了两个晚上,硬件这东西真是折磨人。
大神能帮忙详细说下过程么?包括管脚的接法等等,弄了两天了。。真不知道怎么弄,接到的数据全是1.。。。。。。该怎么办啊。。我扣扣,在这回复也行,最后能详细说说,帮帮忙,谢谢啦
6050的数据可以用这个一个串口数据显示软件来显示,安装协议发送,角速度,加速度和角度就能够显示了,测试方便。
专业销售MPU6050/MPU6050C/MPU3050/MPU3050C,香港现货,价格优势,电话:6陈小姐
{嗯,永恒 发表于
大神能帮忙详细说下过程么?包括管脚的接法等等,弄了两天了。。真不知道怎么弄,接到的数据全是1.。。。。 ...
有串口输出的6050模块,还带角度解算输出的:/item.htm?spm=a230r.1.14.29.aLzK5F&id=
可不可以用6050测量出一个角度来,求代码,在线等
好的& &学习l !!!!!!
大神!!!为啥这个程序利用串口显示的时候是乱码呢。。求指导
问个问题,mpu传感器的休眠状态就是只把PWR_MGMT_1的sleep位置1就行了吗?
Powered byok6410接mpu6050读不出数据,求指导
[问题点数:100分,结帖人jkdantin]
ok6410接mpu6050读不出数据,求指导
[问题点数:100分,结帖人jkdantin]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。查看: 7592|回复: 6
利用51单片机测试读取MPU6050问题
刚接触MPU6050,在用51单片机测试读取MPU6050时,串口输出的数据是这样的,请问是什么问题啊,在这儿纠结一天了,愿得以明灯
(187.99 KB, 下载次数: 44)
22:45 上传
把程序帖上来看看吧
赤色强袭 发表于
把程序帖上来看看吧
你好,我用的程序是这个
赤色强袭 发表于
把程序帖上来看看吧
你好,我用的程序是这个,买模块送的,看了看没发现哪儿有问题
#include &REG51.H&& & & &
#include &math.h&& & //Keil library&&
#include &stdio.h&& &//Keil library& & & &
#include &INTRINS.H&
typedef unsigned char&&
typedef unsigned int& &
//****************************************
// 定义51单片机端口
//****************************************
sbit& & SCL=P1^5;& & & & & & & & & & & & //IIC时钟引脚定义
sbit& & SDA=P1^4;& & & & & & & & & & & & //IIC数据引脚定义
//****************************************
// 定义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为读取
//**************************************************************************************************
//定义类型及变量
//**************************************************************************************************
uchar dis[6];& & & & & & & & & & & & & & & & & & & & //显示数字(-511至512)的字符数组
int& & & & dis_& & & & & & & & & & & & & & & & & & & & //变量
//**************************************************************************************************
//函数声明
//**************************************************************************************************
void&&Delay5us();
void&&delay(unsigned int k);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时& & & & & & & & & & & & & & & & & & & & & & & &
void&&lcd_printf(uchar *s,int temp_data);
//********************************MPU6050操作函数***************************************************
void&&InitMPU6050();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //初始化MPU6050
void&&I2C_Start();& & & & & & & & & & & && && && && && && && && && && && && & //I2C开始信号
void&&I2C_Stop();
void&&I2C_SendACK(bit ack);
bit& &I2C_RecvACK();
void&&I2C_SendByte(uchar dat);
uchar I2C_RecvByte();
void&&I2C_ReadPage();
void&&I2C_WritePage();
void&&display_ACCEL_x();
void&&display_ACCEL_y();
void&&display_ACCEL_z();
uchar Single_ReadI2C(uchar REG_Address);& & & & & & & & & & & & & & & & & & & & & & & & //读取I2C数据
void&&Single_WriteI2C(uchar REG_Address,uchar REG_data);& & & && &&&//向I2C写入数据
//********************************************************************************
//整数转字符串
//********************************************************************************
void lcd_printf(uchar *s,int temp_data)
& & & & if(temp_data&0)
& & & & & & & & temp_data=-temp_
& & & & & & & & *s='-';
& & & & else *s=' ';
& & & & *++s =temp_data/;
& & & & temp_data=temp_data%10000;& &&&//取余运算
& & & & *++s =temp_data/;
& & & & temp_data=temp_data%1000;& &&&//取余运算
& & & & *++s =temp_data/100+0x30;
& & & & temp_data=temp_data%100;& &&&//取余运算
& & & & *++s =temp_data/10+0x30;
& & & & temp_data=temp_data%10;& && &//取余运算
& & & & *++s =temp_data+0x30; & & & &
//******************************************************************************************************
//串口初始化
//*******************************************************************************************************
void init_uart()
& & & & TMOD=0x21;& & & & & & & & & & & & & & & &
& & & & TH1=0& & & & & & & & //实现波特率9600(系统时钟11.0592MHZ)& & & & & & & &
& & & & TL1=0& & & & & & & &
& & & & & & & &
& & & & SCON=0x50;
& & & & PS=1;& && &//串口中断设为高优先级别
& & & & TR0=1;& & & && & //启动定时器& & & & & & & & & & & &
& & & & TR1=1;
& & & & ET0=1;& &&&//打开定时器0中断& & & & & & & & & & & &
& & & & ES=1;& & & &
& & & & EA=1;
//*************************************************************************************************
//串口发送函数
//*************************************************************************************************
void&&SeriPushSend(uchar send_data)
& & SBUF=send_&&
& & & & while(!TI);TI=0;& & & && &
//*************************************************************************************************
//************************************延时*********************************************************
//*************************************************************************************************
void delay(unsigned int k)& & & &
{& & & & & & & & & & & & & & & & & & & & & & & &
& & & & unsigned int i,j;& & & & & & & & & & & & & & & &
& & & & for(i=0;i&k;i++)
& & & & {& & & & & & & & & & & &
& & & & & & & & for(j=0;j&121;j++);
& & & & }& & & & & & & & & & & & & & & & & & & & & & & &
//************************************************************************************************
//延时5微秒(STC90C52RC@12M)
//不同的工作环境,需要调整此函数
//注意当改用1T的MCU时,请调整此延时函数
//************************************************************************************************
void Delay5us()
& & & & _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起始信号
//*************************************************************************************************
void I2C_Start()
& & SDA = 1;& && && && && && &&&//拉高数据线
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SDA = 0;& && && && && && &&&//产生下降沿
& & Delay5us();& && && && && &&&//延时
& & SCL = 0;& && && && && && &&&//拉低时钟线
//*************************************************************************************************
//I2C停止信号
//*************************************************************************************************
void I2C_Stop()
& & SDA = 0;& && && && && && &&&//拉低数据线
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SDA = 1;& && && && && && &&&//产生上升沿
& & Delay5us();& && && && && &&&//延时
//**************************************************************************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************************************************************************
void I2C_SendACK(bit ack)
& & SDA =& && && && && && &//写应答信号
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SCL = 0;& && && && && && &&&//拉低时钟线
& & Delay5us();& && && && && &&&//延时
//****************************************************************************************************
//I2C接收应答信号
//****************************************************************************************************
bit I2C_RecvACK()
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & CY = SDA;& && && && && && & //读应答信号
& & SCL = 0;& && && && && && &&&//拉低时钟线
& & Delay5us();& && && && && &&&//延时
& & return CY;
//*****************************************************************************************************
//向I2C总线发送一个字节数据
//*****************************************************************************************************
void I2C_SendByte(uchar dat)
& & for (i=0; i&8; i++)& && && &//8位计数器
& && &&&dat &&= 1;& && && && &&&//移出数据的最高位
& && &&&SDA = CY;& && && && && &//送数据口
& && &&&SCL = 1;& && && && && & //拉高时钟线
& && &&&Delay5us();& && && && & //延时
& && &&&SCL = 0;& && && && && & //拉低时钟线
& && &&&Delay5us();& && && && & //延时
& & I2C_RecvACK();
//*****************************************************************************************************
//从I2C总线接收一个字节数据
//******************************************************************************************************
uchar I2C_RecvByte()
& & uchar dat = 0;
& & SDA = 1;& && && && && && &&&//使能内部上拉,准备读取数据,
& & for (i=0; i&8; i++)& && && &//8位计数器
& && &&&dat &&= 1;
& && &&&SCL = 1;& && && && && & //拉高时钟线
& && &&&Delay5us();& && && && & //延时
& && &&&dat |= SDA;& && && && & //读数据& && && && && &
& && &&&SCL = 0;& && && && && & //拉低时钟线
& && &&&Delay5us();& && && && & //延时
//*****************************************************************************************************
//向I2C设备写入一个字节数据
//*****************************************************************************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
& & I2C_Start();& && && && && && &//起始信号
& & I2C_SendByte(SlaveAddress);& &//发送设备地址+写信号
& & I2C_SendByte(REG_Address);& & //内部寄存器地址,
& & I2C_SendByte(REG_data);& && & //内部寄存器数据,
& & I2C_Stop();& && && && && && & //发送停止信号
//*******************************************************************************************************
//从I2C设备读取一个字节数据
//*******************************************************************************************************
uchar Single_ReadI2C(uchar REG_Address)
& & & & uchar REG_
& & & & 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();& && && && && && &&&//停止信号
& & & & return REG_
//******************************************************************************************************
//初始化MPU6050
//******************************************************************************************************
void InitMPU6050()
& & & & 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);
//******************************************************************************************************
//合成数据
//******************************************************************************************************
int GetData(uchar REG_Address)
& & & & uchar H,L;
& & & & H=Single_ReadI2C(REG_Address);
& & & & L=Single_ReadI2C(REG_Address+1);
& & & & return ((H&&8)+L);& &//合成数据
//******************************************************************************************************
//超级终端(串口调试助手)上显示10位数据
//******************************************************************************************************
void Display10BitData(int value)
& & & & value/=64;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //转换为10位数据
& & & & lcd_printf(dis, value);& & & & & & & & & & & & //转换数据显示
& & & & for(i=0;i&6;i++)
& & SeriPushSend(dis);
& && & & & //DisplayListChar(x,y,dis,4);& & & & //启始列,行,显示数组,显示长度
//*******************************************************************************************************
//*******************************************************************************************************
void main()
& & & & delay(500);& & & & & & & & //上电延时& & & & & & & &
& & & & init_uart();
& & & & InitMPU6050();& & & & //初始化MPU6050
& & & & delay(150);
& & & & while(1)
& & & & & & & & Display10BitData(GetData(ACCEL_XOUT_H));& & & & //显示X轴加速度
& & & & & & & & Display10BitData(GetData(ACCEL_YOUT_H));& & & & //显示Y轴加速度
& & & & & & & & Display10BitData(GetData(ACCEL_ZOUT_H));& & & & //显示Z轴加速度
& & & & & & & & Display10BitData(GetData(GYRO_XOUT_H));& & & & & & & & //显示X轴角速度
& & & & & & & & Display10BitData(GetData(GYRO_YOUT_H));& & & & & & & & //显示Y轴角速度
& & & & & & & & Display10BitData(GetData(GYRO_ZOUT_H));& & & & & & & & //显示Z轴角速度
& & & & & & & & SeriPushSend(0x0d);
& && &&&SeriPushSend(0x0a);//换行,回车
& & & & & & & & delay(2000);
馨海林旋律 发表于
你好,我用的程序是这个,买模块送的,看了看没发现哪儿有问题
#include & & & &
#include& &&&//Keil librar ...
这程序不就是买模块时送的吗?
另外你主函数里只有SeriPushSend(0x0d);SeriPushSend(0x0a);这两句。没有涉及到输出传感器数据的语句,数据跟定不会变。
我想问一下&&是不是读取mpu6050内容考串口只能模拟IIC输出吗?
看到的有点晚,,不过可以尝试着把HEX显示的那个钩去掉
Powered by}

我要回帖

更多关于 mpu6050读取数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信