找回密码
 注册
查看: 257|回复: 2
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-3 03:38 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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