?? userfunction.c
字號:
//=============================================================
// 文件名稱: UserFunction.c
// 實現功能: 用戶功能子程序程序
// 完成日期: 2004,7,21
//==============================================================
#define P_TimerB_Data (volatile unsigned int *)0x700C
#define P_TimerB_Ctrl (volatile unsigned int *)0x700D
#define P_TimeBase_Setup (volatile unsigned int *)0x700E
#define P_IOB_Data (volatile unsigned int *)0x7005
#define P_IOB_Buffer (volatile unsigned int *)0x7006
#define P_IOB_Dir (volatile unsigned int *)0x7007
#define P_IOB_Attrib (volatile unsigned int *)0x7008
#define P_INT_Ctrl (volatile unsigned int *)0x7010
#define P_INT_Clear (volatile unsigned int *)0x7011
#define P_INT_Ctrl_New (volatile unsigned int *)0x702d
#define P_Watchdog_Clear (volatile unsigned int *)0x7012
#define P_SystemClock (volatile unsigned int *)0x7013
#define M_TIMERA_EN 0x0001 //使能TimerA的配置,計數頻率為96KHz
#define M_TIMERA_STOP 0x0006 //停止TimerA的配置,計數器停止工作
unsigned int M_TIMER_DELAY=30; //為防止余波干擾而定義的延時
unsigned int M_LOW_DISTEN=7;
unsigned int M_TIMER_OFFSET=20;
unsigned int M_TIMER_SEND=10;
unsigned int M_MUT_DATA=32300;
unsigned int uiIOB_20Hz_flag; //IOB01口(即20Hz方波輸出口)的狀態標識
unsigned int uiEXT_EN_flag; //外部中斷使能標識位
unsigned int uiMeasure_Index; //當前測量的次數
unsigned int uiResult[4]; //保存測四次測量結果的緩存區
extern unsigned int F_Binary_BCD(unsigned int Binary);
//F_Binary_BCD為Data_OS_A.asm文件里提供
unsigned int ResultOS(void);
void ErrorOS(void);
void InitMeasureData(void);
unsigned int uiError_Counter; //出錯累加器
//=============================================================
// 函數名稱: InitMeasure()
// 功能描述: 系統IO口、中斷等進行初始化
// 語法格式: void InitMeasure(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 用戶可參考設置進行必要修改,以適應不同情況
//=============================================================
void InitMeasure(void)
{
unsigned int iTest; //設置的中間量
//設置IOB口 IOB04口為20Hz(也許用16Hz)的輸出,以控制模組發射40KHz方波
//IOB2 口為外部中斷的輸入,設置為帶上拉的輸入口。
*P_SystemClock = 0x000b;
*P_IOB_Dir = 0x0010;
*P_IOB_Attrib = 0x0010;
*P_IOB_Data = 0x0004;
//開時間基準中斷,TMB1 16Hz
*P_TimeBase_Setup=0x0001;
//設置TimerB 選使其處于停止工作狀態
*P_TimerB_Data = 0x0000;
*P_TimerB_Ctrl = M_TIMERA_STOP;
*P_INT_Ctrl = 0x0008; //開IRQ5的2Hz中斷,用來清狗
__asm("FIQ OFF");
__asm("IRQ ON");
InitMeasureData();
}
//=============================================================
// 函數名稱: InitMeasureData()
// 功能描述: 部分全局數據的初始化
// 語法格式: void InitMeasureData(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//=============================================================
void InitMeasureData(void)
{
uiIOB_20Hz_flag = 0; //初始化為零
uiEXT_EN_flag = 0;
uiMeasure_Index = 0;
}
//=============================================================
// 函數名稱: BeginMeasure()
// 功能描述: 進行一次測距 包括數據處理
// 每次測距都要進行四次測量,而且都是通過后臺
// 的16Hz中斷啟動這四次測量
// 語法格式: unsigend int BeginMeasure(void)
// 入口參數: 無
// 出口參數: 無
// 注意事項: 僅為用戶模型
//=============================================================
//延時程序
//
void User_Delay(unsigned int iTimers)
{
unsigned int i;
for(i=0;i<iTimers;i++)
{
__asm("nop");
}
}
void US_Send200us(void)
{
*P_TimerB_Data = 0x0000; //TimerA計數器清零
*P_IOB_Data=0x0014;
*P_TimerB_Ctrl = M_TIMERA_EN; //使能TimerA
User_Delay(M_TIMER_SEND); //延時,發送完十一個以上的完整的40KHz方波脈沖
*P_IOB_Data=0x0004; //停止發送
uiIOB_20Hz_flag = 1; //置位標識位
}
unsigned int BeginMeasure(void)
{
unsigned int uiExit_RQ; //退出循環標識
unsigned int uiMeasure_Result; //測量結果
unsigned int i;
*P_SystemClock = 0x000b; //設置SystemCkock,以保證軟件延時的準確...Edit by xinqiang 20050806
uiExit_RQ = 1;
uiMeasure_Index = 0; //開始測量
*P_INT_Ctrl = 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(uiMeasure_Index>4)
{
uiMeasure_Index=0;
uiMeasure_Result = ResultOS(); //處理測距結果
if(uiMeasure_Result<=M_LOW_DISTEN)
{//測量時出錯,進入錯誤管理
uiMeasure_Result = 0; //出錯時,結果為0
}
// else
// {
// Speech_Result(uiMeasure_Result);
// uiError_Counter = 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;
}
else
{
for(i=0;i<3;i++)
{
if((uiResult[i]-uiResult[i+1])>=30)
{
uiResult[i+1] = uiResult[i];
}
}
}
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;
Speech_Resource(12);
/* for(i=0;i<3;i++)
{
LCD_Draw(1);
User_Delay(20000);
LCD_Draw(0);
User_Delay(20000);
}
uiError_Counter++;
if(uiError_Counter>3) uiError_Counter = 3;
switch(uiError_Counter)
{
case 1: Speech_Resource(14);break;
case 2: Speech_Resource(15);break;
case 3: Speech_Resource(16);break;
default: break;
}*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -