|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错4 ~6 L! \ c8 t: @3 W4 P
#include <REG52.H>
: F& J1 W2 g; t3 E5 p; \#include <math.h> //Keil library0 ]: i: y3 c+ j6 \" B1 e- K
#include <stdio.h> //Keil library
0 a! V, ?* S$ b& T, ^6 f1 _#include <INTRINS.H>
8 u3 a8 ~+ W0 P2 f2 qtypedef unsigned char uchar;
, a1 ^# A4 |; B- C% V& R8 Utypedef unsigned short ushort;
; P- J" L* p( ntypedef unsigned int uint;& O; g5 k/ q9 L' V5 [
//****************************************
7 b. [/ C! h( M3 R7 L4 g// 定义51单片机端口$ h8 u0 T* @$ x& X% `
//****************************************, |5 N. W6 Q- N& f+ m
#define DataPort P0 //LCD1602数据端口( y; W# n$ ~# {0 V( D! A5 ~* w
sbit SCL=P1^0; //IIC时钟引脚定义
: y0 l& z( Q0 M! e$ X6 Hsbit SDA=P1^1; //IIC数据引脚定义
# x. F( t2 x3 p! dsbit LCM_RS=P2^0; //LCD1602命令端口7 a0 i$ e0 k' H2 W9 i7 ^" o
sbit LCM_RW=P2^1; //LCD1602命令端口
* u. D1 @# y; Q9 {4 [" Q; ^sbit LCM_EN=P2^2; //LCD1602命令端口1 O4 `3 ?6 D$ I
//****************************************. d3 m. d7 S7 U, c# E
// 定义MPU6050内部地址
; \) a; m2 ^4 Q" ^* U* T& w//****************************************/ B; I1 X5 C- [. U7 G5 K
#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
" [$ L4 q: }# h% d! B8 ?# y#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)9 z" P0 a; F/ }& n( q
#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
* |: @, [' w0 g$ x9 @/ v#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)8 T" p. k* h7 h4 j
#define ACCEL_XOUT_H 0x3B0 r Z# {+ y, ~/ Y. l: V
#define ACCEL_XOUT_L 0x3C1 m% z, t5 Z% F* x
#define ACCEL_YOUT_H 0x3D
* B- P! Z5 L! o# C8 k9 g8 c#define ACCEL_YOUT_L 0x3E
9 c6 p) z& Q5 ~) ^' \ D, f( q8 V#define ACCEL_ZOUT_H 0x3F2 m( g6 S' m8 s1 k2 Y- X
#define ACCEL_ZOUT_L 0x40
. M' X6 q/ w! K5 D: r% ]2 B! I- `#define TEMP_OUT_H 0x41
8 s2 z, f9 d. n' ]# _% N9 P, o#define TEMP_OUT_L 0x421 R) B1 \& E! S M" I% e. B
#define GYRO_XOUT_H 0x43- U' l8 c' c% m& ^1 p
#define GYRO_XOUT_L 0x44; V3 p2 N8 q& |4 }5 A- Z
#define GYRO_YOUT_H 0x45
. T3 a+ ^( `8 }$ d#define GYRO_YOUT_L 0x467 q/ r' k% \3 m, s7 W8 y
#define GYRO_ZOUT_H 0x47
- p- p( o. V! w8 U. M#define GYRO_ZOUT_L 0x489 ~6 e; k8 p3 N$ F4 Z" T. P. g0 \, l1 {: G: j
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)! J5 a% T) f% U( S7 c. ]
#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)( O. w" @7 p' H# Q( i% K6 [
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取
6 m1 L1 U) h8 D2 O8 X( y1 L//****************************************8 b. h' j7 S- y2 U: U% N4 @3 \7 P/ d
//定义类型及变量/ J3 f. G1 s* b$ F- z! G F
//****************************************0 o- [- ]) J- ]" ]5 K
uchar dis[4]; //显示数字(-511至512)的字符数组2 o( _7 h: [/ [1 x1 a/ {+ H
int dis_data; //变量: x9 I: D7 I! a7 o. N: g$ c
//int Temperature,Temp_h,Temp_l; //温度及高低位数据4 {- A6 [% r2 U- H! n! a
//****************************************
. i5 w: ~: M7 t# A- c, ?//函数声明$ r: w* f. f5 a0 d8 a- \4 q
//****************************************
% h) \- y7 _! E. k4 Mvoid delay(unsigned int k); //延时
, p0 v- i1 v6 K" B" t- N" @//LCD相关函数
. u0 X3 B, J+ b4 x7 a3 W" `- Z& Uvoid InitLcd(); //初始化lcd1602. C' M) J7 U3 F T$ J Z& G
void lcd_printf(uchar *s,int temp_data);
+ M+ Q0 J" x4 b" J y3 K7 H- Y; jvoid WriteDataLCM(uchar dataW); //LCD数据
! q/ m: X( g- g3 v/ ^4 Uvoid WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令+ H ~4 u& Y* a; |
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符
- ?+ M, u, N) Hvoid DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串; z) \& k B# T, x
//MPU6050操作函数2 a [1 n) o, C9 D/ s
void InitMPU6050(); //初始化MPU6050
# y# v7 L1 R) W7 cvoid Delay5us();
$ J+ s$ V# B/ P# U2 C$ d- V2 {void I2C_Start();+ j1 C+ k7 G9 H* @
void I2C_Stop();
+ } r* q! Y3 E1 U- m! U& C3 [& V! z, ?
void I2C_SendACK(bit ack);
9 n+ h) R. M& u7 x# Wbit I2C_RecvACK();: ^3 ~+ i$ ]9 D
0 t) P! u+ n* p" `& svoid I2C_SendByte(uchar dat);0 S6 s. N. b1 |
uchar I2C_RecvByte();1 m$ J! G' @' y2 ]8 N) O$ a: i7 @# G
0 _$ S) Z1 @* Pvoid I2C_ReadPage();. ~9 O3 l; [4 x: u5 L+ |8 F
void I2C_WritePage();
% g( _7 d/ D. D' a" K {3 uvoid display_ACCEL_x();
1 f1 r. |; s7 h1 k& l8 M. fvoid display_ACCEL_y();6 g7 U: Z) ?8 A; B! q1 d0 {: i
void display_ACCEL_z();
7 A9 y5 P) O' Buchar Single_ReadI2C(uchar REG_Address); //读取I2C数据7 z& }- n* T& O$ Q2 W2 J1 t
void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据6 Q9 t0 W: [" `# S$ P, S! A
" d- [" T2 v9 E6 c
- `- ~* G: l% a0 D
//****************************************
. K8 F( W$ {9 M//整数转字符串
6 M1 @6 S8 E8 Z1 Q5 p//****************************************
7 Q. U6 _& F3 B \3 I* }3 s cvoid lcd_printf(uchar *s, int temp_data)
( i# F I4 d$ A4 w+ [9 E{9 N& V. ~4 b/ T. W- N* M% Y5 M
if(temp_data<0)
# X8 C* q* y0 u1 o1 P {
: f9 r* d" ~) z temp_data=-temp_data;
9 c; ]$ U y) \- [: J. t& c *s='-';
% M5 ?5 A- c) @* H7 B1 s" c: [ }
6 T. Q* S) G1 r* ?+ _* @: n1 E else *s=' ';
8 e x3 Z3 J* M4 N *++s =temp_data/100+0x30;# E$ E2 [& t7 F- r+ N
temp_data=temp_data%100; //取余运算
V; {1 W0 v. ]" G. s *++s =temp_data/10+0x30;, Z7 _6 h9 S- b1 r
temp_data=temp_data%10; //取余运算+ z) o+ w& H& R2 V6 u4 ]
*++s =temp_data+0x30;
5 t0 s+ e7 b' p4 \, U}9 h4 h' l, ?) g' }
//****************************************
/ p4 a0 T! T0 C2 e//延时4 f/ D' G- r1 ^( O5 G- h4 z9 d
//****************************************4 ?2 j+ |/ B [. r) m
void delay(unsigned int k)! O# V7 A$ h8 K/ [9 Y
{
0 X. U& o, q4 U' b9 g' u unsigned int i,j;
2 ]1 I# S6 h1 g for(i=0;i<k;i++), s- Y2 W$ ?& u+ ^( v# x! y
{
' w4 I% g8 q& N5 ?. v: D for(j=0;j<121;j++);$ ^# F& P$ o# \& Y* ? \0 G9 C
}
1 x7 j# j8 N6 f D$ C# p4 I}
6 N! K6 K6 ]; W D F: Q2 L//****************************************
! V8 H& t- j! e) K! P) H//LCD1602初始化
( Z. }9 |/ N6 X5 e! t! G: K1 ^//****************************************. p' F* M2 H, n& n& L
void InitLcd()
/ X6 i# X! Q/ }: b6 P' l{6 T$ x( \& h4 d4 U% O: E2 R
WriteCommandLCM(0x38,1);
5 |* { k' i4 A4 z2 b, r% W% r WriteCommandLCM(0x08,1);" L; _- q) [' m V4 L: i: N
WriteCommandLCM(0x01,1);! m8 N$ B" i' {1 [
WriteCommandLCM(0x06,1);4 h, v5 P& Y' o( l$ T. K1 n. Q
WriteCommandLCM(0x0c,1);; a( l8 U0 P' E2 |
DisplayOneChar(0,0,'A');
/ z: Y' h, D8 q" s3 Z9 K/ W- p0 M4 ` DisplayOneChar(0,1,'G');
+ \8 {. h0 g b8 ?}1 `" f- Z2 k$ I7 g" z) W2 ]
//****************************************
' I C# z C; f1 e# Y" p7 X//LCD1602写允许 O5 p' D' t4 k4 J* f0 P
//****************************************% w8 `4 V0 N; d2 A [7 {
void WaitForEnable(void)# [/ P$ F2 {/ v) V6 D) q" I
{
9 S# V* R" e S5 r3 z DataPort=0xff;) j$ T8 f1 |) z" {, j# Z
LCM_RS=0;LCM_RW=1;_nop_();
% }7 Y8 u/ ~6 H( T* @ LCM_EN=1;_nop_();_nop_();, C9 a" n9 T/ Z* f' e, I
while(DataPort&0x80);
4 a' S* [- x9 l) N! Z) t0 o0 |6 H" l LCM_EN=0;; a$ G, |% Z) Z- V5 a& g
}) Q& |) d: ]' L7 k( M8 c- [, I
//**************************************** l/ m+ P+ q' H8 }7 T
//LCD1602写入命令2 F, h: q+ s9 b# X$ h
//****************************************
% F! @: K( V/ L. n2 o5 T6 xvoid WriteCommandLCM(uchar CMD,uchar Attribc)
) ~1 [8 P7 Y+ Z) v3 i) t0 _8 `{
! W3 h! t9 H. v if(Attribc)WaitForEnable();
" U' w4 p# H) h5 b& x LCM_RS=0;LCM_RW=0;_nop_();% [! n5 \- E, ^9 P7 Z8 U
DataPort=CMD;_nop_();$ N }! M- W+ m& C$ @' r6 U2 i
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
2 Q' \/ _- x" x$ D) ]5 M}
2 C6 \& f$ W! C//****************************************
: k0 ]. x, N- G! s, Q//LCD1602写入数据
+ y, W; X- n$ d//****************************************
3 A x0 X. u$ q) S+ ]+ U4 ^! dvoid WriteDataLCM(uchar dataW)5 P) }* h% W# ^. k
{
$ a2 I' n% r1 y0 U WaitForEnable();$ q' I4 y* M' X
LCM_RS=1;LCM_RW=0;_nop_();5 v% M/ t5 K$ D) J! d
DataPort=dataW;_nop_();9 P4 b. X) X& a5 m/ ~, |- w
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
! x+ \" @) ]! Y1 U# g9 d& M}1 d7 U4 A' y/ `" S
//****************************************9 L: v$ \2 R$ Q& H) e* }2 s: ^
//LCD1602写入一个字符4 L" R5 l9 X1 Q
//****************************************: O8 p: d H% V& ^- O! R4 }( b
void DisplayOneChar(uchar X,uchar Y,uchar DData)
; }4 T x$ f, F- D/ i- { l{6 J& l, [ N( a2 A, f% P6 S
Y&=1;- s# @4 ?4 V4 i7 S2 C9 V
X&=15;: q. V3 m5 F+ P( z* Z, A, @
if(Y)X|=0x40;# V+ i6 Y2 [/ ]8 L
X|=0x80;
y+ ?7 p0 O @. m3 o, O; F WriteCommandLCM(X,0);0 F0 P, W, ^' n/ }
WriteDataLCM(DData);
" o2 H H0 Q& X) c" J( j}1 R9 S5 A) M7 r) i% F) Y" X! j/ ]8 k
//****************************************
- @. n! o3 g. g% R' ^6 t, M! w) z//LCD1602显示字符串& G: a7 Q; `! K6 D" W; n
//****************************************3 x/ Q7 b4 O1 g) P, j. ~) X4 M) Q0 k0 P
void DisplayListChar(uchar X,uchar Y,uchar *DData,L)- F3 F1 L: N* u: \' M: x$ W
{
: X* B( f1 v4 @% I S" c uchar ListLength=0;
* g7 W1 E- C9 t( H; E o9 a. M Y&=0x1;( {+ s4 e- [# N
X&=0xF;
+ `6 x2 T( j* s while(L--)% J, Y" w& Y% X$ a4 ~+ W. O* N* c
{* ?. P; R. V4 i
DisplayOneChar(X,Y,DData[ListLength]);# d, q; w/ p) o% |5 X0 S2 G4 f
ListLength++;/ a- X" P$ i! }1 s9 f
X++;" ^3 \- o9 g' [7 e' @9 F: @
}( Q4 O. M' H( a7 h
}+ ]9 A6 I& L7 _% Q, l. {* h* R: u( T
7 [6 ?, T& g5 N. n+ V% I% s; F
//**************************************- ~9 @/ C3 `. @# ?" M. P
//延时5微秒(STC90C52RC@12M)
6 K$ Z& f3 Z4 |3 _' d//不同的工作环境,需要调整此函数
- c$ N# [6 P' K0 s$ J# z& f% M//当改用1T的mcu时,请调整此延时函数
; @# A! L3 h4 ]( V. {" j" O# A//**************************************; T& U( w& G7 s6 C& U7 K! e! c$ z$ c
void Delay5us()+ b" L$ e. ^: B) {- N( }
{
9 r& |1 b1 F1 f6 o# C _nop_();_nop_();_nop_();_nop_();
8 ?) f& a/ q( ?+ | _nop_();_nop_();_nop_();_nop_();
! q z7 [# I/ L d _nop_();_nop_();_nop_();_nop_();
3 @1 j0 I* G# `9 O* G _nop_();_nop_();_nop_();_nop_();
$ N* i- `' Z5 k: \6 _ _nop_();_nop_();_nop_();_nop_();: ~3 j- n2 l3 p) v9 R& A
_nop_();_nop_();_nop_();_nop_();
# e0 g3 ^( J( E. b3 S5 k" F$ [}
+ V7 i; v0 G. G5 v& G//**************************************+ w7 }" P0 X0 W$ j
//I2C起始信号
1 T6 w0 U7 ?( ~+ U2 p, O2 k0 k//**************************************
# w) k) q2 X+ C4 ^void I2C_Start()
4 S0 s5 w. R$ n! q7 @6 o$ ?) f{2 w9 E$ K) C! |& u6 f' d* \
SDA = 1; //拉高数据线
) T4 n: k, `: b3 g3 J SCL = 1; //拉高时钟线4 {/ h! ]3 g& E7 t! c3 O
Delay5us(); //延时. A$ H) k$ F4 `8 U3 H: s2 T7 |
SDA = 0; //产生下降沿
& k+ |+ o7 l. B" C Delay5us(); //延时" I% M$ @/ G# Z( ^% w; {8 T4 o
SCL = 0; //拉低时钟线) B' {) S* H9 B( a$ x& P
}
! o6 y" R0 N8 p& `//**************************************; z" p4 A K1 ?
//I2C停止信号/ Z" W$ V. v, Z! D
//**************************************
4 P+ C$ ?6 h2 Q3 B$ t! B( Cvoid I2C_Stop()2 R2 }) b: o$ |8 V# a6 C
{
* v7 C }. W3 k SDA = 0; //拉低数据线1 N2 Y- K) w y/ ]
SCL = 1; //拉高时钟线2 ^: T! e9 z. \$ T5 s2 C
Delay5us(); //延时
) U$ J# l: w9 s* K0 l7 a! e% S SDA = 1; //产生上升沿
( u. n+ C5 o$ I+ o: S Delay5us(); //延时 G, l) M. w8 V& u: I+ W' ^3 ~3 m# T) y
}$ ], w( k" W( T6 ` A: V0 I
//**************************************
0 s- `" _ D, Q- h. [//I2C发送应答信号: H% ` V0 L, H
//入口参数:ack (0:ACK 1:NAK)8 j ^1 A6 M/ ^5 Q$ d9 w/ x. v }
//**************************************
" T: z0 M- a6 Qvoid I2C_SendACK(bit ack)
5 a- w& ?7 D2 o; M. O! c' n{8 p$ Q" V2 U7 w
SDA = ack; //写应答信号: h7 {2 H7 b h
SCL = 1; //拉高时钟线
, y7 A% o# k8 }* J7 I5 F6 Q7 c/ q Delay5us(); //延时
1 v O$ E. C# J& L9 F9 l SCL = 0; //拉低时钟线
, E5 x$ c( a0 z; v$ u. K6 n* q Delay5us(); //延时
) D7 ]# ~( L7 ^! W/ h' ^) U- @5 c}
5 e3 u7 `/ Y1 ]//**************************************( I- I# e `- l3 h$ [4 K8 o
//I2C接收应答信号9 L2 Y7 ] d2 f, M
//**************************************
3 u6 v5 G' o5 H* ibit I2C_RecvACK()& G, |1 e$ V2 o
{
* j: A% m! H( _ SCL = 1; //拉高时钟线
1 U4 C# ^' b( v5 { G7 _7 N Delay5us(); //延时/ G; y2 U1 D8 A" [' U
CY = SDA; //读应答信号5 M' f' j& _: {" c. {+ d
SCL = 0; //拉低时钟线& F* h3 ]$ p, V. S: D1 k
Delay5us(); //延时9 x1 U |8 @3 b' W
return CY;& B n2 U2 M5 I9 T2 i
}
8 A% [" t1 q2 z4 Y$ i; q3 S//**************************************
) ~1 Y; E q& J//向I2C总线发送一个字节数据
4 Y% T' l# l+ F+ b& \( u//**************************************
' l7 E9 Y N, g! y; }; M: h- _void I2C_SendByte(uchar dat) k' }' r* T: m/ b9 l
{3 g; k9 {9 t, w" E
uchar i;" [# D* x, n- p E0 Z8 }
for (i=0; i<8; i++) //8位计数器
# `/ q& D. P+ D {
- ?1 g0 \3 O' L* `" G dat <<= 1; //移出数据的最高位
3 w0 F6 w, B2 _, _5 r4 d2 m, K SDA = CY; //送数据口
* P# ?8 ?, [* r, ?" h1 a3 \ SCL = 1; //拉高时钟线' u7 X! j4 r7 q# ]# S
Delay5us(); //延时! v. ^1 z U" _7 p; y1 V. ~
SCL = 0; //拉低时钟线$ O6 Z R+ x& V% P
Delay5us(); //延时2 @0 d$ B" J+ b0 [- `8 }# g, i' Q1 O
}$ a- h. @4 V7 @% K
I2C_RecvACK();/ w4 S/ O# A9 r6 {$ \# j5 y
}! N! a- a( G# W7 S# J7 V4 V* f/ W& z
//**************************************9 W: T' t& D1 W7 @% O
//从I2C总线接收一个字节数据; I ^+ I( L; W7 O7 ^$ n- j
//**************************************4 |$ G* K: O, f, f
uchar I2C_RecvByte(): p' L- z. j+ A" [
{
. x% \2 j h: V uchar i;
+ b) L7 S; k/ x A9 ~# \ uchar dat = 0;# X, b" [# _2 Q7 q/ m, A
SDA = 1; //使能内部上拉,准备读取数据,
# `5 p7 y% U5 F5 Y9 ]" q3 C for (i=0; i<8; i++) //8位计数器& {5 e7 o/ H7 B4 w: r: w
{
9 r' j. O# U4 M+ w/ l dat <<= 1;" i9 O# K; [1 W% n6 L
SCL = 1; //拉高时钟线4 s$ d! O: l [$ ~
Delay5us(); //延时
. l" P+ {) l6 n E& L dat |= SDA; //读数据
. f# W+ g- @; G SCL = 0; //拉低时钟线
! m9 a1 h. [, x3 }9 B& ?$ \! h1 V Delay5us(); //延时
) s& R/ q8 _; h8 S$ A }
& I* d5 C/ o& \& u; ?; E% g& ^- u return dat;' J+ g- a! ~ S9 E. ]8 q# \
}+ u& m+ P* d- U' j$ o" m
//**************************************
! ]+ N! U5 T9 K7 r" w3 h1 c//向I2C设备写入一个字节数据
& [1 n( s8 D# c+ Y( W//**************************************1 c) G9 q7 F9 Z1 `! Y/ D0 W
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
& D1 s }) v* E{' g4 K5 J0 t* O; s) m
I2C_Start(); //起始信号
4 n0 S5 @" ~' [1 Y; H* e I2C_SendByte(SlaveAddress); //发送设备地址+写信号( C4 e9 h u V( G/ u
I2C_SendByte(REG_Address); //内部寄存器地址,
. D7 i3 L$ d$ ^! s& f' E3 C! ^2 w I2C_SendByte(REG_data); //内部寄存器数据,% L. X9 C+ g( n. D) V1 Y0 {
I2C_Stop(); //发送停止信号! z# D1 \" ]9 d6 m
}
$ g, X5 P9 |. D, _! Z6 Q//**************************************: V9 U7 |6 A8 Q: d4 O
//从I2C设备读取一个字节数据1 Z4 t) Q% @/ y7 t5 m8 @! W
//**************************************/ x* U9 i& _( [8 ~0 m" x- h/ [- \- C
uchar Single_ReadI2C(uchar REG_Address)
6 J* w- V. Z+ S, B1 E: z' A6 r9 b{* y2 q6 ~; O/ M7 L' ]
uchar REG_data;
: m: x. f# c# h7 `9 E I2C_Start(); //起始信号
8 e( }" e- o4 \ I2C_SendByte(SlaveAddress); //发送设备地址+写信号
+ R2 }/ Q1 t( E# t/ s I2C_SendByte(REG_Address); //发送存储单元地址,从0开始
& i. }/ h, c. j/ L' ]$ c I2C_Start(); //起始信号
# f+ k) E- d" K6 c I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号
! A4 R& k# I2 ^. L- T& m REG_data=I2C_RecvByte(); //读出寄存器数据
8 N; r- }0 l" I! X% P I2C_SendACK(1); //接收应答信号' F: o) ]3 `. X9 o s& M4 Q0 |4 Z/ M
I2C_Stop(); //停止信号3 p3 Y% ]$ V9 ~# L+ ~0 O& p
return REG_data;8 C( N; }& @3 E7 a- L7 \* p
}" l8 }2 }# J. n0 I/ ~ l
- n4 Y9 s& I0 a6 A+ T" E1 T
) b% n1 _1 C! G# @" u! I- L2 x
//**************************************
6 E' k) w; h6 p* X, r//初始化MPU6050% y( c3 @* p/ L. @" [% o. c, Z
//**************************************; ]0 |& ` F( ~( H# W. |: ~
void InitMPU6050()
; `2 ^, l5 X; P5 A1 S! e, o6 s{
* p6 r) S9 n+ n& d Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态! S. z; u. f# g% b7 C9 @/ l+ T5 _ k
Single_WriteI2C(SMPLRT_DIV, 0x07);
: s3 V! i$ H) b$ V% ` Single_WriteI2C(CONFIG, 0x06);
. d) N0 R* F2 [ Single_WriteI2C(GYRO_CONFIG, 0x18);
0 ^" e; |* ^) I$ k8 R/ b* g Single_WriteI2C(ACCEL_CONFIG, 0x01);
$ _* X! y3 l) @}
5 @0 K$ X. n+ i f$ l7 u8 ~$ O$ m//**************************************+ N, Q* ^0 O, Z
//在1602上显示10位数据
% o+ O8 e2 a( U! [, l& y//**************************************
% Y2 V' l6 S- D2 `$ Wvoid Display10BitData (int value,uchar x,uchar y)
9 l0 X4 N4 s: Y8 g+ Q6 P: b{$ w' I0 F$ D# \9 _2 I" p& P+ ]
value/=64; //转换为10位数据 value=value/64 右移动六位
- ?$ {6 r# c( @5 M, h- D lcd_printf(dis, value); //转换数据显示
( u' L( O. ~# V8 B. t! q( i DisplayListChar(x, y, dis, 4); //启始列,行,显示数组,显示长度 v* [' X9 ?# S! O6 @" e& s
}
& ]8 T( N D# L5 F//*************************************** n3 n$ I7 C, w. b a+ ?0 Y
//合成数据
* Z9 _7 ?# J; d1 N//**************************************! @9 S3 n X, t1 E1 [6 {$ v. m/ p
int GetData(uchar REG_Address)
. r9 w0 A- c0 \3 A& N; L) v{
+ f: [( M% f0 v3 `2 s" q# u# J# A char H,L;
, |, F) k' |2 j/ {. T0 p H=Single_ReadI2C(REG_Address);
7 K' \4 _( n& n5 o L=Single_ReadI2C(REG_Address+1);
" O$ w1 e, _2 F6 ^4 ~ return (H<<8)+L; //合成数据2 \( N' ^& i3 I9 [
}
% g) t. m& g3 x+ q! Q0 U8 H4 D+ p# C! K/ r6 d) r
4 O x8 M0 T0 v$ f
1 Q# y# m4 }& ]6 w% b
( w1 J1 I9 T: s' {//**************************************
1 u' e: a5 e/ F5 V//显示温度
: H/ ^; ?7 L- L$ s0 J3 r//**************************************
+ u9 E3 e m8 n7 g//void display_temp()
9 b' u# A0 o6 q: d. o+ N: L7 R//{* R3 q2 r; P& L, h9 ]8 v4 u! S
// Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
4 O2 F5 ]3 ^% S0 W2 o- B; D! W// Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度' |/ ?* {" M1 U9 g; R: q0 t
// Temperature=Temp_h<<8|Temp_l; //合成温度
) {$ Y( U) ~4 r2 G7 _// Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度1 ?$ j$ o( M% |2 g0 T
// lcd_printf(dis,Temperature); //转换数据显示
$ f8 X" E9 l/ n* m/ d// DisplayListChar(11,1,dis,4); //启始列,行,显示数组,显示位数
) j0 }* G7 M: m+ }3 ^- `: }" z//}) N( h3 U: R4 o7 ^
//*********************************************************1 Z1 d' {; k! `. \" ?
//主程序
0 m9 T6 [) r# {4 a5 D9 o, o* f//*********************************************************% R: d5 T. E# Q/ v: g, t
void main()5 G+ m: t7 ?# t$ t d
{! C' R6 V% Z2 o- [! k& k
delay(500); //上电延时
' r' \: @6 q$ X+ V0 b6 M6 o& S, R, ?* g InitLcd(); //液晶初始化8 o1 O* \ b+ ^5 [. U4 f" {1 |. m& o% M
InitMPU6050(); //初始化MPU6050# o4 x; U* P0 z5 p4 A6 `+ |
delay(150);' D7 S( Q4 p; a5 b; C- t
while(1)! j8 t. b- T# A& Q1 z2 L
{, ]+ H b% ]; N- m
Display10BitData (GetData(ACCEL_XOUT_H), 2, 0); //显示X轴加速度
. H E! K4 o& ^3 B b Display10BitData (GetData(ACCEL_YOUT_H), 7, 0); //显示Y轴加速度
7 d7 f' _1 o" k# m& A Display10BitData (GetData(ACCEL_ZOUT_H) , 12, 0);//显示Z轴加速度, R; |5 Z w2 T( b- d7 |/ P/ ?
Display10BitData (GetData(GYRO_XOUT_H) , 2, 1); //显示X轴角速度
- t5 Z8 m2 J: t" M Display10BitData (GetData(GYRO_YOUT_H), 7, 1); //显示Y轴角速度
+ Y* [; v+ p" ~ Display10BitData (GetData(GYRO_ZOUT_H), 12, 1); //显示Z轴角速度
B5 _7 @5 Y K, |& r delay(500);
/ S H# Z" i9 k9 ^ q) A% v5 f }
+ ?0 ^3 T: p& z3 @}
0 g, ~/ x( A6 _( M m, n |
|