想读取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度.
程序到<数据融合及运算>段,应该都是没问题的,我觉得就是转换这里的问题(看了很多资料,也没想明白,怎么转换),请师傅们指导...
推荐些资料也好,谢谢
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
师傅,读写的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;
}
基本上都看的明白,就是整数转字符串这里.
//****************************************
//整数转字符串
//****************************************
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是什么意思,想不明白了???
一周热门 更多>