下面demo是用两个按键来模拟车辆经过车检器的信号和传感器采集到新数据的信号。
K1按键是用了模拟车检器的信号
K2按键用来模拟接收到传感器新数据的信号
#include "bsp.h"
#include <stdio.h>
#include <stdint.h>
#include <time.h>
/*
*********************************************************************************************************
* 函 数 名: main
* 功能说明: c程序入口
* 形 参: 无
* 返 回 值: 错误代码(无需处理)
*********************************************************************************************************
*/
int main(void)
{
uint8_t ucKeyCode;
bsp_Init(); /* 硬件初始化 */
bsp_StartAutoTimer(1, 1); /* 启动1个1ms的自动重装的定时器 */
uint64_t count; /* 系统启动后经过的毫秒数 */
uint64_t k1PressTime = 0; /* 车辆经过车检器时经过的毫秒数 */
uint64_t k1ReleaseTime =0; /* 车辆压到传感器时经过的毫秒数 */
/* 主程序大循环 */
while (1)
{
/* CPU空闲时执行的函数,在 bsp.c */
bsp_Idle();
if (bsp_CheckTimer(1)) //之前使用系统时钟click() 一直返回-1,所以在这里做一个1ms的定时器。
{
count++;
}
/* 处理按键事件 */
ucKeyCode = bsp_GetKey(); /*从按键FIFO缓冲区读取一个键值。*/
if (ucKeyCode > 0)
{
/* 有键按下 */
switch (ucKeyCode)
{
case KEY_DOWN_K1: /* 按键K1键按下 */ /* 这里也是一个电平信号,可以当做车检器的信号*/
k1PressTime = count; /* 记录车辆压到传感器时经过的毫秒数 */
printf("经过车检器\r\n");
break;
case KEY_DOWN_K2: /* 按键K2键按下 */ /*这里可以当做检测到车辆压到传感器时产生新数据的信号*/
if(!k1PressTime)
{
printf("未通过车检器\r\n");
break;
}
k1ReleaseTime = count; /* 记录传感器时产生新数据时经过的毫秒数(按下K2键的电平信号) */
uint64_t timeBetweenPresses = k1ReleaseTime - k1PressTime;
printf("时间间隔为:%d 毫秒\r\n", timeBetweenPresses);
double secondsBetweenPresses = (double)timeBetweenPresses / 1000.0;
double s = 0.0028 / (secondsBetweenPresses / 3600.0);
printf("车辆速度为:%lf Km/h\r\n", s);
k1PressTime = 0;
break;
default:
break;
}
}
}
}