找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5908|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

電子指南針項(xiàng)目設(shè)計(jì)資料 源代碼、電路原理圖下載

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

電子指南針項(xiàng)目資料,內(nèi)含文獻(xiàn)資料、源代碼、電路原理圖。
下載: 電子指南針項(xiàng)目資料.rar (19.79 MB, 下載次數(shù): 97)




電子指南針模組電路圖


部分源碼預(yù)覽:
  1. //======================================================
  2. // 文件名稱(chēng):        Compass.c
  3. // 功能描述:        向指南針模塊發(fā)送命令,完成數(shù)據(jù)的轉(zhuǎn)換
  4. // 維護(hù)記錄:        2007-09-30        v1.0
  5. //======================================================
  6. #include "spce061a.h"
  7. #include "Compass.h"
  8. #include "Model.h"
  9. #include "./SPLC501_Driver/SPLC501User.h"
  10. #include "Key.h"
  11. #include "math.h"
  12. #include "PNI_Driver.h"

  13. static float xOffset, yOffset;                                                // 指南針校正參數(shù)
  14. static float xRange, yRange;                                                // 指南針校正參數(shù)
  15. //========================================================================
  16. //        語(yǔ)法格式:        unsigned int Compass_Read(void)
  17. //        實(shí)現(xiàn)功能:        讀取當(dāng)前指南針角度值
  18. //        參數(shù):                無(wú)
  19. //        返回值:        電子指南針的返回值
  20. //========================================================================
  21. unsigned int Compass_Read(void)
  22. {
  23.         float xValue, yValue;
  24.         float xRevise,yRevise;
  25.         float Angle;
  26.         float  Ratio;
  27.         
  28.         xValue = F_PNI_11096_Read(0xE9);
  29.         yValue = F_PNI_11096_Read(0xEA);        
  30.                
  31.         xRevise = xValue - xOffset;                                                                                // 根據(jù)校正結(jié)果,校正X軸
  32.         yRevise = yValue - yOffset;                                                                                // 根據(jù)校正結(jié)果,校正X軸
  33.         
  34.         if(xRange > yRange)
  35.                 yRevise = (yRevise*xRange)/yRange;
  36.         else
  37.                 xRevise = (xRevise*yRange)/xRange;

  38.         if((xRevise == 0) && (yRevise > 0))
  39.                 return 0;
  40.         if((xRevise == 0) && (yRevise < 0))
  41.                 return 180;
  42.          
  43.         Ratio = yRevise / xRevise;
  44.         if( Ratio < 0)
  45.                 Ratio = 0 - Ratio;
  46.         Angle = atanf(Ratio)  *180 /PI;                                                                // 使用反正玄函數(shù)計(jì)算角度值
  47.         
  48.         if((xRevise > 0) && (yRevise > 0))                        // 如果角度是在其它象限中,那么進(jìn)行修正
  49.                 return 360 - Angle;
  50.         else if((xRevise < 0) && (yRevise > 0))
  51.                 return 180 + Angle;
  52.         else if((xRevise < 0) && (yRevise < 0))
  53.                 return 180 - Angle;
  54.         else if((xRevise > 0) && (yRevise < 0))
  55.                 return  Angle;
  56.         
  57.         return 0;
  58. }

  59. //========================================================================
  60. //        語(yǔ)法格式:        unsigned int Compass_Revise(void)
  61. //        實(shí)現(xiàn)功能:        進(jìn)入電子指南針模組校正模式,進(jìn)入此模式時(shí)應(yīng)不斷旋轉(zhuǎn)電子指南針模組
  62. //        參數(shù):                無(wú)
  63. //        返回值:        0
  64. //========================================================================
  65. unsigned int Compass_Revise(void)
  66. {
  67.         int Xmax,Xmin,Ymax,Ymin;                                                        
  68.         int Xraw,Yraw;
  69.         int i;
  70.         
  71.         Xmax = Ymax = -32768;                                                                        // 將最大值賦值為最小值
  72.         Ymin = Ymin = 32767;                                                                        // 將最小值賦值為最大值
  73.         for(i = 0; i <100; i++)
  74.         {
  75.                 Xraw = F_PNI_11096_Read(0xE9);                                                // 得到x軸大小
  76.                 Yraw = F_PNI_11096_Read(0xEA);                                                // 得到Y(jié)軸大小
  77.                
  78.                 if(Xraw > Xmax)
  79.                         Xmax = Xraw;                                                                        // 得到一個(gè)盡可能大的值作為X最大值
  80.                 if(Xraw < Xmin)
  81.                         Xmin = Xraw;                                                                        // 得到一個(gè)盡可能小的值作為X最小值
  82.                 if(Yraw > Ymax)
  83.                         Ymax = Yraw;                                                                        // 得到一個(gè)盡可能大的值作為Y最大值
  84.                 if(Yraw < Ymin)
  85.                         Ymin = Yraw;                                                                        // 得到一個(gè)盡可能小的值作為Y最大值
  86.                 LCD501_PutString(0,40,"Calibration... ");                        // 提示用戶(hù)現(xiàn)在在校正模式下
  87.         }
  88.         xOffset = (Xmax + Xmin)>>1;                                                                // 得到X軸偏移量
  89.         yOffset = (Ymax + Ymin)>>1;                                                                // 得到Y(jié)軸偏移量
  90.         
  91.         xRange = Xmax - Xmin;                                                                        // 得到X軸取值范圍
  92.         yRange = Ymax -Ymin;                                                                        // 得到Y(jié)軸取值范圍
  93.         
  94.         return 0;        
  95. }

  96. //========================================================================
  97. //        語(yǔ)法格式:        void Compass_Line(unsigned int CompassValue)
  98. //        實(shí)現(xiàn)功能:        根據(jù)角度值,畫(huà)出在表盤(pán)上的表針
  99. //        參數(shù):                角度值
  100. //        返回值:        無(wú)
  101. //========================================================================
  102. void Compass_Line(unsigned int CompassValue)
  103. {
  104.         int x,y;
  105.         float Angle;

  106.         if( CompassValue < 0 || CompassValue > 360 )                                                                // 無(wú)效的角度值
  107.                 return ;                                                                                
  108.         LCD501_Bitmap(0,0,(unsigned int*)encoding_yuan);                                            // 重新畫(huà)表盤(pán)
  109.         Angle = Angle_Convert(CompassValue);
  110.         x = 25 + R * cos(Angle);
  111.         y = 22 - R * sin(Angle);
  112.         
  113.         LCD501_Line( 25,22,x,y);        
  114. }
  115. //========================================================================
  116. //        語(yǔ)法格式:        void Compass_Text(unsigned int CompassValue)
  117. //        實(shí)現(xiàn)功能:        顯示傳入的角度值
  118. //        參數(shù):                角度值
  119. //        返回值:        無(wú)
  120. //========================================================================
  121. void Compass_Text(unsigned int Compass_Value)
  122. {
  123.         int Direction;
  124.         unsigned char Str[5];
  125.         unsigned int i = 0 ;
  126.         unsigned int Num;
  127.         
  128.         for(i = 48; i < 128; i = i + 8)                                                                                                //清空經(jīng)緯度顯示區(qū)域
  129.                 LCD501_Bitmap(i,28,(unsigned int *)encoding_empty);        
  130.         
  131.         if( Compass_Value < 0 || Compass_Value > 360 )
  132.         {
  133.                 LCD501_PutChar(58, 28, 'E');
  134.                 LCD501_PutChar(66, 28, 'R');
  135.                 LCD501_PutChar(74, 28, 'R');
  136.                 LCD501_PutChar(82, 28, 'O');
  137.                 LCD501_PutChar(88, 28, 'R');                                
  138.                 return ;
  139.         }

  140.         Direction = Compass_Value / 90;
  141.         switch(Direction)
  142.         {
  143.                 case 0:
  144.                         LCD501_Bitmap(58, 28, (unsigned int *)encoding_dong);
  145.                         LCD501_Bitmap(58+ 1 * SIZE, 28, (unsigned int *)encoding_bei);
  146.                         break;
  147.                 case 1:
  148.                         LCD501_Bitmap(58, 28, (unsigned int *)encoding_dong);
  149.                         LCD501_Bitmap(58+ 1 * SIZE, 28, (unsigned int *)encoding_nan);
  150.                         break;                        
  151.                 case 2:
  152.                         LCD501_Bitmap(58, 28, (unsigned int *)encoding_xi);
  153.                         LCD501_Bitmap(58 + 1 * SIZE, 28, (unsigned int *)encoding_nan);
  154.                         break;                        
  155.                 case 3:
  156.                         LCD501_Bitmap(58, 28, (unsigned int *)encoding_xi);
  157.                         LCD501_Bitmap(58 + 1 * SIZE, 28, (unsigned int *)encoding_bei);
  158.                         break;               
  159.         }
  160.         
  161.         if(Compass_Value >= 100)                                                                                                // 測(cè)試角度有幾位
  162.                 Num =3;        
  163.         else if(Compass_Value >= 10)
  164.                 Num = 2;
  165.         else
  166.                 Num =1;
  167.                
  168.         Int_To_Str(Compass_Value,Str,Num);
  169.                
  170.         i=0;        
  171.         while(Str[i] != '\0')
  172.         {
  173.                 *P_Watchdog_Clear = 0x1;
  174.                 LCD501_PutChar(58 + 2*SIZE + i * 8, 28, Str[i]);
  175.                 i++;
  176.         }
  177.         LCD501_Bitmap(58 + 2 * SIZE + i * 8, 28,(unsigned int *)encoding_du);
  178. }
  179. //========================================================================
  180. //        語(yǔ)法格式:        float Angle_Convert(unsigned int Angle)
  181. //        實(shí)現(xiàn)功能:        把從電子指南針傳來(lái)的角度值轉(zhuǎn)化為正常坐標(biāo)系的角度值
  182. //        參數(shù):                角度值
  183. //        返回值:        轉(zhuǎn)化后的角度值
  184. //========================================================================
  185. float Angle_Convert(unsigned int Angle)
  186. {
  187.         int Direction;
  188.         float Angle_t;
  189.         Direction = Angle / 90;
  190.         switch(Direction)
  191.         {
  192.                 case 0:
  193.                         Angle_t = 90 - Angle;
  194.                         break;
  195.                 case 1:
  196.                         Angle_t = 450 - Angle;
  197.                         break;                        
  198.                 case 2:
  199.                         Angle_t = 450 - Angle;
  200.                         break;                        
  201.                 case 3:
  202.                         Angle_t = 450 - Angle;
  203.                         break;               
  204.         }
  205.         return (Angle_t / 360) * 2 * 3.142 ;
  206. }

  207. //========================================================================
  208. //        語(yǔ)法格式:        void Int_To_Str(unsigned int Integer, unsigned char *Str,unsigned int Num)
  209. //        實(shí)現(xiàn)功能:        把整數(shù)轉(zhuǎn)化成字符串
  210. //        參數(shù):                Integer 帶轉(zhuǎn)化的整數(shù)
  211. //                                Str 轉(zhuǎn)化后的字符串
  212. //                                Num 轉(zhuǎn)化字符的位數(shù)
  213. //        返回值:        無(wú)
  214. //注意:    Buf 數(shù)組的大小至少是Num+1
  215. //========================================================================
  216. void Int_To_Str(unsigned int Integer, unsigned char *Str,unsigned int Num)
  217. {
  218.         int Jin_Zhi;
  219.         int i=0;
  220.         int Num_s ;
  221.         Num_s = Num;
  222.         Jin_Zhi = 1;
  223.         
  224.         if(Num == 1)
  225.                 Jin_Zhi = 1;
  226.         while(Num > 1)                                                               
  227.         {
  228.                 Jin_Zhi = Jin_Zhi * 10;
  229.                 Num --;
  230.         }
  231.         
  232.         do
  233.         {
  234.                 Str[i]  = Integer / Jin_Zhi + 0x30;
  235.                 Integer = Integer % Jin_Zhi ;
  236.                 Jin_Zhi = Jin_Zhi / 10 ;
  237.                 i ++;
  238.                 Num_s--;
  239.         }while(Num_s > 0);
  240.         Str[i] = '\0';
  241. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:105890 發(fā)表于 2016-4-14 14:14 | 只看該作者
不錯(cuò),
回復(fù)

使用道具 舉報(bào)

板凳
ID:160486 發(fā)表于 2017-1-6 17:53 | 只看該作者
不錯(cuò),是我需要的。
回復(fù)

使用道具 舉報(bào)

地板
ID:163961 發(fā)表于 2017-2-8 23:08 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

5#
ID:183771 發(fā)表于 2017-3-27 13:06 | 只看該作者
很喜歡。。。。。。。。。。
回復(fù)

使用道具 舉報(bào)

6#
ID:185472 發(fā)表于 2017-4-1 22:13 | 只看該作者
正是我所需要的!
回復(fù)

使用道具 舉報(bào)

7#
ID:306174 發(fā)表于 2018-4-11 21:46 | 只看該作者
顯示無(wú)變化,怎么回事?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表