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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
最近在机器人调试过程中,需要用到陀螺仪,用51单片机通过调试能够测量到陀螺仪的数据并在LCD1602上显示,但根据测量数据进行控制机器人还需要进一步调试。测量数据的读取关键在于IIC总线和获取数据的寄存器地址不要搞错
2 m  r6 V: U8 ]$ b1 D$ y# |/ u#include <REG52.H>- o$ E4 b/ c& H7 s0 U# v
#include <math.h>    //Keil library. A4 d6 K, g) ^" @5 A2 d
#include <stdio.h>   //Keil library3 g! k% |# D* ?6 s$ `* f% d
#include <INTRINS.H>
0 c! {/ Z5 H! d' ]6 s$ Q9 qtypedef unsigned char  uchar;
7 J1 E  K6 b, p9 Y) Htypedef unsigned short ushort;
2 ^! O' f' p% R* itypedef unsigned int   uint;
  u9 _5 I+ l* j) `. f, s//****************************************8 v+ E9 g% _4 ?5 q
// 定义51单片机端口% Q$ X6 O0 c" ]  p6 d1 F+ C5 I
//****************************************
0 |$ h3 |4 C# C# G* |% _+ @9 w+ b#define DataPort P0                    //LCD1602数据端口
4 `& a& x7 Z' K  ^! Esbit    SCL=P1^0;                        //IIC时钟引脚定义
7 n) O2 `) J( Q8 Ssbit    SDA=P1^1;                        //IIC数据引脚定义( x& U5 ~- k" L# D0 J
sbit    LCM_RS=P2^0;                //LCD1602命令端口
/ K. F- l7 n2 t: `sbit    LCM_RW=P2^1;                //LCD1602命令端口* u' X# b& O5 L' s9 K8 s- F9 \9 `
sbit    LCM_EN=P2^2;                //LCD1602命令端口
# f2 ]2 v5 U8 `3 c) v//****************************************
3 |3 l/ N8 u! a% c  Y// 定义MPU6050内部地址
8 j; a( _  w  }' o* }6 u! H9 N//****************************************
6 A; j6 i5 H) s! u$ Y#define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
$ u  V! Z, r  b#define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)
8 x- V/ W, o+ M#define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s). h* G) ]: J( Q! D, v
#define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)' _0 Q( [& ?& X" W7 A/ h7 o
#define        ACCEL_XOUT_H        0x3B+ H, t, u" R, V# v! C
#define        ACCEL_XOUT_L        0x3C
4 p. x& \; k' b1 @; t6 j9 ^#define        ACCEL_YOUT_H        0x3D
- O5 r" G' E' q, R/ `#define        ACCEL_YOUT_L        0x3E3 N) D6 G6 C8 O: f/ y1 W  P1 X
#define        ACCEL_ZOUT_H        0x3F  G6 q! g+ T4 h" r: S
#define        ACCEL_ZOUT_L        0x402 e  w* F! \2 Z
#define        TEMP_OUT_H                0x41* W2 j% F7 h( h' ?; z. [" C! s! o
#define        TEMP_OUT_L                0x42
# t: J" X$ J5 ]6 V5 D6 E, ]8 k6 _#define        GYRO_XOUT_H                0x43
7 v1 l. [8 V. v$ W0 m9 D; p. F#define        GYRO_XOUT_L                0x44
) U4 I3 M3 _# `#define        GYRO_YOUT_H                0x45/ Q& u# c& {) V' R9 h# a
#define        GYRO_YOUT_L                0x46
2 P3 J- h( p; Q0 d, P+ \#define        GYRO_ZOUT_H                0x47
. C7 `; U2 r1 X$ k: T#define        GYRO_ZOUT_L                0x48/ \2 Z, R1 ]5 q4 S; T
#define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
" m& T* T( L  D" E/ s% n#define        WHO_AM_I                0x75        //IIC地址寄存器(默认数值0x68,只读)
/ R/ ~" z" |$ p. _$ ?#define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取% w" l* ^7 _/ B( ?% z
//****************************************7 L  Y) E8 e  P1 e; A
//定义类型及变量8 x# P" e3 P2 G
//****************************************4 b/ E( E( p# w4 g$ T1 x
uchar dis[4];                                                        //显示数字(-511至512)的字符数组. `  \8 ~9 ^5 V2 q: e
int        dis_data;                                                    //变量
2 `1 m/ g1 V+ d$ o7 K4 S' H//int        Temperature,Temp_h,Temp_l;            //温度及高低位数据% E3 }2 \9 h6 `2 W
//****************************************' w" G9 J% j+ v( M, @3 w
//函数声明
, ~# [+ L2 e0 A& v" k8 M5 M//****************************************
; w/ J, w1 F5 E( ^void  delay(unsigned int k);                                                                                //延时+ O# I8 p- z* y2 k- p, n
//LCD相关函数) ?8 b8 Q; T5 J8 y/ M, L+ o; ]
void  InitLcd();                                                                                                        //初始化lcd1602* f. x0 Z3 \* Q; p8 E
void  lcd_printf(uchar *s,int temp_data);
( y; s# c* R* A: g: V. Qvoid  WriteDataLCM(uchar dataW);                                                                        //LCD数据; n' a" x2 e- T
void  WriteCommandLCM(uchar CMD,uchar Attribc);                                        //LCD指令
2 u8 z  I2 P& n+ r% [7 jvoid  DisplayOneChar(uchar X,uchar Y,uchar DData);                                //显示一个字符
! o: C6 B# V; Qvoid  DisplayListChar(uchar X,uchar Y,uchar *DData,L);                    //显示字符串
7 x( U/ s# a  c7 ?- y9 T//MPU6050操作函数$ B( a3 I" V4 K0 d
void  InitMPU6050();                                                                                                //初始化MPU6050
! `' S9 S5 F6 v5 c# [! R3 L4 Z8 d- Ivoid  Delay5us();
+ c% H* R3 V; L" N4 l+ b, R$ nvoid  I2C_Start();8 p# J% e7 U! m" m& |, A
void  I2C_Stop();
0 ]% R9 x" E; I: p8 f- q) b* h3 H5 w1 N: ]' ?& Z6 N1 O
void  I2C_SendACK(bit ack);
; A( b6 f+ ?  Qbit   I2C_RecvACK();% A9 k: s5 r% V! K% d8 |6 G

0 W: K& Y+ h0 \6 b( Ivoid  I2C_SendByte(uchar dat);2 c9 D* V4 i$ \9 ^
uchar I2C_RecvByte();
% _. P# X8 j  \1 e- w5 L+ I% M& [; W  m  Y. |" A$ W
void  I2C_ReadPage();7 a6 i1 H0 C% T2 C: L' ]1 i
void  I2C_WritePage();
# u9 Q  J8 f/ }5 X+ u0 Kvoid  display_ACCEL_x();
3 b# n: Q! c% y9 ?void  display_ACCEL_y();
' Q/ J8 O0 k4 m9 P% D  N% B. Vvoid  display_ACCEL_z();
3 }: _7 t4 C' {# Quchar Single_ReadI2C(uchar REG_Address);                                        //读取I2C数据: C) S1 x% m! ^" c9 h
void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入数据3 D1 O3 d6 d8 r* u  p' T

6 x" W+ W, l6 n) k( {8 G$ s: Y( P: U8 q0 ]) ^: X
//****************************************
2 Z* ?- G3 O1 x1 v//整数转字符串
) n. k: o, k' C: ]) ^//****************************************
3 a% c$ c8 v. T! I+ F& _void lcd_printf(uchar *s,  int temp_data)% m! L) g- u2 ?" C9 P, _
{
# P1 v) c2 ~7 R' v- L2 |        if(temp_data<0)
. B# m& u) Q% M        {5 `0 r6 i6 w4 ^/ a1 H
                temp_data=-temp_data;
$ B! \# U  Q/ `2 Y1 G                *s='-';8 F/ z2 c, D! B8 |2 ^
        }7 ~; O1 L3 v, k4 P; R- O& }* G
        else *s=' ';* L7 @: g& N/ x8 F( }/ Q
        *++s =temp_data/100+0x30;
1 Y2 I8 ?+ Z  ^& v1 ]& ~9 H        temp_data=temp_data%100;     //取余运算$ L! n7 @+ n1 S: j" n% q
        *++s =temp_data/10+0x30;
. t7 m2 T, j4 G5 D        temp_data=temp_data%10;      //取余运算$ h) k( [% N4 q
        *++s =temp_data+0x30;" p$ u$ y: g& K0 Y- ^
}5 q7 Y) O! e# T' r
//****************************************
& ^) N3 `; v4 B& R) Y& f//延时8 Z+ J* b' y; r7 r
//****************************************# [4 B, h% ]( ?2 [0 g2 d3 J
void delay(unsigned int k)- p' Z1 d; K3 b# G. l0 b% p: |) A
{
5 }( t+ d. Y8 r  T" O  v        unsigned int i,j;8 a: H! {# l3 j/ E9 ?# |
        for(i=0;i<k;i++)* p# K) M5 P- t. F1 z* l1 ]
        {
' |: {& J0 c0 X4 g) _8 ?6 L% u' ^                for(j=0;j<121;j++);
1 N, A' s9 j4 r, `0 i        }# I  |! O& f2 D0 _& }: r7 i
}
- m, A8 N3 H" w. V, x//****************************************
2 n5 [; ~7 q" {; A//LCD1602初始化
; i, o/ b; F- x+ k/ F' h3 J//****************************************5 I. F' S1 ?* t5 ^7 d9 X! t. G/ z
void InitLcd()2 d% S# u4 ]0 j
{" f# R, E0 m+ i; }
        WriteCommandLCM(0x38,1);
. R5 W- K$ t  M        WriteCommandLCM(0x08,1);
3 ?+ z5 R/ \+ R1 d3 V( P3 D5 L" B* R        WriteCommandLCM(0x01,1);( h* x; o" \9 K' A6 `3 y+ P
        WriteCommandLCM(0x06,1);0 a# e, S& c+ [9 p7 k. e
        WriteCommandLCM(0x0c,1);
1 Y! R7 y3 o3 _6 ]+ N2 r& a/ z        DisplayOneChar(0,0,'A');
$ S3 d2 @: V1 n  {, P" w/ E        DisplayOneChar(0,1,'G');
# I+ c' r( A5 f# h4 i}+ j  t% b' c* w
//****************************************
5 H0 ]! a7 \( K6 k) Y//LCD1602写允许
2 I! Y5 }7 p! z8 L//****************************************1 D" O9 H5 ~- q3 ?) Z
void WaitForEnable(void)
3 N- n1 `8 }; P& u: f% m{& P) K" K7 t% i  R, @  H7 V0 Y3 A
        DataPort=0xff;. B9 r: M/ y, Z2 |# Q
        LCM_RS=0;LCM_RW=1;_nop_();
! T- b6 R/ k0 D# H& j        LCM_EN=1;_nop_();_nop_();' e% i9 G' {3 r/ S% q+ `. t5 {
        while(DataPort&0x80);1 n+ p4 z1 S+ k5 ^. \- D9 W
        LCM_EN=0;
' C  n% \1 g4 V) \8 K9 ^  L) F5 i$ r}
0 F0 d$ {6 Q# O4 A0 r//****************************************
, i7 G6 Q. ~) T$ o% P4 }4 z//LCD1602写入命令' S/ X& L* Z* N4 V2 C: R0 |2 v
//****************************************
% z/ z6 h( l) O& o; H/ q1 Dvoid WriteCommandLCM(uchar CMD,uchar Attribc)& Q3 a3 I4 x- [0 |9 s, D5 p
{' W1 ^  Y1 u; t( i3 [+ m4 i! t
        if(Attribc)WaitForEnable();) z: m, H. p, R+ L
        LCM_RS=0;LCM_RW=0;_nop_();1 p; a* Q8 k! E& ~: N
        DataPort=CMD;_nop_();; l- u9 S8 w' u7 M2 g2 \4 ]9 a# f
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;8 a! X" C6 F; E" k% |" C1 d8 U& }) L, R" _
}
( ?" ?9 A8 \' G1 H7 ?* y6 S8 g//****************************************# g6 [6 Y$ Z1 X& V
//LCD1602写入数据& A' }7 L# h. s) o3 T. {; c8 @4 ?
//****************************************% L/ ]4 c! C6 i- u1 ^2 x! Z
void WriteDataLCM(uchar dataW)
% [1 F# d, s8 V{
6 s( G, X9 W' T, j2 ~/ C* r) y        WaitForEnable();0 h$ \, `, ]5 E+ o' D
        LCM_RS=1;LCM_RW=0;_nop_();+ Z$ J  R: w! t/ ]5 c
        DataPort=dataW;_nop_();
4 L3 f7 u5 J, R9 `' j( g+ j        LCM_EN=1;_nop_();_nop_();LCM_EN=0;0 S9 t- p8 X" f0 O/ q8 D
}. }+ W/ \7 n8 V' p1 C$ J/ d: ~  I
//****************************************
# S6 U7 z/ Y9 F9 f  _3 R//LCD1602写入一个字符' v+ `7 M0 A8 Z. q) C2 @" v6 f
//****************************************
1 i5 f7 a+ i' Q  E* m& kvoid DisplayOneChar(uchar X,uchar Y,uchar DData)% y9 C  ~( c0 C9 Y- S
{
7 l% ], @, s* @0 G0 v        Y&=1;2 ?: K7 j0 q# Y7 Y. T
        X&=15;5 h; m% w6 ~4 M% y, E/ x
        if(Y)X|=0x40;0 c: G. x; G  z9 M# r
        X|=0x80;' D0 F5 W0 z( ^6 N  ?, W
        WriteCommandLCM(X,0);" `! r7 }: }; x
        WriteDataLCM(DData);
  ^, s5 F8 I+ Q8 L9 k}  U( K6 D6 U' S+ n
//****************************************
- n- K6 c* k+ A! G8 @2 `//LCD1602显示字符串
. U0 c6 d7 C6 Y3 V//****************************************
# T; w. v0 X4 ?void DisplayListChar(uchar X,uchar Y,uchar *DData,L)
% p+ R+ A2 i* h5 i{, l. {4 V0 w* u2 i# F4 Z8 ?. J
        uchar ListLength=0;! v0 @$ m: E4 g% p- v2 l6 _
        Y&=0x1;: V& `7 l6 X7 @6 X' F: c
        X&=0xF;
: j& v% i+ z  M8 `9 i" I        while(L--)! P3 _5 }- _% m7 K1 Z
        {
- s. Z; p1 [( g; x                DisplayOneChar(X,Y,DData[ListLength]);
4 o5 f0 d' C# T; |% |1 K6 W4 G                ListLength++;' E7 S4 l! Y3 p' R
                X++;: l' q7 P, T/ d) v! W
        }
6 a2 s; b# @' R  d$ `' _4 v}
, V0 A% B1 H- {
) @. N2 ?8 I. G& f7 s+ B//**************************************, r% }: ~8 |5 b" F& P. x2 b: E% n+ a
//延时5微秒(STC90C52RC@12M)* W7 @- \! h) Z7 V  t9 e4 T3 @
//不同的工作环境,需要调整此函数
2 j9 Y; @% q1 s* b//当改用1T的mcu时,请调整此延时函数& y+ d: q' U( M3 d7 f( S4 R
//**************************************' \7 K. q3 N, k" b
void Delay5us(): `! o& @& s: t, F6 ~& \- H
{
5 u# _7 z9 u& @4 `        _nop_();_nop_();_nop_();_nop_();5 q/ V: s2 p6 f6 j+ B  z8 E
        _nop_();_nop_();_nop_();_nop_();; h9 h8 `$ {6 U% {
        _nop_();_nop_();_nop_();_nop_();
+ g# n7 j+ w% H% Y1 d        _nop_();_nop_();_nop_();_nop_();
# c1 O5 W9 n% E7 s        _nop_();_nop_();_nop_();_nop_();
% `2 u7 d; V6 b, P2 b* t        _nop_();_nop_();_nop_();_nop_();! q7 T5 Z6 B9 p- i9 E- x) F
}
7 i: C* H& ?2 C2 Y5 E" v8 x//**************************************% ~! t# I" L' K# f
//I2C起始信号
7 U1 [; |) i7 t* o//**************************************: {/ u! _: Q& z& }! I
void I2C_Start()
: Q" q, ~" a, m5 ?% O& Q{
. \) l( U" f6 s# f. u3 E: j9 s    SDA = 1;                    //拉高数据线3 v6 v: j+ f, X8 i' C' z
    SCL = 1;                    //拉高时钟线- ?1 e) p+ j) j6 w* U7 @
    Delay5us();                 //延时
9 u& s$ I7 N) G. h; m9 l- A    SDA = 0;                    //产生下降沿9 `0 O9 R& a7 S4 X2 r
    Delay5us();                 //延时
+ C; ]) @( d7 D! }! d    SCL = 0;                    //拉低时钟线
- p6 T0 Y2 P2 r; P}3 Y9 e# y5 _$ O
//**************************************
) o9 z0 q8 M6 D4 f3 R0 d; t; g) r//I2C停止信号
1 c0 v! |) x( r% `( r//**************************************
: P( m9 \1 {/ Z+ Wvoid I2C_Stop()
+ B) L+ K7 Z- p3 {{8 w& ^. m$ c, K# s
    SDA = 0;                    //拉低数据线
- H- U7 i8 _3 z" @1 \    SCL = 1;                    //拉高时钟线! x. c; c/ ?, p4 R' C# s- r+ J
    Delay5us();                 //延时+ T3 m# r0 Y$ _% R) u# O# X: Y
    SDA = 1;                    //产生上升沿
2 z3 s& z% S# [    Delay5us();                 //延时
' X: a4 t& t9 q* j+ u( ?}% C) D3 k' Z" g; ]4 o
//**************************************
- B8 I# Z, Z- R  Q4 R/ K//I2C发送应答信号- P) T4 f  J& M9 i5 z6 B
//入口参数:ack (0:ACK 1:NAK)
' @* T2 w$ N+ X/ x7 f//**************************************
% T/ R; Z; b+ f" i/ p2 cvoid I2C_SendACK(bit ack)
  d' [1 O. ]: r4 j% @* D{6 C+ h1 d, q. B2 D$ f
    SDA = ack;                  //写应答信号
( p$ }; F& Z( v3 q2 y    SCL = 1;                    //拉高时钟线
0 q# J' v/ t; _    Delay5us();                 //延时/ E7 ]+ ?# ]* Y
    SCL = 0;                    //拉低时钟线, Q3 s2 e. \" `2 q# g1 o' g, q4 J
    Delay5us();                 //延时
' s6 w6 v9 W% P* S}, p8 d8 s) F/ V& q$ o
//**************************************
4 _: @! }% d9 k) y$ u  a; `//I2C接收应答信号
' c1 f, U) V. N//**************************************/ T( A; n# @4 @: t- I7 m( y
bit I2C_RecvACK()% S2 t$ I8 B, T4 R( Z  Z( k
{
; |1 j. O$ P  S    SCL = 1;                    //拉高时钟线+ X* U4 e; c- C* ~/ C. b/ O, ^
    Delay5us();                 //延时
  s8 N0 c1 d- [$ \8 Q# T    CY = SDA;                   //读应答信号; p; H; a+ E- Z" F1 G
    SCL = 0;                    //拉低时钟线
, b! @% J: R- I* U2 r+ k$ ]/ B    Delay5us();                 //延时! B+ m/ J& \2 n, O2 D3 g, a
    return CY;
: K1 z! _) o: O5 J* Q7 z; R* C}# U( N, n, e" S$ J6 m! T8 a& Z
//**************************************. E- z( l% c( Z  `2 e
//向I2C总线发送一个字节数据* C" P. A, P; s
//**************************************; m$ G, k( Q8 x  ?
void I2C_SendByte(uchar dat)
& K: ?# l' L- m2 w% I1 z{
* T4 k6 E/ h5 R  D& r    uchar i;# P. T) Z6 i4 d0 d+ Q
    for (i=0; i<8; i++)         //8位计数器
9 S/ Y7 D# u; @. H2 }$ |    {
( P7 Z' C9 }) ^- }        dat <<= 1;              //移出数据的最高位
. m$ V" ?0 F" O0 p7 `        SDA = CY;               //送数据口/ `- u! l: ~2 G) P9 z) G8 ?6 b) {& z
        SCL = 1;                //拉高时钟线3 h' A+ O/ w" _/ F3 D
        Delay5us();             //延时1 R2 Y* K* ?) a
        SCL = 0;                //拉低时钟线! z. i. Z4 i( r; a% z, |2 X
        Delay5us();             //延时
% |5 j' C' ~: V    }
9 F  W* {! p' q( K/ K    I2C_RecvACK();: L1 j8 R& i8 K9 x* i6 G
}
; x' A; P2 c4 ?1 J//**************************************
( q# o! f* K- K/ s' }- V; h8 h, W! C//从I2C总线接收一个字节数据
) U& x2 q0 v9 l# N' W% z; b//**************************************
) f1 @% D) \) i" O( ^uchar I2C_RecvByte()9 C. `$ e6 D, s. `
{
$ y- T4 q$ Q# Q( y1 @7 E: A    uchar i;. b8 m8 [- G4 P8 r
    uchar dat = 0;
" Z8 r2 a. I4 [* p1 E$ c    SDA = 1;                    //使能内部上拉,准备读取数据,
7 ~: C& o/ ^+ G. b1 k. q    for (i=0; i<8; i++)         //8位计数器
) [% C* d/ j) i" t  R8 A& S    {
) g5 R- Z: d$ u  ~) w        dat <<= 1;
% s8 f! `* U5 f        SCL = 1;                //拉高时钟线+ M6 }5 f4 \" l% v1 {( Q
        Delay5us();             //延时. h0 g# f1 N8 R; I
        dat |= SDA;             //读数据3 W5 O. t  V7 \3 O: c& w) o3 D
        SCL = 0;                //拉低时钟线6 G% o3 \1 y0 C4 h$ r7 T
        Delay5us();             //延时
% G1 e" V$ p% x4 }# ?+ G    }$ W* a2 |6 Q' m5 Z
    return dat;
0 g9 C1 E4 `+ _- g$ ]}1 i- s$ z& ]$ N- \* M
//**************************************
6 O; Z. g2 ^7 l; `1 S//向I2C设备写入一个字节数据
" j# K; f2 k0 e5 G0 C% ]# ~2 O& a$ u: B//**************************************" f0 P. L5 M/ k) P! i. W
void Single_WriteI2C(uchar REG_Address,uchar REG_data)1 U1 o: T. D) Q7 C  G
{; n1 p* z" b" |5 ?
    I2C_Start();                  //起始信号, k9 b  S# M; @/ f* l4 J$ H# N% E
    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
( H" l/ v: j' D0 E' v    I2C_SendByte(REG_Address);    //内部寄存器地址,- l* K7 V" G+ y- B  {( _7 l- g3 |
    I2C_SendByte(REG_data);       //内部寄存器数据,# l5 r  q- z+ A# Q* ]1 ^  m( g
    I2C_Stop();                   //发送停止信号
. r0 |7 N. F  R' i}# p1 V" q5 E, W6 H% M
//**************************************
8 c3 M  ?* X: F" {+ w- L//从I2C设备读取一个字节数据
- C- K1 _% z4 g3 T) L7 r8 P! ]//**************************************" _) p) v8 r: a/ @( y
uchar Single_ReadI2C(uchar REG_Address)
& Z1 S! _9 x( f+ \9 d0 \{
0 D- n- |# Z6 ~! v        uchar REG_data;
6 c: |8 j( P. e2 V) X2 ~        I2C_Start();                   //起始信号+ {$ P, V8 S* x) ^2 X- f2 A: K
        I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
9 ?( ~  i- X! O: k        I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始$ X6 I! b6 e+ U$ c) s
        I2C_Start();                   //起始信号
. O0 A1 k9 B1 x2 X# |$ h        I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号# B) }; y5 m5 n  [+ u9 v, v4 W) }0 C
        REG_data=I2C_RecvByte();       //读出寄存器数据
7 B' Y6 U* b2 l2 \" f        I2C_SendACK(1);                //接收应答信号7 z* F+ x7 W# H4 z9 ~
        I2C_Stop();                    //停止信号
3 _4 v: p7 `: |% q2 ]3 r        return REG_data;. A" |* c& ^6 }1 ^: d2 [# Q) O+ T7 ^
}
$ E( b* `& `2 d" o" c! X: i" Y% d5 c8 I) W9 R: H
+ j9 k* |) S/ {+ g4 b7 Y* I( e
//**************************************  j1 Q( f1 Z6 q: O- E* O7 D0 Z
//初始化MPU60503 S9 H+ e% a3 G, a3 @# M5 C
//**************************************  {: E& p. \' ?. T
void InitMPU6050()
+ H  a2 @1 C% F9 P- N% ~{
/ e: y0 d, z1 [% l; a0 H- Y7 h        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态* n. ?5 h% ?$ q! u) K$ X) q6 P
        Single_WriteI2C(SMPLRT_DIV, 0x07);
. m1 o4 ]" B8 J- ?# E        Single_WriteI2C(CONFIG, 0x06);. K5 g6 M$ F, u& C8 |5 h- x
        Single_WriteI2C(GYRO_CONFIG, 0x18);3 q9 i5 d8 X& J. X. r0 A
        Single_WriteI2C(ACCEL_CONFIG, 0x01);
" L9 i. q4 B" T; n$ P}
$ n1 k; C2 z% N9 d//**************************************
7 r" a/ @* s! c6 n//在1602上显示10位数据2 T# z- r  L9 X; ?
//**************************************
1 R0 E; B4 J* z( Y9 O& ~4 d& A6 lvoid Display10BitData  (int value,uchar x,uchar y)
4 y1 T3 q2 ?+ F{0 }( k* B0 S# b$ L5 N& m* ?, s) O
        value/=64;                                                //转换为10位数据 value=value/64  右移动六位
; f; t: K( T1 B$ g3 y/ g        lcd_printf(dis, value);                                //转换数据显示
1 N; l0 H' {) J& c' \' X        DisplayListChar(x, y, dis, 4);                        //启始列,行,显示数组,显示长度
$ f$ y3 b5 j, G& r' g" ?& r}, Y8 ^  z& g6 e
//**************************************
' B9 O' R# `) i6 v$ S/ x6 i//合成数据, p& V) w3 ?! X, {
//**************************************
$ {% J8 s, p( L7 X( d% }2 v- Gint GetData(uchar REG_Address)3 x3 c2 _7 Y4 \3 W" z
{
3 u" |7 H, z& ^9 }        char H,L;7 ]! @6 L; \# U: ]6 @
        H=Single_ReadI2C(REG_Address);0 @6 i# m$ v6 I0 g/ L
        L=Single_ReadI2C(REG_Address+1);
* E$ r9 X9 [6 {' J2 [$ u        return (H<<8)+L;   //合成数据6 R, R( l, {5 Z* @6 `$ p2 s2 L
}( T9 d; ~7 U% |/ x" ?

" A6 @2 Y; h0 p1 Y& S& V# F- B& s3 r  ?4 h' X
# U1 L( f) ]9 s
* Z8 K" w- J) H! S
//**************************************
. A) K; Y2 ?% u$ {- A+ V6 m2 q//显示温度5 E0 p1 v1 }( W2 {4 ]8 q
//**************************************. l2 r' P% x( j3 e/ b; ]
//void display_temp(). X1 ?8 X6 d3 y2 U
//{
  P3 |& l+ E* }" P. V//        Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
. j6 b/ u  c( l$ I) h. E) e6 D//        Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度1 k5 {3 X" i/ a* X  O
//        Temperature=Temp_h<<8|Temp_l;     //合成温度
" n0 p. G0 S4 R  i# I3 q$ N1 W//        Temperature = 35+ ( (double) (Temperature + 13200)) / 280; // 计算出温度* ^; a9 L5 k, g5 w/ g$ b+ K' @
//        lcd_printf(dis,Temperature);     //转换数据显示/ V- O8 w  G6 T4 C3 i
//        DisplayListChar(11,1,dis,4);     //启始列,行,显示数组,显示位数
/ I% t' a, \3 b; p, S# H- I//}
% i" E. m9 n6 R& x' \. c//*********************************************************
5 b, y; V% M3 T$ @2 B: r4 g//主程序
/ H0 Y+ b& m. Q; c//*********************************************************
, c" c% @# ?" H* a/ |void main()9 M- X$ ?, Y# ]. g
{1 t3 I& {7 l. B7 A7 u
        delay(500);                //上电延时, y5 q) T5 Y) |8 ~% e
        InitLcd();                //液晶初始化
" u: Q7 h1 J+ @' V/ o9 `6 n        InitMPU6050();        //初始化MPU6050
2 d1 s5 g# Q5 c        delay(150);
. M3 o! Z+ l) l- g% f0 d1 P8 Y$ b        while(1)7 O0 C4 ~9 ?$ I# c7 c7 Z
        {
8 u% I& ]5 F+ [                Display10BitData  (GetData(ACCEL_XOUT_H),  2,  0);        //显示X轴加速度
) A1 e/ c' ^4 L" T" D8 X; P                Display10BitData  (GetData(ACCEL_YOUT_H),  7,  0);        //显示Y轴加速度0 I. x( J( X2 k
                Display10BitData  (GetData(ACCEL_ZOUT_H) ,  12,  0);//显示Z轴加速度& ?4 T+ v3 h7 h4 f8 C
                Display10BitData  (GetData(GYRO_XOUT_H) ,  2,  1);        //显示X轴角速度
7 ]# \; z1 v' Q/ w: T+ k                Display10BitData  (GetData(GYRO_YOUT_H),  7,  1);        //显示Y轴角速度
2 p% H* {" F" B& q                Display10BitData  (GetData(GYRO_ZOUT_H),  12,  1);        //显示Z轴角速度
$ S( y' a7 l' G! G& C  h& y% s                delay(500);0 H. u) ^/ z# s7 D
        }
3 [7 Y! Z: [% C; ]( j" a}( x4 f; z9 I9 I; A* t" r9 L

该用户从未签到

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 07:16 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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