C52单片机的应用(连接、编程、测试)

C52单片机的应用(连接、编程、测试),第1张

一、连接单片机板

MPU6050 电路图,参看:MPU6050开发 -- 初识

从电路图上看了引出四根线:电源、GND、SCL、SDA. 连接单片机板。

单片机部分电路图:

 

STC89C52 没有集成 I2C 控制器,只能通过软件模拟方法实现 I2C 功能,因此,普通I/O口都可以实现,不需要固定。你可以任意使用 STC89C52 单片机两个引脚,作为数据和时钟,然后自己编写模块 I2C 代码。

那么我们就定义51单片机端口:
//****************************************
sbit    SCL=P1^5;//IIC时钟引脚定义
sbit    SDA=P1^4;//IIC数据引脚定义

//****************************************

二、测试程序

 

//****************************************

// Update to MPU6050 by shinetop

// MCU: STC89C52

// 2012.3.1

// 功能: 显示加速度计和陀螺仪的10位原始数据

//****************************************

// 使用单片机STC89C52

// 晶振:11.0592M

// 显示:串口

// 编译环境 Keil uVision2

//****************************************

#include

#include    //Keil library  

#include   //Keil library

#include

typedef unsigned char  uchar;

typedef unsigned short ushort;

typedef unsigned int   uint;

//****************************************

// 定义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_data; //变量

//**************************************************************************************************

//函数声明

//**************************************************************************************************

void  Delay5us();

void  delay(unsigned int k); //延时

void  lcd_printf(uchar *s,int temp_data);

//********************************MPU6050 *** 作函数***************************************************

void  InitMPU6050(); //初始化MPU6050

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;

}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2587938.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存