问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求51程序,用IIC把MPU6050的原始数据读出来晶振11.0295,单片机型号STC98C52

发布网友 发布时间:2022-04-23 13:33

我来回答

3个回答

热心网友 时间:2023-10-15 21:44

用串口显示的
#include <REG52.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
//****************************************
// 定义51单片机端口
//****************************************
#define DataPort P0//LCD1602数据端口
sbit SCL=P1^0;//IIC时钟引脚定义
sbit SDA=P1^1;//IIC数据引脚定义
sbit LCM_RS=P2^0;//LCD1602命令端口
sbit LCM_RW=P2^1;//LCD1602命令端口
sbit LCM_EN=P2^2;//LCD1602命令端口
//****************************************
// 定义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为读取
//****************************************
//定义类型及变量
//****************************************
uchar dis[6];//显示数字(-511至512)的字符数组
intdis_data;//变量
//intTemperature,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_data;
*s='-';
}
else *s=' ';

*++s =temp_data/10000+0x30;
temp_data=temp_data%10000; //取余运算

*++s =temp_data/1000+0x30;
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_data;
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 = ack; //写应答信号
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)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//**************************************
//向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_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(); //停止信号
return REG_data;
}
//**************************************
//初始化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)
{ uchar i;
//value/=64;//转换为10位数据
lcd_printf(dis, value);//转换数据显示
for(i=0;i<6;i++)
{
SeriPushSend(dis[i]);
}

// DisplayListChar(x,y,dis,4);//启始列,行,显示数组,显示长度
}
//**************************************
//显示温度
//**************************************
//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=0xfd;
TL1=0xfd;

SCON=0x50;
PS=1; //串口中断设为高优先级别
TR0=1; //启动定时器
TR1=1;
ET0=1; //打开定时器0中断
ES=1;
EA=1;
}

//*********************************************************
//主程序
//*********************************************************
void main()
{
delay(500);//上电延时
//InitLcd();//液晶初始化
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);
}
}

热心网友 时间:2023-10-15 21:44

用串口显示的
#include <REG52.H>
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
//****************************************
// 定义51单片机端口
//****************************************
#define DataPort P0//LCD1602数据端口
sbit SCL=P1^0;//IIC时钟引脚定义
sbit SDA=P1^1;//IIC数据引脚定义
sbit LCM_RS=P2^0;//LCD1602命令端口
sbit LCM_RW=P2^1;//LCD1602命令端口
sbit LCM_EN=P2^2;//LCD1602命令端口
//****************************************
// 定义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为读取
//****************************************
//定义类型及变量
//****************************************
uchar dis[6];//显示数字(-511至512)的字符数组
intdis_data;//变量
//intTemperature,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_data;
*s='-';
}
else *s=' ';

*++s =temp_data/10000+0x30;
temp_data=temp_data%10000; //取余运算

*++s =temp_data/1000+0x30;
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_data;
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 = ack; //写应答信号
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)
{
uchar i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
//**************************************
//向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_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(); //停止信号
return REG_data;
}
//**************************************
//初始化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)
{ uchar i;
//value/=64;//转换为10位数据
lcd_printf(dis, value);//转换数据显示
for(i=0;i<6;i++)
{
SeriPushSend(dis[i]);
}

// DisplayListChar(x,y,dis,4);//启始列,行,显示数组,显示长度
}
//**************************************
//显示温度
//**************************************
//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=0xfd;
TL1=0xfd;

SCON=0x50;
PS=1; //串口中断设为高优先级别
TR0=1; //启动定时器
TR1=1;
ET0=1; //打开定时器0中断
ES=1;
EA=1;
}

//*********************************************************
//主程序
//*********************************************************
void main()
{
delay(500);//上电延时
//InitLcd();//液晶初始化
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);
}
}

热心网友 时间:2023-10-15 21:45

你好!
这个要看到程序才能帮你解决问题,私,信,发,一下程序

热心网友 时间:2023-10-15 21:45

我也遇到同样的问题,串口一直显示同样的数据,你的问题现在解决了吗?如果解决了麻烦告诉我一下解决方法

热心网友 时间:2023-10-15 21:45

你好!
这个要看到程序才能帮你解决问题,私,信,发,一下程序

热心网友 时间:2023-10-15 21:45

我也遇到同样的问题,串口一直显示同样的数据,你的问题现在解决了吗?如果解决了麻烦告诉我一下解决方法
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
流量保险是什么 会计的基本常识是什么 我奶奶这几天总是拉肚子,而且只能躺着一站起来眼睛就发黑,医生说她贫血... win7c盘里找不到users,用户里也没有c:usersadministrator... C盘里没有users文件夹 pvc天然气管能用多久 PVC天然气管的寿命是多久?  请教大神这怎么搞?天然气排烟管怎么弄? ...时不用在手机确认电脑登陆微信如何不用手机确认 急性胰腺炎护理 急性胰腺炎非手术治疗的护理措施 PIC18对MPU6050读取数据问题 我用51单片机驱动mpu6050,不知程序为何无法正常运行,望大神解答!!! 四轴飞行器程序中这几个宏定义是啥意思,怎么算出来的,有啥用 mpu6050 断电后重新上电 yaw值清零了 stm32中液晶屏9320和mpu6050初始化有冲突 怎么办 在看四轴飞行器的东西,看到了几个宏定义 mpu6050 初始化时必须水平放置吗 为什么mpu6050读出来全是0xff 如何声明stc15上的mpu6050 有关MPU6050为什么每次初始化后初始值跳变的很大 三轴陀螺仪MPU6050模块怎么初始化不成功 土豆绿了,还能吃吗? 家里的土豆放一段时间后会发绿,这是为什么? 土豆为什么发绿? 红皮土豆里面是绿色可以吃吗 土豆放一段时间后会发绿,这是什么原因导致的? 免费企业云盘较好的有哪些? 什么是企业云盘,一般有哪些功能? 什么是企业云盘? 企业云盘和个人云盘有什么区别? MPU6050应用问题!用PIC18来读取。 求基于pic16f877a的陀螺仪mpu6050测试, mpu6050 fifo应该在什么时候开启 诊所租赁合同签订注意哪些问题呢 mpu6050寄存器配置没效果 个人和医院合作协议合同 gy521 mpu6050读取数据波动大 使用MPU6050的DMP测姿态角,当MPU6050旋转一定角度后,怎样设置能使MPU6050旋转后的角度变成0度 MPU6050与C8051怎么连接 你好!我们乡镇医院盖了门市楼,说是对外租赁50年,40万租金一次付清!合同应该怎么签 STM32和mpu6050怎么传输 数据是xzy一起送还是一个一个送 向医院投放(或融资租赁)大型医疗设备(MRl、DR、CT……)的政策、规定... 盈利性医院出租科室的合同是合法的吗 我出租房屋给别人办医院怎么写协议,我想在合同里提出如出现医疗事故,乙方要给予一定的补偿,怎么写好。 医院房屋租赁合同样版 房屋租赁给私人医院的问题 民办非盈利性医院租赁合同无效投入的设备怎么办? 由于单位易主,我所在的医院实行租赁经营,我们副院长承担连带担保责任,我已调离该医院,还承担责任吗? 佳能g2000打印机如何打印2寸照片教程 公立医院场地是否能租赁