測重模塊有硬件和軟件部分,硬件部分負責采集車體重量數(shù)據(jù)和車體傾角數(shù)據(jù),軟件部分負責對數(shù)據(jù)進行預處理和處理,硬件部分這里不多介紹,主要說軟件部分,對預處理數(shù)據(jù)的處理流程如下:
圖1 數(shù)據(jù)處理流程
(1)預處理程序:
asm("INT OFF"); //A0口發(fā)送脈沖,A1口接收DOUT的數(shù)據(jù),A2是轉(zhuǎn)換完成標志位
*P_IOA_Dir=0x0001;
*P_IOA_Attrib=0x0001;
*P_IOA_Data=0x0002;
*P_INT_Ctrl=C_IRQ1_TMA;
*P_TimerA_Ctrl=C_SourceA_Fosc256+C_SourceB_1;
*P_TimerA_Data=0xFFFB; //
//Ltmp=*P_IOA_Data&0x0002;
while(*P_IOA_Data&0x0002);
delay();
asm("INT IRQ");
while(1)
{
*P_Watchdog_Clear = C_WDTCLR;
if(*P_IOA_Data&0x0004)//A2為輸出數(shù)據(jù)完成標志位
{
asm("INT OFF");// IRQ_OFF();
dout=*P_IOA_Data>>4;//取A口高12位的數(shù)據(jù)
*P_IOA_Data=0x0002;//DOUT重新置數(shù)
while(*P_IOA_Data&0x0002);//等待DOUT高電平變?yōu)榈碗娖?/P>
delay();//延遲函數(shù)
asm("INT IRQ");
}
}
}
void IRQ1(void)
{
if(k<=48)
{k++;
if(!(*P_IOA_Data&0x0002)) Ltmp++;
}
if(*P_IOA_Data&0x0001)//下降沿取DOUT
{
*P_IOB_Data=*P_IOB_Data+1;//記錄產(chǎn)生一個脈沖
if((*P_IOB_Data<=12))//下降沿取DOUT
{
tmp=*P_IOA_Data&0xFFF0;//取A口的高12位
tmp=tmp<<1;
//如果DOUT為高電平則加1
if(*P_IOA_Data&0x0002)
tmp=tmp+0x0010;
*P_IOA_Data=(*P_IOA_Data&0x000f)+tmp;
}
if(*P_IOB_Data==25)
{
*P_IOA_Data=*P_IOA_Data|0x0004; //置標志位A2口
*P_IOB_Data=0x0000;
}
}
c_flag^= 0xFFFF; //電平標志寄存器取反
*P_IOA_Data=(c_flag&0x0001)|(*P_IOA_Data&0xFFF6);
*P_INT_Clear=C_IRQ1_TMA;
}
(2)主程序相關(guān)程序流程圖
停止后超載處理流程圖如圖2:
相關(guān)說明:
標志K
K= -1 靜止且不超載 K=0 初次靜止超載
K=1 運動超載 K=2 停車后超載
countR 取數(shù)據(jù)次數(shù)
countW, 超載次數(shù)
v 車速度
m 車載重量
tR 車啟動時間
tS 停車時間 圖2 超載處理流程圖
運動前超載處理程序圖如圖3:
運動中超載處理流程圖如圖.4:
相關(guān)說明:
標志K
K= -1 靜止且不超載 K=0 初次靜止超載
K=1 運動超載 K=2 停車后超載
countR取數(shù)據(jù)次數(shù)
countW, 超載次數(shù)
v 車速度
m 車載重量
tR 車啟動時間
tS 停車時間
圖3 運動前超載處理程序圖 圖4 運動中超載處理流程圖
小車運動前超載處理程序如下:
Void BeforeTheStateDidNotExercise(float* parameter,float weight,int *countR,int *countW)
{ (*countR)++;
if(*countR>=17)
*countR=0;
if(weight>M)
{
(*countW)++;
if(*countW>=12)
{
*parameter=0;
*countW=0;
printf("報警函數(shù) ");
}
}
}
運動前超載處理程序:
void campaignStatus(float* parameter,float weight,int *countR,int *countW,clock_t *start)
{
if(* parameter!=1)
(*countR)++;
//記錄當前時間
momentNow();
*start=clock();
printf(" 記錄當前時間t1");
if(weight>M)
(*countW)++;
if(*countR>=100)
{
if( *countW>=70)
{
printf("報警程序 ");
* parameter=1;
}
*countR=0;
*countW=0;
}
}
運動中超載處理:
void afterStoppingState(float* parameter,float weight,int *countR,int *countW,clock_t *finish)
{
(*countR)++;
//記錄當前時間t2
*finish=clock();
if(weight>M)
(*countW)++;
if(*countR>=100)
{
if(*countW<30)
{*parameter=-1;
printf("發(fā)送相關(guān)信息到主機");
}
*countR=0;
*countW=0;
}
}
//根據(jù)速度和參數(shù)K和parameter確定車體狀態(tài)
void carStatus(float speed,float* parameter,float weight,int *countR,int *countW)
{
//超載持續(xù)時間
clock_t start, finish;
double duration;
if(speed==0)
{
if(*parameter<=0)
BeforeTheStateDidNotExercise(parameter,weight,countR,countW);
else afterStoppingState(parameter,weight,countR,countW,clock_t &finish);
}
else campaignStatus(parameter,weight,countR,countW,clock_t &start);
//超重持續(xù)時間
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
}
//獲取當前時間
int momentNow(void)
{
time_t t;
t=time(0);
local=localtime(&t);
printf(" %d-%d-%d\n%d:%d:%d\n",local->tm_year+1900,local->tm_mon,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
return 0;
} |