|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错3 E. y0 @0 K$ u5 _$ {6 ~ x% R0 S
#include <REG52.H>
& v8 p4 n q A4 s. g#include <math.h> //Keil library6 o4 b6 y2 h4 l0 x/ m! x* [4 O
#include <stdio.h> //Keil library
4 N: f9 X2 \) l' ~0 B: t" b#include <INTRINS.H>
: j# ~- O. L9 w' Z/ vtypedef unsigned char uchar;9 v2 F# w+ y1 T# N5 s' q/ Q
typedef unsigned short ushort;
. C' C, T# C' y4 T3 ttypedef unsigned int uint;
$ m1 ~3 I8 F1 _- r" c//****************************************# H: |/ ~% S& K# [$ f' Z) b- X
// 定义51单片机端口
2 V/ Q/ M, ^% a" }' C$ k//****************************************# g5 c3 z7 ?+ g
#define DataPort P0 //LCD1602数据端口
7 ?6 p4 H% v8 ^ c4 ksbit SCL=P1^0; //IIC时钟引脚定义
( R- c4 o) z( [% zsbit SDA=P1^1; //IIC数据引脚定义
# H% v- ~4 w/ ssbit LCM_RS=P2^0; //LCD1602命令端口" J1 R1 P4 H: M0 f
sbit LCM_RW=P2^1; //LCD1602命令端口* O* h6 e( l; ]% L3 @$ H, f
sbit LCM_EN=P2^2; //LCD1602命令端口
# X3 e$ m* ^' M: r8 ^9 \4 i0 b//****************************************
- n% J) D3 q! W! w, Y _// 定义MPU6050内部地址 u3 k n+ w0 _7 |" D
//****************************************8 A% O0 `. o* ^/ m, ]$ `
#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)1 L$ _9 a+ c/ l" R9 u( O$ ]
#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)" f! e( I- G0 S: [/ V( ` G7 P& C
#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
& b" z; c; H& A s5 M#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
3 Y. T4 q0 V2 w1 [5 o+ n K4 N* d#define ACCEL_XOUT_H 0x3B
e# C2 v4 r+ L* d3 a# d) G/ e6 D#define ACCEL_XOUT_L 0x3C
+ O: S" ?* M! `+ V#define ACCEL_YOUT_H 0x3D
8 p* u6 d! p/ R: S' x#define ACCEL_YOUT_L 0x3E8 f7 L" K1 k8 W: V' w& V4 i/ s* W
#define ACCEL_ZOUT_H 0x3F# I' _) F* E* c4 Y) {, T2 v
#define ACCEL_ZOUT_L 0x40
. l! a- |& K3 I, X7 z#define TEMP_OUT_H 0x41' C" s b _( _( D+ F4 U% A x; X/ I
#define TEMP_OUT_L 0x42. W# B B; Q( m2 q6 B! t: b
#define GYRO_XOUT_H 0x43
1 u# {1 p3 ?% M#define GYRO_XOUT_L 0x44
; P J$ R3 p a2 t1 t0 ]#define GYRO_YOUT_H 0x454 E, x/ u/ ?* }! _1 a- F0 s
#define GYRO_YOUT_L 0x46
+ w: n0 | [+ M$ H8 Z+ F5 f#define GYRO_ZOUT_H 0x47
) D1 }( N+ Y _7 {$ K#define GYRO_ZOUT_L 0x48( q. v$ h" m2 }0 b; ]( E" g+ j
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)
& @( [- p3 J) c% H! Y, a5 V0 v#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)
! [ l8 A2 F+ w1 m9 d* }#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取
4 e+ M$ L3 |- m3 Y* B" Z% W7 f//****************************************
" S' X9 n0 M$ ~5 P//定义类型及变量
1 E9 j% K! Q2 d& D0 N//****************************************
% Q- H7 x- v% f) X5 juchar dis[4]; //显示数字(-511至512)的字符数组" Q" F" t8 P! s6 }! H: E" i) a
int dis_data; //变量
+ U! G4 M6 z) p2 G% K//int Temperature,Temp_h,Temp_l; //温度及高低位数据
6 N/ U |! J5 X) f. t8 R//****************************************
1 E. D* g$ x7 o3 ]/ B3 B9 r% i//函数声明" j% k" O$ K) Y4 J
//****************************************/ C2 ^- H; O, i5 V' x8 Z
void delay(unsigned int k); //延时* p: Y1 s A8 I5 r/ x. A% m
//LCD相关函数
. d% ]: ~ P: ?1 _3 `void InitLcd(); //初始化lcd1602
' Z& O) f4 |2 ^: l! @void lcd_printf(uchar *s,int temp_data);" H) d) Q- n; X& S
void WriteDataLCM(uchar dataW); //LCD数据
+ Z9 o6 k2 k' R4 x- \/ U# hvoid WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令/ ] W; N J& P/ O1 S
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符5 y5 ^4 F, e% E) W9 V* e9 c8 |: D
void DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串8 Z2 l& B% R1 k, ?$ S- x
//MPU6050操作函数
6 \* w* ?" a! Cvoid InitMPU6050(); //初始化MPU6050
4 t# f3 ?8 N. P" C* r4 a) zvoid Delay5us();
$ i2 {' a0 K% @6 N' C1 ~8 avoid I2C_Start();
9 f4 {8 I3 j/ X) Pvoid I2C_Stop();3 i( F9 i) C" l6 \6 O0 z
8 v9 ~: c! r) X+ F' Hvoid I2C_SendACK(bit ack);: l* W3 _% r* q, U: M6 h) E/ @
bit I2C_RecvACK();
. ~/ h# a3 W: U+ b; n
0 P, z4 h. S3 W/ I4 `# ~! t7 {void I2C_SendByte(uchar dat);) l+ }6 g, [' O
uchar I2C_RecvByte();5 i+ X; p X+ R$ K
9 k2 M! D2 B+ q" w7 [/ U& Z+ r3 w0 Gvoid I2C_ReadPage();5 G( Y9 Y0 w$ i% L; i% T
void I2C_WritePage();
5 i* f4 d C S! Avoid display_ACCEL_x();( V/ X) S3 n' n4 t% T
void display_ACCEL_y();0 i: n7 @! Z8 d& |
void display_ACCEL_z();
- c8 G$ X1 ~- l. n/ t1 Suchar Single_ReadI2C(uchar REG_Address); //读取I2C数据. k+ `/ }3 o- ?9 @* c' y! X% z9 {- y2 w
void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据
& W. Y7 o0 @# Z8 f- p" y n5 v! n( z& c. J& k4 `9 \
3 q3 y9 M E$ g y: e: |1 E//****************************************7 G; B1 }1 m% M$ R
//整数转字符串5 Q8 ~1 ?2 d; C0 c) j% s( x: \
//****************************************
; i# |* w/ [2 g; D" Rvoid lcd_printf(uchar *s, int temp_data)& ~+ L" n* \/ ^ @0 P
{" C2 _1 G r* x! M, `. E
if(temp_data<0)
8 \( B R) y& S' ~4 |! F {# M! S& [* ?- t7 I+ m, V5 s4 @
temp_data=-temp_data;
& T4 k8 G( x, H! i B+ H4 U4 } *s='-';! x- u" | |5 K! h
}
2 O+ e- x7 o. l else *s=' ';
. _7 Y9 S0 @' n9 o- \ *++s =temp_data/100+0x30;
: H- N9 p" Y5 [2 A2 A2 O X temp_data=temp_data%100; //取余运算
6 v8 [6 z9 e5 v1 c) z *++s =temp_data/10+0x30;
: g1 I$ S3 j( G5 W6 U2 O temp_data=temp_data%10; //取余运算
) J2 T9 z" T- C2 c D& F *++s =temp_data+0x30;
% f/ Q% o. \$ B( E7 J. F! S: @}1 ?$ X/ F8 Z) o+ M1 M" p
//****************************************) Y/ F* a( r& J# f
//延时1 @4 M5 T' N4 C) P. H) `; m
//****************************************
, w1 r# v, G% p2 I2 Rvoid delay(unsigned int k)
7 d% `% {+ B9 J$ x' S7 Q! G{4 E0 E0 r2 o5 s" B, q7 S
unsigned int i,j;
# V# k9 V- ~' u8 R) Y# m+ V/ e for(i=0;i<k;i++)6 n: W# A+ l! }+ L
{
) |( \5 f% d" E: N for(j=0;j<121;j++);' q% @: v# n5 \. o5 K) B( x
}
6 `4 k6 |; ?8 ]2 H7 C" x5 c}
9 W! n' z" e& Q3 R+ E3 K//****************************************# d; r& T G* l2 W7 y- H
//LCD1602初始化9 M/ X+ x" k8 b8 @8 x
//****************************************
1 S0 k+ T( ~: W- v6 N" ?void InitLcd() J- v5 N, h7 q2 E) a
{
/ u# k+ r6 J& I& R WriteCommandLCM(0x38,1);) a. F. {- d* e. i! a9 R' L, E
WriteCommandLCM(0x08,1);
7 Z: I7 Y( b' }8 y. t. c" _ WriteCommandLCM(0x01,1);
3 f/ ^5 E( U! d8 b' u; H/ F WriteCommandLCM(0x06,1); Z1 w/ F. X7 T. i; ^
WriteCommandLCM(0x0c,1);. X5 g& ]5 ]$ p# B+ N# W+ [' D
DisplayOneChar(0,0,'A');
- K) l/ \' h2 {% Q7 q" l% W( u DisplayOneChar(0,1,'G');
6 O9 n, M" @) K2 r2 U+ B! J" P}4 G) i# P7 Q+ m; `8 Q! z
//****************************************
/ Z+ v& d) `. r//LCD1602写允许2 a1 Z6 c; Y; X
//****************************************
0 n" f" O4 p# B" x" rvoid WaitForEnable(void)2 {- t; Q: `; e& F
{3 ?) ^8 k, |5 N/ u
DataPort=0xff;
- w( u/ M& y7 ]' i3 ]/ C; E LCM_RS=0;LCM_RW=1;_nop_();9 V# e6 S2 v0 p& H5 F/ q, T4 T# n( B
LCM_EN=1;_nop_();_nop_();
0 O' ~; [3 T. {$ }( O8 F s' I7 w- o while(DataPort&0x80);: ~" Y- I7 w W' B
LCM_EN=0;0 r- N X# t; t9 l
}
3 U0 }2 C# m! H/ u2 ^//****************************************
3 ^4 W/ D: h; j! w; U J" N% M//LCD1602写入命令, V# c9 _. f1 k I* [# H) O
//****************************************
/ M6 }! n" X1 V7 J1 ^1 mvoid WriteCommandLCM(uchar CMD,uchar Attribc)
: |3 M3 Q8 y6 L/ T, E{
?# e R u5 T if(Attribc)WaitForEnable();
9 L: A* ` A9 h: m4 R5 `, L8 v# v# \ LCM_RS=0;LCM_RW=0;_nop_();
/ I0 W2 w1 Q4 I* w: v6 ] DataPort=CMD;_nop_();; C6 K2 T- E* u/ U2 M. x) M
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
* M! h+ m' _8 O0 X}/ ^3 b" F" z1 R. ~/ \# ]
//****************************************
, j1 j4 t* N0 n" d/ T8 q$ X+ W$ d7 B//LCD1602写入数据: I6 q3 |1 v# Y
//****************************************
$ y! }* V' k* [$ J: Q: Svoid WriteDataLCM(uchar dataW)
4 R6 m" v, y3 y* h( s6 w4 V$ ~{" W5 [8 F! u5 A: B
WaitForEnable();: f1 i4 e' P; ?4 d {; d
LCM_RS=1;LCM_RW=0;_nop_();: O a# l ~8 {, A& ^
DataPort=dataW;_nop_();% a. s+ `- k1 {0 @
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
2 Q+ U( g3 q8 S# V d' P}
! \0 u- V4 p1 l D6 s% ~//****************************************
& J/ O; A" F5 Q8 }2 h4 ~2 P, B3 A& B//LCD1602写入一个字符
6 R) R3 f3 q! Z: M) L( p//****************************************
2 G% D/ p; ^# i: Qvoid DisplayOneChar(uchar X,uchar Y,uchar DData)
+ i0 p2 p- t% i2 m' Y, O: e{5 B/ h/ X6 A4 S2 z
Y&=1;. ~) V# L& M2 n0 q& s3 }, A* c
X&=15;
5 N) L' k& ?. W9 `$ q2 X if(Y)X|=0x40;
+ {/ ~, `. y1 ?: v$ W7 c3 k" P X|=0x80;
, D2 ^; R! |7 Z; T* ^( e WriteCommandLCM(X,0);( H7 u& @4 _% t9 U5 x1 m- t
WriteDataLCM(DData); N l6 [4 V/ _' A1 a! A# Q- ~% [6 A
}0 o! o" ~+ ?9 B# a
//****************************************- J. f; N# U1 k' k8 J
//LCD1602显示字符串
( \5 f& Q) Z$ F; K//****************************************
& n0 W' C0 o$ Bvoid DisplayListChar(uchar X,uchar Y,uchar *DData,L)
1 Z' T1 h h. b6 n! N- v7 j{
$ f: i) Q/ }$ m uchar ListLength=0;
+ _. r& }2 _+ {1 W4 O( Q Y&=0x1;
, s4 ~+ _6 p6 {& a( \ X&=0xF;
6 y) d' F i/ S2 s3 s while(L--)4 i, u0 z3 K! `9 P
{
9 V/ ^3 ^. c- Y, j) Z" n' d DisplayOneChar(X,Y,DData[ListLength]);
, v# q& f3 X5 N, J& B ListLength++;$ z7 g3 |$ [( S
X++;- c# t. I4 @4 j' o
}
' T! q8 [: ?4 l3 U" }% ]}
% V z0 r# M* e K+ T7 X" F1 k( Y- M3 T9 c% |1 ~
//**************************************
' N0 @9 t" V9 j J//延时5微秒(STC90C52RC@12M)
4 k. q' w0 g# q% o//不同的工作环境,需要调整此函数
' A" ]8 l5 L3 L4 E7 ?, J6 t//当改用1T的mcu时,请调整此延时函数
, I! f6 r3 n6 q4 Z) C% F: w3 T( s! C! q//**************************************# f* n8 G; o7 G3 z% }8 M
void Delay5us()
' r: V( J$ D6 E" o0 M# N5 ^# e{
) |8 R. P5 C* m/ g; O/ b$ y) }% B _nop_();_nop_();_nop_();_nop_();
8 k4 S# T# T4 f$ Y" s/ f _nop_();_nop_();_nop_();_nop_();
. C- _& l9 H3 I; w. w: U5 M6 j _nop_();_nop_();_nop_();_nop_();
|* c. E5 A s _nop_();_nop_();_nop_();_nop_();8 M% g8 b, z, L4 w+ a
_nop_();_nop_();_nop_();_nop_();5 O. W* ?- A, a. F. S) V& \; B6 j
_nop_();_nop_();_nop_();_nop_();
9 G4 o" |% k$ ~ G* d- G}1 F# Z% k) F! g' ^
//**************************************
7 A/ j6 _4 L8 L0 P! N//I2C起始信号. C( {+ M- H* n ~% E
//**************************************
. }4 b: s, J- E) Ovoid I2C_Start()( [- I; F; @" k
{5 t3 a3 J* _! s( e- Y
SDA = 1; //拉高数据线
- _( _- _* Z- D/ g ~ SCL = 1; //拉高时钟线
/ ?7 D" h* p# i2 _ Delay5us(); //延时
/ B! P s+ a" V U: k" N V SDA = 0; //产生下降沿
# I; ?' a2 W, f! d% T" b+ m* S Delay5us(); //延时 V: W2 {) w9 _3 \6 T. ^7 [
SCL = 0; //拉低时钟线
$ Y3 r7 v. s5 F) h! H}
- Z2 V9 a3 _5 {/ F V//**************************************& f Q% U$ _% w; H0 O. u4 u( e, H
//I2C停止信号+ m4 d$ Y( b$ l+ a& x7 `1 d" g
//**************************************
' C, e. B, { A, avoid I2C_Stop()
: u' L( O6 Y/ ~{
$ z5 O; p) W- k SDA = 0; //拉低数据线
+ D, Y! o& N( P" [+ V" w! o$ s+ ~ SCL = 1; //拉高时钟线* \( q8 g& c: S& x2 b* [/ g! s w
Delay5us(); //延时
, E8 [0 Z: E8 ?+ w& t/ ^; z SDA = 1; //产生上升沿
5 v! T( L' @1 Z7 n1 f Delay5us(); //延时
. L$ Y( R& h. p: P1 {+ C* o} a G( f8 H- f$ {: E$ @
//**************************************
( B* m' z3 C( L- y//I2C发送应答信号
: h7 S0 D3 ^; l; p" K//入口参数:ack (0:ACK 1:NAK)* [$ U) ?( a( g1 d, M
//**************************************
6 @ n) P7 u2 j( c4 A H6 Kvoid I2C_SendACK(bit ack)
* J0 V: h+ H1 w5 c. ~! ]{
4 E7 m5 V, L( E6 W% e( r SDA = ack; //写应答信号" {8 W0 ^! J; @- w% I
SCL = 1; //拉高时钟线3 s! u: i) R6 t' T9 m, l
Delay5us(); //延时4 m2 A: W8 W+ F
SCL = 0; //拉低时钟线( n/ s8 L+ {, N) q5 `7 L, ^
Delay5us(); //延时: a) {6 }3 [8 x R$ ~' M( a; ?. c
}
( d9 u& v5 l3 |) Z//**************************************
# [2 y/ i0 v+ k. E5 W W8 ]5 B2 D//I2C接收应答信号
( d: |( g5 B2 U' J/ G//**************************************
" e" A8 H$ v t5 I2 rbit I2C_RecvACK(). h# L- c- H1 h& D7 j E
{$ i4 F, v) |# H3 ?* G1 h$ j/ ]
SCL = 1; //拉高时钟线- u& j# q" Y9 J4 f
Delay5us(); //延时* g. Z. [. m% [3 T) c+ f7 x
CY = SDA; //读应答信号
5 T1 o, S$ L. M: M SCL = 0; //拉低时钟线
0 b7 \+ ~, D" a" h9 }# `1 C% k Delay5us(); //延时. p8 U0 D" L- F1 l8 y* ~
return CY;
* w+ w# m! b' d. L" C}
7 F6 ]/ ~! p- J( `//**************************************3 m1 v7 P8 ?: S2 @
//向I2C总线发送一个字节数据/ r* i0 q/ c, U, V0 S
//**************************************. E, ?, r# o+ D0 h; u, B) }
void I2C_SendByte(uchar dat)
- l2 F7 H. @0 s' A' p* p9 T" T{* e+ F) r4 l6 s* M( x- \
uchar i;
?( [9 q6 @/ |8 y+ v for (i=0; i<8; i++) //8位计数器
! V" l2 i: ]! P9 ?6 O# m; _7 ? {
9 i' O0 i- R6 {5 S8 R; C dat <<= 1; //移出数据的最高位3 V" J: \3 K2 S" _; {% @1 L
SDA = CY; //送数据口& ~8 \0 k8 ? f% b' H: ^' P" w
SCL = 1; //拉高时钟线
9 u' P6 |7 E) h$ x2 h2 j Delay5us(); //延时
3 u3 I+ |9 Y, p& ~* U/ @+ q7 I SCL = 0; //拉低时钟线
! a9 U! K2 g$ t Delay5us(); //延时
I& [ x: i) I/ W. n" T. k }" y5 w Z" x6 @
I2C_RecvACK();
a, O- |( T1 u$ ?8 A}
- c0 _* |3 m& ^- |$ H! w, K3 c* V//**************************************
, N& R* H( `9 h- d; ^//从I2C总线接收一个字节数据
( f, r* u& E" s//**************************************# [$ [" K+ S' l. S4 @) v' K
uchar I2C_RecvByte()
6 t# m6 @" x/ z6 D{% R8 q; Q7 N2 G8 J9 R2 L
uchar i;/ n8 H) P- ~" X0 e
uchar dat = 0;
" ^$ W) U. L+ Y' O SDA = 1; //使能内部上拉,准备读取数据,, S# |6 |; m( ~* N( O) e
for (i=0; i<8; i++) //8位计数器
: H4 J0 t9 O- U# o* ` {
' _; }2 _# f& D) y- l9 ? dat <<= 1;- q, t6 S: W, N; z! x9 o
SCL = 1; //拉高时钟线
2 G9 I% R; U$ s5 \; a! f Delay5us(); //延时
2 d, l% @, g, ]: g) S! Z3 S dat |= SDA; //读数据
, g8 R& L6 u* U. y3 A- j SCL = 0; //拉低时钟线# M8 ^7 c) ]# h5 q; `( R
Delay5us(); //延时; h( T: d- u5 D* q; a
}
) ` |9 z- N! ?- D return dat;) s# d( x% I( ~# A1 d2 `. v" O
}
7 t( z5 g, r/ p. }//**************************************2 s; q$ K* H/ g H
//向I2C设备写入一个字节数据# `: }5 V4 [( z
//**************************************, T# M! t: V1 x- o$ i5 b
void Single_WriteI2C(uchar REG_Address,uchar REG_data)( B9 H' _- M: Z7 Z" i
{/ q& k# D1 H2 w5 ]
I2C_Start(); //起始信号2 W3 {% X) |( Y4 q/ _
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
' {+ w: y0 u5 p9 v6 g+ X2 W2 R0 T: f I2C_SendByte(REG_Address); //内部寄存器地址,
/ Q7 A1 K" `. e' U U. T) R I2C_SendByte(REG_data); //内部寄存器数据,1 C* O& s; d/ Q9 o. ~
I2C_Stop(); //发送停止信号7 }. Z0 T+ p. r. C8 w
}1 D, Y% X! B- L3 d
//**************************************: a5 v, n& r0 {# H
//从I2C设备读取一个字节数据
7 I9 \# K5 x2 E' Z, V8 B& |//**************************************
) j) d6 p, {# z; Y8 ~) ^5 Juchar Single_ReadI2C(uchar REG_Address)( n8 J/ {# s$ o7 N
{
- B2 d& [% S9 T4 d uchar REG_data;
$ ?* O$ U! O+ G5 ? I2C_Start(); //起始信号" d' J# j2 |3 H" f
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
9 l' o4 `5 L/ A7 H, O1 e5 L I2C_SendByte(REG_Address); //发送存储单元地址,从0开始
( Z& k5 D. Y+ l* J! q' {1 v I2C_Start(); //起始信号
/ u1 Q% y( d: _2 V& G( y I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
/ o5 I/ X' L+ e! T/ P d7 w q2 R REG_data=I2C_RecvByte(); //读出寄存器数据0 c& h4 v2 N' g
I2C_SendACK(1); //接收应答信号
' v. M2 A" p$ d& I% L% d8 X I2C_Stop(); //停止信号" j) w; L" Q- C5 }7 d" F
return REG_data;9 r# g% X) R3 E& f
}) i7 c0 L/ s; l }8 q1 i1 Q/ w; @
% ], D/ P) V( \: J
: K: _/ p3 T$ b; @
//**************************************0 v8 r' r e0 g# ^* e% q9 v
//初始化MPU6050' h4 Q* ~1 M0 P: k& k7 W2 X1 ^
//**************************************! A- L6 M" N5 e& s) N0 v5 Z
void InitMPU6050()
& o3 f5 J8 U6 F, ~6 f# v{2 L9 G0 \% p5 a
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态
2 i# \8 U% i1 E) y' J Single_WriteI2C(SMPLRT_DIV, 0x07);
( K4 o. e. ^) l" I Single_WriteI2C(CONFIG, 0x06);
( {) r& E3 \+ Y3 |$ _0 J5 Z! H Single_WriteI2C(GYRO_CONFIG, 0x18);
|* w4 g6 V% M! Q# |( k) L Single_WriteI2C(ACCEL_CONFIG, 0x01);
) L% M [' p6 ^7 G5 j9 g}+ B* v3 J0 J: c$ O( o
//**************************************0 ^" z- A/ H v& {! B* m2 P
//在1602上显示10位数据
, Q" ?0 m9 X, }& H//**************************************
; b; J2 @# P B0 n9 o% {( d7 fvoid Display10BitData (int value,uchar x,uchar y)
o3 h. T# v- T- [* @{' H, \9 s2 Y0 B: r7 A
value/=64; //转换为10位数据 value=value/64 右移动六位
: Q( I g. T- y1 t; \$ a lcd_printf(dis, value); //转换数据显示 e6 }/ i5 m3 i7 Q% ^% _/ i1 k
DisplayListChar(x, y, dis, 4); //启始列,行,显示数组,显示长度
2 x& |3 W7 I3 e$ M; u}
' ?- r, X8 S: H9 Z2 b' s; z6 W* L2 C1 J//**************************************
X- u2 |, h. B& A k+ m: Z) t& n//合成数据: f# g( I: ?5 _: F* S$ d5 t
//**************************************8 s: j3 H5 @$ R: Q, K) i& K
int GetData(uchar REG_Address)
, d9 p, w+ m9 r0 u; O% e' G3 O2 R{
8 {) e1 j8 S# |8 v+ U' C char H,L;
; _4 G. J+ {2 f R: q H=Single_ReadI2C(REG_Address);
. d. F6 D( G% H0 M L=Single_ReadI2C(REG_Address+1);+ E: h+ f7 n# Z0 j9 T
return (H<<8)+L; //合成数据# x& @+ X# F2 e, Y; X: c
}
$ _* I- @ Q) x7 P, S. P) n, w& s W; f
9 t6 e! i# P0 l" a6 R6 g: z
9 W( ?& p: V' s5 H5 z4 k: x0 N0 f
//**************************************: w3 Y- o/ P3 X# H4 D
//显示温度
0 j( j) s; a4 R2 `* Y* K//**************************************
6 o5 e3 Q. O: ?% [//void display_temp()* ]/ O* \; B1 S' J/ z
//{
. N' q G* f# ]8 Q// Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
0 c# K* O* O9 r4 ~: u2 C// Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度! G2 D5 s5 \' T5 L
// Temperature=Temp_h<<8|Temp_l; //合成温度# ]: v7 ] N' D6 u0 k* C1 U7 }
// Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度1 H3 ?) y: h/ ]( `; L: i# g+ v
// lcd_printf(dis,Temperature); //转换数据显示$ z/ c4 [ G8 U7 O% O1 r1 ^) y/ a
// DisplayListChar(11,1,dis,4); //启始列,行,显示数组,显示位数
' k7 I7 s1 Z7 X: y5 |0 w" b7 |6 q//}/ s: V4 Y }4 G; h, W. G3 f
//*********************************************************
( S. C5 n5 b p9 L# m//主程序3 p" t3 _- Z8 }; {0 l
//*********************************************************
$ b4 r. Q& C4 k* Evoid main()5 D! j0 x0 g1 ~9 K/ @
{
, q% e3 K9 v1 b- _* `) N delay(500); //上电延时
& y; b9 Z& I- x" K InitLcd(); //液晶初始化7 ?2 u8 H/ p! p8 k6 B
InitMPU6050(); //初始化MPU6050
; b4 [1 @" x+ w! K, i) P; y delay(150);
9 _, M" y% t# P6 D, i while(1)
& B; ?3 s! Q; e9 q. h% T" x! K; [0 P) k {
0 `7 s+ a% e! u1 ` Display10BitData (GetData(ACCEL_XOUT_H), 2, 0); //显示X轴加速度3 H' n8 S+ c, Z7 e5 Z: C0 f
Display10BitData (GetData(ACCEL_YOUT_H), 7, 0); //显示Y轴加速度
! H7 Y" X& N! Z) x" ?! h Display10BitData (GetData(ACCEL_ZOUT_H) , 12, 0);//显示Z轴加速度9 L: X; M' J/ u; j$ w6 P3 B
Display10BitData (GetData(GYRO_XOUT_H) , 2, 1); //显示X轴角速度% P# j4 O3 J* X- }" o* t
Display10BitData (GetData(GYRO_YOUT_H), 7, 1); //显示Y轴角速度
& \$ H/ q0 t! r& g& Y/ k4 }2 d Display10BitData (GetData(GYRO_ZOUT_H), 12, 1); //显示Z轴角速度
0 L) G y+ I' a' o) X, t+ y delay(500);
* l) T9 D3 s- R }- ?8 t- _3 p" }' c/ p2 N
}9 k7 b; x6 {) t4 m6 H$ F; i
|
|