MPU6050温度值的读取与转换及串口通信,请指导

2019-03-24 16:59发布

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


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<k;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度.
程序到<数据融合及运算>段,应该都是没问题的,我觉得就是转换这里的问题(看了很多资料,也没想明白,怎么转换),请师傅们指导...

推荐些资料也好,谢谢
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
lehuijie
1楼-- · 2019-03-24 23:40
这个大概率是你iic程序出问题了。给你个mpu6250读取的程序你自己对照下
曹伟1993
2楼-- · 2019-03-25 00:37
 精彩回答 2  元偷偷看……
v115488
3楼-- · 2019-03-25 02:47
曹伟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;
}


v115488
4楼-- · 2019-03-25 03:06
看了看商家提供的程序.
基本上都看的明白,就是整数转字符串这里.

//****************************************
//整数转字符串
//****************************************
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是什么意思,想不明白了???

一周热门 更多>