久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于HMC5883L模塊轉動時,角度顯示有問題,請在大家幫忙一下

[復制鏈接]
跳轉到指定樓層
樓主
ID:275668 發表于 2018-1-13 21:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在淘寶上買了HMC5883L 模塊, 資料網下下載的,運行時候發現,模塊轉動時,角度顯示有問題,從0到180 度應該是轉了一半才對,可是那模塊我轉了半圈才顯示到150度左右, 然后在后半圈顯示是150-360度,這是怎么回事,是C 資料問題還是別的問題,我試了兩片模塊都一下的,

  1. //***************************************
  2. // HMC5883 IIC測試程序
  3. // 使用單片機STC89C51
  4. // 晶振:11.0592M
  5. // 顯示:LCD1602
  6. // 編譯環境 Keil uVision2
  7. // 參考宏晶網站24c04通信程序
  8. // 時間:2011年3月1日
  9. //****************************************
  10. #include  <REG51.H>        
  11. #include  <math.h>    //Keil library  
  12. #include  <stdio.h>   //Keil library        
  13. #include  <INTRINS.H>
  14. #define   uchar unsigned char
  15. #define   uint unsigned int        
  16. //使用的端口,請按照以下接線
  17. #define   DataPort P0        //LCD1602數據端口
  18. sbit        SCL=P2^6;      //IIC時鐘引腳定義
  19. sbit        SDA=P2^7;      //IIC數據引腳定義
  20. sbit    LCM_RS=P2^0;   //LCD1602命令端口               
  21. sbit    LCM_RW=P2^1;   //LCD1602命令端口               
  22. sbit    LCM_EN=P2^2;   //LCD1602命令端口

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

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

  29. void delay(unsigned int k);
  30. void InitLcd();
  31. void Init_HMC5883(void);            //初始化5883

  32. void WriteDataLCM(uchar dataW);
  33. void WriteCommandLCM(uchar CMD,uchar Attribc);
  34. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  35. void conversion(uint temp_data);

  36. void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //單個寫入數據
  37. uchar Single_Read_HMC5883(uchar REG_Address);                   //單個讀取內部寄存器數據
  38. void  Multiple_Read_HMC5883();                                  //連續的讀取內部寄存器數據
  39. //以下是模擬iic使用函數-------------
  40. void Delay5us();
  41. void Delay5ms();
  42. void HMC5883_Start();
  43. void HMC5883_Stop();
  44. void HMC5883_SendACK(bit ack);
  45. bit  HMC5883_RecvACK();
  46. void HMC5883_SendByte(BYTE dat);
  47. BYTE HMC5883_RecvByte();
  48. void HMC5883_ReadPage();
  49. void HMC5883_WritePage();
  50. //-----------------------------------

  51. //*********************************************************
  52. void conversion(uint temp_data)  
  53. {  
  54.     wan=temp_data/10000+0x30 ;
  55.     temp_data=temp_data%10000;   //取余運算
  56.         qian=temp_data/1000+0x30 ;
  57.     temp_data=temp_data%1000;    //取余運算
  58.     bai=temp_data/100+0x30   ;
  59.     temp_data=temp_data%100;     //取余運算
  60.     shi=temp_data/10+0x30    ;
  61.     temp_data=temp_data%10;      //取余運算
  62.     ge=temp_data+0x30;         
  63. }

  64. /*******************************/
  65. void delay(unsigned int k)        
  66. {                                                
  67. unsigned int i,j;                                
  68. for(i=0;i<k;i++)
  69. {                        
  70. for(j=0;j<121;j++)                        
  71. {;}}                                                
  72. }
  73. /*******************************/
  74. void WaitForEnable(void)        
  75. {                                       
  76. DataPort=0xff;               
  77. LCM_RS=0;LCM_RW=1;_nop_();
  78. LCM_EN=1;_nop_();_nop_();
  79. while(DataPort&0x80);        
  80. LCM_EN=0;                                
  81. }                                       
  82. /*******************************/
  83. void WriteCommandLCM(uchar CMD,uchar Attribc)
  84. {                                       
  85. if(Attribc)WaitForEnable();        
  86. LCM_RS=0;LCM_RW=0;_nop_();
  87. DataPort=CMD;_nop_();        
  88. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  89. }                                       
  90. /*******************************/
  91. void WriteDataLCM(uchar dataW)
  92. {                                       
  93. WaitForEnable();               
  94. LCM_RS=1;LCM_RW=0;_nop_();
  95. DataPort=dataW;_nop_();        
  96. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  97. }               
  98. /***********************************/
  99. void InitLcd()                                
  100. {                        
  101. WriteCommandLCM(0x38,1);        
  102. WriteCommandLCM(0x08,1);        
  103. WriteCommandLCM(0x01,1);        
  104. WriteCommandLCM(0x06,1);        
  105. WriteCommandLCM(0x0c,1);
  106. }                        
  107. /***********************************/
  108. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  109. {                                                
  110. Y&=1;                                                
  111. X&=15;                                                
  112. if(Y)X|=0x40;                                       
  113. X|=0x80;                        
  114. WriteCommandLCM(X,0);               
  115. WriteDataLCM(DData);               
  116. }                                                

  117. /**************************************
  118. 延時5微秒(STC90C52RC@12M)
  119. 不同的工作環境,需要調整此函數,注意時鐘過快時需要修改
  120. 當改用1T的MCU時,請調整此延時函數
  121. **************************************/
  122. void Delay5us()
  123. {
  124.              _nop_();_nop_();_nop_();_nop_();
  125.              _nop_();_nop_();_nop_();_nop_();
  126.         _nop_();_nop_();_nop_();_nop_();
  127.         _nop_();_nop_();_nop_();_nop_();
  128.               _nop_();_nop_();_nop_();_nop_();
  129.         _nop_();_nop_();_nop_();_nop_();
  130.         _nop_();_nop_();_nop_();_nop_();
  131.              _nop_();_nop_();_nop_();_nop_();

  132. }

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

  141.     while (n--);
  142. }

  143. /**************************************
  144. 起始信號
  145. **************************************/
  146. void HMC5883_Start()
  147. {
  148.     SDA = 1;                    //拉高數據線
  149.     SCL = 1;                    //拉高時鐘線
  150.     Delay5us();                 //延時
  151.     SDA = 0;                    //產生下降沿
  152.     Delay5us();                 //延時
  153.     SCL = 0;                    //拉低時鐘線
  154. }

  155. /**************************************
  156. 停止信號
  157. **************************************/
  158. void HMC5883_Stop()
  159. {
  160.     SDA = 0;                    //拉低數據線
  161.     SCL = 1;                    //拉高時鐘線
  162.     Delay5us();                 //延時
  163.     SDA = 1;                    //產生上升沿
  164.     Delay5us();                 //延時
  165. }

  166. /**************************************
  167. 發送應答信號
  168. 入口參數:ack (0:ACK 1:NAK)
  169. **************************************/
  170. void HMC5883_SendACK(bit ack)
  171. {
  172.     SDA = ack;                  //寫應答信號
  173.     SCL = 1;                    //拉高時鐘線
  174.     Delay5us();                 //延時
  175.     SCL = 0;                    //拉低時鐘線
  176.     Delay5us();                 //延時
  177. }

  178. /**************************************
  179. 接收應答信號
  180. **************************************/
  181. bit HMC5883_RecvACK()
  182. {
  183.     SCL = 1;                    //拉高時鐘線
  184.     Delay5us();                 //延時
  185.     CY = SDA;                   //讀應答信號
  186.     SCL = 0;                    //拉低時鐘線
  187.     Delay5us();                 //延時

  188.     return CY;
  189. }

  190. /**************************************
  191. 向IIC總線發送一個字節數據
  192. **************************************/
  193. void HMC5883_SendByte(BYTE dat)
  194. {
  195.     BYTE i;

  196.     for (i=0; i<8; i++)         //8位計數器
  197.     {
  198.         dat <<= 1;              //移出數據的最高位
  199.         SDA = CY;               //送數據口
  200.         SCL = 1;                //拉高時鐘線
  201.         Delay5us();             //延時
  202.         SCL = 0;                //拉低時鐘線
  203.         Delay5us();             //延時
  204.     }
  205.     HMC5883_RecvACK();
  206. }

  207. /**************************************
  208. 從IIC總線接收一個字節數據
  209. **************************************/
  210. BYTE HMC5883_RecvByte()
  211. {
  212.     BYTE i;
  213.     BYTE dat = 0;

  214.     SDA = 1;                    //使能內部上拉,準備讀取數據,
  215.     for (i=0; i<8; i++)         //8位計數器
  216.     {
  217.         dat <<= 1;
  218.         SCL = 1;                //拉高時鐘線
  219.         Delay5us();             //延時
  220.         dat |= SDA;             //讀數據               
  221.         SCL = 0;                //拉低時鐘線
  222.         Delay5us();             //延時
  223.     }
  224.     return dat;
  225. }

  226. //***************************************************

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

  235. //********單字節讀取內部寄存器*************************
  236. uchar Single_Read_HMC5883(uchar REG_Address)
  237. {  uchar REG_data;
  238.     HMC5883_Start();                          //起始信號
  239.     HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
  240.     HMC5883_SendByte(REG_Address);                   //發送存儲單元地址,從0開始        
  241.     HMC5883_Start();                          //起始信號
  242.     HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  243.     REG_data=HMC5883_RecvByte();              //讀出寄存器數據
  244.         HMC5883_SendACK(1);   
  245.         HMC5883_Stop();                           //停止信號
  246.     return REG_data;
  247. }
  248. //******************************************************
  249. //
  250. //連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
  251. //
  252. //******************************************************
  253. void Multiple_read_HMC5883(void)
  254. {   uchar i;
  255.     HMC5883_Start();                          //起始信號
  256.     HMC5883_SendByte(SlaveAddress);           //發送設備地址+寫信號
  257.     HMC5883_SendByte(0x03);                   //發送存儲單元地址,從0x3開始        
  258.     HMC5883_Start();                          //起始信號
  259.     HMC5883_SendByte(SlaveAddress+1);         //發送設備地址+讀信號
  260.          for (i=0; i<6; i++)                      //連續讀取6個地址數據,存儲中BUF
  261.     {
  262.         BUF[i] = HMC5883_RecvByte();          //BUF[0]存儲數據
  263.         if (i == 5)
  264.         {
  265.            HMC5883_SendACK(1);                //最后一個數據需要回NOACK
  266.         }
  267.         else
  268.         {
  269.           HMC5883_SendACK(0);                //回應ACK
  270.        }
  271.    }
  272.     HMC5883_Stop();                          //停止信號
  273.     Delay5ms();
  274. }

  275. //初始化HMC5883,根據需要請參考pdf進行修改****
  276. void Init_HMC5883()
  277. {
  278.      Single_Write_HMC5883(0x02,0x00);  //
  279. }
  280. //*********************************************************
  281. //主程序********
  282. //*********************************************************
  283. void main()
  284. { // bit sign_bit;
  285.    unsigned int i;
  286.    int x,y,z;
  287.    double angle;

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

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


  308.     for (i=0;i<10000;i++);   //延時                  
  309.   }
  310. }
復制代碼



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

使用道具 舉報

沙發
ID:309640 發表于 2018-6-8 12:52 | 只看該作者
需要矯正磁力計的
回復

使用道具 舉報

板凳
ID:578562 發表于 2019-7-6 10:07 | 只看該作者
你這個LCD上是顯示X,Y,Z數據嗎,還是只有一維
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美午夜一区 | 一区二区三区久久久 | 丁香色婷婷| 在线91| www.成人.com| 人人插人人 | 国产精品久久久av | 91影视| 日韩伦理一区二区三区 | 中文字字幕在线中文乱码范文 | 久久久精品一区二区三区 | 欧美三级免费观看 | 精品国产久 | 亚洲 欧美 另类 综合 偷拍 | 亚洲精品福利视频 | 国产一区二区久久 | 日韩av一区在线观看 | 精品一二区| 做a的各种视频 | 羞羞网站免费观看 | 国产一区不卡 | 精精国产xxxx视频在线播放 | 69堂永久69tangcom | 久久九九99 | 精品中文在线 | 中文字幕日韩欧美一区二区三区 | 日韩一级二级片 | 欧美日韩免费 | 精品不卡 | 91精品国产91久久久 | 欧美性生活网 | 国产乱码精品一区二区三区中文 | 欧美一级片在线观看 | 久久九精品 | 视频一区在线 | 大学生a级毛片免费视频 | www视频在线观看 | 国产精品视频一区二区三区 | 日韩国产在线 | 日韩天堂av | 成人影院在线观看 |