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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

電子指南針項目設計資料 源代碼、電路原理圖下載

  [復制鏈接]
跳轉到指定樓層
樓主

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




電子指南針模組電路圖


部分源碼預覽:
  1. //======================================================
  2. // 文件名稱:        Compass.c
  3. // 功能描述:        向指南針模塊發送命令,完成數據的轉換
  4. // 維護記錄:        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;                                                // 指南針校正參數
  14. static float xRange, yRange;                                                // 指南針校正參數
  15. //========================================================================
  16. //        語法格式:        unsigned int Compass_Read(void)
  17. //        實現功能:        讀取當前指南針角度值
  18. //        參數:                無
  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;                                                                                // 根據校正結果,校正X軸
  32.         yRevise = yValue - yOffset;                                                                                // 根據校正結果,校正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;                                                                // 使用反正玄函數計算角度值
  47.         
  48.         if((xRevise > 0) && (yRevise > 0))                        // 如果角度是在其它象限中,那么進行修正
  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. //        語法格式:        unsigned int Compass_Revise(void)
  61. //        實現功能:        進入電子指南針模組校正模式,進入此模式時應不斷旋轉電子指南針模組
  62. //        參數:                無
  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軸大小
  77.                
  78.                 if(Xraw > Xmax)
  79.                         Xmax = Xraw;                                                                        // 得到一個盡可能大的值作為X最大值
  80.                 if(Xraw < Xmin)
  81.                         Xmin = Xraw;                                                                        // 得到一個盡可能小的值作為X最小值
  82.                 if(Yraw > Ymax)
  83.                         Ymax = Yraw;                                                                        // 得到一個盡可能大的值作為Y最大值
  84.                 if(Yraw < Ymin)
  85.                         Ymin = Yraw;                                                                        // 得到一個盡可能小的值作為Y最大值
  86.                 LCD501_PutString(0,40,"Calibration... ");                        // 提示用戶現在在校正模式下
  87.         }
  88.         xOffset = (Xmax + Xmin)>>1;                                                                // 得到X軸偏移量
  89.         yOffset = (Ymax + Ymin)>>1;                                                                // 得到Y軸偏移量
  90.         
  91.         xRange = Xmax - Xmin;                                                                        // 得到X軸取值范圍
  92.         yRange = Ymax -Ymin;                                                                        // 得到Y軸取值范圍
  93.         
  94.         return 0;        
  95. }

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

  106.         if( CompassValue < 0 || CompassValue > 360 )                                                                // 無效的角度值
  107.                 return ;                                                                                
  108.         LCD501_Bitmap(0,0,(unsigned int*)encoding_yuan);                                            // 重新畫表盤
  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. //        語法格式:        void Compass_Text(unsigned int CompassValue)
  117. //        實現功能:        顯示傳入的角度值
  118. //        參數:                角度值
  119. //        返回值:        無
  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)                                                                                                //清空經緯度顯示區域
  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)                                                                                                // 測試角度有幾位
  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. //        語法格式:        float Angle_Convert(unsigned int Angle)
  181. //        實現功能:        把從電子指南針傳來的角度值轉化為正常坐標系的角度值
  182. //        參數:                角度值
  183. //        返回值:        轉化后的角度值
  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. //        語法格式:        void Int_To_Str(unsigned int Integer, unsigned char *Str,unsigned int Num)
  209. //        實現功能:        把整數轉化成字符串
  210. //        參數:                Integer 帶轉化的整數
  211. //                                Str 轉化后的字符串
  212. //                                Num 轉化字符的位數
  213. //        返回值:        無
  214. //注意:    Buf 數組的大小至少是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. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:105890 發表于 2016-4-14 14:14 | 只看該作者
不錯,
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

5#
ID:183771 發表于 2017-3-27 13:06 | 只看該作者
很喜歡!!!!!!!!!!!
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av永久| 欧美不卡一区二区三区 | 一区二区三区视频在线观看 | 午夜精品 | 欲色av| 日韩a在线 | 久久久久一区二区 | 欧美日本一区 | 国产精品色 | 精品少妇一区二区三区日产乱码 | 欧美5区 | 五月婷婷视频 | 日韩不卡在线 | 在线视频一区二区三区 | 祝你幸福电影在线观看 | 国产视频一区二区 | 在线亚洲一区二区 | 欧美在线色视频 | 久久精品亚洲 | 精品成人69xx.xyz| 日本不卡一区二区三区在线观看 | 毛片久久久 | 精品久久久久久久久久久下田 | aaaaa毛片| 久久久一区二区 | 亚洲精品视频播放 | 黄色一级毛片免费看 | 国产区久久 | 久久国产精品无码网站 | 可以免费看的毛片 | caoporn国产精品免费公开 | 国内久久| av中文在线观看 | 国产精品成人一区二区三区 | 中文字幕国产视频 | 成人片免费看 | 国产高清在线观看 | 久久精品国产一区二区三区 | 一区二区在线 | 福利片在线观看 | 久久大 |