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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-30 06:02 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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