楼主这几天疯狂的学习这个模块,很是头疼,经过各种办法与尝试  有了以下的程序   亲测可用,在这里和大家分享一下,有写的不好的地方还请大家指出。 
 
 
[/mw_shl_code] 
#include "system.h" 
#include "SysTick.h" 
#include "led.h" 
#include "usart.h" 
#include "key.h" 
#include "nrf24l01.h" 
#include "pwm.h" 
#include "iic.h" 
#include "hmc5883l.h" 
#include "math.h" 
 
        u8 BUF[6]; 
 
int main() 
{         
         
        SysTick_Init(168); 
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组 
        LED_Init(); 
        USART1_Init(115200); 
        NRF24L01_Init(); 
        Init_HMC5883(); 
        IIC_Init(); 
         
         
   int x,y,z; 
        double angle; 
        u8 BUF[6]; 
        while(1) 
        {                 
                 
      Multiple_read_HMC5883(BUF); 
                x=BUF[0] << 8 | BUF[1]; // 
            z=BUF[2] << 8 | BUF[3]; // 
            y=BUF[4] << 8 | BUF[5]; //分别读取x y z轴的数据 
                if(x>32768) 
                        x = -(0xFFFF - x + 1); 
                if(z>32768) 
                        z = -(0xFFFF - z + 1); 
                if(y>32768) 
                        y = -(0xFFFF - y + 1); 
                if(x<0)            //这里的数据楼主读出来x偶尔有负整数,而y永远是负整数 
                        x=-x; 
                angle= (atan2((double)y,(double)x) * (180 / 3.14159265) + 180); // angle in degrees   这个公式算出来的角度是与x轴的夹角度数,但是x轴楼主觉得是一直在变得啊,这个角度到底是什么楼主现在也不能确定。。。  所以这个公式楼主并没有采用 
//楼主采用的是直接去读x y z的数据,因为模块动的时候这些数据也在变化,水平转动的时候z轴是不变的,只有x y在变,所以楼主采用读取xy数据,根据xy的数据去确定大致的方向。 
//以下是确定方向的代码      xy的值是楼主自己测出来然后拿手机上面的指南针对比的,所以每个人去的数据可能不一样,以下是楼主的数据 
if((100< x )&&(x <150)&&(650< (-y))&&(700>(-y))) 
{ 
printf(&quot;dong %d%d 
&quot;,x,-y);   //指向东面,同时打印出x -y的值 
delay_ms(50); 
} 
else 
        printf(&quot;x,y %d%d 
&quot;,x,-y);      //如果指的不是东面,就打印出x -y的值   指向其他方向的楼主没有写,因为数据有点多,今天不想测了。。。 
   
                 
        } 
} 
[/mw_shl_code] 
 
这是头文件 
[C] 纯文本查看 复制代码 
#ifndef __HMC5883L_H 
#define __HMC5883L_H 
#include &quot;system.h&quot; 
#include &quot;iic.h&quot; 
 
#define SlaveAddress 0x3c    //从机地址 
 
void Init_HMC5883(void); 
void Write_HMC5883(u8 add, u8 da); 
u8 Read_HMC5883(u8 REG_Address); 
void Multiple_read_HMC5883(u8*BUF); 
 
#endif |   
     
  
 |