|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错1 x% s1 @) r8 {1 ~6 _! D
#include <REG52.H>
: \& B. a! d, \, G! a* A#include <math.h> //Keil library/ f* G3 _ d7 G1 ]" B) Q* w- I7 Y2 W
#include <stdio.h> //Keil library
# l' c j6 S. {: j9 w8 R#include <INTRINS.H>
1 @ }2 |$ y+ b: u _5 B) @1 ntypedef unsigned char uchar;/ ]9 B V' g* c3 Y3 z4 v
typedef unsigned short ushort;5 n2 ]( q8 E [ m/ B
typedef unsigned int uint;
" B! d9 m9 Y- o+ i' i- [//****************************************
2 q, m0 Y- ]8 h8 R8 J# t// 定义51单片机端口) P! G; b6 w7 m/ A- s; {* u
//****************************************6 m7 C* s/ D4 Q6 r% F$ w( R
#define DataPort P0 //LCD1602数据端口
6 q' ?& P9 s" Rsbit SCL=P1^0; //IIC时钟引脚定义- f2 h9 \/ f" _ R
sbit SDA=P1^1; //IIC数据引脚定义4 D' ?: I' b* M6 K, Y l
sbit LCM_RS=P2^0; //LCD1602命令端口
: N+ _& {. |% M J8 A9 V* ]& }sbit LCM_RW=P2^1; //LCD1602命令端口, R' x' a+ ~8 E
sbit LCM_EN=P2^2; //LCD1602命令端口, F) m7 |! C1 W) z
//****************************************
1 b: G2 X4 Q! O9 r4 R& k* k// 定义MPU6050内部地址
; U# B3 x' G4 A! M, b6 U//****************************************6 _1 }) Y$ _: L3 ~' l
#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
7 X1 Z, `7 ?( e#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
/ u$ d' E- w6 @ w#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s). }9 @& k. P3 Y2 _, `/ L4 k
#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
( A( e9 g' \6 G; U6 R#define ACCEL_XOUT_H 0x3B
; W: E. R5 D9 o$ L#define ACCEL_XOUT_L 0x3C" a" d% u+ @& ~: g- _+ d
#define ACCEL_YOUT_H 0x3D
X9 K# Z' \9 J2 b( ^: H& P. R#define ACCEL_YOUT_L 0x3E+ Q9 \' x7 }- z. s- s; e
#define ACCEL_ZOUT_H 0x3F
0 r H$ N6 i1 B* V#define ACCEL_ZOUT_L 0x40
& k; S" B7 s+ |) ?7 v2 v6 o#define TEMP_OUT_H 0x41( C4 k; F: _5 k9 u" n& D4 ]
#define TEMP_OUT_L 0x42
2 ~1 ]5 ~% Z" V: c& G$ \#define GYRO_XOUT_H 0x436 `& d, S5 F N8 `; g4 l- I
#define GYRO_XOUT_L 0x440 b J4 V$ k' Y) A
#define GYRO_YOUT_H 0x45 z6 L. r5 U' m! n9 G+ h3 r. z
#define GYRO_YOUT_L 0x46$ k4 h, A! l1 h7 {* Q# u
#define GYRO_ZOUT_H 0x47
) U% Q! W# n; ]% b, X/ s* m; Z: E* o; |#define GYRO_ZOUT_L 0x48; M/ i) o! P2 F. R( k2 ] @
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)) K# v+ Z4 M/ U m
#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读). N x6 O; A- [, m7 W2 \
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取
9 e* x( w6 @+ q9 X//****************************************
" h: l; O; m. o- x" [//定义类型及变量 Z1 W! x# s& B! U
//****************************************& Z+ z: ` L3 a6 Q, E
uchar dis[4]; //显示数字(-511至512)的字符数组* q! Q* }8 T7 E+ n$ {
int dis_data; //变量
& ^& r y, ^3 n0 h0 g) |//int Temperature,Temp_h,Temp_l; //温度及高低位数据+ e, i) d6 j1 v% C2 m% S
//****************************************
m$ U4 g; U! x: z. F; @//函数声明
6 m% I* V9 O: v$ U1 h. P//****************************************- H1 a6 b/ r1 z; o3 R" @3 [1 Z
void delay(unsigned int k); //延时- g( @ Y6 ]% T& c: O" |# d
//LCD相关函数5 X6 d! P& e+ L1 Q: Q
void InitLcd(); //初始化lcd1602
2 Q" B' m5 q6 E9 v) {& `void lcd_printf(uchar *s,int temp_data);8 f. Y" f. [/ `- v( P9 J6 ?
void WriteDataLCM(uchar dataW); //LCD数据
, M% N( A4 B: [void WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令
1 W( Z' f1 J1 @void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符' j7 g3 G* A( d& o
void DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串
# g0 p3 _8 F" D; n% ^% o//MPU6050操作函数
, O* ?7 k$ w4 C( Fvoid InitMPU6050(); //初始化MPU6050% v- X. @4 X: u1 \5 N# Q
void Delay5us();' |1 e# o: f+ i5 z2 E" U* U; |
void I2C_Start();
# _7 x" M9 n: W0 tvoid I2C_Stop();
* Y, V% e9 i6 T& } t( x, W
/ J6 M0 K8 S5 z" K; ?" jvoid I2C_SendACK(bit ack);
4 G/ V9 w0 e p- ]bit I2C_RecvACK();
( V/ ^* }8 C( ?1 U8 z( Y* s! g
; u% A( U5 i/ L! ?$ Q% hvoid I2C_SendByte(uchar dat);
: R/ }8 W. _2 Z. [6 P0 Guchar I2C_RecvByte();
4 m0 r9 ?8 `: z% T# d0 B( K+ q7 t) R! h8 S0 Z$ E
void I2C_ReadPage();( W- \: \9 O% O7 R
void I2C_WritePage();
) k9 }" O4 H% l5 m. i, hvoid display_ACCEL_x();8 F" h( n- v0 R
void display_ACCEL_y();
- M) A5 ^% ]- m& ?; ]! d/ c! |) kvoid display_ACCEL_z();
6 e9 ~& A! d8 ]) _# Tuchar Single_ReadI2C(uchar REG_Address); //读取I2C数据
) b: s0 ~: f% svoid Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据( s a" F# r6 B
0 B9 Q3 ^3 p/ ]" [$ l" l4 F
' i$ {8 E# s+ w: F$ Z
//****************************************, E4 J- u7 d$ I) \) H/ ^7 ~3 \, E
//整数转字符串
b! w/ a1 N: y# f0 @2 \//****************************************) ?6 {: Q" }" K5 ~/ P5 s3 V
void lcd_printf(uchar *s, int temp_data)
( Y: ~& V% F( Z. F. I{, c u& n7 A) R% n; X
if(temp_data<0) U& Y( G: P# ], S% y5 \! Q& _7 I7 k- J
{* |0 E2 u0 [: X
temp_data=-temp_data;$ i9 j: U. D0 A- i3 U- B
*s='-';
$ | G8 i. o0 h0 C }
& r e# f0 u& _# s else *s=' ';
0 }/ z' A J% G) K6 X! j *++s =temp_data/100+0x30;3 K/ t7 u" z& C. S/ X: V
temp_data=temp_data%100; //取余运算7 V+ _4 s1 c" K* `# Z
*++s =temp_data/10+0x30;) T' G3 N" L8 r& r* j: _; |2 P
temp_data=temp_data%10; //取余运算
0 p' s7 j+ e( N }6 b5 x S# B *++s =temp_data+0x30;! Z" Y( T! R6 Y, U
}
2 W: h6 w; C5 @//****************************************
3 w2 \. ?$ }" r7 ^//延时+ ^; m2 r2 d% A7 }' q
//****************************************
& p( O/ j/ f. [* @# b* i: |void delay(unsigned int k)) _ E' j; N3 l
{
. b" V' n9 h' f; ] unsigned int i,j;
% E' g$ E( E: S/ k7 `7 ~) ~ for(i=0;i<k;i++)8 i: W/ T) D; e$ d: c
{1 Q+ }8 w- n8 O8 x# R2 r
for(j=0;j<121;j++);( \0 W2 |& w( K0 G6 }% ~
}
& {! Z6 V/ C9 B. E: [}
4 I$ t4 }$ ~0 w2 g$ r//****************************************
8 o4 z$ _4 x% H; ]! o% I- r) f//LCD1602初始化) k; j) X/ c& H8 A
//****************************************
9 ^9 _0 i+ v0 i- p3 o9 V# avoid InitLcd()- L1 E" {& ^1 A4 \* @( L
{5 V( R, q+ i8 N
WriteCommandLCM(0x38,1);. R5 [/ h4 X8 G( }1 |$ T5 J% ^$ `# {/ ?
WriteCommandLCM(0x08,1);9 |; @4 u V7 _
WriteCommandLCM(0x01,1);
, Z$ l+ W$ m* x. E5 I WriteCommandLCM(0x06,1);
2 c, R& C; B4 K! u1 a WriteCommandLCM(0x0c,1);
5 Q9 v: n" q! h DisplayOneChar(0,0,'A');
: ?/ \) r/ Q9 l* T" |4 g9 ]) X DisplayOneChar(0,1,'G');+ W' U# u1 r" I F1 Q
}
% C/ _$ n! c5 p" P( w% ~( r) f//****************************************
" n6 n9 W6 x0 v) v1 i+ C! d( z//LCD1602写允许; g1 l0 i; H' p( P; A5 `# N3 c
//****************************************
0 `5 u+ D: [/ R& v+ U' o5 Tvoid WaitForEnable(void)
* o! q) O4 c' C4 ]& `) X{) y' F) C7 P( a6 |6 g
DataPort=0xff;
( Y% Y8 T1 l5 x6 D" D/ w4 y LCM_RS=0;LCM_RW=1;_nop_();
- ?$ [" Q3 L: j+ K LCM_EN=1;_nop_();_nop_();7 Y6 n, p& J; v7 z! O1 R
while(DataPort&0x80);! e" `8 d; {% p2 J9 o; b
LCM_EN=0;7 c' N; E& ?/ x7 b% J0 t2 W4 I# c" j
}# _6 A, ] {% Q8 ~$ T6 @* h0 c
//****************************************( `+ s6 e. R' F0 v0 p
//LCD1602写入命令; i% K5 m; i' d9 B# @( E
//****************************************0 `9 Z' q' ?3 d" Y4 L2 V9 `$ E
void WriteCommandLCM(uchar CMD,uchar Attribc)+ I5 T, X5 D! H- p+ j$ ^
{
( e- S; ]3 k% ^ if(Attribc)WaitForEnable();8 d/ }9 u/ I8 R9 e0 s5 ?# V
LCM_RS=0;LCM_RW=0;_nop_();
0 c9 ]- O& B ^* ~! i DataPort=CMD;_nop_();
; \% @/ Z0 O, e$ ~4 v" g LCM_EN=1;_nop_();_nop_();LCM_EN=0;
5 h% T' R! p+ {0 ^}
; g2 U q. T' N" c( M' |4 o7 H//****************************************
" i! \9 V& v* A; x3 P: @//LCD1602写入数据' k6 y' S! u" q" X
//****************************************
& A$ X* K; T# j$ i. H5 ^void WriteDataLCM(uchar dataW)
. M- l; s$ `* D- X9 ^& H{0 ^3 M# R: t: N. b
WaitForEnable();
6 P# M6 q3 c! |6 a i LCM_RS=1;LCM_RW=0;_nop_();2 N8 f9 q3 Q8 y9 [0 P# k
DataPort=dataW;_nop_();
1 q% U+ ^. G" W LCM_EN=1;_nop_();_nop_();LCM_EN=0;% h# ^/ a1 E' H( R2 p
}5 X. p+ A( K \6 a% B* d3 [
//****************************************
% _3 e h2 x+ }$ E* S" j# \//LCD1602写入一个字符( Y1 J/ v' S, Y# j) s
//****************************************
) s& Y" z' t" M: [void DisplayOneChar(uchar X,uchar Y,uchar DData)1 F, e/ f/ P- R, y
{
: R }. C/ h1 s" P7 I5 ~9 r Y&=1;
/ X$ x/ K5 l( @+ E X&=15;
1 `8 j) ~) I: `) \9 e if(Y)X|=0x40;; y/ T" q4 g3 A8 x; k8 g
X|=0x80;. ]. A9 Y* }+ o r; w$ O; ^
WriteCommandLCM(X,0);" u. X0 M7 U# U" _6 o8 s: X
WriteDataLCM(DData);" _) P3 b$ k+ Y) U
}
* O6 u. V |/ e. ~! L//****************************************) C+ T6 A- z. U/ n: e+ }0 S4 |3 p$ o
//LCD1602显示字符串# g- R' l# J" ~6 s# q8 J2 f7 }+ }
//****************************************
( K7 ^! c5 L8 Y. e% T* E1 M- q' @void DisplayListChar(uchar X,uchar Y,uchar *DData,L), L/ R1 ^0 X( V$ s, L) @+ u- h
{) Y8 L3 }) n; w. U5 k. `4 {! ~
uchar ListLength=0;5 Q! {' _" O% m1 `8 M# c
Y&=0x1;
4 |' ]' K2 O& k: X# _. \& W: _1 Q: n X&=0xF;
- a8 \: z6 C; _# G, n while(L--)& a- r9 D/ G* I6 e, G& q: U
{
) [8 C7 R6 m$ ]5 ` DisplayOneChar(X,Y,DData[ListLength]);- _4 F$ [0 I: o7 `5 F! Q
ListLength++;
8 z, d) J$ n8 C, @ X++;
; w$ H7 e$ ~( }: l }
' Z& q* v& Z" ]7 x6 z}
- i7 _0 y' `: W( A, t# b, o# b( g2 B/ w O
//**************************************/ U) B9 | |8 x K$ S& }5 k
//延时5微秒(STC90C52RC@12M)2 H/ F$ F- q. v) C* U- ~, @3 ^% Z& k
//不同的工作环境,需要调整此函数
0 m* }1 G2 i% ~//当改用1T的mcu时,请调整此延时函数9 u% n& ]/ G( J8 C. R, S
//**************************************: u7 u; P- S: ]
void Delay5us()
, O$ @. z- z4 E/ N! N4 ?{
- g% ?! m! c# g _nop_();_nop_();_nop_();_nop_();
! S- ~ k9 i7 @* @( m1 ] _nop_();_nop_();_nop_();_nop_();
% ?# `0 g4 L, }7 F/ m _nop_();_nop_();_nop_();_nop_();
: ~7 r5 q3 e& n# t _nop_();_nop_();_nop_();_nop_();% d* ^7 { V; ]: o
_nop_();_nop_();_nop_();_nop_();" h$ Y9 y7 { g6 Q
_nop_();_nop_();_nop_();_nop_();
( d- z, i- v A/ U. k' e}
5 |7 k9 T* Y, n _8 I; w//**************************************# s% Z* @; z9 J/ z( c
//I2C起始信号6 P) a- z5 O$ L; R
//**************************************
! M% [# X7 }: u" c, H8 \void I2C_Start()
0 w" [. M3 B) G( P9 j3 H0 ?{
0 V1 n8 ?/ k. L9 n' E SDA = 1; //拉高数据线
( P# V* u- Z; u4 A' j$ s9 @( ^ SCL = 1; //拉高时钟线' r! `. m/ z9 V2 r# Y! U
Delay5us(); //延时5 g3 o/ O+ \/ B4 B# F6 _; t, g
SDA = 0; //产生下降沿
5 z% u3 g6 k# q! E, [ Delay5us(); //延时
5 X( T) C% J; H* y6 }( v2 g7 ` SCL = 0; //拉低时钟线2 ]' M) R7 T( d9 ]6 x
}
- E- t! {! v" }/ M) A//**************************************( q0 ^+ j3 B4 v" f1 S$ J
//I2C停止信号' J8 ]! b4 [$ V" c6 [
//**************************************
! P9 K, O- |3 [4 m( y! z7 Uvoid I2C_Stop()
7 C. t) {+ j1 o& ~! k{7 [4 a7 c+ c8 _' T, C
SDA = 0; //拉低数据线8 o% i; h# G+ d! T
SCL = 1; //拉高时钟线
( K$ K! S4 M( N' K Delay5us(); //延时
4 e; y* w0 e1 A( {; \ SDA = 1; //产生上升沿. Y, x3 n5 {5 t* q" D3 S
Delay5us(); //延时
$ Q6 E: q: w$ u# \}) y- _' e, S5 w- K9 q' k1 y$ Q* Y1 H
//**************************************
Z, _' B+ d0 e6 I8 Z//I2C发送应答信号
8 W# J( `! R9 ?9 ]0 E: @$ D' |, {//入口参数:ack (0:ACK 1:NAK)
0 I: Z! L0 C) _//**************************************
9 g4 o3 E% _1 C8 H+ k( s' Jvoid I2C_SendACK(bit ack)
8 ?! w( C5 f$ b{6 [8 m6 Y$ W- b- `% A9 F" ?
SDA = ack; //写应答信号8 u3 l& m) J! w7 C
SCL = 1; //拉高时钟线3 R7 @ K* _4 w. x: z* k8 ~5 t V# e
Delay5us(); //延时% q, J# S0 k& B6 y- _
SCL = 0; //拉低时钟线
9 M' Q5 }* e6 S; E4 g Delay5us(); //延时
" W! l/ s0 Y4 B! H& I) x, ]2 h}/ y0 P2 o' l! Y/ F6 l/ x9 {- B# ?$ `1 ^
//**************************************8 e/ F& i4 S1 y
//I2C接收应答信号1 f$ v, d( r! w: i- K* c: L# b
//**************************************
/ E" U2 Y: K+ q3 q# Ubit I2C_RecvACK()0 x: c$ N8 G# R. g: Q, F' s
{+ g+ b& C$ s" w% y4 P/ x
SCL = 1; //拉高时钟线
6 ]3 d8 h& V. ?! |! H4 F1 F Delay5us(); //延时
) I7 ?, S9 v. Z& \3 @" a CY = SDA; //读应答信号
3 |2 d8 x9 p) e$ T V) c8 S SCL = 0; //拉低时钟线- O* J: @7 W: }& c; q- \+ }
Delay5us(); //延时, D }! g2 }. o5 W3 E$ w
return CY;
% f- I$ l* s) ^+ T; }) w6 q}
, w% f% L i: k2 }" A8 l. ^//**************************************- b) b9 @/ r$ Z& {3 M2 p1 v$ A. }
//向I2C总线发送一个字节数据
3 o0 ]$ r& }' r" W6 s9 }//**************************************
; O- j, L0 ~- n0 ovoid I2C_SendByte(uchar dat)0 u" @0 m# B/ x, @" Y" D! U
{
, A# {" X8 n# P/ h uchar i;
! |$ ]+ s H5 J' s' j for (i=0; i<8; i++) //8位计数器
" r y9 @ [2 ]' {6 S {
( f4 D$ x7 l1 A- V/ p1 { dat <<= 1; //移出数据的最高位# H, m5 J1 \: ~: u& z+ a- @
SDA = CY; //送数据口. T% x+ b2 x. t# l& o! ~) \
SCL = 1; //拉高时钟线
7 q( c' a. ]. g2 E7 B | Delay5us(); //延时
$ ?7 R/ @" Z& W d3 ^ SCL = 0; //拉低时钟线% S2 E+ k- ^+ w2 X$ P
Delay5us(); //延时! \: N) B/ D" ?. H
}
7 K* w& l n& p. u' M* x I2C_RecvACK();) b* W1 [8 T7 A1 Z! ?2 h
}
/ R' X- j, U4 p, r3 ]4 h//**************************************$ j# l6 Y9 r" A
//从I2C总线接收一个字节数据, i4 J2 y- i* P5 X8 T
//**************************************
0 {) |& a' {" l9 o; \" u) P2 A8 e. Ruchar I2C_RecvByte()0 s5 y) c2 [* l# ?6 [
{
1 a, G" S# G4 X& `: S) o' ]4 O8 l uchar i;% r( f/ s: A1 C! T+ s( }( t+ e
uchar dat = 0;
6 ]' E& X+ l" A* u7 H. u1 ? SDA = 1; //使能内部上拉,准备读取数据,
; M6 p0 _, @& W0 ] for (i=0; i<8; i++) //8位计数器
: @+ B6 j) g8 n, p* P, G { ], |+ t) f& b1 Q
dat <<= 1;# l( a, L' q5 H+ `! P( ~
SCL = 1; //拉高时钟线
! |% k1 w! M. D. x5 ^! m& A Delay5us(); //延时! V9 w$ z, w) H7 F! E) Q
dat |= SDA; //读数据
0 R0 b4 B, L# G. i SCL = 0; //拉低时钟线
$ R3 E$ d2 t7 n0 d Z# t Delay5us(); //延时
" d( C" s) _2 a' m7 l* l2 N }
6 u# h3 d1 o4 h" k( ?9 r3 k return dat;
% B% D; U9 ~4 g& u" h}/ ], O" @& @" {
//**************************************' ~) ?& q6 D: e* E" m% v6 p! C
//向I2C设备写入一个字节数据
* m7 I( i' m- `; v0 p; R5 e//**************************************# F l( @9 C- l& i- S0 |8 G
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
! B/ x3 S6 S5 b# S: H, @{
- \. V5 H# Y* M6 c I2C_Start(); //起始信号
1 k7 j3 q$ j5 }& K/ m. s I2C_SendByte(SlaveAddress); //发送设备地址+写信号
* U* q0 O6 E3 @5 s% [7 J2 K I2C_SendByte(REG_Address); //内部寄存器地址,7 l) K! o. }" p: _* F" V2 k6 N
I2C_SendByte(REG_data); //内部寄存器数据,$ ?% k' F# v+ W' }
I2C_Stop(); //发送停止信号9 y+ o2 P; ^. ]0 v8 h- z, M
}
% w. S# G3 h3 B( O5 X//**************************************# w1 |* K: U; z& j* }- o
//从I2C设备读取一个字节数据
. U) A6 Y7 }2 B. g9 _: z: H//**************************************6 I4 Q9 @8 V1 P" U
uchar Single_ReadI2C(uchar REG_Address)
9 W6 v+ f- X6 u R{( g1 G2 m- U# e- ] T- |9 @. c
uchar REG_data;
7 N% q$ b; d: w I2C_Start(); //起始信号+ e9 B1 l* a- f; F1 @3 E
I2C_SendByte(SlaveAddress); //发送设备地址+写信号5 f) t. u0 [9 s( Z$ i7 V
I2C_SendByte(REG_Address); //发送存储单元地址,从0开始9 E H% }8 p3 a* e) y k+ l" ?3 p
I2C_Start(); //起始信号5 w+ o% T+ L! P$ J: z
I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
, y) R* I( L9 S; _) v REG_data=I2C_RecvByte(); //读出寄存器数据8 W0 R2 n5 L5 Q7 f! M3 `4 N
I2C_SendACK(1); //接收应答信号
6 [& p4 W# V/ l; j% p: x I2C_Stop(); //停止信号
' L; n: g9 W8 g6 J% b% O8 h8 r return REG_data;
9 [. d- w/ L$ ]3 f) p: b}, p" s5 q: O* N- i! }+ G9 l8 p M" D
( O" W. m4 E5 r4 [
+ v. W' y8 o% k% p* V5 ?& E! f$ U/ v
//**************************************
& M- q5 O7 \( D4 u' T//初始化MPU60505 p7 o8 @/ k; K, b/ K; g
//**************************************1 r. Z. h9 O: m3 ~; l: `
void InitMPU6050()6 M8 |5 o# r( K7 z" G+ B$ c- K
{
; g2 |' N, f2 g6 y Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态. N; }. s' ~6 L5 [
Single_WriteI2C(SMPLRT_DIV, 0x07);
1 y$ J# \& h5 \7 @0 E Single_WriteI2C(CONFIG, 0x06);9 E$ u" e! ?1 G3 S! r
Single_WriteI2C(GYRO_CONFIG, 0x18);6 l6 A( z, \ z/ }8 o* Y5 v9 k/ {' S% L
Single_WriteI2C(ACCEL_CONFIG, 0x01); A7 [) \0 q0 u l! l
}5 |2 ~8 r& @6 a% _, ~
//**************************************
! S( x2 Z. L# C* d0 Y//在1602上显示10位数据 ^: D. W) ]( P% B& e! h! L
//**************************************
1 F7 Y, o8 ?4 Z0 a2 W K! evoid Display10BitData (int value,uchar x,uchar y)1 p" `# H9 j5 @: V7 m7 o
{
; Y6 d; \; E; d& y- s ~. z value/=64; //转换为10位数据 value=value/64 右移动六位
2 R/ r- T& [; u2 ] lcd_printf(dis, value); //转换数据显示
! C& m3 J) F+ }" F DisplayListChar(x, y, dis, 4); //启始列,行,显示数组,显示长度0 x* d" _" I* C% G9 A$ n+ i% n% q
}( q7 p! ?; M- b/ t- S/ d
//**************************************# N- }5 x( e& d, V" _+ a) z, S% m
//合成数据/ X7 Z* J, z: U% T$ Q
//**************************************" B( n/ s' r4 U1 }6 b; f
int GetData(uchar REG_Address) g9 K8 L- f2 S2 a" h
{6 F3 F5 S) }7 l
char H,L;0 \ `3 c: {9 @7 q# I* k
H=Single_ReadI2C(REG_Address);/ p' Q1 Z% b! F
L=Single_ReadI2C(REG_Address+1);! ^& l! e+ E6 B& Q( _* _
return (H<<8)+L; //合成数据% M* C4 K' M8 S* L* { I
}! h( A5 e6 x; I9 S
8 N% P+ ^8 |+ A6 K/ ~/ i
. S8 C: E% H' {& T% L. }
, k6 L$ o- r2 e2 V, f0 U- o* o. v3 N+ f9 i
//**************************************: |/ a$ L; n! }* G) E+ t
//显示温度) L& M3 G# W3 F% ]" Y) t7 \: z
//**************************************
) c# d% t+ w7 R8 a//void display_temp()
+ Q# n6 q$ W1 g* K8 M) Z//{; L, \! t1 i: T; @6 G7 D
// Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
6 {+ O; g+ {. Y( p// Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度' E6 V; T8 H, g' P% m. X) i
// Temperature=Temp_h<<8|Temp_l; //合成温度
0 w! k* B9 c# e5 o# e5 c/ g// Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度
- U& N' |" C- j// lcd_printf(dis,Temperature); //转换数据显示5 M, v8 |' d' d, | Y
// DisplayListChar(11,1,dis,4); //启始列,行,显示数组,显示位数" I# O1 m( |$ Q' y- ?' Y
//}0 B) C6 d" ^0 o! ]/ P4 i% Q2 u
//*********************************************************
: \5 a- e/ R( B% ~ M//主程序& }* l8 q I0 @% ]" A1 ]
//*********************************************************: A% b5 x, B9 f. _; v) T0 ~8 P
void main()
; g! C3 h, L7 n3 v( T! o{: A6 O& l ?- r. P4 _
delay(500); //上电延时
# S# k% s' n$ D3 Y InitLcd(); //液晶初始化
) k9 m, F$ S$ A5 d0 q8 p* `2 G4 c InitMPU6050(); //初始化MPU6050& {3 R+ z; E1 N
delay(150);2 U# s- n4 v- k0 B
while(1)
# f5 H2 z# _+ u& d# ^ {
3 f! U% Q7 ~- [0 }! ]/ R5 ]4 c) e Display10BitData (GetData(ACCEL_XOUT_H), 2, 0); //显示X轴加速度
6 ^5 J. B) o- B+ k) C% Z Display10BitData (GetData(ACCEL_YOUT_H), 7, 0); //显示Y轴加速度6 h1 _7 e' |+ v6 q
Display10BitData (GetData(ACCEL_ZOUT_H) , 12, 0);//显示Z轴加速度
3 S8 G; n- {7 u/ f1 m Display10BitData (GetData(GYRO_XOUT_H) , 2, 1); //显示X轴角速度
2 f" ?" o2 `6 c/ _ Display10BitData (GetData(GYRO_YOUT_H), 7, 1); //显示Y轴角速度0 s& T& a! _+ i8 D* \* v& n- F3 M
Display10BitData (GetData(GYRO_ZOUT_H), 12, 1); //显示Z轴角速度
. Q# }2 e- r) g Y( l delay(500);
A' ~- [) h' Y }5 B1 E5 g/ C8 x* f
}/ |7 B1 m5 t$ i6 f- `
|
|