找回密码
 注册
关于网站域名变更的通知
查看: 286|回复: 2
打印 上一主题 下一主题

51单片机+MPU6050陀螺仪+LCD1602显示程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-17 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错: d0 m  v" z4 e' m' [
#include <REG52.H>4 r3 [( T2 w: R) ^2 v
#include <math.h>    //Keil library
' k) N; z$ g9 {- b, g& c6 a#include <stdio.h>   //Keil library% F9 w. U; w6 R. R
#include <INTRINS.H>: l$ T! R$ c( Q7 E
typedef unsigned char  uchar;2 a/ x+ m& i) L
typedef unsigned short ushort;- A+ R; k1 p4 Q% X
typedef unsigned int   uint;# ?1 Q( Q- y' u  K( h# D' x+ u
//****************************************
* L+ l3 {) F; G; u, N0 s0 `+ p// 定义51单片机端口
, c) F. _1 w3 h8 o. E! l& ?//****************************************
8 Q) H& j) F' d' R#define DataPort P0                    //LCD1602数据端口
( T# K6 u/ v5 f1 D  O- Isbit    SCL=P1^0;                        //IIC时钟引脚定义  _/ y. s. S9 Y8 Q
sbit    SDA=P1^1;                        //IIC数据引脚定义$ G* r: \$ u6 z2 H# \& R
sbit    LCM_RS=P2^0;                //LCD1602命令端口
. q: S- w' R! d6 V2 X7 e3 `) osbit    LCM_RW=P2^1;                //LCD1602命令端口7 F% H' g( `5 t9 ^; l
sbit    LCM_EN=P2^2;                //LCD1602命令端口
: g) l- W) P/ @  }* D//****************************************& v* Z! h0 F# c" B
// 定义MPU6050内部地址" Q% }/ q9 z' O. m
//****************************************
2 _/ A5 r, R: f' A#define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
) }; g, [- z, ?9 g: M8 D) x- }/ f#define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)& k4 O( V  A: G8 e) b7 F% e
#define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s); g& }& @5 T: a: e8 B# h
#define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
* k9 h. _- T% {% \  f#define        ACCEL_XOUT_H        0x3B
$ q9 ^6 A7 p& w& M# p+ s7 k#define        ACCEL_XOUT_L        0x3C6 O, V+ }2 b. m+ g
#define        ACCEL_YOUT_H        0x3D
; ^* G- E1 Q" B. O#define        ACCEL_YOUT_L        0x3E+ J- P& I0 p0 c7 Z, k8 |
#define        ACCEL_ZOUT_H        0x3F
# F/ P' p/ _% ?7 e! M2 |#define        ACCEL_ZOUT_L        0x40
' f4 a' D  g& i5 w$ _+ p; d0 q#define        TEMP_OUT_H                0x41
& G+ E7 y# ~" M- D! b, L2 |2 Y#define        TEMP_OUT_L                0x42, ]1 [& V) N, u* u) P7 ~0 A. q
#define        GYRO_XOUT_H                0x43
' h% o, S  U3 V9 a4 Q#define        GYRO_XOUT_L                0x44! `4 l: `0 ]( g) @4 J
#define        GYRO_YOUT_H                0x45% g) f; v" I/ [; b4 T4 [8 J
#define        GYRO_YOUT_L                0x46
# T7 w0 P: B0 j# _- k2 q#define        GYRO_ZOUT_H                0x475 g  ?$ `# }1 R" N$ \
#define        GYRO_ZOUT_L                0x48$ I' O# |$ L) b; @
#define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)0 v, t) Z, y0 G8 C/ p& P$ \
#define        WHO_AM_I                0x75        //IIC地址寄存器(默认数值0x68,只读)
4 m6 ~8 K- x7 _0 w# |9 G1 l#define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取
/ j0 ]& D9 M! ^! o0 ^; Z6 k* h+ @9 a4 D# ]//****************************************  l4 y, R, e/ E$ E1 w/ X
//定义类型及变量" g) l4 P" {/ }/ b# Z3 v  |
//***************************************** B3 N% ]; S2 X! a9 N
uchar dis[4];                                                        //显示数字(-511至512)的字符数组% m8 [. N) f4 v3 g
int        dis_data;                                                    //变量0 b5 k% `# h) q$ R" Q  J$ g
//int        Temperature,Temp_h,Temp_l;            //温度及高低位数据
( r4 o' @6 V8 p5 z8 P8 o//****************************************
6 h: }0 z2 F  V- h  J/ i1 f//函数声明/ H5 l# Z. n0 D" K
//****************************************0 J* ]; r2 g4 m8 h# k2 {
void  delay(unsigned int k);                                                                                //延时1 n; D& c$ T. O, J
//LCD相关函数
8 e; P2 `6 I. V( uvoid  InitLcd();                                                                                                        //初始化lcd1602
% X! ^* b! r. C+ Nvoid  lcd_printf(uchar *s,int temp_data);
6 I& P5 n+ D% Yvoid  WriteDataLCM(uchar dataW);                                                                        //LCD数据
2 }' Y9 e0 j) E4 y% G/ L4 yvoid  WriteCommandLCM(uchar CMD,uchar Attribc);                                        //LCD指令
7 u2 V: m# K  M! h* X/ xvoid  DisplayOneChar(uchar X,uchar Y,uchar DData);                                //显示一个字符
/ }) `( Z7 `$ B! e9 H) evoid  DisplayListChar(uchar X,uchar Y,uchar *DData,L);                    //显示字符串8 ]5 E% j+ m7 U1 f: f6 L  j
//MPU6050操作函数
5 q' k& M1 l" r% T0 h/ ?1 g" f5 b2 r: Vvoid  InitMPU6050();                                                                                                //初始化MPU60503 }! J; J# g" `0 v+ I
void  Delay5us();4 I; K/ y$ y: V* R
void  I2C_Start();
5 `4 `7 [6 ]* Z# W; X  }5 N* Svoid  I2C_Stop();
* j2 a! D: z6 r6 R; Q, R7 m6 t
' n8 F8 A$ V% e# o, l7 Ovoid  I2C_SendACK(bit ack);
$ {' }! y. O4 f* H; k- sbit   I2C_RecvACK();& ?) `9 Y. O& d! ?4 ?. y) D
6 i- L% N7 j3 [1 \% I, `% j+ t
void  I2C_SendByte(uchar dat);# ~" T, r1 l  |( F
uchar I2C_RecvByte();
1 X" f& r% d, \3 m0 H9 C3 U7 t8 L& c9 X
  D% C+ u. `' g4 I. d* Dvoid  I2C_ReadPage();- s+ G, G! ]: y. o
void  I2C_WritePage();# o3 u- W) A7 L$ o* N7 {
void  display_ACCEL_x();
( P8 s+ J% O& p9 \void  display_ACCEL_y();
! J. u* O  l$ x* L( C8 K3 Xvoid  display_ACCEL_z();2 A# b) N" I* D" I% k/ F9 v8 G! @
uchar Single_ReadI2C(uchar REG_Address);                                        //读取I2C数据7 m" C1 i2 D$ N$ g1 T- x
void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入数据
0 z+ N% T. \. R, k
8 `5 s0 f) O2 b. V+ T; ~
, `+ q+ B% x0 F+ \& E4 ?* G//****************************************5 ?3 k7 h4 ^# g. G
//整数转字符串
  H9 z1 }. `8 i; j. l//****************************************7 ]" Q: B4 M% ?
void lcd_printf(uchar *s,  int temp_data)
0 U& I+ O6 a  n{
* l. ~3 S; p9 b6 B        if(temp_data<0)
9 U4 j/ M: l- t8 H0 v* ?        {' ^# Y# E4 \, R/ J& o! N4 B
                temp_data=-temp_data;
6 i; j6 r( d) _& O                *s='-';
6 w# d) g9 T7 _, O/ T8 N        }5 @! f4 ^8 Y" K! _8 M
        else *s=' ';& ?, I0 K) y" v0 e( C: f( v/ Q
        *++s =temp_data/100+0x30;2 E, D$ R: U0 K% b6 l/ c* K2 \3 ~
        temp_data=temp_data%100;     //取余运算
% d* s& m2 P6 s4 D' ^4 x        *++s =temp_data/10+0x30;
! a  `7 g" e6 d$ }7 {( Y3 x        temp_data=temp_data%10;      //取余运算
# l' e& k' r8 O  m  u/ \' |        *++s =temp_data+0x30;
9 }7 ^4 {. j5 _}
% p, m9 X3 U6 ]& C& w//****************************************
7 m/ y4 Y1 l7 l. F$ c3 N3 l- _//延时' B* n; s# V, W+ L* b
//****************************************
8 ^0 n* j3 F/ H, H' P  G. C7 _1 qvoid delay(unsigned int k)
6 q3 a+ C3 |3 \8 q% V" M' r' S{" j" Y/ |" s" P, g* U) p2 k
        unsigned int i,j;
6 R) J- ~+ B+ A# L) m        for(i=0;i<k;i++)
' X) q' ^$ I+ P        {+ c8 Y* i* L# |2 _7 {7 M
                for(j=0;j<121;j++);
# w. ?1 r4 j! o8 }+ `        }5 }9 |. L5 ^' y" ^' ?
}
5 l  L4 o, R  {0 k' v//****************************************
& z1 b% O( b7 g7 o+ F; D* N//LCD1602初始化
& u4 y* b' l: `! p; ^1 m6 C9 N4 m//****************************************
+ f7 ?3 Y, I) h- U0 |3 mvoid InitLcd()
3 h3 Q& O# P7 a1 t7 S{
( @! ?- g2 N; h5 Q+ [# [' g        WriteCommandLCM(0x38,1);
6 d0 ^& z' |' N8 N2 A0 D: {        WriteCommandLCM(0x08,1);2 b: I2 Y- i+ M! d3 D
        WriteCommandLCM(0x01,1);
% x3 h% V; p* G1 M: x        WriteCommandLCM(0x06,1);4 h" k" r% C8 @- h1 O0 G9 K
        WriteCommandLCM(0x0c,1);5 M9 m" W3 {9 K& w8 v& U
        DisplayOneChar(0,0,'A');6 N; v: c8 M  q( V+ r4 ]
        DisplayOneChar(0,1,'G');
/ q+ i% \  t$ M7 l7 E}% {4 q  g. f4 O6 V. F5 `: J
//****************************************, y! u3 G& A8 f
//LCD1602写允许9 V5 L* e% x2 T6 }
//****************************************
1 b$ F8 `- [/ ]$ v6 V+ Rvoid WaitForEnable(void)
) o; V) |% G  S* f" q; Z{
1 n" l7 d. l, V5 s( E" X6 I' L) `" ?        DataPort=0xff;, e0 `, ~( O7 z3 B, P* W- A1 O
        LCM_RS=0;LCM_RW=1;_nop_();
0 g: B& j: z' U6 o: t        LCM_EN=1;_nop_();_nop_();
6 q. N2 e( c# y, T        while(DataPort&0x80);/ X* D$ P! X$ U, M
        LCM_EN=0;6 S- X5 e5 _# R4 b3 D: G
}
  ^' f$ d6 M" C) x//****************************************
* A* [3 K# n% F//LCD1602写入命令4 B5 f2 B$ I( ]8 ^. O% `
//****************************************
) a1 G# ~, {& l8 Lvoid WriteCommandLCM(uchar CMD,uchar Attribc)3 v1 z3 l- I( s- ?: C+ c
{0 f, }9 D! t9 F
        if(Attribc)WaitForEnable();
. Y# t. N0 `+ ~# }9 D- L        LCM_RS=0;LCM_RW=0;_nop_();
" A0 }4 O8 u0 T3 a# O, o        DataPort=CMD;_nop_();$ g# r; P: o; L  v  o
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;- i! w; h3 R  S9 S/ E0 h
}5 Q7 n) T1 d* \, h
//****************************************
8 Q5 E; I' Z1 s* w! z//LCD1602写入数据
, p; }5 Q! X/ F- ~% Q//****************************************
/ M6 C* B/ R6 z& ]# wvoid WriteDataLCM(uchar dataW)
" T8 b8 [8 k* g; x{1 s9 S6 x) v0 M
        WaitForEnable();
( k, l: W6 D# X% [. J        LCM_RS=1;LCM_RW=0;_nop_();: @  Z* f/ ?8 `( r
        DataPort=dataW;_nop_();: x1 K, f+ ~: K0 {4 V) Q7 H3 a
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;5 Y/ n: }( `* q' r& P
}* s+ |; T5 {9 v6 {0 x
//****************************************
0 x' L3 a# z# a, b//LCD1602写入一个字符! N7 l5 {$ V* i5 W& m& w
//****************************************
8 }9 A! c5 v8 Y! p) d0 I$ Hvoid DisplayOneChar(uchar X,uchar Y,uchar DData)
- N6 U- e6 o7 t7 s8 ~7 b{
/ j8 u- G" }5 F" ]        Y&=1;& c. B' v+ d6 Q4 C+ p  ?
        X&=15;
/ c  Z6 c% i: |        if(Y)X|=0x40;
8 @+ @3 k+ o" L; e0 R7 _$ f1 V        X|=0x80;, b- O" _$ ]5 T* W0 z+ Y. {  u. q
        WriteCommandLCM(X,0);9 U# X* y0 j# T! f! D
        WriteDataLCM(DData);
: O( _& @5 ?' R6 Z; ?0 R}( B1 q& `- ]8 }3 W
//****************************************( b5 J$ E( w! ^9 M  [6 b0 m' d
//LCD1602显示字符串
- j' b, H# u% @+ O/ G//****************************************3 N: I4 T$ `# W+ [5 L
void DisplayListChar(uchar X,uchar Y,uchar *DData,L)* x( e3 X6 ]3 e2 r
{7 H, b$ l3 y. r( u; M) n! f
        uchar ListLength=0;2 A) Z( e" x6 n& J
        Y&=0x1;+ G. G) Y: q2 w4 @) E$ _
        X&=0xF;
1 a9 `. B8 P1 w( ]2 c8 f        while(L--)
2 V4 c5 d0 p! M( M; c! I, p% F4 F        {
% F. A: E* Q& F. f                DisplayOneChar(X,Y,DData[ListLength]);& G2 |# Q" u# D) P# q" X7 a6 V
                ListLength++;9 j' \$ N8 M+ k4 H) [( ]( I
                X++;
% U  D& r4 `. _        }
: N$ l- ~4 R! y0 V" S& v}
; Q' u8 r( A8 p4 z- l5 V% L1 d3 v; E& B4 `& }* C) s
//**************************************& ]0 j1 ]2 Z7 t; Q# o
//延时5微秒(STC90C52RC@12M)
/ T, X1 T4 d* d//不同的工作环境,需要调整此函数
/ s3 \3 N! l9 c# K! Z//当改用1T的mcu时,请调整此延时函数
% F) ?, {; K8 v//**************************************3 V) V% J# Z" Q5 N. Q
void Delay5us()
) K2 N, @: E3 W- m: s# k0 Q{" Y$ |0 B. ]  @% e
        _nop_();_nop_();_nop_();_nop_();
4 T9 a5 w, t: ~. l1 P" [        _nop_();_nop_();_nop_();_nop_();$ a# P. K8 j$ \
        _nop_();_nop_();_nop_();_nop_();' X0 o5 V$ g. J; y( M' s4 k+ G( p
        _nop_();_nop_();_nop_();_nop_();
1 n) i1 h4 e8 C0 ^$ i        _nop_();_nop_();_nop_();_nop_();# b4 ]) Q* G/ }
        _nop_();_nop_();_nop_();_nop_();' h9 B1 F9 q3 }! g
}
2 p. L4 M- z& B  o4 c7 I) z//**************************************
7 k5 |  {8 E6 N5 e, H& ~//I2C起始信号1 o6 L3 M' I* i. ~# `5 s
//**************************************1 M4 M* k1 j- @- \9 Q- I
void I2C_Start()
5 p8 n% z- R- n{
6 S! A3 w5 V" R  h    SDA = 1;                    //拉高数据线$ \7 Y, c7 n* P, r9 \6 Z/ H
    SCL = 1;                    //拉高时钟线
. r* y  {" T% P2 [* P9 E! D- z) b    Delay5us();                 //延时, d- b. [8 d6 d9 X) y
    SDA = 0;                    //产生下降沿1 }; g, k  v+ d3 y% @& F# n
    Delay5us();                 //延时. n/ r) |8 I& w  p
    SCL = 0;                    //拉低时钟线
- S/ y  D2 ~! d; R6 p}) d- m/ t: k; ?1 @' {3 I) e- d
//**************************************
& K5 g  t# `2 {% v' f* v1 ^//I2C停止信号" R7 P- R7 F) ?) q
//**************************************( A" l8 g* E" L! B; M# U* z
void I2C_Stop()
* E' a3 v+ j  s! G: r) g{8 p' o4 q2 s. A% L: E
    SDA = 0;                    //拉低数据线& W- s, d5 D7 P! A: Z" ]# R
    SCL = 1;                    //拉高时钟线
" E6 q! Q1 @9 T) {4 P$ o1 e+ E    Delay5us();                 //延时- `, q! P% M0 ]4 F" \7 {5 I
    SDA = 1;                    //产生上升沿
7 A) ~2 v2 l2 `4 `    Delay5us();                 //延时
/ [9 a+ [% [0 _7 Y}
) `5 F; m- q/ }- b1 m# g: q//**************************************
: L' X/ e' F8 z# R4 r' }//I2C发送应答信号
- R1 X2 P( M. c7 }' U+ m//入口参数:ack (0:ACK 1:NAK)
3 C  y3 t# Z: D8 X4 N//**************************************: z* o  P# W4 L
void I2C_SendACK(bit ack)) u$ X6 G% {) L* ?
{% N4 m, S9 v7 t* m
    SDA = ack;                  //写应答信号
) {& [8 q! N4 O: z    SCL = 1;                    //拉高时钟线5 H7 R5 V9 r" e0 d8 }+ h6 ~% }7 f
    Delay5us();                 //延时$ p: |( x! R- |) G6 g; `! Y
    SCL = 0;                    //拉低时钟线# Q( \' a5 `* n: J  A
    Delay5us();                 //延时
* X7 l2 D8 T4 Y# f! i}
8 L+ k! n* W; V: R/ z/ B+ T//**************************************8 g7 B$ |/ }- s& l4 d! B
//I2C接收应答信号- G. B5 I7 t$ Q/ q: `! s# d& A
//**************************************
$ r5 M# W9 I' k0 B& dbit I2C_RecvACK()( \$ C( b! P8 x& d
{3 z9 b! b- W$ j0 l! A3 w
    SCL = 1;                    //拉高时钟线
( u( `; V, W. ?    Delay5us();                 //延时
( b; o& W  b7 H* U    CY = SDA;                   //读应答信号
+ u7 o, k& S0 H6 E, o    SCL = 0;                    //拉低时钟线
& T4 a% c0 ]. u4 Y- T6 e% S    Delay5us();                 //延时
- I6 J) ?' [9 ?8 m6 G/ C    return CY;
. E+ G  _1 O& c+ B}- O- N8 `- Z8 X0 ~4 B. g4 A
//**************************************. L& [6 m( Z7 _% f4 S
//向I2C总线发送一个字节数据
0 Z8 U! w0 B# d7 s3 S  ~//**************************************
5 g( n$ `7 w) @  X4 q0 _void I2C_SendByte(uchar dat)
% t! J0 c! V; L# v{
4 B" Y! B, C/ U* f  ]    uchar i;- M: y5 [  N' M
    for (i=0; i<8; i++)         //8位计数器8 z& ]6 C) M% G+ R2 b. A0 W
    {
% p/ s! K0 f: H* a- q        dat <<= 1;              //移出数据的最高位+ f) g8 J& i/ a' X3 V& k8 r& E
        SDA = CY;               //送数据口' |) ?% }; N5 Z8 I8 S- D9 b% @6 B
        SCL = 1;                //拉高时钟线3 U' n# E0 a7 {
        Delay5us();             //延时
4 R3 p) J* \3 J4 R4 W7 B        SCL = 0;                //拉低时钟线
( I- R. r, b$ G, G4 y. w" [, [        Delay5us();             //延时
9 q$ B' J2 _/ _; @; M! Q  J0 I, h    }
* u) g6 e! L8 r' s- A/ y    I2C_RecvACK();
8 q4 p' l4 q. ^- l}4 E, T+ L$ i* g5 F
//**************************************& ?0 c! J& b8 I1 n
//从I2C总线接收一个字节数据: m% Z1 Y+ M- U" H8 o: ]
//**************************************5 ?; t8 {9 d3 p/ e
uchar I2C_RecvByte(): a: v4 v3 x  C. l
{6 d1 A$ D3 o. E; o9 _
    uchar i;
" g( O# G: w  ^5 q# |) o* n    uchar dat = 0;
0 N8 c5 P3 G3 x4 y$ ~    SDA = 1;                    //使能内部上拉,准备读取数据,
- {8 [, Z, Q# O    for (i=0; i<8; i++)         //8位计数器
2 a  G( ?7 o7 N! r; w- j    {: w. L" Y3 |& s3 ?
        dat <<= 1;
5 x5 O" [" x) U' ^6 _! \$ m        SCL = 1;                //拉高时钟线6 f7 m$ ]  M! s  L3 Z9 D- p
        Delay5us();             //延时' L: b0 o! x2 g% u0 N1 T' B5 y1 Z
        dat |= SDA;             //读数据% i2 h4 |* z6 l) b5 o/ J: [
        SCL = 0;                //拉低时钟线# u& r& B& x. U
        Delay5us();             //延时2 k  T9 ~( b% V! i  C+ q& P* p6 E
    }! U: s8 E8 H2 @0 R0 X
    return dat;
0 o9 a  O# B: u$ \}
. `# F# R3 w0 i. T//*************************************** G6 x3 I5 I( A+ O3 G, X1 N3 b7 l; B
//向I2C设备写入一个字节数据
! [6 g* ]/ o5 g9 v& P2 o//**************************************# a- E$ h  z. {0 b2 a) t
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
5 ?% D9 e6 i( o$ C0 L{1 T3 h- ?' p; m1 P  p
    I2C_Start();                  //起始信号
0 q$ n% c6 z: D8 W    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
$ {2 g% K2 x. M" s5 X# f" e2 w    I2C_SendByte(REG_Address);    //内部寄存器地址,
% c9 V: H0 s( O    I2C_SendByte(REG_data);       //内部寄存器数据,' M4 ^! |; {! t% W) F# u6 s3 w0 N
    I2C_Stop();                   //发送停止信号7 o  V3 u6 N  m0 I
}
& P+ H: P! A/ T9 t- ~8 \//**************************************2 @3 y) }3 {/ M8 P
//从I2C设备读取一个字节数据4 m* i# `, [5 O5 K0 A4 U0 u- C
//**************************************$ C& q" _$ k2 q  E  P: W# u. j
uchar Single_ReadI2C(uchar REG_Address)
% c2 N; o3 L/ i) H, E' l% j/ {{: {  o$ U) ]+ t; D
        uchar REG_data;( X$ Z2 J/ _" m2 {9 @% J
        I2C_Start();                   //起始信号( ^. j9 z9 u5 q2 D. z# \2 H
        I2C_SendByte(SlaveAddress);    //发送设备地址+写信号; c2 G& y% |8 k
        I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始
( y( D) w1 ?1 g* _0 {" }  r" T        I2C_Start();                   //起始信号; F0 t5 `7 y! ?' A
        I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
* Y/ @" g8 w! ^' n6 W3 ^        REG_data=I2C_RecvByte();       //读出寄存器数据! Y, a6 l" `4 p$ i1 K+ h3 H! K& c
        I2C_SendACK(1);                //接收应答信号- q4 g" |$ n7 |1 H: m/ F
        I2C_Stop();                    //停止信号
( F. z$ F9 h2 r; x! f        return REG_data;
8 y( k7 t+ j! O& S. o# y}
( U( g4 P# S8 ]% u
* M5 @! @- |, a! L
  f% }/ J# x# O0 v6 Z3 r//**************************************
, G4 P* x: e- X6 @" G3 {- D//初始化MPU6050
/ o2 V: Y8 W+ I& \' c- t6 n//**************************************
" N7 g3 u' s# P* q' P! Evoid InitMPU6050()
  z- _+ ?! E' c9 V. ]; `* V{
2 d" L1 j9 ^; x) i4 J6 f        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态0 v" [3 _, ]6 O+ N- O
        Single_WriteI2C(SMPLRT_DIV, 0x07);
' @% ~) E2 V0 ~" B0 q8 s$ Z: b        Single_WriteI2C(CONFIG, 0x06);
5 O9 U. h6 U+ b0 p4 b        Single_WriteI2C(GYRO_CONFIG, 0x18);/ ^! s4 h# C% W1 K. U
        Single_WriteI2C(ACCEL_CONFIG, 0x01);
( Q% s4 G& m! s6 p}, F8 {, S7 Q2 T6 w
//**************************************
! z' r! j; K3 q' U' k//在1602上显示10位数据
# a/ w* c2 b1 _  ^- ~8 s//**************************************! I) K7 S# z$ e% v
void Display10BitData  (int value,uchar x,uchar y)
$ G- {. A5 v$ w9 z& u{; Y; @, ~6 k; o# b' |/ A
        value/=64;                                                //转换为10位数据 value=value/64  右移动六位3 U. w$ x9 Q- R% e2 W- }7 T
        lcd_printf(dis, value);                                //转换数据显示
4 {; w- u/ D1 J2 l9 a        DisplayListChar(x, y, dis, 4);                        //启始列,行,显示数组,显示长度3 e* ?& |3 p  x6 |3 O, i
}# y; R; C  b# R2 g) o* P% b; [
//**************************************; Y, b: [' B$ |6 W8 y; _, N
//合成数据) {$ w0 W  n7 W% N6 e; h5 a: _
//**************************************
2 v& l  U( ?5 i1 Dint GetData(uchar REG_Address)( I( Y& C! J4 o; O
{6 D7 l4 K/ W, W, x
        char H,L;) ~+ j& x$ J0 u" F
        H=Single_ReadI2C(REG_Address);2 X: X7 N' [% @
        L=Single_ReadI2C(REG_Address+1);8 ]' ^/ V3 e, p" n* R5 T
        return (H<<8)+L;   //合成数据
2 y( m" m9 J7 J- O}/ P  b* ~; W% J. Z/ ~! @
0 I( v, z( n- I7 o3 B, Q- k3 K
7 ?9 n6 s9 i/ N  u2 i% F. u$ F
& y6 _6 V! S: E; e2 U2 s
" `; y* \% W- C3 b# s
//**************************************
8 e5 c$ \! {0 ^+ Z* m* ~//显示温度
3 b8 N% H; c/ Q( ^$ G//**************************************
# K: q6 H- h8 O' ^/ G* d//void display_temp()9 i% F+ z6 m, k5 j
//{7 _$ |* ~9 O' e8 R+ D
//        Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度! U0 ?0 N0 t6 x  ^9 }
//        Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度/ i' I. L% C/ y# {5 ^+ H5 l2 P
//        Temperature=Temp_h<<8|Temp_l;     //合成温度
" {9 h- ?/ B! h//        Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度+ i  F' R; Y' g2 ]1 Q0 O8 ~
//        lcd_printf(dis,Temperature);     //转换数据显示
0 p4 P( a1 a0 E//        DisplayListChar(11,1,dis,4);     //启始列,行,显示数组,显示位数
/ L% e- _/ `6 Q9 J1 w//}
4 b, q5 D! |% s+ D: D//*********************************************************
# y# A3 w+ c1 b5 k+ O( @- o& d//主程序5 |* r% ]: R8 a
//*********************************************************
6 z* j" a, N+ [void main()) B! b2 U% X3 {" ]
{6 E2 C. S1 C# y  f' e
        delay(500);                //上电延时
- c* K$ z5 K+ o, p/ p( d0 |- E2 t        InitLcd();                //液晶初始化
# {7 Y6 r& w& U/ p/ j        InitMPU6050();        //初始化MPU6050
6 A( {" v& [/ F        delay(150);- d. F/ D8 y3 D  `; U
        while(1)
- g4 L1 f, z6 g' [1 ]        {
3 J9 z" I2 F, q" c8 i                Display10BitData  (GetData(ACCEL_XOUT_H),  2,  0);        //显示X轴加速度
- K" l. j; z  c8 P8 b                Display10BitData  (GetData(ACCEL_YOUT_H),  7,  0);        //显示Y轴加速度' B9 C. C" F: E% P
                Display10BitData  (GetData(ACCEL_ZOUT_H) ,  12,  0);//显示Z轴加速度, p4 F1 h3 c' [+ I. d
                Display10BitData  (GetData(GYRO_XOUT_H) ,  2,  1);        //显示X轴角速度
% ?1 A9 g+ S  q- n! q# M0 d: F                Display10BitData  (GetData(GYRO_YOUT_H),  7,  1);        //显示Y轴角速度
+ u& S  i  }4 t                Display10BitData  (GetData(GYRO_ZOUT_H),  12,  1);        //显示Z轴角速度- |7 N& f6 a* u3 T
                delay(500);* g/ o5 g0 f) U( B8 ?+ m
        }9 L. N$ E1 M; B' X
}, r1 K+ d4 e* i# ?' I6 O% ^' Y

该用户从未签到

2#
发表于 2022-8-17 10:38 | 只看该作者
谢谢分享,很棒

该用户从未签到

3#
发表于 2022-8-17 13:10 | 只看该作者
谢谢分享!!!!!学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 14:17 , Processed in 0.171875 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表