找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5877|回复: 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 单片机教程网

快速回复 返回顶部 返回列表