|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错
, L. s# `5 e# L#include <REG52.H>9 ]! H8 I; z9 @( i+ s7 K# A1 C ~* s4 a
#include <math.h> //Keil library
3 h7 s% a- {% b! v3 F( z3 y" ^#include <stdio.h> //Keil library: h. K/ j4 `9 g6 O; [( Q4 _& z& D
#include <INTRINS.H># x) L/ c @. n, N+ Z9 V1 Y
typedef unsigned char uchar;
0 c9 ~. G- M: ctypedef unsigned short ushort; a7 d& g" [! Z$ L( q/ s( A" I7 {6 p6 b
typedef unsigned int uint;
" L2 ~. g' ]2 U; a/ O) I8 q) N4 i9 v//****************************************
3 y' a3 W. Y4 a4 v& p4 x Z1 n// 定义51单片机端口
7 @2 x3 t2 L( h. `5 m4 J' |0 U//****************************************
5 ^3 Z% [. j. ~5 L3 h: {( q, F#define DataPort P0 //LCD1602数据端口
' ? n) m0 A9 ^2 E4 lsbit SCL=P1^0; //IIC时钟引脚定义; A0 A1 [' v, h, t3 @8 X
sbit SDA=P1^1; //IIC数据引脚定义
/ U, E3 H: s. o3 M" rsbit LCM_RS=P2^0; //LCD1602命令端口
' P4 [9 T: u5 i& _# W& K- O) qsbit LCM_RW=P2^1; //LCD1602命令端口$ `8 C. W- E+ |4 b, l5 D
sbit LCM_EN=P2^2; //LCD1602命令端口
# |+ {0 F% F6 C//****************************************0 b( a" P9 M. Q6 s
// 定义MPU6050内部地址; j$ Y* N G$ \: V7 J& R+ Y
//****************************************
" C4 k& a: D! P3 I! [#define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz)
. ?# Z# H$ m4 z5 f' F#define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz)
* U: ]7 X- X6 W# G; h+ S#define GYRO_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
- O4 J1 N! ?3 I; d" Q; G+ q% W#define ACCEL_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
! K8 s' P: N9 `, R1 y6 V, w7 c#define ACCEL_XOUT_H 0x3B
2 d$ V! h7 m B8 a#define ACCEL_XOUT_L 0x3C
3 j9 c* q* K0 i% C$ ~ l#define ACCEL_YOUT_H 0x3D; K5 F% M1 ~$ k7 T
#define ACCEL_YOUT_L 0x3E' h& I% O8 C" a* a6 P. {
#define ACCEL_ZOUT_H 0x3F# J( o2 g. `* B; C: }, \4 O4 U
#define ACCEL_ZOUT_L 0x40% n$ e j/ B+ E" V
#define TEMP_OUT_H 0x41. @! ?) x7 |, H( I6 N+ W0 W2 g
#define TEMP_OUT_L 0x42
$ A% p! X! e5 \5 Y# @9 @ @#define GYRO_XOUT_H 0x43
8 U4 s0 W5 A' J, Z" Y#define GYRO_XOUT_L 0x44
% v2 j7 I: I# q7 m% p* ?7 n#define GYRO_YOUT_H 0x45
7 k5 ~5 u9 O- ?, J7 D6 X# o#define GYRO_YOUT_L 0x469 H9 Y! ^( b+ v! o/ D5 J
#define GYRO_ZOUT_H 0x47- Q/ [+ ?# i" s: g! H
#define GYRO_ZOUT_L 0x486 v, R, z5 M& T/ `% Q9 S
#define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用)& K+ d+ o+ t2 a7 v4 R
#define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读)$ k9 z }# o e% j. Z
#define SlaveAddress 0xD0 //IIC写入时的地址字节数据,+1为读取2 D7 I) V! \& J
//****************************************2 e5 G1 a% n$ c
//定义类型及变量) D7 w3 Z: \5 p( }7 r+ q2 F
//****************************************
* \# o: u/ Y$ | C+ Nuchar dis[4]; //显示数字(-511至512)的字符数组
( P7 |/ `0 c6 E- b& l, I' Q; Kint dis_data; //变量1 F; K: }9 T) }% x
//int Temperature,Temp_h,Temp_l; //温度及高低位数据6 [5 U2 S2 ~. _+ x& @
//****************************************9 c* Z7 \& r8 H( f, t& D1 M
//函数声明
( \! h+ G1 E5 D# y( j//***************************************** X. g4 \9 K0 L$ t. @5 d
void delay(unsigned int k); //延时
9 d, ]- D/ e; H' z6 B, ^//LCD相关函数+ _) Z9 `6 M0 ~3 r
void InitLcd(); //初始化lcd1602# Y) L: I4 J: E/ P! n
void lcd_printf(uchar *s,int temp_data); Y+ N% k, F) S1 \% P
void WriteDataLCM(uchar dataW); //LCD数据
6 J! j# _& m9 F. n+ Q" rvoid WriteCommandLCM(uchar CMD,uchar Attribc); //LCD指令
' S+ K+ t* \0 D0 Y+ R5 }- c6 [void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示一个字符
* X) T3 O% N9 A, z+ hvoid DisplayListChar(uchar X,uchar Y,uchar *DData,L); //显示字符串
( e, z* [6 \# T0 @+ Y: [//MPU6050操作函数/ M; h+ L% u" o
void InitMPU6050(); //初始化MPU6050
8 j( E7 d; F$ q& s! c7 `1 r3 fvoid Delay5us();
; r! j. q7 E8 {6 Q, S1 @void I2C_Start();. x9 B3 y. @' R& J: H
void I2C_Stop();. K t6 C* D f, f, o. p2 F; C5 t
" s! l5 _# N3 `+ w1 }void I2C_SendACK(bit ack);" Q1 j0 z3 N# d, l5 f+ _) m1 I
bit I2C_RecvACK();& L) g/ S. ]8 K6 R2 ]. C- `
: B' J1 _6 X* p1 s) G
void I2C_SendByte(uchar dat);
+ C: m9 z( X9 j9 \uchar I2C_RecvByte();
( Z1 n* Z: G* }$ P8 P% n1 o1 g& k% m& ^# x$ b
void I2C_ReadPage();" G8 M; R& b8 Z) k9 b
void I2C_WritePage();
+ L$ ?5 w6 ^' w, S; h6 }% qvoid display_ACCEL_x();! [5 F' O4 D3 l) Q) s6 N- e3 \- m; O
void display_ACCEL_y();
' s9 C- T+ k) S6 X& ` jvoid display_ACCEL_z();/ {% u2 N- W8 o' a; D. f) H% }
uchar Single_ReadI2C(uchar REG_Address); //读取I2C数据: q+ y( `- l7 c# R G* k: O( ^
void Single_WriteI2C(uchar REG_Address,uchar REG_data); //向I2C写入数据6 q# k0 G8 L" r+ m6 C, L
, S( O. H9 ?; M9 U, ^( b0 o
' Y8 g# F2 Q- j* }1 E- S
//****************************************
- p! \4 |+ v; a! O# k8 _, R//整数转字符串
7 T7 M, T6 d- G' c/ l6 G2 q//****************************************
: E& u7 \1 j1 w3 _void lcd_printf(uchar *s, int temp_data)
! z5 s. A/ f0 t7 M: Z: U{9 _) A; z* Q1 }( l8 X* _! X( `
if(temp_data<0)8 ~$ S: g1 f# J6 @/ G1 h
{
: x1 {! [6 {4 B# ]0 W! B temp_data=-temp_data;% a6 W, S: ~' ^6 t3 Y* G
*s='-';
% i4 ]) T3 @; v1 s/ u1 V }! c! b; l& Y9 ^( o1 E' l
else *s=' ';
7 M+ M- h4 E6 p4 F *++s =temp_data/100+0x30;( }( z7 t' L0 _
temp_data=temp_data%100; //取余运算2 I9 I% H( r( K( i* h+ w% }: ^$ r
*++s =temp_data/10+0x30;1 J j% @* L. ]
temp_data=temp_data%10; //取余运算/ e; R6 W% M( S" a
*++s =temp_data+0x30;$ l4 v4 {8 V8 p4 h% X$ G
}
; \: ^; X z( v# P s& r1 Y1 ~//****************************************
1 ^) G9 Y' K b% ~4 D//延时. e, R) N: b# o# D: J3 U: ?" |
//****************************************
' K3 c& w- o# G) tvoid delay(unsigned int k)
; S: D7 }; _- b" e# a{
, p l$ a7 V4 H7 }% j' E0 e' [ unsigned int i,j;1 m3 D% j+ R8 l2 X# _% q
for(i=0;i<k;i++)
. r" n' f/ g) p {
8 d0 q1 J- \) Z2 h ` for(j=0;j<121;j++);& r4 b3 ?9 J2 b. u
}
3 ^ h3 |- u- e, B" `}
* u4 k0 m o: k6 x: o* J& r//****************************************
0 T, _% c; M6 b& W* E& K- U( f//LCD1602初始化
- P: v7 ^6 J; J8 [//****************************************& x5 ~# c8 `/ H- M5 h
void InitLcd()- w, j9 I; v9 X3 v5 v7 J2 m
{
5 W( @' H" {+ T# |8 ]$ S WriteCommandLCM(0x38,1);" Y) c2 w% A$ h8 c* H
WriteCommandLCM(0x08,1);
. o% P: N" w2 z6 C y; k WriteCommandLCM(0x01,1); E: o# w3 u+ }% \( \- I5 X* u
WriteCommandLCM(0x06,1);1 a0 e7 `' r) ?! [
WriteCommandLCM(0x0c,1);% w2 w. c1 V2 ]3 O
DisplayOneChar(0,0,'A');* u5 e6 N. Z6 ]4 n8 I
DisplayOneChar(0,1,'G');
- Q) ]# q, u/ _1 ~" D7 R}
* K: s5 W- w7 R* t# `//****************************************. O0 V0 ?1 U/ e! \; I# E/ G
//LCD1602写允许7 a& h! A8 a! X6 v+ [) l+ {
//****************************************
" X" V1 m; e* U: g: }3 _+ |% Bvoid WaitForEnable(void)
" s: q( u% p/ v& m. {5 v2 n{7 c0 q' L; x. v; d
DataPort=0xff;
* L; C! {$ n" }+ S4 d( s LCM_RS=0;LCM_RW=1;_nop_(); ?: |3 M( n: ^" z1 e8 X# `/ _
LCM_EN=1;_nop_();_nop_();' X C9 `5 ~4 j' V0 E
while(DataPort&0x80);
# T; C0 w3 f |4 g+ ]1 N6 u% G! u% M LCM_EN=0;
3 J: l- Y5 F4 ]}
, y. I+ N, A8 B' V* [8 U//****************************************, ]# \1 r" V3 W% h
//LCD1602写入命令' O6 E! F9 B6 U$ f' K2 f# X
//****************************************
5 r+ P* p! \ {: s, Cvoid WriteCommandLCM(uchar CMD,uchar Attribc) Q' Z9 y8 g6 x, {: m
{0 ?! H. B2 }/ ~8 h$ S. ]7 J/ q
if(Attribc)WaitForEnable();) `+ z) H( \5 J# |' @
LCM_RS=0;LCM_RW=0;_nop_();6 g3 [& o) p+ R, C; D) O' i
DataPort=CMD;_nop_();" _% V# S4 n. ?6 c, k
LCM_EN=1;_nop_();_nop_();LCM_EN=0;; X2 e8 {; T* j p. m
}
V3 \" i% C2 H& x) `0 {//****************************************
9 x* k. @2 ^+ Z; \5 n8 J$ L//LCD1602写入数据. L$ |- Q) C2 Z; m& L, g o% k& I
//****************************************- Q, ~, J3 ^$ [; e! {5 V' ~
void WriteDataLCM(uchar dataW)% D, d/ m) @; H- N
{
4 ?8 ?4 [( U' Z% ` WaitForEnable();
. R( ^1 ]+ i* m LCM_RS=1;LCM_RW=0;_nop_();
( k3 `$ m# D4 a DataPort=dataW;_nop_();: n& e' `1 z: }/ @ p) S8 n
LCM_EN=1;_nop_();_nop_();LCM_EN=0;! I. j9 ]* ]9 s( @( A
}& H6 x$ c7 y; h+ _4 `, `
//****************************************! O1 v1 v: {2 F/ }! _
//LCD1602写入一个字符9 F3 H, b+ ]6 I4 J8 \1 R4 v
//****************************************
9 X) {. K1 h" \void DisplayOneChar(uchar X,uchar Y,uchar DData)2 m! E8 C' X' b
{9 G9 S ], k. [( H+ k/ \
Y&=1;; V! b% U& v% j( M3 Y( u$ P
X&=15;0 s; U' p: ?- R/ b/ J# j5 K4 `
if(Y)X|=0x40; I8 {; }% ^, S. i: A. P1 W
X|=0x80;% l2 X$ S, l6 c' x
WriteCommandLCM(X,0);
4 c" g, W& r9 k WriteDataLCM(DData);
, l; ?1 ?4 @. W- n+ E9 u/ T9 `$ O% o}
# ^5 A9 U: N9 P3 j6 W- l3 J//****************************************6 ]0 c9 D" C2 T, k7 O9 O
//LCD1602显示字符串 c" D( ?; F; g3 u
//****************************************2 j- {; N A0 ~3 X
void DisplayListChar(uchar X,uchar Y,uchar *DData,L)' O% g: v* s: z% x
{
( `5 y. o1 Q) f" j uchar ListLength=0;1 g: s, X/ f- [* c
Y&=0x1;
6 Z' c% d6 P# t8 O$ {0 q X&=0xF;0 _ n& l1 e) J% N3 B3 y7 R
while(L--)7 j! [1 ]% N& D: \) |9 i
{& Y X. N! {7 T8 w$ P
DisplayOneChar(X,Y,DData[ListLength]);# H$ `/ C% u6 ~+ e
ListLength++;
+ \2 h( A" T; x" ~. m* x X++;
' O& C0 D& u+ X* [+ Z }2 \# W2 T9 y4 P; u/ |
}1 i9 u8 Y2 N* E# z. I( V; L
5 ~: B' b" H6 p0 v( ]% D
//**************************************
# ^5 K( j) ~$ l6 y. g; `0 T l4 d//延时5微秒(STC90C52RC@12M)
5 ` C/ m9 @( g//不同的工作环境,需要调整此函数: L9 l2 G9 g: f% I5 v
//当改用1T的mcu时,请调整此延时函数
0 A* H2 o* U6 a( G/ v( i+ b//**************************************
+ L9 B! t( r, d7 ]void Delay5us()
" n1 {8 m% b$ Q! m" S1 L{5 n8 v& y6 V2 d5 W
_nop_();_nop_();_nop_();_nop_();
1 f" H0 S: E* @ _nop_();_nop_();_nop_();_nop_();& C9 u: b# }6 ?* z
_nop_();_nop_();_nop_();_nop_();8 E' C! W+ B( i4 u) |9 C2 m; e
_nop_();_nop_();_nop_();_nop_();% W0 I/ g# H' O, G
_nop_();_nop_();_nop_();_nop_();
+ s( _( L, w+ j, B- h3 u _nop_();_nop_();_nop_();_nop_();
+ T8 g N8 K- `/ _5 Q}0 m- P3 z# C9 d0 C1 F+ b
//**************************************
8 }0 Z! v7 O/ C( }4 ]% ]" ~//I2C起始信号
4 W9 `% a1 E5 R/ K8 x//**************************************9 U9 q, S! U& [, R& G5 I+ l s j
void I2C_Start()
6 b6 f" c# Y- M% s3 C{
9 y0 S0 z/ p% T5 \( h9 f. Z/ v& E SDA = 1; //拉高数据线
: G/ B# T* N" k V+ Q SCL = 1; //拉高时钟线
9 X, L! T O# h, Z2 Q/ R Delay5us(); //延时
8 d7 _2 D$ y- [' _! x SDA = 0; //产生下降沿
5 R' {3 {' l# w/ t( Z Delay5us(); //延时
; g2 U% i' c- v9 F" G SCL = 0; //拉低时钟线
6 p% y( X1 }! M Z$ Y}6 @3 Y7 P% P4 B/ q4 p
//**************************************' S, _, y# k" m! C
//I2C停止信号0 Y5 ` J; A6 ?1 p0 R
//**************************************
3 Z n/ Q! Q7 R0 s$ H4 D. ?void I2C_Stop()
3 q8 ? I' z1 s3 m! W{, P. N0 K/ l/ S" z+ _1 R' K
SDA = 0; //拉低数据线
( z# k% c0 f- m: H5 ~& K* @ SCL = 1; //拉高时钟线
4 {) |- G& g; F0 D Delay5us(); //延时
* t; s+ j: \. N6 o" v. s* r* J SDA = 1; //产生上升沿) \) P4 j- T5 e% [
Delay5us(); //延时: }- V" o9 u: V: c
}
! h6 S7 k$ \- y9 {//**************************************
' o8 ^5 ?5 `) u5 [ N//I2C发送应答信号& u1 N8 M# J0 K; P* T' z
//入口参数:ack (0:ACK 1:NAK); o" y4 Q b$ O h
//**************************************
5 O: l. J& P) jvoid I2C_SendACK(bit ack)
7 g i* h% |& A" A3 K5 Y{9 V) o+ \4 p& B* j
SDA = ack; //写应答信号7 R6 \( _% ]: d( u2 c
SCL = 1; //拉高时钟线
6 K) T, Y! D1 c/ ]! k5 k8 b Delay5us(); //延时
* N7 F" p* b. o) a I, ]( ]2 m* T SCL = 0; //拉低时钟线 A! ]3 r$ u7 b3 x I; i
Delay5us(); //延时
* `( T7 I/ s; u, p; t7 W. I}9 i0 }" j7 V( v/ q, b; j
//**************************************
! | p, n2 o. S//I2C接收应答信号
* ^; i- s6 f+ g9 K( O//**************************************
% z9 H0 y* m$ `4 w/ Sbit I2C_RecvACK()
8 \6 ]) C: W1 N4 T0 u; V1 [, J{
* t9 d2 k; T2 @; Q/ P6 w/ b SCL = 1; //拉高时钟线
- S4 Y- A8 A% p5 N/ U Delay5us(); //延时
* L/ M) e! W" |( }7 D1 [ CY = SDA; //读应答信号
' \6 h |7 k$ i. |2 X% i/ q0 N: ` SCL = 0; //拉低时钟线
% ]$ S) N. {3 a, i( ^ Delay5us(); //延时2 I9 f8 G& e5 g r
return CY;. c) z# _$ q7 i4 V2 s
}8 u: |$ |- H7 u' s) x# I
//*************************************** t6 S1 A* |7 Q7 g E: V* B
//向I2C总线发送一个字节数据
+ F# G+ H5 d; B+ e# x//**************************************8 {) @+ V6 ]: B$ J; N* w
void I2C_SendByte(uchar dat)
9 I/ t$ v" J& S{% I$ h: _2 v& m
uchar i;
% ?: D% X; J- d- H8 m; G1 ^ for (i=0; i<8; i++) //8位计数器
. Q p8 F/ W3 ~" o {' m ?# x1 G! r2 e
dat <<= 1; //移出数据的最高位
" k" y" t3 t+ c. C/ l SDA = CY; //送数据口( Z; y i5 [" @7 w# v
SCL = 1; //拉高时钟线* B. X& T# L& g' X% G8 V
Delay5us(); //延时
- N' o: e' J2 d7 @; H SCL = 0; //拉低时钟线
5 K% ^5 l/ l8 y& ~+ K) d- ^6 o5 r Delay5us(); //延时( p3 U' U3 [5 J7 D9 P! u
}
4 \0 H1 A. A$ y0 f I2C_RecvACK();
1 v6 c. J0 V$ G; ]* c}
$ m' [1 V7 |( Y/ |: ?//**************************************
0 B: |/ ^0 @- p, P//从I2C总线接收一个字节数据
. A# U5 _1 A1 v2 h5 J. A//**************************************1 ] }8 L( X. r. g: B# |
uchar I2C_RecvByte()7 o. @5 {0 p1 f, t7 O
{
1 o' I7 K! h9 E' s5 j$ h: o uchar i;
4 a2 ~5 s2 [4 j z uchar dat = 0;
) f1 M7 {" m( N9 ?6 O SDA = 1; //使能内部上拉,准备读取数据,
8 @6 H1 V( e1 O/ w* } for (i=0; i<8; i++) //8位计数器6 [) h" A6 q4 C, l( q2 Q9 t& p1 ]
{8 }* r0 S: _" {. V( g, I
dat <<= 1;5 B f& E5 |8 U& z3 V5 b f0 V
SCL = 1; //拉高时钟线
- r0 `; J3 k8 ]% S Delay5us(); //延时% F* M5 r" L- l
dat |= SDA; //读数据
. W* j8 g5 P, D! Q7 v SCL = 0; //拉低时钟线; i8 E0 {3 q4 J) }$ I
Delay5us(); //延时
# H( g- ^, W" P5 L3 _0 V }: r! L* B0 u: d+ k2 J g' Q
return dat;2 Q# Q( @ t# m" W, U* [
}" D1 E# D0 ^9 k: ]
//**************************************
( u' u- r9 K) \" J, @. w//向I2C设备写入一个字节数据
% M. o' Y( I/ F ^//**************************************
' ~; y' e3 A2 M' J' Evoid Single_WriteI2C(uchar REG_Address,uchar REG_data)
5 {9 P2 o& ^. @1 i* n{& q; z" e$ O! G6 U6 d1 j! O( r
I2C_Start(); //起始信号+ q$ F) K6 y8 V8 b& P; N- K6 P! F
I2C_SendByte(SlaveAddress); //发送设备地址+写信号
/ S) M; A4 ?. S" m+ P I2C_SendByte(REG_Address); //内部寄存器地址,& Z0 @2 Q/ \" i4 ]6 F( u" ~
I2C_SendByte(REG_data); //内部寄存器数据,. h9 ~) e% J/ `' y4 T* Y- ^
I2C_Stop(); //发送停止信号
! w' `; T0 E W. k4 t}
& L' i6 N5 I# H* Q0 g" u//**************************************( P) r- q7 J7 x# u0 Z
//从I2C设备读取一个字节数据+ b& E3 B! ~& |9 E" N( ~; c
//**************************************
/ [: m% Q4 Q8 y# \5 @& ruchar Single_ReadI2C(uchar REG_Address)
/ e- \# t0 ~: k7 l' l{
+ L! ]) I( b3 u3 X4 U: r uchar REG_data;& g; [1 @( s2 d* F' x" m1 h
I2C_Start(); //起始信号
) I) K. C' G* S8 {) _ I2C_SendByte(SlaveAddress); //发送设备地址+写信号# {' v( H1 ~; ]- x5 D& u+ n
I2C_SendByte(REG_Address); //发送存储单元地址,从0开始$ |% Y) x N9 q% d$ w* y
I2C_Start(); //起始信号
5 m+ l* A6 B6 _. Z5 b. u3 `4 O I2C_SendByte(SlaveAddress+1); //发送设备地址+读信号9 H- Y) Z- ?" k+ T
REG_data=I2C_RecvByte(); //读出寄存器数据
, r. S B/ m, l/ E V! b I2C_SendACK(1); //接收应答信号) I" |- u5 W c8 Z6 L" H
I2C_Stop(); //停止信号: x3 E; l. Q+ ]8 x) I
return REG_data;/ M5 Q, B2 {8 c r3 ?
}" G# d h6 O0 B4 L( [6 `- O
; _' b8 J: l0 l6 |( y7 r9 L" `& z& H- `' h: G6 @& y
//**************************************6 e+ M) j: s* t T
//初始化MPU6050
, M' ~: R* A' Q2 q U- H% i//**************************************
5 g3 q& y( y6 j5 E* lvoid InitMPU6050()' d& }5 [+ m8 w9 o* ~+ ~
{
# W! M# F1 E2 V* H3 U) u; t7 Q: p* ? Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠状态$ }0 R. ^7 Y& _3 v" O/ s* S% n7 X
Single_WriteI2C(SMPLRT_DIV, 0x07);8 Z* ?; @% N/ o7 I- w" k5 z7 m. O3 x, l5 b
Single_WriteI2C(CONFIG, 0x06);/ u( n; K4 s' W& A! p
Single_WriteI2C(GYRO_CONFIG, 0x18);
) B' e5 K1 m- J Single_WriteI2C(ACCEL_CONFIG, 0x01);
b! h) A8 b: X0 [2 ]}
& z- u4 B9 M8 z5 w% V+ s5 R2 P//**************************************
% l2 @5 H3 {0 F9 z+ O& Y5 Q//在1602上显示10位数据
3 c! o ]. h; m1 N, r9 p//**************************************; D4 T" {' {0 h8 o, ^7 Z
void Display10BitData (int value,uchar x,uchar y)! @6 n' D! |9 C5 f
{! @5 r9 A2 w W3 W6 H
value/=64; //转换为10位数据 value=value/64 右移动六位
& f2 l: r. Z- Y2 p( Q lcd_printf(dis, value); //转换数据显示
3 x7 z& H, e" t, S7 A. n DisplayListChar(x, y, dis, 4); //启始列,行,显示数组,显示长度
. t2 w5 G5 a/ Q0 _% N$ g} h0 F/ s6 O; K" c. Z) i! ~
//**************************************
! d; s$ ?3 f9 j$ q3 k' K# t: L//合成数据
8 }) L+ T: J S8 }( _# {+ f) a//**************************************4 L: q+ u3 x: N3 A
int GetData(uchar REG_Address)
* ?, l7 r2 ]( F# H5 ?/ f P" }{
# O- Z! x& M, m9 Q" z5 n* c char H,L;
N7 C' Z# S' ~& ^% E* c7 D H=Single_ReadI2C(REG_Address);
; n3 o$ S2 ^- @0 m, |: b2 J8 Y L=Single_ReadI2C(REG_Address+1);
( ~# ?' c9 v8 X$ \ return (H<<8)+L; //合成数据7 n" s$ r- ^1 Z0 s/ |
}% _* I+ M$ m0 U$ a+ k2 ?' h
$ K+ [) \1 m) I+ z5 i4 h5 i
% y5 F: }( \9 i4 j6 t0 }4 K* j! A6 z% N
3 B2 _7 t! l3 [/ H* R) }6 Y//**************************************) f, U) g9 _- r
//显示温度
6 K1 l; V% }: u//**************************************
5 O; H& H) D# O& p2 n( K" A, E//void display_temp()2 A6 u. I% b8 e- z
//{; _& c9 \+ t* e a
// Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度. C1 }) [' T# y( Y! ?+ ]7 q4 F
// Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度* n) C1 c ^5 y
// Temperature=Temp_h<<8|Temp_l; //合成温度
- B8 ^. R4 g) [5 _5 } `' H/ x// Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度7 Y8 j% d4 _3 R: j' Z5 b) \, |
// lcd_printf(dis,Temperature); //转换数据显示7 E9 W3 P" k* u* n
// DisplayListChar(11,1,dis,4); //启始列,行,显示数组,显示位数
, \* Y v$ r) R2 S0 c% d. _//}) ~3 N0 \+ [ S6 ]* N
//*********************************************************+ d- B6 Q( L' t8 d/ C; M2 h' l1 l* Q
//主程序6 a' F" V1 F5 x- ?* X/ S! L
//*********************************************************
+ P0 u- U+ y1 v$ F) t+ N6 T, }void main()3 z1 t' W# [8 p1 H" t
{
$ J; `- b, P! [: e0 h Y delay(500); //上电延时
8 a) `+ T; p3 M) g8 U! \ InitLcd(); //液晶初始化% F5 ?- W7 _8 a* r- P: G- d
InitMPU6050(); //初始化MPU6050
D9 [, U. f7 ?( E' `8 f0 s) c delay(150);& V( A+ |2 K, g% B% W
while(1)
6 B2 ~& w9 T* J {& v. N, s+ J r
Display10BitData (GetData(ACCEL_XOUT_H), 2, 0); //显示X轴加速度- `: P# ]: I9 w7 F. o) t4 Z
Display10BitData (GetData(ACCEL_YOUT_H), 7, 0); //显示Y轴加速度; l" ]" y6 h) A& F9 N% P/ @
Display10BitData (GetData(ACCEL_ZOUT_H) , 12, 0);//显示Z轴加速度6 Q1 z& b* o8 D0 @ \
Display10BitData (GetData(GYRO_XOUT_H) , 2, 1); //显示X轴角速度" ^' B( l7 d4 b v" e" e9 L1 Y
Display10BitData (GetData(GYRO_YOUT_H), 7, 1); //显示Y轴角速度
$ B5 y& u5 N: d Display10BitData (GetData(GYRO_ZOUT_H), 12, 1); //显示Z轴角速度" F I9 S$ D/ q" K9 W
delay(500);) z. a m( C# X3 S4 J+ T
}
$ O1 M+ S' b# e( T$ A+ x}
. ?0 ^1 Z; v1 m$ R3 Y7 c- ~ |
|