wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4701|回復: 6
打印 上一主題 下一主題
收起左側

三軸加速度模塊GY-271遇到困難,請求幫助

[復制鏈接]
跳轉到指定樓層
樓主
使用商家給的代碼,顯示只有A:45,擺動模塊,沒有任何現象。
商家代碼如下:
//***************************************
// HMC5883 IIC測試程序
// 使用單片機STC89C51
// 晶振:11.0592M
// 顯示:LCD1602
// 編譯環境 Keil uVision2
// 參考宏晶網站24c04通信程序
// 時間:2011年3月1日
//****************************************
#include  <REG51.H>       
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library       
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int       
//使用的端口,請按照以下接線
#define   DataPort P0        //LCD1602數據端口
sbit        SCL=P1^0;      //IIC時鐘引腳定義
sbit        SDA=P1^1;      //IIC數據引腳定義
sbit    LCM_RS=P2^0;   //LCD1602命令端口               
sbit    LCM_RW=P2^1;   //LCD1602命令端口               
sbit    LCM_EN=P2^2;   //LCD1602命令端口

#define        SlaveAddress   0x3C          //定義器件在IIC總線中的從地址
typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE BUF[8];                         //接收數據緩存區             
uchar ge,shi,bai,qian,wan;           //顯示變量
int  dis_data;                       //變量

void delay(unsigned int k);
void InitLcd();
void Init_HMC5883(void);            //初始化5883

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);

void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //單個寫入數據
uchar Single_Read_HMC5883(uchar REG_Address);                   //單個讀取內部寄存器數據
void  Multiple_Read_HMC5883();                                  //連續的讀取內部寄存器數據
//以下是模擬iic使用函數-------------
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(bit ack);
bit  HMC5883_RecvACK();
void HMC5883_SendByte(BYTE dat);
BYTE HMC5883_RecvByte();
void HMC5883_ReadPage();
void HMC5883_WritePage();
//-----------------------------------

//*********************************************************
void conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余運算
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余運算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余運算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余運算
    ge=temp_data+0x30;        
}

/*******************************/
void delay(unsigned int k)       
{                                               
unsigned int i,j;                               
for(i=0;i<k;i++)
{                       
for(j=0;j<121;j++)                       
{;}}                                               
}
/*******************************/
void WaitForEnable(void)       
{                                       
DataPort=0xff;               
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);       
LCM_EN=0;                               
}                                       
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
if(Attribc)WaitForEnable();       
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();       
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}                                       
/*******************************/
void WriteDataLCM(uchar dataW)
{                                       
WaitForEnable();               
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();       
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}               
/***********************************/
void InitLcd()                               
{                       
WriteCommandLCM(0x38,1);       
WriteCommandLCM(0x08,1);       
WriteCommandLCM(0x01,1);       
WriteCommandLCM(0x06,1);       
WriteCommandLCM(0x0c,1);
}                       
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                               
Y&=1;                                               
X&=15;                                               
if(Y)X|=0x40;                                       
X|=0x80;                       
WriteCommandLCM(X,0);               
WriteDataLCM(DData);               
}                                               

/**************************************
延時5微秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5us()
{
             _nop_();_nop_();_nop_();_nop_();
             _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
              _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
             _nop_();_nop_();_nop_();_nop_();

}

/**************************************
延時5毫秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
起始信號
**************************************/
void HMC5883_Start()
{
    SDA = 1;                    //拉高數據線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 0;                    //產生下降沿
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
}

/**************************************
停止信號
**************************************/
void HMC5883_Stop()
{
    SDA = 0;                    //拉低數據線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 1;                    //產生上升沿
    Delay5us();                 //延時
}

/**************************************
發送應答信號
入口參數:ack (0:ACK 1:NAK)
**************************************/
void HMC5883_SendACK(bit ack)
{
    SDA = ack;                  //寫應答信號
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時
}

/**************************************
接收應答信號
**************************************/
bit HMC5883_RecvACK()
{
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    CY = SDA;                   //讀應答信號
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時

    return CY;
}

/**************************************
向IIC總線發送一個字節數據
**************************************/
void HMC5883_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位計數器
    {
        dat <<= 1;              //移出數據的最高位
        SDA = CY;               //送數據口
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    HMC5883_RecvACK();
}

/**************************************
從IIC總線接收一個字節數據
**************************************/
BYTE HMC5883_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能內部上拉,準備讀取數據,
    for (i=0; i<8; i++)         //8位計數器
    {
        dat <<= 1;
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        dat |= SDA;             //讀數據               
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    return dat;
}

//***************************************************

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
{
    HMC5883_Start();                  //起始信號
    HMC5883_SendByte(SlaveAddress);   //發送設備地址+寫信號
    HMC5883_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf
    HMC5883_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf
    HMC5883_Stop();                   //發送停止信號
}

//********單字節讀取內部寄存器*************************
uchar Single_Read_HMC5883(uchar REG_Address)
{  uchar REG_data;
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
    HMC5883_SendByte(REG_Address);                   //發送存儲單元地址,從0開始       
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
    REG_data=HMC5883_RecvByte();              //讀出寄存器數據
        HMC5883_SendACK(1);   
        HMC5883_Stop();                           //停止信號
    return REG_data;
}
//******************************************************
//
//連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
//
//******************************************************
void Multiple_read_HMC5883(void)
{   uchar i;
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
    HMC5883_SendByte(0x03);                   //發送存儲單元地址,從0x3開始       
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
         for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
    {
        BUF[i] = HMC5883_RecvByte();          //BUF[0]存儲數據
        if (i == 5)
        {
           HMC5883_SendACK(1);                //最后一個數據需要回NOACK
        }
        else
        {
          HMC5883_SendACK(0);                //回應ACK
       }
   }
    HMC5883_Stop();                          //停止信號
    Delay5ms();
}

//初始化HMC5883,根據需要請參考pdf進行修改****
void Init_HMC5883()
{
     Single_Write_HMC5883(0x02,0x00);  //
}
//*********************************************************
//主程序********
//*********************************************************
void main()
{ // bit sign_bit;
   unsigned int i;
   int x,y,z;
   double angle;

   delay(500);                       
   InitLcd();
   Init_HMC5883();
  while(1)            //循環
  {
    Multiple_Read_HMC5883();      //連續讀出數據,存儲在BUF中
//---------顯示X軸
    x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register
    z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
    y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

    angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
    angle*=10;
    conversion(angle);       //計算數據和顯示
        DisplayOneChar(2,0,'A');
    DisplayOneChar(3,0,':');
    DisplayOneChar(4,0,qian);
    DisplayOneChar(5,0,bai);
    DisplayOneChar(6,0,shi);
    DisplayOneChar(7,0,'.');
        DisplayOneChar(8,0,ge);

    for (i=0;i<10000;i++);   //延時                  
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2017-3-27 22:11 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:183949 發表于 2017-3-28 15:32 | 只看該作者
那我要如何修改?
我用串口程序看了,只有FF回來
串口程序如下:
//***************************************
// HMC5883 51串口測試程序
// 使用單片機STC89C51
// 晶振:11.0592M
// 顯示:PC串口
// 編譯環境 Keil uVision2
// 參考宏晶網站24c04通信程序
// 時間:2011年3月1日
//****************************************
#include  <REG51.H>       
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library       
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint  unsigned int       
//使用的端口,請按照以下接線
#define DataPort P0        //LCD1602數據端口
sbit        SCL=P1^0;      //IIC時鐘引腳定義
sbit        SDA=P1^1;      //IIC數據引腳定義


#define        SlaveAddress   0x3C          //定義器件5883在IIC總線中的從地址
typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE BUF[8];                         //接收數據緩存區             
uchar ge,shi,bai,qian,wan;           //顯示變量
int  dis_data;                       //變量
//************

//************
void delay(unsigned int k);
void Init_HMC5883(void);            //初始化5883
void conversion(uint temp_data);

void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //單個寫入數據
//uchar Single_Read_HMC5883(uchar REG_Address);                   //單個讀取內部寄存器數據
void  Multiple_Read_HMC5883();                                  //連續的讀取內部寄存器數據
//以下是模擬iic使用函數-------------
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(bit ack);
bit  HMC5883_RecvACK();
void HMC5883_SendByte(BYTE dat);
BYTE HMC5883_RecvByte();
void HMC5883_ReadPage();
void HMC5883_WritePage();
//-----------------------------------

//*********************************************
//串口初始化
//9600 bps @ 11.059 MHz
void init_uart()
{
        TMOD=0x21;                               
        TH1=0xfd;                               
        TL1=0xfd;                               
        SCON=0x50;
        PS=1;      //串口中斷設為高優先級別
        TR0=1;           //啟動定時器                       
        TR1=1;
        ET0=1;     //打開定時器0中斷                       
        ES=1;       
}

//*********串口數據發送******************
void  SeriPushSend(uchar send_data)
{
    SBUF=send_data;  
        while(!TI);TI=0;          
}
//*********************************************************
void conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余運算
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余運算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余運算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余運算
    ge=temp_data+0x30;        
}

/*******************************/
void delay(unsigned int k)       
{                                               
unsigned int i,j;                               
for(i=0;i<k;i++)
{                       
for(j=0;j<121;j++)                       
{;}}                                               
}
       

/**************************************
延時5微秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
}

/**************************************
延時5毫秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
起始信號
**************************************/
void HMC5883_Start()
{
    SDA = 1;                    //拉高數據線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 0;                    //產生下降沿
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
}

/**************************************
停止信號
**************************************/
void HMC5883_Stop()
{
    SDA = 0;                    //拉低數據線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 1;                    //產生上升沿
    Delay5us();                 //延時
}

/**************************************
發送應答信號
入口參數:ack (0:ACK 1:NAK)
**************************************/
void HMC5883_SendACK(bit ack)
{
    SDA = ack;                  //寫應答信號
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時
}

/**************************************
接收應答信號
**************************************/
bit HMC5883_RecvACK()
{
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    CY = SDA;                   //讀應答信號
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時

    return CY;
}

/**************************************
向IIC總線發送一個字節數據
**************************************/
void HMC5883_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位計數器
    {
        dat <<= 1;              //移出數據的最高位
        SDA = CY;               //送數據口
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    HMC5883_RecvACK();
}

/**************************************
從IIC總線接收一個字節數據
**************************************/
BYTE HMC5883_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能內部上拉,準備讀取數據,
    for (i=0; i<8; i++)         //8位計數器
    {
        dat <<= 1;
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        dat |= SDA;             //讀數據               
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    return dat;
}

//***************************************************

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
{
    HMC5883_Start();                  //起始信號
    HMC5883_SendByte(SlaveAddress);   //發送設備地址+寫信號
    HMC5883_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf
    HMC5883_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf
    HMC5883_Stop();                   //發送停止信號
}
/*
//********單字節讀取內部寄存器*************************
uchar Single_Read_HMC5883(uchar REG_Address)
{  uchar REG_data;
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
    HMC5883_SendByte(REG_Address);                   //發送存儲單元地址,從0開始       
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
    REG_data=HMC5883_RecvByte();              //讀出寄存器數據
        HMC5883_SendACK(1);   
        HMC5883_Stop();                           //停止信號
    return REG_data;
}
*/
//******************************************************
//
//連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
//
//******************************************************
void Multiple_read_HMC5883(void)
{   uchar i;
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
    HMC5883_SendByte(0x03);                   //發送存儲單元地址,從0x3開始       
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
         for (i=0; i<7; i++)                      //連續讀取6個地址數據,存儲中BUF
    {
        BUF[i] = HMC5883_RecvByte();          //BUF[0]存儲0x32地址中的數據
        if (i == 6)
        {
           HMC5883_SendACK(1);                //最后一個數據需要回NOACK
        }
        else
        {
          HMC5883_SendACK(0);                //回應ACK
       }
   }
    HMC5883_Stop();                          //停止信號
    Delay5ms();
}

//初始化HMC5883,根據需要請參考pdf進行修改****
void Init_HMC5883()
{
     Single_Write_HMC5883(0x02,0x00);  //
         Single_Write_HMC5883(0x01,0xE0);  //
}
//*********************************************************
//主程序********
//*********************************************************
void main()
{ // bit sign_bit;

   unsigned int i;
   int x,y,z;
   double angle;


   delay(100);                       
   init_uart();
   Init_HMC5883();

  while(1)            //循環
  {

    Multiple_Read_HMC5883();      //連續讀出數據,存儲在BUF中
        x = BUF[0] << 8 | BUF[1];
    y = BUF[4] << 8 | BUF[5];
        z = BUF[2] << 8 | BUF[3];
    angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
    conversion(angle);       //計算數據和顯示

    SeriPushSend(bai);
    SeriPushSend(shi);
        SeriPushSend(ge);

        SeriPushSend(0x0d);
        SeriPushSend(0x0a);

    for (i=0;i<10000;i++);   //延時                  
  }
}
回復

使用道具 舉報

地板
ID:151348 發表于 2017-3-28 15:34 | 只看該作者
一方面程序只顯示一軸數據,另一方面,擺動模塊這數據沒變化,估計是IIC通信不成功
回復

使用道具 舉報

5#
ID:183949 發表于 2017-3-28 18:20 | 只看該作者
那我下面這個是顯示三軸數據了吧。
//***************************************
// HMC5883 IIC測試程序
// 使用單片機STC89C51
// 晶振:11.0592M
// 顯示:LCD1602
// 編譯環境 Keil uVision2
// 參考宏晶網站24c04通信程序
// 時間:2011年3月1日
//****************************************
#include  <REG51.H>       
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library       
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int       
//使用的端口,請按照以下接線
#define   DataPort P2        //LCD1602數據端口
sbit        SCL=P1^0;      //IIC時鐘引腳定義
sbit        SDA=P1^1;      //IIC數據引腳定義
sbit    LCM_RS=P0^7;   //LCD1602命令端口               
sbit    LCM_RW=P0^6;   //LCD1602命令端口               
sbit    LCM_EN=P0^5;   //LCD1602命令端口

#define        SlaveAddress   0x3C          //定義器件在IIC總線中的從地址
typedef unsigned char BYTE;
typedef unsigned short WORD;

BYTE BUF[8];                         //接收數據緩存區             
uchar ge,shi,bai,qian,wan;           //顯示變量
//int  dis_data;                       //變量

void delay_ms(unsigned int t);
void InitLcd();
void Init_HMC5883(void);            //初始化5883

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);

void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //單個寫入數據
//uchar Single_Read_HMC5883(uchar REG_Address);                 /單個讀取內部寄存器數據
void  Multiple_Read_HMC5883();                                  //連續的讀取內部寄存器數據
//以下是模擬iic使用函數-------------
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(bit ack);
bit  HMC5883_RecvACK();
void HMC5883_SendByte(BYTE dat);
BYTE HMC5883_RecvByte();
void HMC5883_ReadPage();
void HMC5883_WritePage();
//-----------------------------------

//*************************顯示在LCD的數據********************************
void Conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余運算
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余運算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余運算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余運算
    ge=temp_data+0x30;        
}

/**************延時函數*****************/
void Delay_ms(unsigned int t)       
{                                               
        unsigned int i,j;                               
        for(i=t;i>0;i--)
        for(j=121;j>0;j--);                                               
}
/***************等待LCD使能****************/
void WaitForEnable(void)       
{                                       
        DataPort=0xff;               
        LCM_RS=0;
        LCM_RW=1;
        _nop_();
        LCM_EN=1;
        _nop_();
        _nop_();
        while(DataPort&0x80);       
        LCM_EN=0;                               
}                                       
/**************寫LCD內存命令函數*****************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
        if(Attribc)WaitForEnable();       
        LCM_RS=0;
        LCM_RW=0;
        _nop_();
        DataPort=CMD;
        _nop_();       
        LCM_EN=1;
        _nop_();
        _nop_();
        LCM_EN=0;
}                                       
/**************寫LCD數據寄存器*****************/
void WriteDataLCM(uchar dataW)
{                                       
        WaitForEnable();               
        LCM_RS=1;
        LCM_RW=0;
        _nop_();
        DataPort=dataW;
        _nop_();       
        LCM_EN=1;
        _nop_();
        _nop_();
        LCM_EN=0;
}               
/****************初始化LCD*******************/
void InitLcd()                               
{                       
        WriteCommandLCM(0x38,1);       
        WriteCommandLCM(0x08,1);       
        WriteCommandLCM(0x01,1);       
        WriteCommandLCM(0x06,1);       
        WriteCommandLCM(0x0c,1);
}                       
/****************顯示一個字符*******************/
void Display_One_Char(uchar X,uchar Y,uchar DData)
{                                               
        Y&=1;                                               
        X&=15;                                               
        if(Y)X|=0x40;                                       
        X|=0x80;                       
        WriteCommandLCM(X,0);               
        WriteDataLCM(DData);               
}                                               

/**************************************
延時5微秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5us()
{
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}

/**************************************
延時5毫秒(STC90C52RC@12M)
不同的工作環境,需要調整此函數
當改用1T的MCU時,請調整此延時函數
**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
起始信號
**************************************/
void HMC5883_Start()
{
    SDA = 1;                    //拉高數據線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 0;                    //產生下降沿
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
}

/**************************************
停止信號
**************************************/
void HMC5883_Stop()
{
    SDA = 0;                    //拉低數據線
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SDA = 1;                    //產生上升沿
    Delay5us();                 //延時
}

/**************************************
發送應答信號
入口參數:ack (0:ACK 1:NAK)
**************************************/
void HMC5883_SendACK(bit ack)
{
    SDA = ack;                  //寫應答信號
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時
}

/**************************************
接收應答信號
**************************************/
bit HMC5883_RecvACK()
{
    SCL = 1;                    //拉高時鐘線
    Delay5us();                 //延時
    CY = SDA;                   //讀應答信號
    SCL = 0;                    //拉低時鐘線
    Delay5us();                 //延時

    return CY;
}

/**************************************
向IIC總線發送一個字節數據
**************************************/
void HMC5883_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位計數器
    {
        dat <<= 1;              //移出數據的最高位
        SDA = CY;               //送數據口
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    HMC5883_RecvACK();
}

/**************************************
從IIC總線接收一個字節數據
**************************************/
BYTE HMC5883_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能內部上拉,準備讀取數據,
    for (i=0; i<8; i++)         //8位計數器
    {
        dat <<= 1;
        SCL = 1;                //拉高時鐘線
        Delay5us();             //延時
        dat |= SDA;             //讀數據               
        SCL = 0;                //拉低時鐘線
        Delay5us();             //延時
    }
    return dat;
}

//************************寫入單字節數據***************************

void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
{
    HMC5883_Start();                  //起始信號
    HMC5883_SendByte(SlaveAddress);   //發送設備地址+寫信號
    HMC5883_SendByte(REG_Address);    //內部寄存器地址,請參考中文pdf
    HMC5883_SendByte(REG_data);       //內部寄存器數據,請參考中文pdf
    HMC5883_Stop();                   //發送停止信號
}

//************************讀取內部寄存器*************************
//uchar Single_Read_HMC5883(uchar REG_Address)
//{   
//        uchar REG_data;
//  HMC5883_Start();                          //起始信號
//  HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
//  HMC5883_SendByte(REG_Address);            //發送存儲單元地址,從0開始       
//  HMC5883_Start();                          //起始信號
//  HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
//  REG_data=HMC5883_RecvByte();              //讀出寄存器數據
//        HMC5883_SendACK(1);   
//        HMC5883_Stop();                           //停止信號
//  return REG_data;
//}

//******************************************************
//連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
//******************************************************
void Multiple_Read_HMC5883(void)
{   uchar i;
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
    HMC5883_SendByte(0x03);                   //發送存儲單元地址,從0x3開始       
    HMC5883_Start();                          //起始信號
    HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
         for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
    {
        BUF[i] = HMC5883_RecvByte();          //BUF[0]存儲數據
        if (i == 5)
        {
           HMC5883_SendACK(1);                //最后一個數據需要回NOACK
        }
        else
        {
          HMC5883_SendACK(0);                //回應ACK
       }
   }
    HMC5883_Stop();                          //停止信號
    Delay5ms();
}

//初始化HMC5883,根據需要請參考pdf進行修改****
void Init_HMC5883()
{
     Single_Write_HMC5883(0x02,0x00);  //
}
//*********************************************************
//主程序********
//*********************************************************
void main()
{
        // bit sign_bit;
        unsigned int i;
        int X,Y,Z;
        double Angle_XY=0,Angle_XZ=0,Angle_YZ=0;

        Delay_ms(500);                       
        InitLcd();
        Init_HMC5883();
        while(1)            //循環
        {
                Multiple_Read_HMC5883();      //連續讀出數據,存儲在BUF中
//---------顯示X軸
                X=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output register  最高有效位
                Z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output register
                Y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register

                if(X>0x7fff)X-=0xffff;          
                if(Y>0x7fff)Y-=0xffff;
                if(Z>0x7fff)Z-=0xffff;
               
                Display_One_Char(0,0,'H');
                Display_One_Char(1,0,'M');
                Display_One_Char(2,0,'C');
                Display_One_Char(3,0,'5');
                Display_One_Char(4,0,'8');
                Display_One_Char(5,0,'8');
                Display_One_Char(6,0,'3');

                Angle_XY= atan2((double)Y,(double)X) * (180 / 3.14159265) + 180; //計算XY平面角度
                Angle_XY*=10;
                Conversion(Angle_XY);       //計算XY平面角度數據和顯示
                Display_One_Char(8,0,'X');
                Display_One_Char(9,0,'Y');
                Display_One_Char(10,0,':');
                Display_One_Char(11,0,qian);
                Display_One_Char(12,0,bai);
                Display_One_Char(13,0,shi);
                Display_One_Char(14,0,'.');
                Display_One_Char(15,0,ge);
               
                Angle_XZ= atan2((double)Z,(double)X) * (180 / 3.14159265) + 180; //計算XZ平面角度
                Angle_XZ*=10;
                Conversion(Angle_XZ);       //計算XZ平面角度數據和顯示
                Display_One_Char(0,1,'X');
                Display_One_Char(1,1,'Z');
                Display_One_Char(2,1,':');
                Display_One_Char(3,1,qian);
                Display_One_Char(4,1,bai);
                Display_One_Char(5,1,shi);
                Display_One_Char(6,1,'.');
                Display_One_Char(7,1,ge);
               
                Angle_YZ= atan2((double)Z,(double)Y) * (180 / 3.14159265) + 180; //計算YZ平面角度
                Angle_YZ*=10;
                Conversion(Angle_YZ);       //計算YZ平面角度數據和顯示
                Display_One_Char(8,1,'Y');
                Display_One_Char(9,1,'Z');
                Display_One_Char(10,1,':');
                Display_One_Char(11,1,qian);
                Display_One_Char(12,1,bai);
                Display_One_Char(13,1,shi);
                Display_One_Char(14,1,'.');
                Display_One_Char(15,1,ge);

    for (i=0;i<10000;i++);   //延時                  
  }
}

回復

使用道具 舉報

6#
ID:570056 發表于 2019-6-23 14:51 來自觸屏版 | 只看該作者
新人報道 發表于 2017-3-28 18:20
**** 作者被禁止或刪除 內容自動屏蔽 ****

三個軸都是45.0,老兄

1561272646782..jpg (623.76 KB, 下載次數: 74)

1561272646782..jpg
回復

使用道具 舉報

7#
ID:1110204 發表于 2024-1-27 00:34 來自觸屏版 | 只看該作者
請問樓主是怎么解決的呀?我也遇到了相同的問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
国产精品一区二区三区精品| 免费裸体美女网站| 欧美精品一区二区三区高清aⅴ| 国产精品一区二区三区网站| 日韩欧美中文字幕一区二区三区| 日韩欧美在线观看一区二区| 亚洲色图欧美视频| 国产女人被狂躁到高潮小说| 性生交免费视频| 久久久久久高清| 久精品免费视频| 欧美年轻男男videosbes| 91麻豆免费看| 亚洲深夜福利| 免费看av成人| 国产经典一区| 日本免费在线观看| 3344永久| 老师让我她我爽了好久视频| 99久久久久久久久| 我不卡一区二区| 日本黄色的视频| 亚洲精品国产suv一区88| 91香蕉视频在线下载| 欧美激情中文网| 亚洲欧美国产va在线影院| 日本高清无吗v一区| 欧美激情一区二区在线| 精品一区二区三区影院在线午夜| 亚洲电影影音先锋| 国产精品久久久网站| 日本在线啊啊| 蜜桃视频在线观看www社区| 黄色一级片视频| 国产短剧电视剧免费观看| 国内老熟妇对白xxxxhd| 国偷自拍第113页| 后入内射无码人妻一区| 日批免费观看视频| 女性隐私黄www网站视频| 在线视频不卡国产| 久久精品综合一区| 成人免费观看网址| 91av在线不卡| 欧美肥臀大乳一区二区免费视频| 精品视频久久久久久| 7777精品伊人久久久大香线蕉完整版 | 日韩欧美一区二区在线观看| 成人久久精品视频| 欧美一区二区大胆人体摄影专业网站| 国产亚洲一区精品| 亚洲国语精品自产拍在线观看| 欧美性一二三区| 精品久久久久久亚洲国产300| 中文字幕一区二区三区色视频| 9久草视频在线视频精品| 国内精品伊人久久久久影院对白| 日韩av网站在线观看| aa国产精品| 99精品欧美| 亚洲免费大片| 欧美.日韩.国产.一区.二区| 999视频精品| 欧美hd在线| 久久性感美女视频| 日韩理论电影| 欧美一区综合| 亚洲三级毛片| 免费亚洲一区| 蜜臀av一级做a爰片久久| 日韩精品电影在线| 捆绑调教美女网站视频一区| 免费成人av在线播放| 秋霞影院一区二区| 蜜桃视频免费观看一区| 久草这里只有精品视频| 国产一区激情在线| 福利电影一区二区| 久久先锋影音av鲁色资源| 久久综合色天天久久综合图片| 久久嫩草精品久久久精品| 日本一区二区三区四区| 国产精品久久网站| 夜夜亚洲天天久久| 狠狠躁夜夜躁人人爽超碰91| 一本色道久久加勒比精品| 色久综合一二码| 欧美日韩国产经典色站一区二区三区| 欧美日韩精品三区| 精品久久久久久综合日本欧美| 亚洲精品国产精品国自产观看浪潮| 亚洲乱码国产乱码精品精| 中文字幕在线亚洲| 欧美日本亚洲视频| 国产成人精品视频| www.一区二区三区| 日韩理论片在线观看| 日韩在线视频在线| 色哟哟精品视频| 蜜臀视频在线观看| 永久免费看片视频教学| 圆产精品久久久久久久久久久| 日韩中文字幕高清| 少妇精品视频一区二区| 91啦中文成人| 好男人看片在线观看免费观看国语| 在线播放免费| 少女频道在线观看高清 | 日本xxxwww免费视频| 99riav视频| 不卡在线视频| 中文字幕在线官网| 女仆av观看一区| 国产在线日韩| 国产成人av一区| 日韩一区有码在线| 日本韩国精品在线| 亚洲色图欧美制服丝袜另类第一页| 欧美福利在线观看| 亚洲综合小说区| 超碰超碰超碰超碰超碰| 色呦色呦色精品| 999福利视频| 中文字幕 自拍偷拍| 最近中文字幕mv免费高清视频8| 黄色大片网站| 中文日本在线观看| 老司机精品视频网| 亚洲国产一成人久久精品| 精品一区二区三区久久久| 1000部国产精品成人观看| 777xxx欧美| 久久免费少妇高潮久久精品99| 成人自拍偷拍| 国产精品一区二区免费在线观看| 国产精品久久无码| 三级网站在线播放| 鲁啊鲁视频在线精品| 在线国产网址| 精品女同一区二区三区在线观看| 亚洲日本在线观看视频| 成人在线电影在线观看视频| 国产资源精品在线观看| 亚洲一区二区综合| 亚洲欧美国产日韩天堂区| 成人精品久久久| 日韩欧美一区二| 久久嫩草捆绑紧缚| 天天干天天摸天天操| 日本在线аv| 免费观看成人性生生活片| 亚洲精品国产首次亮相| 91麻豆国产福利在线观看| 欧美日韩一区在线| 97超视频免费观看| japanese在线播放| 一级黄色毛毛片| 色欲久久久天天天综合网| 午夜影院在线| 天天干在线视频论坛| 国产精品嫩草影院在线看| 国产黑丝在线一区二区三区| 91黄色在线观看| 91国语精品自产拍在线观看性色| 国产成人精品免费看在线播放| 国产视频久久久久久| 国产普通话bbwbbwbbw| 男人j桶女人的网站| 日韩av超清在线观看| 亚洲资源av| 色婷婷综合在线| 7m精品福利视频导航| 少妇人妻无码专区视频| 国产成人精品亚洲男人的天堂| 国产麻豆精品高清在线播放| av免费在线观| 欧美激情视频一区二区三区免费| 亚洲免费伊人电影| 欧美福利在线观看| 久久久久久免费看| 草久视频在线观看| 四虎av网址| 欧美日韩黄网站| 成人综合婷婷国产精品久久免费| 欧美成人一区二区三区片免费| www国产亚洲精品| 国产白嫩美女无套久久| 在线电影中文字幕| 女同一区二区免费aⅴ| 亚洲精品影视| 欧美午夜精品一区二区三区| 国产欧美精品一区二区| 三级黄色片播放| 嫩模一区二区三区| 日本三级在线观看网站| 六月天综合网| 日韩欧美国产综合| 欧美精品二区三区四区免费看视频| 中出视频在线观看| 国产精品自产拍在线网站| 色戒汤唯在线观看| 国产最新精品免费| 亚洲精品自拍视频| 中文字幕日韩一区二区三区不卡| 日本妇女毛茸茸| 99re在线视频播放| 国产精品黄网站| 国产精品色婷婷| 国产亚洲福利一区| 国产精品久久久久久久乖乖| 久久这里只有精品免费| 欧美色图久久| 精品69视频一区二区三区| 九色综合狠狠综合久久| 日韩欧美一级片| 国产精品日韩一区二区免费视频| 亚洲男女在线观看| 四虎影音在线| av女在线播放| 风间由美一区二区三区在线观看| 亚洲精品国产拍免费91在线| 婷婷久久五月天| 九九视频在线观看| 日本三级电影网| 九九视频免费观看视频精品 | 日韩午夜在线观看视频| 日韩欧美第二区在线观看| а天堂中文在线资源| 男男互摸gay网站| 亚洲欧洲专区| 国产精品久久久久影院亚瑟 | 亚洲午夜精品17c| 国产精品成人免费视频| 波多野结衣办公室33分钟| 热99精品视频| 成人看片网站| av资源网一区| 欧美性受xxx| 无码人妻一区二区三区精品视频| 亚洲天堂电影在线观看| 国产综合视频一区二区三区免费| 欧美日韩福利| 777午夜精品免费视频| 人偷久久久久久久偷女厕| 无码人妻精品一区二区三区9厂| 一级片在线免费看| 日日摸夜夜添夜夜添亚洲女人| 欧美成人激情免费网| 伊人天天久久大香线蕉av色| 日本韩国欧美中文字幕| 18av在线播放| 久久99精品一区二区三区| 亚洲午夜激情免费视频| 激情成人开心网| 午夜av免费观看| 唐人社导航福利精品| 久久综合色之久久综合| 成人高h视频在线| 免费观看特级毛片| 在线免费国产视频| 中文日韩欧美| 久久久97精品| 国产精品二区视频| 天堂网.www在线资源| 久久69av| 亚洲夂夂婷婷色拍ww47| aa成人免费视频| 日韩女同强女同hd| 69av成人| 久久久高清一区二区三区| 国产99久久精品一区二区永久免费| 亚洲中文字幕无码一区| 樱桃视频免费看| 国产日韩高清一区二区三区在线| 日韩精品免费一线在线观看| 国产欧美一区二| 人人干狠狠干| 91精品一区二区三区综合| 日韩精品中文字幕一区| 污视频免费在线观看网站| 国产成人禁片免费观看视频| 日韩高清电影免费| 欧美丝袜自拍制服另类| 美国av在线播放| 亚洲欧美日韩免费| 日韩亚洲精品在线观看| 欧美日韩激情一区二区| 美脚丝袜脚交一区二区| 亚洲精品手机在线| 欧美男人天堂| 欧美性猛交xxxx久久久| 亚洲欧洲一区二区| 亚洲卡一卡二卡三| 国产一区不卡| 亚洲第一网中文字幕| 国产精品久久久毛片| 国产精品美女一区二区三区四区| 欧美在线三区| 色婷婷**av毛片一区| 中文字幕乱码一区| 在线视频91p| 久久久国产精华| 国产亚洲一区二区三区在线播放| 亚洲一级黄色大片| 精品国产伦一区二区三区观看说明| 日本道免费精品一区二区三区| 老太脱裤子让老头玩xxxxx| 性生活视频网址| 免费精品99久久国产综合精品| 69久久夜色精品国产69| 国产极品美女高潮无套嗷嗷叫酒店| 日本中文在线观看| 亚洲私人黄色宅男| 在线看成人av电影| 精品极品三级久久久久| 中文亚洲字幕| 欧美亚洲另类视频| 黄色大片网站在线观看| 欧美日韩午夜电影网| 欧美一区二区视频在线观看2020| 国产高潮免费视频| 福利av痴女| 国产精品一二一区| 99re国产在线播放| 亚洲天堂网在线视频| 亚洲春色h网| 亚洲性生活视频在线观看| a级片在线观看| 欧美18—19sex性hd| 欧美日韩在线播放三区| 国内av一区二区| 麻豆电影在线播放| 一区二区三区中文在线| 国产一区二区三区乱码| 在线视频国产福利| 成人毛片老司机大片| 蜜桃日韩视频| 亚洲国产视频在线观看| 麻豆精品新av中文字幕| 92国产精品久久久久首页| 亚洲产国偷v产偷v自拍涩爱| 欧美在线视屏| 国产成人久久久| 午夜免费福利视频| 日韩天天综合| 成人激情在线观看| 天堂√中文在线| 麻豆精品精品国产自在97香蕉| 亚洲free嫩bbb| 中文字幕av高清| 国产剧情一区在线| 亚洲7777| 天天色天天干天天| 亚洲国产精品t66y| 青青草精品视频在线| 蜜桃视频免费网站| 一区二区三区欧美日韩| 久久久久久香蕉| 高清毛片在线看| 欧美精品日韩精品| 国产成人av一区二区三区不卡| 国产在线天堂www网在线观看| 亚洲国产精品女人久久久| 手机毛片在线观看| 国产三级一区| 亚洲乱亚洲乱妇无码| 中文字幕在线播出| 色97色成人| 98精品国产自产在线观看| 午夜成人鲁丝片午夜精品| 久久一区精品| 成人欧美一区二区三区黑人免费| 暧暧视频免费| wwwwxxxxx欧美| 免费黄色日本网站| 丁香花高清在线观看完整版| 91麻豆精品国产91久久久资源速度 | 亚洲人成绝费网站色www| 蜜桃传媒一区二区亚洲| 少妇高潮一区二区三区| 97婷婷大伊香蕉精品视频| 欧美日韩在线观看成人| 国产电影一区二区在线观看| 国产精品久久久久9999| 澳门永久av免费网站| 狠狠色丁香婷婷综合| 亚洲黄色网址在线观看| 午夜毛片在线| 欧美一区二区三区在线电影 | 天天av导航| 亚洲一二三区视频在线观看| 乱码一区二区三区| 天堂网www中文在线| 日韩欧美综合一区| 国产亚洲精品久久777777| 午夜日韩电影| 六月婷婷久久| 天堂中文av| 欧美一区二区三区免费观看视频| 美国黄色小视频|