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

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

[复制链接]

该用户从未签到

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

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- `

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-3 04:06 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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