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

HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教...

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-9 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
HMC5883L电子指南针罗盘模块 GY-271三轴磁场传感器 的相关教程
+ Z- Q8 ]* h  I3 ]& T9 n- jGY-271模块教程分享,这是HMC5883L电子指南针罗盘模块 三轴磁场传感器 的相关教程,带stc单片机。avr单片机和Arduino平台的源码。有需要的同学可以看看& ~. w4 c* w6 c+ T" T1 L

& X+ G% k# S$ mGY-271 HMC5883L模块外观图:
% q8 I5 y6 `$ }4 c$ V% O7 u. ^ 0 x9 q0 r; C% S% C- e& B

9 Z- m& ~( C& O8 C( d# HGY-271 HMC5883L模块原理图:  X1 t; L9 a2 n. e# t
; {2 |  I% r1 \

: @, o/ [/ z7 q  ?6 @0 ]6 B0 pGY-271 HMC5883L模块尺寸图:/ p' w) j0 g) o2 d2 \0 f% v

, O0 v, G8 W4 c7 D! H" i4 a" Y) G
' D( ^+ g0 S1 \, o5 C% O7 d9 g+ \& P; b0 s+ g

. y  w9 n' ^. r( }与单片机的通讯接口程序:% O5 O4 V$ ~% ]" h# {, k+ k$ u+ x
//***************************************" f- k" n) u: f  Y
// HMC5883 51串口测试程序
. w: B' Y4 ~7 W0 O$ s) J, m// 使用单片机STC89C51 " C) Y7 O% [( {9 u
// 晶振:11.0592M
4 @$ ^4 h4 P8 d1 q4 J+ f// 显示:PC串口: l) [7 ^+ z: ~
// 编译环境 Keil uVision21 r7 s4 k5 ]8 j" k  M! S
// 参考宏晶网站24c04通信程序
2 A8 e: S  x1 L* g' D& \4 E// 时间:2011年3月1日
, E6 c8 o3 @. y//****************************************; A% p: @% g, @) P- K9 d% p& ]
#include  <REG51.H>        
! n5 x) t7 U& u. d$ ~#include  <math.h>    //Keil library  8 t; W; c5 H2 l
#include  <stdio.h>   //Keil library        3 Z" \. m, _: R" j2 J- E) M
#include  <INTRINS.H>8 G/ m  d8 E4 u/ ?) H# X
#define   uchar unsigned char7 `* g8 c: S$ U' ~5 @! @+ U. u6 ~
#define   uint  unsigned int        * U2 X+ O& [$ T
//使用的端口,请按照以下接线
* C7 B: ^0 ~; t' }1 T#define DataPort P0        //LCD1602数据端口# ~( _: W; o7 V& ~
sbit        SCL=P1^0;      //IIC时钟引脚定义# w. U! s- y% S% W+ S
sbit        SDA=P1^1;      //IIC数据引脚定义; I0 x+ p( ?% [0 Y8 @+ c& c' _

7 v' n6 |9 x' g
* H; K" n# h; S6 u

7 t, t2 M! }& K4 o! k2 A( x2 u5 P% R
% i+ P- `, N) l3 T
#define        SlaveAddress   0x3C          //定义器件5883在IIC总线中的从地址) ]# v* Q( y% W# @- G2 e: O+ W
typedef unsigned char BYTE;
) h& ], v1 b* b4 a: ^. ?' jtypedef unsigned short WORD;
5 _! V, Y$ N4 E/ [% n5 Y3 T
! N5 k9 V4 S4 O1 _3 @* n5 g* p

, v9 }' S& D) [$ E8 xBYTE BUF[8];                         //接收数据缓存区              + {% @8 e" F( D
uchar ge,shi,bai,qian,wan;           //显示变量
& @: M: G, q) m/ _4 `$ M" {int  dis_data;                       //变量  `  F" E) Z) W9 U4 R( T. u
//************; R. H1 g) z4 q* S0 G

" S6 @. a" H' S" N
, i9 Z& D. V. S: P. [! Q
//************
5 l, h$ z* ~; G# lvoid delay(unsigned int k);) K+ O# \5 w5 l, w( H
void Init_HMC5883(void);            //初始化5883/ q% v6 I' k% ^$ q
void conversion(uint temp_data);% u3 U* _( H- X  S2 Y

; o& z8 B: T/ V

' A  m5 l1 G: R& Y7 g6 A7 Z  Lvoid  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //单个写入数据7 K& j; N9 ]+ C4 s' e
//uchar Single_Read_HMC5883(uchar REG_Address);                   //单个读取内部寄存器数据& ]% [# Q: s$ Z; x3 c5 @9 t- `; m2 n" s
void  Multiple_Read_HMC5883();                                  //连续的读取内部寄存器数据
9 V$ H1 Z; F& i//以下是模拟iic使用函数-------------1 u7 X" E" H6 a, t# M* K' `9 T
void Delay5us();
$ T! f/ c: r, r. T" j7 yvoid Delay5ms();- r' p  C' O. T- f
void HMC5883_Start();" w8 a" Q% \7 L' R0 ]* r& p
void HMC5883_Stop();
$ x& N- Q5 C8 N% |1 k- Ovoid HMC5883_SendACK(bit ack);
7 L% M6 ^; p  Z& [' |: [. Fbit  HMC5883_RecvACK();$ v( m9 h7 H4 q* j
void HMC5883_SendByte(BYTE dat);
1 y) P4 E; h- l) t0 P' r- Q$ y) gBYTE HMC5883_RecvByte();
! E  q8 s8 }  p" u) xvoid HMC5883_ReadPage();+ r+ R* x& i2 `  l& T
void HMC5883_WritePage();
+ ^7 ?8 Z+ z. Z0 u//-----------------------------------
; t2 n2 w  m3 ~; H, X2 r8 k1 |) e" y# F; c; b8 l+ a6 Z) d( f& Q

& z8 g. |6 t/ |6 w. D6 {//*********************************************
. E+ E. L6 J: Y( |//串口初始化- T8 f8 |& \5 c5 ~6 Y& i
//9600 bps @ 11.059 MHz
, O$ ]# D8 g( ], _' F# yvoid init_uart()
8 n: F0 F8 ~) G/ b& y8 R{
4 r+ |: V7 v1 E. u/ y        TMOD=0x21;                                * t$ \9 k. b& B  D
        TH1=0xfd;                                
' Y& c1 R0 w& v0 E7 d) x        TL1=0xfd;                                
9 o* ]& J3 h3 u; x) A5 d2 s" q        SCON=0x50;
9 v8 B$ q, d3 J1 r        PS=1;      //串口中断设为高优先级别
! `# I# B7 s0 C) Z* B3 u        TR0=1;           //启动定时器                        8 x( L: Q! l4 k: }. T% C& y
        TR1=1;
9 E9 d; I" p( W9 i$ K# b" p        ET0=1;     //打开定时器0中断                        ! l; m7 k, R) s2 I* G5 d
        ES=1;        * S+ H/ L& ]9 l5 m  D
}& D! P/ K* H; I" U7 z
' v  ~( t1 I+ H7 G( F! P

7 |0 a! {( w6 f* `//*********串口数据发送******************
, X5 w  K; b+ W" _void  SeriPushSend(uchar send_data)! v' n1 V# ^& g' X
{( b6 r  u  x  {
    SBUF=send_data;  
2 u1 d5 F8 B- O        while(!TI);TI=0;          4 Y; b) J) y. }* m
}
2 ~* b: Y$ k& ^& x6 U9 U//*********************************************************1 E2 S9 |. b+ J% }. T0 r1 E
void conversion(uint temp_data)  9 I- p1 w3 @1 P+ t7 n1 G
{  ' c- a& [2 @+ j+ D" o0 c
    wan=temp_data/10000+0x30 ;
5 q2 R. l8 S" f9 \5 `    temp_data=temp_data%10000;   //取余运算
' Q, V3 p! h& D4 s9 c& P1 }* t: e4 i        qian=temp_data/1000+0x30 ;
1 F0 b& @/ e* `) H. t    temp_data=temp_data%1000;    //取余运算
/ g3 _& h# a/ W* x# g- b    bai=temp_data/100+0x30   ;7 @$ c2 M  }9 w' P% j# L% `& t
    temp_data=temp_data%100;     //取余运算
3 V# o) O3 v5 Z/ N3 a1 K( ]( j' {    shi=temp_data/10+0x30    ;
" {6 [2 e: h8 V2 G$ i9 F+ Y    temp_data=temp_data%10;      //取余运算
/ U; _) R" s" X( v0 n: q    ge=temp_data+0x30;         $ r4 [: c3 c( v5 A& S0 e% Y! f
}0 [" {' i$ z# h7 ^, {

( G. A8 F: p4 X1 [7 e7 S
4 ]4 {  D( A' e% P/ f, P3 h
/*******************************/$ ^" u, ^2 Z; ?
void delay(unsigned int k)        ' V! G$ _7 e( Q2 \
{                                                9 X3 P7 f- b. Y0 v" }9 t/ z
unsigned int i,j;                                2 z8 m4 |2 M8 P, z
for(i=0;i<k;i++)
4 T4 K6 H1 ~9 v" P" d{                        % P) i$ `! Q/ Q5 t8 N# W: U/ D0 l
for(j=0;j<121;j++)                        
4 H6 X" N: J" B. _# f3 i{;}}                                                0 y0 [5 V' W0 N, c: N" ?
}
) f( p- t; k) x- E) t/ R        1 r/ V- ]8 S% m4 v3 f
  M1 S2 r0 g' ~7 C+ J7 o

1 C& B4 A: [. `' d/**************************************2 @1 `' s$ E/ ]" F9 [
延时5微秒(STC90C52RC@12M)
9 y# H/ S/ ~( o( y不同的工作环境,需要调整此函数,注意时钟过快时需要修改
4 O/ z, b: \  A7 K  ^当改用1T的mcu时,请调整此延时函数
6 r- a+ v% r' q& O**************************************/7 Z5 d9 N1 g# H! _: G2 C# j
void Delay5us()
2 k4 y8 A5 X3 Y. p{
* x0 z- Q  r/ I0 A* g3 `; u2 d    _nop_();_nop_();_nop_();_nop_();
& ]' D3 S( I* m7 B1 A    _nop_();_nop_();_nop_();_nop_();
  t+ y3 k2 r, Q) Q        _nop_();_nop_();_nop_();_nop_();
4 Z* |# N% h2 ]        _nop_();_nop_();_nop_();_nop_();  c$ R, n5 ~) Z* ~7 L
    _nop_();_nop_();_nop_();_nop_();' g! I) Q2 @" J, l8 r* s' f
}- p4 d  Z5 a. r% x0 Z/ \3 r" l$ [
% `8 d% H) C& V) S
) D' g) f+ l0 m0 P
/**************************************
* E( I4 c: K. q延时5毫秒(STC90C52RC@12M)
- F% a* h2 h6 \* X: r: X# g不同的工作环境,需要调整此函数" p* q$ J0 Y0 Q& Y  U
当改用1T的MCU时,请调整此延时函数
+ A' n7 U$ |; g! P# y**************************************/# J% V" o1 J, s- C, T1 F0 z
void Delay5ms()0 Y% T# \* s) W
{/ X( t& r  h: \: A# d8 e
    WORD n = 560;. M: X1 m5 y0 O! g7 X, D* P
. L, b: A4 I6 x4 K- Z

8 x8 m, F, D( S" ]  \5 a9 b    while (n--);
6 n0 Y1 B8 Q8 U+ f& q' [}
9 ?7 [3 V" _2 u2 T5 b6 j, ~" B3 A' q
$ A* w% A' t' O1 _! B$ Q- @
/**************************************
3 d) m9 G& E, k8 A8 m9 [: z# [起始信号
! s4 U$ Y1 r- e9 U* \**************************************/
1 ^5 }  B0 A, g4 U) ^9 p" [void HMC5883_Start()
- s' \3 m4 H( W; p( _$ m{- V0 Q4 C! b1 @2 ]5 k6 a) f
    SDA = 1;                    //拉高数据线5 m8 |" z- u" v* Q
    SCL = 1;                    //拉高时钟线
- x& s  t* r7 a) p: e    Delay5us();                 //延时
' I, X' M$ `* C) O" P' i    SDA = 0;                    //产生下降沿( S& {- U/ ?4 i) ^3 B3 y( ^/ U, P
    Delay5us();                 //延时9 x1 H& y* |& ^7 P: s0 [4 }
    SCL = 0;                    //拉低时钟线3 v9 i, \. p! J% h% t2 G2 n
}  X4 P* g. a) ^0 [. W9 D
) ]  h  f: y; F  M" y3 z

1 d* Y  \4 D+ J. L% U/**************************************( Q( w- z- U. F
停止信号( J2 q8 J. N4 T9 ~* {
**************************************/6 s2 c, X7 n0 S4 g7 j" ^6 p0 v
void HMC5883_Stop()
+ v" {* f! t) r" D; D$ X{. a# Z. n" d1 }& X9 s+ Q6 w
    SDA = 0;                    //拉低数据线
* S& w! S+ T# R; y    SCL = 1;                    //拉高时钟线
% O9 o- o7 q/ ~( h8 x* m    Delay5us();                 //延时
  g$ b. S( Q2 O5 r' G    SDA = 1;                    //产生上升沿3 g) D. b% s- t( h, D
    Delay5us();                 //延时
$ l6 ^! Z$ Z" D$ ~% u3 F}, X6 {! ?4 Z  b( O' z

. A7 |# D6 G, p) H# ]5 i
2 i8 o) _4 n* \' f8 }  q8 O! n
/**************************************2 t6 a7 {& C4 H1 F
发送应答信号, B) k" W$ R; ?" O3 ~  F
入口参数:ack (0:ACK 1:NAK)
2 \) y& h% }  K" C4 `**************************************/
" x/ G5 K% S+ z+ Gvoid HMC5883_SendACK(bit ack)
# g2 l- o/ E! J8 F{: ]+ ?! T% {& `% Z
    SDA = ack;                  //写应答信号# x" [6 h+ S: c7 l  |* n( p
    SCL = 1;                    //拉高时钟线9 O# e/ v9 N3 l' |; p$ M
    Delay5us();                 //延时
  f1 g( b1 `1 h    SCL = 0;                    //拉低时钟线
! l. A2 L) @+ @* Z% X    Delay5us();                 //延时
) X6 Z% ^0 P- [. h8 e; n' o}: Z' A2 O. H* a( n" F3 B9 G) w

! u, N7 Q& K6 X$ g! r  n9 H9 c

- e; x8 W  L) A: ?7 o  z/**************************************3 T1 v0 f8 g. k& z
接收应答信号6 a9 _) J4 h6 U" E; ~
**************************************/# a( E. u& y9 N4 w+ l" ^& F( b
bit HMC5883_RecvACK()* y- f5 y) f4 U" I+ u: ]
{
9 t* u- @; a+ E/ _1 s    SCL = 1;                    //拉高时钟线+ J0 ?3 N4 \5 m* P0 L% S
    Delay5us();                 //延时
  q: \. Y5 o# E+ g5 F) Z    CY = SDA;                   //读应答信号( S. s; }$ L1 d) T, n0 E1 K
    SCL = 0;                    //拉低时钟线! z0 c- P& m1 |' h
    Delay5us();                 //延时, v% i9 _: a, Z
, x( {4 F. I; b; Z" i; C6 Q

$ q3 ]  R/ O* d7 ^5 f0 L7 B* w6 A    return CY;
6 Z  X: [1 t' q}* K% g9 y4 e/ `2 H9 R& X4 I* [- J
& n9 o$ l8 G$ _8 x; `
) g4 s& Q; ~0 `3 d- c
/**************************************) `  X2 Q: M5 n6 s3 g' Y
向IIC总线发送一个字节数据
2 B, j( L3 w  Q4 ]1 V0 k9 ?$ e**************************************/
# D! x( g$ |( q5 M) Y0 i2 _: U: Tvoid HMC5883_SendByte(BYTE dat)
- t! k2 @  |% X3 e" r8 P( ?{7 Y) `# w  `* N% m- N3 {
    BYTE i;
  x" F' \! {$ Y' W; M) {1 G( W: ]) M3 Q& F' ^
& Q, [9 l7 M* S$ h; l
    for (i=0; i<8; i++)         //8位计数器
( h9 j+ s/ Y- X% }% D3 o    {. F/ H% V# w- Q$ w* l8 C
        dat <<= 1;              //移出数据的最高位
- P+ T& M' l5 w2 z/ U  F        SDA = CY;               //送数据口
% i7 l, {4 x2 X$ N2 o        SCL = 1;                //拉高时钟线+ X  |( e" s+ ^
        Delay5us();             //延时
# j2 v1 {, v6 M! h) z        SCL = 0;                //拉低时钟线
; b! z2 C8 f* ]6 H. |; [7 z. }        Delay5us();             //延时
7 U" o; z$ d' M8 e2 x- Y, a    }
( A7 S# w0 {2 K/ u0 J6 P    HMC5883_RecvACK();# m0 i0 g3 N1 i, @) |4 {1 M
}
+ p4 K. J8 K+ A; A1 O$ C* D& O" N' s

( T% ?& u  u! P/**************************************  x4 q+ t0 r) ]% Q% C- A# y
从IIC总线接收一个字节数据
8 A. a3 N1 E: A, v9 g' M! o5 T**************************************/
  h2 c' G' r: A3 x8 {; T1 K* }0 j0 J  JBYTE HMC5883_RecvByte()( L& {( T4 v: m) f
{
! Y% f8 T" h+ D: v, c; x3 Y    BYTE i;
8 t  p  n" y' j! K, o    BYTE dat = 0;
/ f6 T6 R$ d5 l$ ?9 [! f/ F# B& P( `/ {/ I# P* K

2 v& p, G' L$ V7 R( P# z    SDA = 1;                    //使能内部上拉,准备读取数据,
) S- c, a0 Y/ n4 X    for (i=0; i<8; i++)         //8位计数器9 w/ S4 T$ S! @" N1 I( a4 a
    {( d$ y0 r8 k- X1 s. U
        dat <<= 1;: b4 a+ Z7 Z" j! j5 p0 D
        SCL = 1;                //拉高时钟线+ @7 ^  ~* r1 \1 a" e3 t9 M& n
        Delay5us();             //延时
3 v3 y5 ~. T# H* Y; B7 S2 j        dat |= SDA;             //读数据               
8 b4 I* x( N/ p1 e% X' O        SCL = 0;                //拉低时钟线& F, b( O4 A# {0 I6 d+ E; X; w/ p
        Delay5us();             //延时
/ p4 C/ x! y, `* y2 I( A    }1 ^; S( i( s8 {) l
    return dat;
6 P2 Y  f& O) K* {4 l}# u* M% B) o# q
, ^+ K; c# z6 o

. h& m2 T% x' I1 {, e3 D//***************************************************
2 F4 U) S9 c$ C7 P7 T  b) G/ A9 b) D* K  l7 ]9 |% a6 `
4 _: I# y5 U9 e' d# u
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)8 E6 m  k) k. t! P  [
{
$ g2 H/ T- \+ b4 c! f& N, y% e9 r1 `% P/ k' ^/ X/ c- a! P
' u. z: J, R' Y7 T/ {0 w& D

7 e  z/ [1 p- d8 m! `
. ~7 K( U3 y- n! C' J5 ]! A4 a9 `
…………限于本文篇幅 余下代码请下载附件…………' e0 F; u' J  B" ~2 K$ j2 v
: A% m$ x" h; b' ]- _: H+ W, |
. h2 S: r0 K+ |) s6 U
游客,如果您要查看本帖隐藏内容请回复
( e! R, X  ^$ A2 g, j( `

( [4 I" k# p. N9 g" x0 d
- r4 a1 L" M" m- `$ W2 b7 {) Z8 ?0 e& y

  D+ T/ B, Y# O6 m

$ n& k1 c2 E. l$ \" r6 B1 \" |- [
5 n1 m" m+ K! {1 }3 L' [4 j& F
* I! P" N8 q( t" U8 s% @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 04:42 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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