?? userfunction.c
字號:
//========================================================
// 文件名稱: UserFunction.c
// 功能描述: 超聲波測距功能子程序程序
// 日期: 2006-4-13
//========================================================
//========================================================
#include "SPCE061A.h"
#define M_TIMERA_EN 0x0001 //使能TimerA的配置,計數頻率為96KHz
#define M_TIMERA_STOP 0x0006 //停止TimerA的配置,計數器停止工作
unsigned int M_TIMER_DELAY=95; //為防止余波干擾而定義的延時
unsigned int M_LOW_DISTEN=7;
unsigned int M_TIMER_OFFSET=20;
unsigned int M_TIMER_SEND=14;
unsigned int M_MUT_DATA=32800;
unsigned int uiIOB_20Hz_flag; //IOB01口(即20Hz方波輸出口)的狀態標識
unsigned int uiEXT_EN_flag; //外部中斷使能標識位
unsigned int uiMeasure_Index; //當前測量的次數
unsigned int uiResult[4]; //保存測四次測量結果的緩存區
unsigned int ResultOS(void);
void ErrorOS(void);
void InitMeasureData(void);
unsigned int uiError_Counter; //出錯累加器
//=============================================================
// 函數名稱: InitMeasure()
// 功能描述: 系統IO口、中斷等進行初始化
// 語法格式: void InitMeasure(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 用戶可參考設置進行必要修改,以適應不同情況
//=============================================================
void InitMeasure(void)
{
//設置IOB口 IOB04口為20Hz(也許用16Hz)的輸出,以控制模組發射40KHz方波
//IOB2 口為外部中斷的輸入,設置為帶上拉的輸入口。
*P_SystemClock = 0x000b;
*P_IOB_Dir = 0x0008;
*P_IOB_Attrib = 0x0008;
*P_IOB_Data = 0x0004;
//開時間基準中斷,TMB1 16Hz
*P_TimeBase_Setup=0x0001;
//設置TimerB 選使其處于停止工作狀態
*P_TimerB_Data = 0x0000;
*P_TimerB_Ctrl = M_TIMERA_STOP;
__asm("FIQ OFF");
__asm("IRQ ON");
InitMeasureData();
}
//=============================================================
// 函數名稱: InitMeasureData()
// 功能描述: 部分全局數據的初始化
// 語法格式: void InitMeasureData(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//=============================================================
unsigned int uiLCD_EN_flag;
void InitMeasureData(void)
{
uiIOB_20Hz_flag = 0; //初始化為零
uiEXT_EN_flag = 0;
uiMeasure_Index = 0;
uiLCD_EN_flag=0;
}
//=============================================================
// 函數名稱: BeginMeasure()
// 功能描述: 進行一次測距 包括數據處理
// 每次測距都要進行四次測量,而且都是通過后臺
// 的16Hz中斷啟動這四次測量
// 語法格式: unsigend int BeginMeasure(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//=============================================================
//延時程序
//
void User_Delay(unsigned int iTimers)
{
unsigned int i;
for(i=0;i<iTimers;i++)
{
__asm("nop");
*P_Watchdog_Clear = 0x0001;
}
}
void US_Send200us(void)
{
*P_TimerB_Data = 0x0000; //TimerA計數器清零
*P_IOB_Data=*P_IOB_Buffer|0x0008;
*P_TimerB_Ctrl = M_TIMERA_EN; //使能TimerA
User_Delay(M_TIMER_SEND); //延時,發送完十一個以上的完整的40KHz方波脈沖
*P_IOB_Data=*P_IOB_Buffer&0xfff7; //停止發送
uiIOB_20Hz_flag = 1; //置位標識位
}
unsigned int BeginMeasure(void)
{
unsigned int uiExit_RQ; //退出循環標識
unsigned int uiMeasure_Result; //測量結果
unsigned int Temp = 0, Temp2 = 0;
int i = 0, j = 0;
*P_SystemClock = 0x000b; //設置SystemCkock,以保證軟件延時的準確
uiExit_RQ = 1;
uiMeasure_Index = 0; //開始測量
*P_INT_Ctrl = *P_INT_Ctrl_New|0x0002; //打開16Hz中斷,在中斷里面啟動測量
while(uiExit_RQ)
{
if(uiIOB_20Hz_flag) //當該標識位非零時才進行下面的判斷
{
if(*P_TimerB_Data>=M_TIMER_DELAY) //計數器中數值表明已經過了余波干擾延時
{ //可以打開外部中斷,檢測回波信號
*P_INT_Clear = 0x0100; //開中斷前先清中斷
*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100;
uiEXT_EN_flag = 1;
uiIOB_20Hz_flag = 0; //清該標志位,由16Hz中斷啟動下一次測量
}
}
if(*P_TimerB_Data>900) //TimerB當中的Data超過900時,表示超過了1.5m
{//如果測量的距離超過限定的1.5m ,則結束一次檢測,固定置距離值為1.5m
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //關掉外部中斷
uiEXT_EN_flag = 0;
*P_TimerB_Ctrl = M_TIMERA_STOP; //同時計數器停止工作
//對測得的時間差進行初步處理.......
i = uiMeasure_Index;
j = 0;
Temp = 900;
while(i)
{
Temp2 = uiResult[j];
Temp = Temp2;
j++;
i--;
}//end.......
}
//一次測距結束(即完成四次測量),進入結果處理
if(uiMeasure_Index>4)
{
uiMeasure_Index=0;
uiMeasure_Result = ResultOS(); //處理測距結果
if(uiMeasure_Result<=M_LOW_DISTEN)
{//測量時出錯,進入錯誤管理
uiMeasure_Result = 0; //出錯時,結果為0
}
uiExit_RQ=0;
break;
}
*P_Watchdog_Clear = 0x0001;
}
return uiMeasure_Result; //返回數據,返回0時代表測量出錯。
}
//=============================================================
// 函數名稱: ResultOS()
// 功能描述: 對結果進行軟件處理 包括結果解算、軟件補償等。
// 語法格式: unsigned int ResultOS(void)
// 入口參數: 無
// 出口參數: 十進制的距離,以cm為單位
// 注意事項: 僅為用戶模型
//=============================================================
unsigned int ResultOS(void)
{
unsigned long int uliResult2;
unsigned int uiResult1;
unsigned int i;
if(uiResult[0]<=(M_TIMER_DELAY+M_TIMER_OFFSET))
{//測回數據當中,如果最大數小于規定的域值,此時的數據是錯的
return 0;
}
uiResult1 = (uiResult[1]+uiResult[2])/2-3; //取平均值
uliResult2 = (unsigned long int)uiResult1*M_MUT_DATA;//數據處理
uliResult2 = uliResult2/96;
uliResult2 = uliResult2/2;
//用戶可在止加入適當的軟件補償,以期得到更準確的距離值
// uliResult2 = uliResult2-3050;
uliResult2 = uliResult2/1000;
//..end
uiResult1 = (unsigned int)uliResult2;
for(i=0;i<4;i++)
{
uiResult[i]=0;
}
return uiResult1;
}
//=============================================================
// 函數名稱: void ErrorOS(void)
// 功能描述: 測量出錯管理(處理)
// 語法格式: void ErrorOS(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//=============================================================
void ErrorOS(void)
{
unsigned int i;
i=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -