hmc5883的程序有人做过么?我的程序哪里出问题了?本人菜鸟,见笑了。

2019-03-24 17:49发布

调了好几个小时了,就是不知道问题在哪里,请高手们指点。

测量先不说,就是怎么读寄存器都没弄清。
看了中文的pdf了,但是还是没搞懂,先看看我的程序吧。

程序部分(已近将无关部分删除):

uchar code table[]="0123456789";

////////////////HMC5883/////////////////////////////////

void start()                             //开始信号
{       
        sda=1;
        scl=1;
        sda=0;
}
void stop()                                 //停止
{
        sda=0;
        scl=1;
        sda=1;
}
void respons()                                  //应答
{
        sda=1;
        scl=1;
        while(sda);
        scl=0;
}
////////////////////////////////////////////////////////

void write_byte(uchar date)
{
        uchar i;
        for(i=0;i<8;i++)
        {
        date=date<<1;
        scl=0;
        sda=CY;
        scl=1;
        }
        scl=0;
        sda=1;
}
uchar read_byte()
{
        uchar i,k;
        scl=0;
        sda=1;
        for(i=0;i<8;i++)
        {
        scl=1;
        k=(k<<1)|sda;
        scl=0;
        }
        return k;
}


void write_hmc(uchar address,uchar date)
{
        start();
        write_byte(0x3c);                             //器件地址//写
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}

uchar read_hmc()                                       //试调 有点乱。
{
        uchar date;

        //delay(1);

        start();
        write_byte(0x3d);
//delay(1);
        respons();
//        write_data(table[2]);

//        delay(1);

//        write_byte(address);
//                write_data(table[2]);

//delay(1);
//        respons();

//                write_data(table[3]);

        date=read_byte();

        stop();
        return date;
}

void init_hmc()
{
        write_hmc(0x02,0x00);
}

////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////

////////////////////////////////////////////////////////
void main()
{
//        init_hmc();
        while(1)
        {
        delay(10);
        write_hmc(0x00,0x00);
        delay(10);

//        write_hmc(0x02,0x01);
//        write_hmc(0x02,0x01);
//        delay(10);
        delay(10);
        num=read_hmc();       
        delay(10);
        num=read_hmc();
        delay(10);
        write_com(0xc0);

        delay(200);

        while(1);
        }
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
dadangjia
2019-03-25 09:44
August-creator 发表于 2014-4-1 11:13
I2C都写错了吧?其他的还好啊,单片机比较简单的!
51单片机参考程序,注意晶振12MHz哦;
void Delay5us( ...

这个我也参照51的程序写的,但读出结果是全是oxff,这是怎么回事?

一周热门 更多>