6590|4

28

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

MPU6050温度值的读取与转换及串口通信,请指导 [复制链接]

想读取6050的温度,并在上位机PC上的串口助手显示,可是串口上显示的全是乱码方块,代码如下:
#include
#include


typedef unsigned char u8;
typedef unsigned int  u16;


//****************************************
// 定义MPU6050内部地址
//****************************************
#define SMERT_DIV    0x19   //25.采样频率分频器.采样频率=陀螺仪输出频率(DLPF_CFG)/( 1+SMPLRT_DIV )
#define CONFIG       0X1A   //26.配置
#define GYRO_CONFIG  0x1b   //27.陀螺仪配置
#define ACCEL_CONFIG 0x1c   //28.加速计配置
#define ACCEL_XOUT_H 0x3b   //59.加速度计测量值X轴的高8位
#define ACCEL_XOUT_L 0x3C   //60.加速度计测量值X轴的低8位
#define ACCEL_YOUT_H 0x3D   //61.加速度计测量值Y轴的高8位
#define ACCEL_YOUT_L 0x3E   //62.加速度计测量值Y轴的低8位
#define ACCEL_ZOUT_H 0x3F   //63.加速度计测量值Z轴的高8位
#define ACCEL_ZOUT_L 0x40   //64.加速度计测量值Z轴的低8位
#define TEMP_OUT_H   0x41   //65.温度测量值的高8位
#define TEMP_OUT_L   0x42   //66.温度测量值的低8位
#define GYRO_XOUT_H  0x43   //67.陀螺仪测量值X轴的高8位
#define GYRO_XOUT_L  0x44   //68.陀螺仪测量值X轴的低8位
#define GYRO_YOUT_H  0x45   //69.陀螺仪测量值Y轴的高8位
#define GYRO_YOUT_L  0x46   //70.陀螺仪测量值Y轴的低8位
#define GYRO_ZOUT_H  0x47   //71.陀螺仪测量值Z轴的高8位
#define GYRO_ZOUT_L  0x48   //72.陀螺仪测量值Z轴的低8位
#define PWR_MGMT_1   0x6b   //107.电源控制1
#define WHU_AM_I     0x75   //117.MPU-60X0的6位I2C地址寄存器
#define SlaveAddress 0xd0   //IIC写入时的地址字节数据,+1为读取


//*************************************************************************************************
//************************************延时*********************************************************
//*************************************************************************************************
void delay(u16 k)       
{                                               
        unsigned int i,j;                               
        for(i=0;i
        {                       
                for(j=0;j<121;j++);
        }                                               
}


//初始化MPU6050
void initmpu6050()
{
        I2C_mpu6050Write(PWR_MGMT_1,0x00);  //电源管理,典型值:0x00(正常启用)
        I2C_mpu6050Write(SMERT_DIV,0x07);   //陀螺仪采样率,典型值:0x07(125Hz)
        I2C_mpu6050Write(CONFIG,0x06);      //低通滤波频率,典型值:0x06(5Hz)
        I2C_mpu6050Write(GYRO_CONFIG,0x18); //设置陀螺仪的满量程范围为:±2000°/s
        I2C_mpu6050Write(ACCEL_CONFIG,0x00);//设置加速度计的满量程范围为:±2g
}


//******************************************************************************************************
//串口初始化
//*******************************************************************************************************
void init_uart()
{
        TMOD=0x20;                               
        TH1=0xf3;                //实现波特率4800(系统时钟12MHZ)               
        TL1=0xf3;               
        PCON=0x80;       
        SCON=0x50;
        PS=1;      //串口中断设为高优先级别
        TR0=1;           //启动定时器                       
        TR1=1;
        ET0=1;     //打开定时器0中断                       
        ES=1;       
        EA=1;
}


//数据融合及运算
float ronghe(u8 addr)
{
        u8 H,L;
        short tem;
        H=I2C_mpu6050Read(addr);
  L=I2C_mpu6050Read(addr+1);
        tem=(short) ((H<<8)|L);
  return (36.53+(tem/340));
}


//*************************************************************************************************
//串口发送函数
//*************************************************************************************************
void  SeriPushSend(u8 send_data)
{
        u8 det,det1,det2;
        det=ronghe(send_data);
        det1=det/10;
    SBUF=det1;  
        while(!TI);TI=0;       
        det2=det%10;
        SBUF=det2;  
        while(!TI);TI=0;
}


//主程序
void main()
{
        delay(500);
        init_uart();
  initmpu6050();
        delay(150);
        while(1)
        {
                SeriPushSend(TEMP_OUT_H);
                delay(200);
        }
}

理想的结果是,得到的结果为,有符号型的浮点数.例:-32.13度.
程序到<数据融合及运算>段,应该都是没问题的,我觉得就是转换这里的问题(看了很多资料,也没想明白,怎么转换),请师傅们指导...

推荐些资料也好,谢谢
此帖出自51单片机论坛

最新回复

你用IIC去读取数据,首先你应该找到这个设备的地址吧?只有找到了这个设备,你才能对这个设备进行操作,都没有找到这个设备,你对谁的寄存器进行操作?  详情 回复 发表于 2018-7-6 09:08
点赞 关注
 

回复
举报

424

帖子

6

TA的资源

一粒金砂(高级)

沙发
 
这个大概率是你iic程序出问题了。给你个mpu6250读取的程序你自己对照下

MPUxxxx测试过.rar

70.21 KB, 下载次数: 43

此帖出自51单片机论坛
 
 
 

回复

875

帖子

1

TA的资源

纯净的硅(高级)

板凳
 
你用IIC去读取数据,首先你应该找到这个设备的地址吧?只有找到了这个设备,你才能对这个设备进行操作,都没有找到这个设备,你对谁的寄存器进行操作?
此帖出自51单片机论坛

点评

师傅,读写的MPU地址都写在IIC里了,你帮忙看下有没有问题.辛苦你了 /******************************************************************************* * 函数名 : I2C_mpu6050Write(unsigned char addr,  详情 回复 发表于 2018-7-7 19:57
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

4
 
曹伟1993 发表于 2018-7-6 09:08
你用IIC去读取数据,首先你应该找到这个设备的地址吧?只有找到了这个设备,你才能对这个设备进行操作,都 ...

师傅,读写的MPU地址都写在IIC里了,你帮忙看下有没有问题.辛苦你了
/*******************************************************************************
* 函数名         : I2C_mpu6050Write(unsigned char addr,unsigned char dat)
* 函数功能                   : 往mpu6050的一个地址写入一个数据
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void I2C_mpu6050Write(u8 addr,u8 dat)
{
        I2C_start();
        I2C_sendbyte(0xd0);
        I2C_sendbyte(addr);
        I2C_sendbyte(dat);
        I2C_stop();
}

/*******************************************************************************
* 函数名         : I2C_mpu6050Read(unsigned char addr)
* 函数功能                   : 读取mpu6050的一个地址的一个数据
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
u8 I2C_mpu6050Read(u8 addr)
{
        u8 num;
        I2C_start();
        I2C_sendbyte(0xd0);
        I2C_sendbyte(addr);
        I2C_start();
        I2C_sendbyte(0xd1);
        num=I2C_readbyat();
        I2C_stop();
        return num;
}


此帖出自51单片机论坛
 
 
 

回复

28

帖子

1

TA的资源

一粒金砂(中级)

5
 
看了看商家提供的程序.
基本上都看的明白,就是整数转字符串这里.

//****************************************
//整数转字符串
//****************************************
void lcd_printf(uchar *s,int temp_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;        
}
在后面都加个0x30是什么意思,想不明白了???

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表