📄 main.c
字号:
dif_pulse=pulse_cur_time-pulse_start_rec; //求出复位前1小时的脉冲数
index_stp_pls=index_pls_spdbuf; //将当前脉冲数组下标复制给停车数组下标
pulse_spd_buf[index_stp_pls]=dif_pulse; //存入脉冲数
Clr_WDog(); //清w-dog
//将速度缓冲区数据复制到总记录区
ptr_stp_min=ptr_minaero; //将当前数据指针复制给停车数据指针
for(j=0;j<65;j++)
{
j_temp=time_speed[j];
P11=0;
P10=0;
*ptr_stp_min=j_temp;
ptr_stp_min++;
P11=1;
P10=1;
Clr_WDog(); //清w-dog
}
P11=1;
P10=1;
flag_wr_empty=1; //未写过数据区标志置1
if(ptr_stp_min>=0X6B68)
{
flag_wr_full=1; //写满数据区标志置1
ptr_stp_min=0X1000; //写满360小时,指针清0
}
Clr_WDog(); //清w-dog
for(i=0;i<11;i++) //所有人的休息时长加上stop_time
{
all_drv_rec[i][10]+=stop_time;
if(all_drv_rec[i][10]>tcxxsj) all_drv_rec[i][10]=tcxxsj+10;
Clr_WDog(); //清w-dog
}
all_drv_rec[driver_cur][10]=0; //当前驾驶员的休息时长清0
stop_time=0; //将休息时长清0
for(i=0;i<5;i++) //记下当前驾驶员的停车时间
{ Clr_WDog(); //清w-dog
all_drv_rec[driver_cur][i+5]=temp_date[i];
}
Get_15mSpeed(number_15m); //将15分钟速度排序
Copy_20sdata(); //将20秒数据复制到临时数组
Get_20sdata(); //根据停车前20秒脉冲数算出相应速度,按照时间先后排列,并加上停车时间
//根据FL_OVERTIME是否为1,判断上一记录是否为超时记录
if(FL_OVERTIME) //超时
{
Save_Ovrec(); //将上一条记录的起始、结束时间和驾驶员存入超时记录区
num_ovrec=(num_ovrec+1)%21;
}
Clr_WDog(); //清w-dog
FL_RUN=0; //行驶标志置0
FL_BACKUPB=FL_BACKUPB&0XF7; //保存行驶标志
FL_OLDRUN=0; //把当前行驶标志保存
FL_BACKUPB=FL_BACKUPB&0XFB;
}
else
{
if(speed_15min[number_15m][0]!=OLD_HOUR||speed_15min[number_15m][1]!=OLD_MIN)
number_15m=(number_15m+1)%15; //将“0”作为当前分钟速度存放到15分钟速度数组
speed_15min[number_15m][0]=OLD_HOUR;
speed_15min[number_15m][1]=OLD_MIN;
speed_15min[number_15m][2]=0;
for(i=0;i<18;i++) //将当前驾驶证号码存放到15分钟速度数组
{
Clr_WDog(); //清w-dog
speed_15min[number_15m][i+3]=cur_id[i+7];
}
}
//计算停电时间长度
P11=1;
P10=1;
//取出当前日期和时间
OLD_YEAR=TNIAN; //16进制的当前“年”
OLD_MONTH=TYUE; //16进制的当前“月”
OLD_DAY=TRI; //16进制的当前“日”
OLD_HOUR=TSHI; //16进制的当前“时”
OLD_MIN=TFEN; //16进制的当前“分”
OLD_SEC=TMIAO; //16进制的当前“秒”
NEW_YEAR=OLD_YEAR/16*10+OLD_YEAR%16; //10进制的当前“年”
NEW_MONTH=OLD_MONTH/16*10+OLD_MONTH%16; //10进制的当前“月”
NEW_DAY=OLD_DAY/16*10+OLD_DAY%16; //10进制的当前“日”
NEW_HOUR=OLD_HOUR/16*10+OLD_HOUR%16; //10进制的当前“时”
NEW_MINUTE=OLD_MIN/16*10+OLD_MIN%16; //10进制的当前“分”
if((NEW_YEAR==YEAR)&&(NEW_MONTH==MONTH)&&(NEW_DAY==DAY)) //在同一天复位
{
if(NEW_HOUR==HOUR) //同1小时
{
//求出分钟数
minute_stop=NEW_MINUTE-MINUTE;
if(minute_stop>tcxxsj) minute_stop=tcxxsj+10; //超过tcxxsj
}
else if(NEW_HOUR==(HOUR+1)) //NEW_HOUR是HOUR的下1小时
{
minute_stop=NEW_MINUTE+60-MINUTE;
if(minute_stop>tcxxsj) minute_stop=tcxxsj+10; //超过tcxxsj
}
else minute_stop=tcxxsj+10; //超过tcxxsj
}
else
{
minute_stop=tcxxsj+10; //超过tcxxsj
Write_Curday(); //不在同一天,写入当前日期
}
P11=1;
P10=1;
if(OLD_HOUR!=time_speed[3]||OLD_DAY!=time_speed[2]||OLD_MONTH!=time_speed[1]||OLD_YEAR!=time_speed[0])
{ //复位不在同1小时内
if(flag_have_run) //停电前1小时内开过车
{
index_pls_spdbuf=(index_stp_pls+1)%360;
ptr_minaero=ptr_stp_min; //将停车数据指针复制给当前数据指针
addr_ptr_minaero=ptr_minaero;
}
Get_Pls_Cur();
pulse_start_rec=pulse_cur_time; //由于复位不在同一小时,求出pulse_start_rec
flag_have_run=0;
time_speed[0]=OLD_YEAR;
time_speed[1]=OLD_MONTH;
time_speed[2]=OLD_DAY;
time_speed[3]=OLD_HOUR;
time_speed[4]=0;
for(i=5;i<65;i++)
{
Clr_WDog(); //清w-dog
time_speed[i]=0;
}
}
//根据停电分钟数,补写15分钟速度数组
if(minute_stop>=15) //根据现在时间,从后向前补写
{
speed_15min[number_15m][0]=OLD_HOUR;
speed_15min[number_15m][1]=OLD_MIN;
speed_15min[number_15m][2]=0;
for(j=0;j<18;j++) //将当前驾驶证号码存放到15分钟速度数组
{
speed_15min[number_15m][j+3]=cur_id[j+7];
Clr_WDog(); //清w-dog
}
for(i=0;i<14;i++)
{
Clr_WDog(); //清w-dog
j_temp=speed_15min[number_15m][1];
k_temp=speed_15min[number_15m][0];
number_15m=(number_15m+14)%15;
if(j_temp==0) //“分”是0
{
if(k_temp==0) //“时”是0
speed_15min[number_15m][0]=0x23; //下1个“时”为0X23
else //“时”不是0
{
l_temp=k_temp/16*10+k_temp%16;
l_temp--;
k_temp=l_temp/10*16+l_temp%10;
speed_15min[number_15m][0]=k_temp;
}
speed_15min[number_15m][1]=0x59; //下1个“分”为0X59
}
else //“分”不是0
{
speed_15min[number_15m][0]=k_temp;
l_temp=j_temp/16*10+j_temp%16;
l_temp--;
j_temp=l_temp/10*16+l_temp%10;
speed_15min[number_15m][1]=j_temp;
}
speed_15min[number_15m][2]=0;
for(j=0;j<18;j++) //将当前驾驶证号码存放到15分钟速度数组
{
Clr_WDog(); //清w-dog
speed_15min[number_15m][j+3]=cur_id[j+7];
}
}
number_15m=(number_15m+14)%15; //指向最新数据
}
else //根据过去时间,从前向后补写
{
for(i=0;i<minute_stop;i++)
{
Clr_WDog(); //清w-dog
j_temp=speed_15min[number_15m][1];
k_temp=speed_15min[number_15m][0];
number_15m=(number_15m+1)%15;
if(j_temp==0x59)
{
if(k_temp==0x23) speed_15min[number_15m][0]=0;
else l_temp=k_temp/16*10+k_temp%16;
l_temp++;
k_temp=l_temp/10*16+l_temp%10;
speed_15min[number_15m][0]=k_temp;
speed_15min[number_15m][1]=0;
}
else
{
speed_15min[number_15m][0]=k_temp;
l_temp=j_temp/16*10+j_temp%16;
l_temp++;
j_temp=l_temp/10*16+l_temp%10;
speed_15min[number_15m][1]=j_temp;
}
speed_15min[number_15m][2]=0;
for(j=0;j<18;j++) //将当前驾驶证号码存放到15分钟速度数组
{
Clr_WDog(); //清w-dog
speed_15min[number_15m][j+3]=cur_id[j+7];
}
}
}
//将当前脉冲数赋给t1_pls_1sb和t1_pls_1mb
t1_pls_1sb=TH0_save;
t1_pls_1sb<<=8;
t1_pls_1sb+=TL0_save;
t1_pls_1mb=t1_pls_1sb;
FL_RUN=0; //行驶标志置0
FL_BACKUPB=FL_BACKUPB&0XF7; //保存行驶标志
FL_OLDRUN=0;
FL_BACKUPB=FL_BACKUPB&0XFB;
FL_OVERTIME=0;
FL_BACKUPA=FL_BACKUPA&0XBF;
stop_time+=minute_stop; //将停电分钟数加给休息时长
t1_1s=0;
Clr_WDog(); //清w-dog
}
P11=1;
P10=1;
ctr_beiguang=9; //背光灯计数器,初值为9,当该值为10时,背光灯灭
t1_start_add=0; //中断程序中,判断是否5秒内每秒都大于1个脉冲时用,清零
t1_end_add=0; //中断程序中,判断是否5秒内每秒都大于1个脉冲时用,清零
TH1=0;
TL1=0;
TMOD=0X65; //设置定时器0和1均为计数器,定时器0对从传感器传来的脉冲计数,
//定时器1的输入为时钟产生的2048HZ脉冲,计数值为256,从而每125毫秒产生一次中断。
TR1=1;
ET1=1;
TR0=1;
ET0=1; //ETO,定时器0中断允许位
PT1=1; //定时器1为高优先级
EA=1; //开中断
P11=1;
P10=1;
Clr_WDog(); //清w-dog
/*
FLAG_KGL0=0; //开关量0清0
FLAG_KGL1=0; //开关量1清0
FLAG_KGL2=0; //开关量2清0
FLAG_KGL3=0; //开关量3清0
FLAG_KGL4=0; //开关量4清0
FLAG_KGL5=0; //开关量5清0
*/
while(1)
{
//首先判断汽车是否行驶中
if(FL_RUN) //如果汽车行驶中
{
P11=1;
P10=1;
flag_have_run=1; //该小时的开车标志置1
//首先判断汽车状态是刚起动,还是一直在开
if(FL_OLDRUN==0) //汽车状态为刚起动
{
all_drv_rec[driver_cur][10]+=stop_time; //当前驾驶员的休息时长加上stop_time
if(all_drv_rec[driver_cur][10]>tcxxsj) //当前驾驶员休息超过停车休息时间
{
all_drv_rec[driver_cur][10]=tcxxsj+10;
Wr_Time(); //记下开车时间
for(i=0;i<5;i++)
all_drv_rec[driver_cur][i]=temp_date[i]; //记下该驾驶员的开车时间
all_drv_rec[driver_cur][11]=0; //该驾驶员的开车时长清0
all_drv_rec[driver_cur][12]=0;
FL_OVERTIME=0;
FL_BACKUPA=FL_BACKUPA&0XBF;
}
else //当前驾驶员休息未超过停车休息时间
{
//将当前驾驶员的开车时长加上休息时长
temp1_all=all_drv_rec[driver_cur][11];
temp1_all<<=8;
temp1_all+=all_drv_rec[driver_cur][12];
temp1_all+=all_drv_rec[driver_cur][10];
all_drv_rec[driver_cur][11]=temp1_all>>8;
all_drv_rec[driver_cur][12]=temp1_all;
if(temp1_all>pljssj) //利用开车时长判断是否超时,如果大于疲劳驾驶时间
{
FL_OVERTIME=1;
FL_BACKUPA=FL_BACKUPA|0X40;
}
else
{
FL_OVERTIME=0;
FL_BACKUPA=FL_BACKUPA&0XBF;
}
}
FL_OLDRUN=1; //最后将FL_OLDRUN赋1
FL_BACKUPB=FL_BACKUPB|0X04;
}
//idle(); //显示屏0
// GetKey(); //使背光键在开车时有效
if(FL_1M) //1分钟到
{
stop_time++; //stop_time自加1
if(stop_time>tcxxsj) stop_time=tcxxsj+10;
temp1_all=all_drv_rec[driver_cur][11];
temp1_all<<=8;
temp1_all+=all_drv_rec[driver_cur][12];
temp1_all++; //该驾驶员的开车时长加1
all_drv_rec[driver_cur][11]=temp1_all>>8;
all_drv_rec[driver_cur][12]=temp1_all;
if(temp1_all>pljssj) //利用开车时长判断是否超时,如果大于疲劳驾驶时间
{
FL_OVERTIME=1;
FL_BACKUPA=FL_BACKUPA|0X40;
}
else
{
FL_OVERTIME=0;
FL_BACKUPA=FL_BACKUPA&0XBF;
}
FL_1M=0; //最后将FL_1M清0
FL_BACKUPB=FL_BACKUPB&0XFE;
}
}
else
{
P11=1;
P10=1;
//首先判断车是一直停着,还是刚停
if(FL_OLDRUN==1) //读FL_OLDRUN,判断出车刚才是开着的
{
Wr_stp_3d(); //记下停车当天以及前两天的日期和停车时间
Get_Pls_Cur(); //求出当前脉冲
//计算最后1分钟速度(不满1分钟,按1分钟计)
temp1_all=pulse_cur_time-t1_pls_1mb; //得到最后1分钟内的脉冲数
/* 特征系数为CANSHU转/公里,每转有8个脉冲,则得到(8*CANSHU)脉冲/公里,现假设已测得1分钟内共计有C个脉冲,
则60C为每小时的脉冲数, (60C/(8*CANSHU))公里/小时即为该分钟内的速度。 */
temp_long=temp1_all;
temp_long*=60;
temp_long>>=3;
temp_long=temp_long+CANSHU/2; //为纠正为“4舍5入”,人为加上(CANSHU/2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -