大型货车超载超速实时检测系统
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程序流程图
称重传感器相关文章:称重传感器原理 倾角传感器相关文章:倾角传感器原理
评论