|
电子指南针项目资料,内含文献资料、源代码、电路原理图。
下载:
电子指南针项目资料.rar
(19.79 MB, 下载次数: 97)
电子指南针模组电路图
部分源码预览:
- //======================================================
- // 文件名称: Compass.c
- // 功能描述: 向指南针模块发送命令,完成数据的转换
- // 维护记录: 2007-09-30 v1.0
- //======================================================
- #include "spce061a.h"
- #include "Compass.h"
- #include "Model.h"
- #include "./SPLC501_Driver/SPLC501User.h"
- #include "Key.h"
- #include "math.h"
- #include "PNI_Driver.h"
- static float xOffset, yOffset; // 指南针校正参数
- static float xRange, yRange; // 指南针校正参数
- //========================================================================
- // 语法格式: unsigned int Compass_Read(void)
- // 实现功能: 读取当前指南针角度值
- // 参数: 无
- // 返回值: 电子指南针的返回值
- //========================================================================
- unsigned int Compass_Read(void)
- {
- float xValue, yValue;
- float xRevise,yRevise;
- float Angle;
- float Ratio;
-
- xValue = F_PNI_11096_Read(0xE9);
- yValue = F_PNI_11096_Read(0xEA);
-
- xRevise = xValue - xOffset; // 根据校正结果,校正X轴
- yRevise = yValue - yOffset; // 根据校正结果,校正X轴
-
- if(xRange > yRange)
- yRevise = (yRevise*xRange)/yRange;
- else
- xRevise = (xRevise*yRange)/xRange;
- if((xRevise == 0) && (yRevise > 0))
- return 0;
- if((xRevise == 0) && (yRevise < 0))
- return 180;
-
- Ratio = yRevise / xRevise;
- if( Ratio < 0)
- Ratio = 0 - Ratio;
- Angle = atanf(Ratio) *180 /PI; // 使用反正玄函数计算角度值
-
- if((xRevise > 0) && (yRevise > 0)) // 如果角度是在其它象限中,那么进行修正
- return 360 - Angle;
- else if((xRevise < 0) && (yRevise > 0))
- return 180 + Angle;
- else if((xRevise < 0) && (yRevise < 0))
- return 180 - Angle;
- else if((xRevise > 0) && (yRevise < 0))
- return Angle;
-
- return 0;
- }
- //========================================================================
- // 语法格式: unsigned int Compass_Revise(void)
- // 实现功能: 进入电子指南针模组校正模式,进入此模式时应不断旋转电子指南针模组
- // 参数: 无
- // 返回值: 0
- //========================================================================
- unsigned int Compass_Revise(void)
- {
- int Xmax,Xmin,Ymax,Ymin;
- int Xraw,Yraw;
- int i;
-
- Xmax = Ymax = -32768; // 将最大值赋值为最小值
- Ymin = Ymin = 32767; // 将最小值赋值为最大值
- for(i = 0; i <100; i++)
- {
- Xraw = F_PNI_11096_Read(0xE9); // 得到x轴大小
- Yraw = F_PNI_11096_Read(0xEA); // 得到Y轴大小
-
- if(Xraw > Xmax)
- Xmax = Xraw; // 得到一个尽可能大的值作为X最大值
- if(Xraw < Xmin)
- Xmin = Xraw; // 得到一个尽可能小的值作为X最小值
- if(Yraw > Ymax)
- Ymax = Yraw; // 得到一个尽可能大的值作为Y最大值
- if(Yraw < Ymin)
- Ymin = Yraw; // 得到一个尽可能小的值作为Y最大值
- LCD501_PutString(0,40,"Calibration... "); // 提示用户现在在校正模式下
- }
- xOffset = (Xmax + Xmin)>>1; // 得到X轴偏移量
- yOffset = (Ymax + Ymin)>>1; // 得到Y轴偏移量
-
- xRange = Xmax - Xmin; // 得到X轴取值范围
- yRange = Ymax -Ymin; // 得到Y轴取值范围
-
- return 0;
- }
- //========================================================================
- // 语法格式: void Compass_Line(unsigned int CompassValue)
- // 实现功能: 根据角度值,画出在表盘上的表针
- // 参数: 角度值
- // 返回值: 无
- //========================================================================
- void Compass_Line(unsigned int CompassValue)
- {
- int x,y;
- float Angle;
- if( CompassValue < 0 || CompassValue > 360 ) // 无效的角度值
- return ;
- LCD501_Bitmap(0,0,(unsigned int*)encoding_yuan); // 重新画表盘
- Angle = Angle_Convert(CompassValue);
- x = 25 + R * cos(Angle);
- y = 22 - R * sin(Angle);
-
- LCD501_Line( 25,22,x,y);
- }
- //========================================================================
- // 语法格式: void Compass_Text(unsigned int CompassValue)
- // 实现功能: 显示传入的角度值
- // 参数: 角度值
- // 返回值: 无
- //========================================================================
- void Compass_Text(unsigned int Compass_Value)
- {
- int Direction;
- unsigned char Str[5];
- unsigned int i = 0 ;
- unsigned int Num;
-
- for(i = 48; i < 128; i = i + 8) //清空经纬度显示区域
- LCD501_Bitmap(i,28,(unsigned int *)encoding_empty);
-
- if( Compass_Value < 0 || Compass_Value > 360 )
- {
- LCD501_PutChar(58, 28, 'E');
- LCD501_PutChar(66, 28, 'R');
- LCD501_PutChar(74, 28, 'R');
- LCD501_PutChar(82, 28, 'O');
- LCD501_PutChar(88, 28, 'R');
- return ;
- }
- Direction = Compass_Value / 90;
- switch(Direction)
- {
- case 0:
- LCD501_Bitmap(58, 28, (unsigned int *)encoding_dong);
- LCD501_Bitmap(58+ 1 * SIZE, 28, (unsigned int *)encoding_bei);
- break;
- case 1:
- LCD501_Bitmap(58, 28, (unsigned int *)encoding_dong);
- LCD501_Bitmap(58+ 1 * SIZE, 28, (unsigned int *)encoding_nan);
- break;
- case 2:
- LCD501_Bitmap(58, 28, (unsigned int *)encoding_xi);
- LCD501_Bitmap(58 + 1 * SIZE, 28, (unsigned int *)encoding_nan);
- break;
- case 3:
- LCD501_Bitmap(58, 28, (unsigned int *)encoding_xi);
- LCD501_Bitmap(58 + 1 * SIZE, 28, (unsigned int *)encoding_bei);
- break;
- }
-
- if(Compass_Value >= 100) // 测试角度有几位
- Num =3;
- else if(Compass_Value >= 10)
- Num = 2;
- else
- Num =1;
-
- Int_To_Str(Compass_Value,Str,Num);
-
- i=0;
- while(Str[i] != '\0')
- {
- *P_Watchdog_Clear = 0x1;
- LCD501_PutChar(58 + 2*SIZE + i * 8, 28, Str[i]);
- i++;
- }
- LCD501_Bitmap(58 + 2 * SIZE + i * 8, 28,(unsigned int *)encoding_du);
- }
- //========================================================================
- // 语法格式: float Angle_Convert(unsigned int Angle)
- // 实现功能: 把从电子指南针传来的角度值转化为正常坐标系的角度值
- // 参数: 角度值
- // 返回值: 转化后的角度值
- //========================================================================
- float Angle_Convert(unsigned int Angle)
- {
- int Direction;
- float Angle_t;
- Direction = Angle / 90;
- switch(Direction)
- {
- case 0:
- Angle_t = 90 - Angle;
- break;
- case 1:
- Angle_t = 450 - Angle;
- break;
- case 2:
- Angle_t = 450 - Angle;
- break;
- case 3:
- Angle_t = 450 - Angle;
- break;
- }
- return (Angle_t / 360) * 2 * 3.142 ;
- }
- //========================================================================
- // 语法格式: void Int_To_Str(unsigned int Integer, unsigned char *Str,unsigned int Num)
- // 实现功能: 把整数转化成字符串
- // 参数: Integer 带转化的整数
- // Str 转化后的字符串
- // Num 转化字符的位数
- // 返回值: 无
- //注意: Buf 数组的大小至少是Num+1
- //========================================================================
- void Int_To_Str(unsigned int Integer, unsigned char *Str,unsigned int Num)
- {
- int Jin_Zhi;
- int i=0;
- int Num_s ;
- Num_s = Num;
- Jin_Zhi = 1;
-
- if(Num == 1)
- Jin_Zhi = 1;
- while(Num > 1)
- {
- Jin_Zhi = Jin_Zhi * 10;
- Num --;
- }
-
- do
- {
- Str[i] = Integer / Jin_Zhi + 0x30;
- Integer = Integer % Jin_Zhi ;
- Jin_Zhi = Jin_Zhi / 10 ;
- i ++;
- Num_s--;
- }while(Num_s > 0);
- Str[i] = '\0';
- }
复制代码
|
评分
-
查看全部评分
|