-
//includes.h
#include
#include
#include
//main.c
#include
void
main()
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 &=~XT2OFF;
do
{
IFG1
&=~OFIFG;
for(uint
i=0xff;i>0;i
--
);
}while((IFG1&OFIFG));
//
等待时钟稳定
BCSCTL2 |=SELM_2+SELS;
//
主、从系统时钟均为高频
DATA_DIR=0XFF;
DATA_OUT=0X00;
P6DIR=0XFF;
P6OUT=0X00;
init();
InitMPU6050();
while(1)
{
Dis
play10BitData(GetData(ACCEL_XOUT_H),2,0);
Display10BitData(GetData(ACCEL_YOUT_H),
7,0);
Display10BitDat
a(GetData(GYRO_XOUT_H),2,1);
p>
Display10BitData(GetData(GYRO_YOUT_H),7,1
);
Display10BitData(GetData(GY
RO_ZOUT_H),12,1);
delayms(300);
}
}
//
以下是传感器相关文件
//mpu6050.h
#define CPU_F
((double)8000000)
#define
delayus(x)
__delay_cycles((long)(CPU_F*(double)x/1000000.0))
//
宏定义延时函数
#define delayms(x) __delay_cycles((long
)(CPU_F*(double)x/1000.0))
//
显示
X
轴
加速度
//
显示
Y
轴加速度
//<
/p>
显示
X
轴角速度
p>
//
显示
Y
轴角速
度
Display10BitData(GetData(AC
CEL_ZOUT_H),12,0);
//
显示
Z
轴加速度
#define SCL1 P5OUT
|=BIT0
#define
SCL0 P5OUT &=~BIT0
#define
SCLOUT P5DIR |= BIT0;
#define SDA1 P5OUT |=BIT1
#define SDA0 P5OUT &=~BIT1
#define SDAIN P5DIR &=~BIT1
#define SDAOUT P5DIR |=BIT1
#define SDADATA (P5IN &
BIT1)
//********
********************************
//
定义
MPU6050
内部地址
//***************
*************************
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
void
I2C_Start();
void
I2C_Stop();
void
I2C_SendACK(uchar ack);
uchar I2C_RecvACK();
void I2C_SendByte(uchar
dat);
uchar
I2C_RecvByte();
SMPLRT_DIV
CONFIG
0x19
//
陀螺仪采样率,典型值:
0x07
(125Hz)
0x1A
//
低通滤波频率,典型值:
0x06(5Hz
)
0x1B
//
陀螺仪自检及测量范围,典型值:
0x18(
不自检,
2000deg/s)
//IIC
数据引脚
GYRO_CONFIG
ACCEL_XOUT_H
0x3B
ACCEL_XOUT_L
0x3C
ACCEL_YOUT_H
0x3D
ACCEL_YOUT_L
0x3E
ACCEL_ZOUT_H
0x3F
ACCEL_ZOUT_L
0x40
TEMP_OUT_H
TEMP_OUT_L
ACCEL_CONFIG
0x1C
//
加速计自检、
测量范围及高通滤波频率,
典型值:
0x01(
不自检,
2G
,
5Hz)
0x41
0x42
0x43
0x44
0x45
0x46
0x47
0x48
0x6B
//
电源管理,典型值:
0x00(
正常启用
)
0x75
//IIC
地址寄存器
(
默认数值
0x6
8
,只读
)
GYRO_XOUT_H
GYRO_XOUT_L
GYRO_YOUT_H
GYRO_YOUT_L
GYRO_ZOUT_H
GYRO_ZOUT_L
PWR_MGMT_1
WHO_AM_I
SlaveAddress
0xD0
//IIC
写入时的地址字节数据,
+1
为读取
< br>
//
显示数字
(
-
511
至
512)
的字符数组
void
Single_WriteI2C(uchar REG_Address,uchar
REG_data);
uchar
Single_ReadI2C(uchar REG_Address);
void InitMPU6050();
void lcd_printf(uchar *s,int
temp_data);
void
DisplayListChar(uchar X,uchar Y,uchar *DData,uchar
L);
int GetData(uchar
REG_Address);
void
Display10BitData(int value,uchar x,uchar
y);
//mpu6050.c
#include
uchar
dis[4];
int
dis_data;
//****************
**********************
//I2C
起始信号
//**************************************
void I2C_Start()
{
SDAOUT;
SDA1;
//
拉高数据线
SCLOUT;
SCL1;
//
拉高时钟线
delayus(5);
//
延时
SDA0;
//
产生下降沿
delayus(5);
//
延时
SCL0;
//
拉低时钟线
}
//*************
*************************
//I2C
停止信号
//**************************************
void I2C_Stop()
{
SDAOUT;
SDA0;
//
拉低数据线
SCLOUT;
SCL1;
//
拉高时钟线
delayus(5);
//
延时
SDA1;
//
产生上升沿
delayus(5);
//
延时
}
//*************
*************************
//I2C
发送应答信号
//
入口参数
:ack (0:ACK
1:NAK)
//*******************
*******************
void
I2C_SendACK(uchar ack)
{
SDAOUT;
SCLOUT;
if(ack) SDA1;
else
SDA0;
//
SDA = ack;
//
写应答信号
SCL1;
//
拉高时钟线
delayus(5);
//
延时
SCL0;
//
拉低时钟线
delayus(5);
//
延时
}
//*************
*************************
//I2C
接收应答信号
//**************************************
uchar I2C_RecvACK()
{
uchar
cy;
SCLOUT;
SCL1;
//
拉高时钟线
SDAIN;
delayus(5);
//
延时
if(SDADATA)
{
cy=1;
}
else
{
cy=0;
}
//
cy = SDA;
//
读应答信号
SCL0;
//
拉低时钟线
delayus(5);
//
延时
SDAOUT;
return cy;
}
//*************
*************************
//
向
I2C
总线发送一个字节数据
//****************************
**********
void
I2C_SendByte(uchar dat)
{
uchar
i;
SDAOUT;
for (i=0; i<8; i++)
//8
位计数器
{
if((dat<
{
SDA1;
}
else
{
SDA0;
}
// SDA = cy;
//
送数据口
SCLOUT;
SCL1;
//
拉高时钟线
delayus(5);
//
延时
SCL0;
//
拉低时钟线
delayus(5);
//
延时
}
I2C_RecvACK();
}
//*************
*************************
//
从
I2C
总线接收一个字节数据
//****************************
**********
uchar
I2C_RecvByte()
{
uchar i;
uchar dat = 0,cy;
SDAOUT;
SCLOUT;
SDA1;
//
使能内部上拉
< br>,
准备读取数据
,
SDAIN;
for
(i=0; i<8; i++)
//8
位计数器
{
dat <<=
1;
SCL1;
//
拉高时钟线
delayus(5);
//
延时
if(SDADATA)
{
cy=1;
}
else
{
cy=0;
}
dat |= cy;
//
读数据