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

標題: 想HMC5883L做個電子指南針,大神幫幫,求教怎么用 [打印本頁]

作者: 51hww34    時間: 2017-8-8 12:35
標題: 想HMC5883L做個電子指南針,大神幫幫,求教怎么用
  1. #include <reg52.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <intrins.h>

  5. typedef unsigned char uchar;
  6. typedef unsigned int uint;

  7. /*12864液晶引腳定義*/      
  8. sbit CS=P3^3;
  9. sbit SID=P3^4;
  10. sbit SCLK=P3^5;

  11. sbit SCL=P1^0;      //IIC時鐘引腳定義
  12. sbit SDA=P1^1;      //IIC數據引腳定義

  13. #define SlaveAddress 0x3c   //定義器件在IIC總線中的從地址
  14. uchar Rec_Data[6];
  15. void Send_byte(unsigned char bbyte);
  16. void Delaynms(unsigned int di);


  17. /*延時函數*/
  18. void Delay(uint t)
  19. {
  20.     while(t--)
  21.     {}
  22. }
  23. /********************************************
  24. **LCD顯示函數
  25. ********************************************/
  26. /*寫入一個數據或指令*/
  27. void Send_DATA(uchar ddata,uchar start)
  28. {

  29.         unsigned char start_data,Hdata,Ldata;
  30.           if(start==0)
  31.                 start_data=0xf8;//寫指令
  32.     else   
  33.             start_data=0xfa; //寫數據

  34.     SCLK=0;
  35.     CS=1;

  36.         Hdata=ddata&0xf0;                  //取高四位
  37.           Ldata=(ddata<<4)&0xf0;  //取低四位
  38.           Send_byte(start_data);          //發送起始信號
  39.           Delaynms(5); //延時是必須的
  40.           Send_byte(Hdata);              //發送高四位
  41.           Delaynms(1);  //延時是必須的
  42.           Send_byte(Ldata);                  //發送低四位
  43.           Delaynms(1);  //延時是必須的
  44.     CS=0;
  45.     Delay(20);  
  46. }

  47. void Delaynms(unsigned int di) //??
  48. {
  49.         unsigned int da,db;
  50.         for(da=0;da<di;da++)
  51.                    for(db=0;db<10;db++);
  52. }

  53. void Send_byte(unsigned char bbyte) //發送一個字節
  54. {
  55.         unsigned char i;
  56.         for(i=0;i<8;i++)
  57.            {
  58.                    SID=bbyte&0x80; //取出最高位
  59.                 SCLK=1;
  60.                    SCLK=0;
  61.                    bbyte<<=1; //左移
  62.            }  
  63. }
  64. void LCD_set_xy( unsigned char x, unsigned char y )
  65. {        //設置LCD顯示的起始位置,X為行,Y為列
  66.     unsigned char address;
  67.         switch(x)
  68.         {
  69.                 case 0: address = 0x80 + y; break;   
  70.             case 1: address = 0x80 + y; break;
  71.                 case 2: address = 0x90 + y; break;
  72.                     case 3: address = 0x88 + y; break;
  73.                 case 4: address = 0x98 + y; break;
  74.                 default:address = 0x80 + y; break;
  75.         }
  76.         Send_DATA(address,0);
  77. }

  78. /*12864液晶初始化*/
  79. void LCD_Init(void)
  80. {
  81.     Delay(60000);
  82.     Send_DATA(0x30,0);
  83.     Send_DATA(0x04,0);
  84.     Send_DATA(0x0c,0);
  85.     Send_DATA(0x01,0);
  86.     Delay(3000);
  87. }
  88. /*顯示字符串*/
  89. void Dis_str(uchar Addr,uchar *str)
  90. {

  91.     Send_DATA(Addr,0);
  92.     Delay(10);
  93.     while(*str!='\0')
  94.     {
  95.         Send_DATA(*str,1);
  96.         str++;
  97.         Delay(10);
  98.     }
  99. }
  100. /*起始信號*/
  101. void IIC_Start(void)
  102. {
  103.     SDA=1;
  104.     SCL=1;
  105.     Delay(5);
  106.     SDA=0;
  107.     Delay(5);
  108.     SCL=0;
  109. }
  110. /*停止信號*/
  111. void IIC_Stop(void)
  112. {
  113.     SDA=0;
  114.     SCL=1;
  115.     Delay(5);
  116.     SDA=1;
  117.     Delay(5);
  118. }
  119. /*發送應答信號*/
  120. void IIC_SendAck(bit Ack)
  121. {
  122.     SDA=Ack;//ack (0:ACK 1:NACK)
  123.     SCL=1;
  124.     Delay(5);
  125.     SCL=0;
  126.     Delay(5);
  127. }
  128. /*接收應答信號*/
  129. bit IIC_RecAck(void)
  130. {
  131.     SCL=1;
  132.     Delay(5);
  133.     CY=SDA;
  134.     SCL=0;
  135.     Delay(5);
  136.     return CY;
  137. }
  138. /*向IIC總線發送一個字節數據*/
  139. void HMC5883_Send_Byte(uchar Dat)
  140. {
  141.     uchar i;
  142.     for(i=0;i<8;i++)
  143.     {
  144.         Dat<<=1;
  145.         SDA=CY;
  146.         SCL=1;
  147.         Delay(5);
  148.         SCL=0;
  149.         Delay(5);
  150.     }
  151.     IIC_RecAck();
  152. }
  153. /*從IIC總線接收一個字節數據*/
  154. uchar HMC5883_Rec_Byte(void)
  155. {
  156.     uchar i,Dat=0;
  157.     SDA=1;
  158.     for(i=0;i<8;i++)
  159.     {
  160.         Dat<<=1;
  161.         SCL=1;
  162.         Delay(5);
  163.         Dat |=SDA;
  164.         SCL=0;
  165.         Delay(5);
  166.     }
  167.     return Dat;
  168. }
  169. /*單字節寫HMC5833*/
  170. void Single_Write_HMC5883(uchar Address,uchar Dat)
  171. {
  172.     IIC_Start();
  173.     HMC5883_Send_Byte(SlaveAddress);
  174.     HMC5883_Send_Byte(Address);
  175.     HMC5883_Send_Byte(Dat);
  176.     IIC_Stop();
  177. }
  178. /*單字節讀HMC5833*/
  179. /*uchar Single_Read_HMC5883(uchar Addr)
  180. {
  181.     uchar Value;
  182.     IIC_Start();
  183.     HMC5883_Send_Byte(SlaveAddress);
  184.     HMC5883_Send_Byte(Addr);
  185.     IIC_Start();
  186.     HMC5883_Send_Byte(SlaveAddress+1);
  187.     Value=HMC5883_Rec_Byte();
  188.     IIC_SendAck(1);
  189.     IIC_Stop();
  190.     return Value;
  191. }*/
  192. /*多字節讀HMC5833*/
  193. void Multiple_Read_HMC5883(void)
  194. {
  195.     uchar i;  //連續讀出HMC5883內部角度數據,地址范圍0x3~0x5
  196.     IIC_Start();
  197.     HMC5883_Send_Byte(SlaveAddress);
  198.     HMC5883_Send_Byte(0x03);//發送存儲單元地址,從0x03開始
  199.     IIC_Start();
  200.     HMC5883_Send_Byte(SlaveAddress+1);
  201.     for(i=0;i<6;i++) //連續讀取6個地址數據,存儲在Rec_Data
  202.     {
  203.         Rec_Data[i]=HMC5883_Rec_Byte();
  204.         if(i==5)
  205.             IIC_SendAck(1); //最后一個數據需要回NOACK
  206.         else
  207.             IIC_SendAck(0); //回應ACK
  208.     }
  209.     IIC_Stop();
  210.     Delay(100);
  211. }
  212. //初始化HMC5883,根據需要請參考pdf進行修改****
  213. void HMC5883_Init(void)
  214. {
  215.      Single_Write_HMC5883(0x02,0x00);
  216. }
  217. /*主函數*/
  218. void main(void)
  219. {
  220.     int X,Y,Z;
  221.     double Angle;
  222.     uint Acr;

  223.     LCD_Init();//LCD12864液晶初始化
  224.     HMC5883_Init();//HMC5883初始化

  225.      while(1)
  226.     {
  227.         Multiple_Read_HMC5883();//連續讀出數據,存儲在Rec_Data[]中
  228.         X=Rec_Data[0]<<8 | Rec_Data[1];//Combine MSB and LSB of X Data output register
  229.         Z=Rec_Data[2]<<8 | Rec_Data[3];//Combine MSB and LSB of Z Data output register
  230.         Y=Rec_Data[4]<<8 | Rec_Data[5];//Combine MSB and LSB of Y Data output register
  231.         Angle= atan2((double)Y,(double)X)*(180/3.14159265)+180;//單位:角度 (0~360)
  232.         Angle*=10;
  233.         Acr=(uint)Angle;
  234.                         LCD_set_xy(2,0);
  235.         Send_DATA(Acr%10000/1000+0x30,1);
  236.         Send_DATA(Acr%1000/100+0x30,1);
  237.         Send_DATA(Acr%100/10+0x30,1);
  238.         Send_DATA('.',1);
  239.         Send_DATA(Acr%10+0x30,1);

  240.         Delay(50000);
  241.     }
  242. }
復制代碼
上面是參考網上程序改的,好像不行,顯示屏一直顯示045.0,顯示屏用的是12864.不知道是程序問題還是模塊的問題。主控用的是AT89S52。模塊是GY271-HMC5883L.

作者: cjjcjj1    時間: 2017-8-8 15:44
提示: 作者被禁止或刪除 內容自動屏蔽
作者: 51hww34    時間: 2017-8-8 21:53
cjjcjj1 發表于 2017-8-8 15:44
你好!
1、檢查一下模塊引腳是不是和程序對應
2、開發板的晶振是多少的

用的是最小系統,晶振11.0592M

作者: zjdlx    時間: 2017-10-21 17:00
我也是是參考網上程序改的,好像不行,顯示屏也一直顯示045.0。現在解決了么?
作者: 密碼忘了    時間: 2018-2-25 10:41
原來做蹺蹺板小車,用到GY271,不小心燒毀了,淘寶買回來一直不能用,細看datasheet發現,一種是hm5883,一種是gm5883
作者: 597014232    時間: 2018-3-1 21:17
我也是顯示450.。。
什么原因我也搞不懂
作者: ljff    時間: 2018-4-12 01:17
現實不變化,到底怎么辦呀,來個人回答呀




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 中文字幕国产一区 | 久久51 | 亚洲国产一区在线 | 国产高清视频 | 特一级黄色毛片 | 久久精品一 | 久久精品亚洲 | 日韩日韩日韩日韩日韩日韩日韩 | 91爱啪啪 | 成人免费xxxxx在线视频 | www.夜夜骑 | 亚洲精品日韩一区二区电影 | 99精品一级欧美片免费播放 | 久久国产电影 | 日本久久网 | 小早川怜子xxxxaⅴ在线 | 欧美一级电影免费观看 | 国产超碰人人爽人人做人人爱 | 免费成人高清在线视频 | 色视频在线观看 | 国产精品一区二区视频 | 九九热在线观看 | 欧美在线激情 | 特黄小视频 | 日韩欧美国产电影 | 高清视频一区二区三区 | 九九免费视频 | 欧美精品一区二区三区蜜桃视频 | 国产精品一区二区在线观看 | 亚洲一区二区三区免费在线观看 | 久久亚洲欧美日韩精品专区 | 日韩一区中文字幕 | 三级在线视频 | 黄色精品 | 亚洲欧洲激情 | 国产一区二区三区在线看 | 午夜黄色 | 亚洲成av片人久久久 | 成人深夜福利网站 | 精品国产精品 | 久久亚洲综合 |