|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错
2 m r6 V: U8 ]$ b1 D$ y# |/ u#include <REG52.H>- o$ E4 b/ c& H7 s0 U# v
#include <math.h> //Keil library. A4 d6 K, g) ^" @5 A2 d
#include <stdio.h> //Keil library3 g! k% |# D* ?6 s$ `* f% d
#include <INTRINS.H>
0 c! {/ Z5 H! d' ]6 s$ Q9 qtypedef unsigned char uchar;
7 J1 E K6 b, p9 Y) Htypedef unsigned short ushort;
2 ^! O' f' p% R* itypedef unsigned int uint;
u9 _5 I+ l* j) `. f, s//****************************************8 v+ E9 g% _4 ?5 q
// 定义51单片机端口% Q$ X6 O0 c" ] p6 d1 F+ C5 I
//****************************************
0 |$ h3 |4 C# C# G* |% _+ @9 w+ b#define DataPort P0 //LCD1602数据端口
4 `& a& x7 Z' K ^! Esbit SCL=P1^0; //IIC时钟引脚定义
7 n) O2 `) J( Q8 Ssbit SDA=P1^1; //IIC数据引脚定义( x& U5 ~- k" L# D0 J
sbit LCM_RS=P2^0; //LCD1602命令端口
/ K. F- l7 n2 t: `sbit LCM_RW=P2^1; //LCD1602命令端口* u' X# b& O5 L' s9 K8 s- F9 \9 `
sbit LCM_EN=P2^2; //LCD1602命令端口
# f2 ]2 v5 U8 `3 c) v//****************************************
3 |3 l/ N8 u! a% c Y// 定义MPU6050内部地址
8 j; a( _ w }' o* }6 u! H9 N//****************************************
6 A; j6 i5 H) s! u$ Y#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
$ u V! Z, r b#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
8 x- V/ W, o+ M#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s). h* G) ]: J( Q! D, v
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)' _0 Q( [& ?& X" W7 A/ h7 o
#define ACCEL_XOUT_H 0x3B+ H, t, u" R, V# v! C
#define ACCEL_XOUT_L 0x3C
4 p. x& \; k' b1 @; t6 j9 ^#define ACCEL_YOUT_H 0x3D
- O5 r" G' E' q, R/ `#define ACCEL_YOUT_L 0x3E3 N) D6 G6 C8 O: f/ y1 W P1 X
#define ACCEL_ZOUT_H 0x3F G6 q! g+ T4 h" r: S
#define ACCEL_ZOUT_L 0x402 e w* F! \2 Z
#define TEMP_OUT_H 0x41* W2 j% F7 h( h' ?; z. [" C! s! o
#define TEMP_OUT_L 0x42
# t: J" X$ J5 ]6 V5 D6 E, ]8 k6 _#define GYRO_XOUT_H 0x43
7 v1 l. [8 V. v$ W0 m9 D; p. F#define GYRO_XOUT_L 0x44
) U4 I3 M3 _# `#define GYRO_YOUT_H 0x45/ Q& u# c& {) V' R9 h# a
#define GYRO_YOUT_L 0x46
2 P3 J- h( p; Q0 d, P+ \#define GYRO_ZOUT_H 0x47
. C7 `; U2 r1 X$ k: T#define GYRO_ZOUT_L 0x48/ \2 Z, R1 ]5 q4 S; T
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
" m& T* T( L D" E/ s% n#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)
/ R/ ~" z" |$ p. _$ ?#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取% w" l* ^7 _/ B( ?% z
//****************************************7 L Y) E8 e P1 e; A
//定义类型及变量8 x# P" e3 P2 G
//****************************************4 b/ E( E( p# w4 g$ T1 x
uchar dis[4]; //显示数字(-511至512)的字符数组. ` \8 ~9 ^5 V2 q: e
int dis_data; //变量
2 `1 m/ g1 V+ d$ o7 K4 S' H//int Temperature,Temp_h,Temp_l; //温度及高低位数据% E3 }2 \9 h6 `2 W
//****************************************' w" G9 J% j+ v( M, @3 w
//函数声明
, ~# [+ L2 e0 A& v" k8 M5 M//****************************************
; w/ J, w1 F5 E( ^void delay(unsigned int k); //延时+ O# I8 p- z* y2 k- p, n
//LCD相关函数) ?8 b8 Q; T5 J8 y/ M, L+ o; ]
void InitLcd(); //初始化lcd1602* f. x0 Z3 \* Q; p8 E
void lcd_printf(uchar *s,int temp_data);
( y; s# c* R* A: g: V. Qvoid WriteDataLCM(uchar dataW); //LCD数据; n' a" x2 e- T
void WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令
2 u8 z I2 P& n+ r% [7 jvoid DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符
! o: C6 B# V; Qvoid DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串
7 x( U/ s# a c7 ?- y9 T//MPU6050操作函数$ B( a3 I" V4 K0 d
void InitMPU6050(); //初始化MPU6050
! `' S9 S5 F6 v5 c# [! R3 L4 Z8 d- Ivoid Delay5us();
+ c% H* R3 V; L" N4 l+ b, R$ nvoid I2C_Start();8 p# J% e7 U! m" m& |, A
void I2C_Stop();
0 ]% R9 x" E; I: p8 f- q) b* h3 H5 w1 N: ]' ?& Z6 N1 O
void I2C_SendACK(bit ack);
; A( b6 f+ ? Qbit I2C_RecvACK();% A9 k: s5 r% V! K% d8 |6 G
0 W: K& Y+ h0 \6 b( Ivoid I2C_SendByte(uchar dat);2 c9 D* V4 i$ \9 ^
uchar I2C_RecvByte();
% _. P# X8 j \1 e- w5 L+ I% M& [; W m Y. |" A$ W
void I2C_ReadPage();7 a6 i1 H0 C% T2 C: L' ]1 i
void I2C_WritePage();
# u9 Q J8 f/ }5 X+ u0 Kvoid display_ACCEL_x();
3 b# n: Q! c% y9 ?void display_ACCEL_y();
' Q/ J8 O0 k4 m9 P% D N% B. Vvoid display_ACCEL_z();
3 }: _7 t4 C' {# Quchar Single_ReadI2C(uchar REG_Address); //读取I2C数据: C) S1 x% m! ^" c9 h
void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据3 D1 O3 d6 d8 r* u p' T
6 x" W+ W, l6 n) k( {8 G$ s: Y( P: U8 q0 ]) ^: X
//****************************************
2 Z* ?- G3 O1 x1 v//整数转字符串
) n. k: o, k' C: ]) ^//****************************************
3 a% c$ c8 v. T! I+ F& _void lcd_printf(uchar *s, int temp_data)% m! L) g- u2 ?" C9 P, _
{
# P1 v) c2 ~7 R' v- L2 | if(temp_data<0)
. B# m& u) Q% M {5 `0 r6 i6 w4 ^/ a1 H
temp_data=-temp_data;
$ B! \# U Q/ `2 Y1 G *s='-';8 F/ z2 c, D! B8 |2 ^
}7 ~; O1 L3 v, k4 P; R- O& }* G
else *s=' ';* L7 @: g& N/ x8 F( }/ Q
*++s =temp_data/100+0x30;
1 Y2 I8 ?+ Z ^& v1 ]& ~9 H temp_data=temp_data%100; //取余运算$ L! n7 @+ n1 S: j" n% q
*++s =temp_data/10+0x30;
. t7 m2 T, j4 G5 D temp_data=temp_data%10; //取余运算$ h) k( [% N4 q
*++s =temp_data+0x30;" p$ u$ y: g& K0 Y- ^
}5 q7 Y) O! e# T' r
//****************************************
& ^) N3 `; v4 B& R) Y& f//延时8 Z+ J* b' y; r7 r
//****************************************# [4 B, h% ]( ?2 [0 g2 d3 J
void delay(unsigned int k)- p' Z1 d; K3 b# G. l0 b% p: |) A
{
5 }( t+ d. Y8 r T" O v unsigned int i,j;8 a: H! {# l3 j/ E9 ?# |
for(i=0;i<k;i++)* p# K) M5 P- t. F1 z* l1 ]
{
' |: {& J0 c0 X4 g) _8 ?6 L% u' ^ for(j=0;j<121;j++);
1 N, A' s9 j4 r, `0 i }# I |! O& f2 D0 _& }: r7 i
}
- m, A8 N3 H" w. V, x//****************************************
2 n5 [; ~7 q" {; A//LCD1602初始化
; i, o/ b; F- x+ k/ F' h3 J//****************************************5 I. F' S1 ?* t5 ^7 d9 X! t. G/ z
void InitLcd()2 d% S# u4 ]0 j
{" f# R, E0 m+ i; }
WriteCommandLCM(0x38,1);
. R5 W- K$ t M WriteCommandLCM(0x08,1);
3 ?+ z5 R/ \+ R1 d3 V( P3 D5 L" B* R WriteCommandLCM(0x01,1);( h* x; o" \9 K' A6 `3 y+ P
WriteCommandLCM(0x06,1);0 a# e, S& c+ [9 p7 k. e
WriteCommandLCM(0x0c,1);
1 Y! R7 y3 o3 _6 ]+ N2 r& a/ z DisplayOneChar(0,0,'A');
$ S3 d2 @: V1 n {, P" w/ E DisplayOneChar(0,1,'G');
# I+ c' r( A5 f# h4 i}+ j t% b' c* w
//****************************************
5 H0 ]! a7 \( K6 k) Y//LCD1602写允许
2 I! Y5 }7 p! z8 L//****************************************1 D" O9 H5 ~- q3 ?) Z
void WaitForEnable(void)
3 N- n1 `8 }; P& u: f% m{& P) K" K7 t% i R, @ H7 V0 Y3 A
DataPort=0xff;. B9 r: M/ y, Z2 |# Q
LCM_RS=0;LCM_RW=1;_nop_();
! T- b6 R/ k0 D# H& j LCM_EN=1;_nop_();_nop_();' e% i9 G' {3 r/ S% q+ `. t5 {
while(DataPort&0x80);1 n+ p4 z1 S+ k5 ^. \- D9 W
LCM_EN=0;
' C n% \1 g4 V) \8 K9 ^ L) F5 i$ r}
0 F0 d$ {6 Q# O4 A0 r//****************************************
, i7 G6 Q. ~) T$ o% P4 }4 z//LCD1602写入命令' S/ X& L* Z* N4 V2 C: R0 |2 v
//****************************************
% z/ z6 h( l) O& o; H/ q1 Dvoid WriteCommandLCM(uchar CMD,uchar Attribc)& Q3 a3 I4 x- [0 |9 s, D5 p
{' W1 ^ Y1 u; t( i3 [+ m4 i! t
if(Attribc)WaitForEnable();) z: m, H. p, R+ L
LCM_RS=0;LCM_RW=0;_nop_();1 p; a* Q8 k! E& ~: N
DataPort=CMD;_nop_();; l- u9 S8 w' u7 M2 g2 \4 ]9 a# f
LCM_EN=1;_nop_();_nop_();LCM_EN=0;8 a! X" C6 F; E" k% |" C1 d8 U& }) L, R" _
}
( ?" ?9 A8 \' G1 H7 ?* y6 S8 g//****************************************# g6 [6 Y$ Z1 X& V
//LCD1602写入数据& A' }7 L# h. s) o3 T. {; c8 @4 ?
//****************************************% L/ ]4 c! C6 i- u1 ^2 x! Z
void WriteDataLCM(uchar dataW)
% [1 F# d, s8 V{
6 s( G, X9 W' T, j2 ~/ C* r) y WaitForEnable();0 h$ \, `, ]5 E+ o' D
LCM_RS=1;LCM_RW=0;_nop_();+ Z$ J R: w! t/ ]5 c
DataPort=dataW;_nop_();
4 L3 f7 u5 J, R9 `' j( g+ j LCM_EN=1;_nop_();_nop_();LCM_EN=0;0 S9 t- p8 X" f0 O/ q8 D
}. }+ W/ \7 n8 V' p1 C$ J/ d: ~ I
//****************************************
# S6 U7 z/ Y9 F9 f _3 R//LCD1602写入一个字符' v+ `7 M0 A8 Z. q) C2 @" v6 f
//****************************************
1 i5 f7 a+ i' Q E* m& kvoid DisplayOneChar(uchar X,uchar Y,uchar DData)% y9 C ~( c0 C9 Y- S
{
7 l% ], @, s* @0 G0 v Y&=1;2 ?: K7 j0 q# Y7 Y. T
X&=15;5 h; m% w6 ~4 M% y, E/ x
if(Y)X|=0x40;0 c: G. x; G z9 M# r
X|=0x80;' D0 F5 W0 z( ^6 N ?, W
WriteCommandLCM(X,0);" `! r7 }: }; x
WriteDataLCM(DData);
^, s5 F8 I+ Q8 L9 k} U( K6 D6 U' S+ n
//****************************************
- n- K6 c* k+ A! G8 @2 `//LCD1602显示字符串
. U0 c6 d7 C6 Y3 V//****************************************
# T; w. v0 X4 ?void DisplayListChar(uchar X,uchar Y,uchar *DData,L)
% p+ R+ A2 i* h5 i{, l. {4 V0 w* u2 i# F4 Z8 ?. J
uchar ListLength=0;! v0 @$ m: E4 g% p- v2 l6 _
Y&=0x1;: V& `7 l6 X7 @6 X' F: c
X&=0xF;
: j& v% i+ z M8 `9 i" I while(L--)! P3 _5 }- _% m7 K1 Z
{
- s. Z; p1 [( g; x DisplayOneChar(X,Y,DData[ListLength]);
4 o5 f0 d' C# T; |% |1 K6 W4 G ListLength++;' E7 S4 l! Y3 p' R
X++;: l' q7 P, T/ d) v! W
}
6 a2 s; b# @' R d$ `' _4 v}
, V0 A% B1 H- {
) @. N2 ?8 I. G& f7 s+ B//**************************************, r% }: ~8 |5 b" F& P. x2 b: E% n+ a
//延时5微秒(STC90C52RC@12M)* W7 @- \! h) Z7 V t9 e4 T3 @
//不同的工作环境,需要调整此函数
2 j9 Y; @% q1 s* b//当改用1T的mcu时,请调整此延时函数& y+ d: q' U( M3 d7 f( S4 R
//**************************************' \7 K. q3 N, k" b
void Delay5us(): `! o& @& s: t, F6 ~& \- H
{
5 u# _7 z9 u& @4 ` _nop_();_nop_();_nop_();_nop_();5 q/ V: s2 p6 f6 j+ B z8 E
_nop_();_nop_();_nop_();_nop_();; h9 h8 `$ {6 U% {
_nop_();_nop_();_nop_();_nop_();
+ g# n7 j+ w% H% Y1 d _nop_();_nop_();_nop_();_nop_();
# c1 O5 W9 n% E7 s _nop_();_nop_();_nop_();_nop_();
% `2 u7 d; V6 b, P2 b* t _nop_();_nop_();_nop_();_nop_();! q7 T5 Z6 B9 p- i9 E- x) F
}
7 i: C* H& ?2 C2 Y5 E" v8 x//**************************************% ~! t# I" L' K# f
//I2C起始信号
7 U1 [; |) i7 t* o//**************************************: {/ u! _: Q& z& }! I
void I2C_Start()
: Q" q, ~" a, m5 ?% O& Q{
. \) l( U" f6 s# f. u3 E: j9 s SDA = 1; //拉高数据线3 v6 v: j+ f, X8 i' C' z
SCL = 1; //拉高时钟线- ?1 e) p+ j) j6 w* U7 @
Delay5us(); //延时
9 u& s$ I7 N) G. h; m9 l- A SDA = 0; //产生下降沿9 `0 O9 R& a7 S4 X2 r
Delay5us(); //延时
+ C; ]) @( d7 D! }! d SCL = 0; //拉低时钟线
- p6 T0 Y2 P2 r; P}3 Y9 e# y5 _$ O
//**************************************
) o9 z0 q8 M6 D4 f3 R0 d; t; g) r//I2C停止信号
1 c0 v! |) x( r% `( r//**************************************
: P( m9 \1 {/ Z+ Wvoid I2C_Stop()
+ B) L+ K7 Z- p3 {{8 w& ^. m$ c, K# s
SDA = 0; //拉低数据线
- H- U7 i8 _3 z" @1 \ SCL = 1; //拉高时钟线! x. c; c/ ?, p4 R' C# s- r+ J
Delay5us(); //延时+ T3 m# r0 Y$ _% R) u# O# X: Y
SDA = 1; //产生上升沿
2 z3 s& z% S# [ Delay5us(); //延时
' X: a4 t& t9 q* j+ u( ?}% C) D3 k' Z" g; ]4 o
//**************************************
- B8 I# Z, Z- R Q4 R/ K//I2C发送应答信号- P) T4 f J& M9 i5 z6 B
//入口参数:ack (0:ACK 1:NAK)
' @* T2 w$ N+ X/ x7 f//**************************************
% T/ R; Z; b+ f" i/ p2 cvoid I2C_SendACK(bit ack)
d' [1 O. ]: r4 j% @* D{6 C+ h1 d, q. B2 D$ f
SDA = ack; //写应答信号
( p$ }; F& Z( v3 q2 y SCL = 1; //拉高时钟线
0 q# J' v/ t; _ Delay5us(); //延时/ E7 ]+ ?# ]* Y
SCL = 0; //拉低时钟线, Q3 s2 e. \" `2 q# g1 o' g, q4 J
Delay5us(); //延时
' s6 w6 v9 W% P* S}, p8 d8 s) F/ V& q$ o
//**************************************
4 _: @! }% d9 k) y$ u a; `//I2C接收应答信号
' c1 f, U) V. N//**************************************/ T( A; n# @4 @: t- I7 m( y
bit I2C_RecvACK()% S2 t$ I8 B, T4 R( Z Z( k
{
; |1 j. O$ P S SCL = 1; //拉高时钟线+ X* U4 e; c- C* ~/ C. b/ O, ^
Delay5us(); //延时
s8 N0 c1 d- [$ \8 Q# T CY = SDA; //读应答信号; p; H; a+ E- Z" F1 G
SCL = 0; //拉低时钟线
, b! @% J: R- I* U2 r+ k$ ]/ B Delay5us(); //延时! B+ m/ J& \2 n, O2 D3 g, a
return CY;
: K1 z! _) o: O5 J* Q7 z; R* C}# U( N, n, e" S$ J6 m! T8 a& Z
//**************************************. E- z( l% c( Z `2 e
//向I2C总线发送一个字节数据* C" P. A, P; s
//**************************************; m$ G, k( Q8 x ?
void I2C_SendByte(uchar dat)
& K: ?# l' L- m2 w% I1 z{
* T4 k6 E/ h5 R D& r uchar i;# P. T) Z6 i4 d0 d+ Q
for (i=0; i<8; i++) //8位计数器
9 S/ Y7 D# u; @. H2 }$ | {
( P7 Z' C9 }) ^- } dat <<= 1; //移出数据的最高位
. m$ V" ?0 F" O0 p7 ` SDA = CY; //送数据口/ `- u! l: ~2 G) P9 z) G8 ?6 b) {& z
SCL = 1; //拉高时钟线3 h' A+ O/ w" _/ F3 D
Delay5us(); //延时1 R2 Y* K* ?) a
SCL = 0; //拉低时钟线! z. i. Z4 i( r; a% z, |2 X
Delay5us(); //延时
% |5 j' C' ~: V }
9 F W* {! p' q( K/ K I2C_RecvACK();: L1 j8 R& i8 K9 x* i6 G
}
; x' A; P2 c4 ?1 J//**************************************
( q# o! f* K- K/ s' }- V; h8 h, W! C//从I2C总线接收一个字节数据
) U& x2 q0 v9 l# N' W% z; b//**************************************
) f1 @% D) \) i" O( ^uchar I2C_RecvByte()9 C. `$ e6 D, s. `
{
$ y- T4 q$ Q# Q( y1 @7 E: A uchar i;. b8 m8 [- G4 P8 r
uchar dat = 0;
" Z8 r2 a. I4 [* p1 E$ c SDA = 1; //使能内部上拉,准备读取数据,
7 ~: C& o/ ^+ G. b1 k. q for (i=0; i<8; i++) //8位计数器
) [% C* d/ j) i" t R8 A& S {
) g5 R- Z: d$ u ~) w dat <<= 1;
% s8 f! `* U5 f SCL = 1; //拉高时钟线+ M6 }5 f4 \" l% v1 {( Q
Delay5us(); //延时. h0 g# f1 N8 R; I
dat |= SDA; //读数据3 W5 O. t V7 \3 O: c& w) o3 D
SCL = 0; //拉低时钟线6 G% o3 \1 y0 C4 h$ r7 T
Delay5us(); //延时
% G1 e" V$ p% x4 }# ?+ G }$ W* a2 |6 Q' m5 Z
return dat;
0 g9 C1 E4 `+ _- g$ ]}1 i- s$ z& ]$ N- \* M
//**************************************
6 O; Z. g2 ^7 l; `1 S//向I2C设备写入一个字节数据
" j# K; f2 k0 e5 G0 C% ]# ~2 O& a$ u: B//**************************************" f0 P. L5 M/ k) P! i. W
void Single_WriteI2C(uchar REG_Address,uchar REG_data)1 U1 o: T. D) Q7 C G
{; n1 p* z" b" |5 ?
I2C_Start(); //起始信号, k9 b S# M; @/ f* l4 J$ H# N% E
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
( H" l/ v: j' D0 E' v I2C_SendByte(REG_Address); //内部寄存器地址,- l* K7 V" G+ y- B {( _7 l- g3 |
I2C_SendByte(REG_data); //内部寄存器数据,# l5 r q- z+ A# Q* ]1 ^ m( g
I2C_Stop(); //发送停止信号
. r0 |7 N. F R' i}# p1 V" q5 E, W6 H% M
//**************************************
8 c3 M ?* X: F" {+ w- L//从I2C设备读取一个字节数据
- C- K1 _% z4 g3 T) L7 r8 P! ]//**************************************" _) p) v8 r: a/ @( y
uchar Single_ReadI2C(uchar REG_Address)
& Z1 S! _9 x( f+ \9 d0 \{
0 D- n- |# Z6 ~! v uchar REG_data;
6 c: |8 j( P. e2 V) X2 ~ I2C_Start(); //起始信号+ {$ P, V8 S* x) ^2 X- f2 A: K
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
9 ?( ~ i- X! O: k I2C_SendByte(REG_Address); //发送存储单元地址,从0开始$ X6 I! b6 e+ U$ c) s
I2C_Start(); //起始信号
. O0 A1 k9 B1 x2 X# |$ h I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号# B) }; y5 m5 n [+ u9 v, v4 W) }0 C
REG_data=I2C_RecvByte(); //读出寄存器数据
7 B' Y6 U* b2 l2 \" f I2C_SendACK(1); //接收应答信号7 z* F+ x7 W# H4 z9 ~
I2C_Stop(); //停止信号
3 _4 v: p7 `: |% q2 ]3 r return REG_data;. A" |* c& ^6 }1 ^: d2 [# Q) O+ T7 ^
}
$ E( b* `& `2 d" o" c! X: i" Y% d5 c8 I) W9 R: H
+ j9 k* |) S/ {+ g4 b7 Y* I( e
//************************************** j1 Q( f1 Z6 q: O- E* O7 D0 Z
//初始化MPU60503 S9 H+ e% a3 G, a3 @# M5 C
//************************************** {: E& p. \' ?. T
void InitMPU6050()
+ H a2 @1 C% F9 P- N% ~{
/ e: y0 d, z1 [% l; a0 H- Y7 h Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态* n. ?5 h% ?$ q! u) K$ X) q6 P
Single_WriteI2C(SMPLRT_DIV, 0x07);
. m1 o4 ]" B8 J- ?# E Single_WriteI2C(CONFIG, 0x06);. K5 g6 M$ F, u& C8 |5 h- x
Single_WriteI2C(GYRO_CONFIG, 0x18);3 q9 i5 d8 X& J. X. r0 A
Single_WriteI2C(ACCEL_CONFIG, 0x01);
" L9 i. q4 B" T; n$ P}
$ n1 k; C2 z% N9 d//**************************************
7 r" a/ @* s! c6 n//在1602上显示10位数据2 T# z- r L9 X; ?
//**************************************
1 R0 E; B4 J* z( Y9 O& ~4 d& A6 lvoid Display10BitData (int value,uchar x,uchar y)
4 y1 T3 q2 ?+ F{0 }( k* B0 S# b$ L5 N& m* ?, s) O
value/=64; //转换为10位数据 value=value/64 右移动六位
; f; t: K( T1 B$ g3 y/ g lcd_printf(dis, value); //转换数据显示
1 N; l0 H' {) J& c' \' X DisplayListChar(x, y, dis, 4); //启始列,行,显示数组,显示长度
$ f$ y3 b5 j, G& r' g" ?& r}, Y8 ^ z& g6 e
//**************************************
' B9 O' R# `) i6 v$ S/ x6 i//合成数据, p& V) w3 ?! X, {
//**************************************
$ {% J8 s, p( L7 X( d% }2 v- Gint GetData(uchar REG_Address)3 x3 c2 _7 Y4 \3 W" z
{
3 u" |7 H, z& ^9 } char H,L;7 ]! @6 L; \# U: ]6 @
H=Single_ReadI2C(REG_Address);0 @6 i# m$ v6 I0 g/ L
L=Single_ReadI2C(REG_Address+1);
* E$ r9 X9 [6 {' J2 [$ u return (H<<8)+L; //合成数据6 R, R( l, {5 Z* @6 `$ p2 s2 L
}( T9 d; ~7 U% |/ x" ?
" A6 @2 Y; h0 p1 Y& S& V# F- B& s3 r ?4 h' X
# U1 L( f) ]9 s
* Z8 K" w- J) H! S
//**************************************
. A) K; Y2 ?% u$ {- A+ V6 m2 q//显示温度5 E0 p1 v1 }( W2 {4 ]8 q
//**************************************. l2 r' P% x( j3 e/ b; ]
//void display_temp(). X1 ?8 X6 d3 y2 U
//{
P3 |& l+ E* }" P. V// Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
. j6 b/ u c( l$ I) h. E) e6 D// Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度1 k5 {3 X" i/ a* X O
// Temperature=Temp_h<<8|Temp_l; //合成温度
" n0 p. G0 S4 R i# I3 q$ N1 W// Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度* ^; a9 L5 k, g5 w/ g$ b+ K' @
// lcd_printf(dis,Temperature); //转换数据显示/ V- O8 w G6 T4 C3 i
// DisplayListChar(11,1,dis,4); //启始列,行,显示数组,显示位数
/ I% t' a, \3 b; p, S# H- I//}
% i" E. m9 n6 R& x' \. c//*********************************************************
5 b, y; V% M3 T$ @2 B: r4 g//主程序
/ H0 Y+ b& m. Q; c//*********************************************************
, c" c% @# ?" H* a/ |void main()9 M- X$ ?, Y# ]. g
{1 t3 I& {7 l. B7 A7 u
delay(500); //上电延时, y5 q) T5 Y) |8 ~% e
InitLcd(); //液晶初始化
" u: Q7 h1 J+ @' V/ o9 `6 n InitMPU6050(); //初始化MPU6050
2 d1 s5 g# Q5 c delay(150);
. M3 o! Z+ l) l- g% f0 d1 P8 Y$ b while(1)7 O0 C4 ~9 ?$ I# c7 c7 Z
{
8 u% I& ]5 F+ [ Display10BitData (GetData(ACCEL_XOUT_H), 2, 0); //显示X轴加速度
) A1 e/ c' ^4 L" T" D8 X; P Display10BitData (GetData(ACCEL_YOUT_H), 7, 0); //显示Y轴加速度0 I. x( J( X2 k
Display10BitData (GetData(ACCEL_ZOUT_H) , 12, 0);//显示Z轴加速度& ?4 T+ v3 h7 h4 f8 C
Display10BitData (GetData(GYRO_XOUT_H) , 2, 1); //显示X轴角速度
7 ]# \; z1 v' Q/ w: T+ k Display10BitData (GetData(GYRO_YOUT_H), 7, 1); //显示Y轴角速度
2 p% H* {" F" B& q Display10BitData (GetData(GYRO_ZOUT_H), 12, 1); //显示Z轴角速度
$ S( y' a7 l' G! G& C h& y% s delay(500);0 H. u) ^/ z# s7 D
}
3 [7 Y! Z: [% C; ]( j" a}( x4 f; z9 I9 I; A* t" r9 L
|
|