大型貨車超載超速實時檢測系統
4.2.2軟件設計
軟件采用C語言程序,定時采用低頻定時器,用2Hz時基定時,定時周期為1s(定時時長0.5s),同時要用外部中斷2對OUT脈計數。使用一個標志(signal)顯示計時長度(第幾個0.5s)。當signal為1時,啟動外部中斷計數;當signal為3時,關閉外部中斷,同時關閉定時中斷,完成一次計數[30]。
(1)函數流程圖分析
測速度模塊主要由三個子函數組成:測速主函,定時中斷子函數,外部中斷子函數。
數測速函數是測速模塊的主體,是主函數直接調用的子函數,流程圖如圖4.3所示。
圖4.6 測速函數流程圖
定時子程序是用于給定準確的時間,以便能夠計算出精準的速度,定時使用2Hz低頻時基計時。定時中斷子函數流程圖如圖4.4所示。
圖4.7 定時中斷子函數流程圖
為了能夠及時的計下AH44E產生的每個負脈沖,必須采用外部中斷計數。外部中斷子函數流程圖如圖4.5所示。
圖4.8 外部中斷子函數流程圖
(2)部分程序代碼
unsigned int signal=0; //計時標志
unsigned int count=0; //計外部脈沖數
double speed(void)
{
unsigned int uiDelay=0xffff;
__asm(INT OFF); //關閉中斷
*P_INT_Ctrl=C_IRQ3_EXT2 | C_IRQ5_2Hz;
//設置中斷 IRQ3_EXT1、IRQ5_2Hz
__asm(INT IRQ); //開中斷
while(uiDelay--)
*P_Watchdog_Clear = C_WDTCLR; //延時等待
uiDelay=0xffff;
while(uiDelay--)
*P_Watchdog_Clear = C_WDTCLR; //延時等待
return (double)count/(signal-1)*2; //計算速度
}
//中斷服務子程序代碼如下:
void IRQ5(void)
{
if(*P_INT_Ctrl0x0004)
{
signal++;
if(signal==1)
{
count=0; //signal=1時計數開始
*P_IOB_Dir=0x00; //設IOB3為上拉電阻輸入
*P_IOB_Attrib=0x00;
*P_IOB_Data=0x08;
}
else if(signal==3)
//signal=3時計數結束
(*P_INT_Ctrl)=~(C_IRQ3_EXT2 | C_IRQ5_2Hz);
//關IRQ3_EXT1、IRQ5_2Hz中斷
*P_INT_Clear=C_IRQ5_2Hz; //清中斷標志位
}
else
{
*P_INT_Clear=0x0008; //清中斷標志位
}
}
void IRQ3(void)
{
if(*P_INT_CtrlC_IRQ3_EXT1) //外部中斷1
{
*P_INT_Clear=C_IRQ3_EXT1; //清中斷標志位
}
else if(*P_INT_CtrlC_IRQ3_EXT2) //外部中斷2
{
count++; //計數加1
*P_INT_Clear=C_IRQ3_EXT2; //清中斷標志位
}
}
圖4.9 GPRS程序流程圖
稱重傳感器相關文章:稱重傳感器原理 傾角傳感器相關文章:傾角傳感器原理
評論