|
1.png (32.72 KB, 下載次數: 145)
下載附件
2016-4-13 21:46 上傳
電子指南針項目資料,內含文獻資料、源代碼、電路原理圖。
下載:
電子指南針項目資料.rar
(19.79 MB, 下載次數: 97)
2016-4-13 19:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
2.png (123.38 KB, 下載次數: 158)
下載附件
2016-4-13 21:46 上傳
3.png (44.13 KB, 下載次數: 157)
下載附件
2016-4-13 21:46 上傳
電子指南針模組電路圖
0.png (100 KB, 下載次數: 139)
下載附件
2016-4-13 21:52 上傳
0.png (101.98 KB, 下載次數: 143)
下載附件
2016-4-13 21:55 上傳
部分源碼預覽:
- //======================================================
- // 文件名稱: 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';
- }
復制代碼
|
評分
-
查看全部評分
|