📄 main.c
字号:
//先算2天里程
/* 特征系数为CANSHU转/公里,每转有8个脉冲,则得到(8*CANSHU)脉冲/公里,现假设2天共有D个脉冲,
为使里程数精确到小数点后面1位,将脉冲数乘以10,((D*10)/(8*CANSHU))公里即为2天的里程的10倍 */
temp_long=pulse_anydate*10;
temp_long>>=3;
LICHEN_2DAY=temp_long/CANSHU;
lichen_2d[0]=LICHEN_2DAY/100000*16+(LICHEN_2DAY%100000)/10000;
LICHEN_2DAY=LICHEN_2DAY%10000;
lichen_2d[1]=LICHEN_2DAY/1000*16+(LICHEN_2DAY%1000)/100;
LICHEN_2DAY=LICHEN_2DAY%100;
lichen_2d[2]=LICHEN_2DAY/10*16+LICHEN_2DAY%10;
Clr_WDog(); //清w-dog
//再算360里程
for(k=48;k<360;k++)
{
pulse_anydate+=pulse_spd_buf[i];
i=(i+359)%360;
Clr_WDog(); //清w-dog
}
temp_long=pulse_anydate*10;
temp_long>>=3;
LICHEN_360=temp_long/CANSHU;
LICHEN_ALL=LICHEN_360; //将360里程复制给累计里程,如行驶超过360小时,则再重新计算累计里程
Clr_WDog(); //清w-dog
lichen_360h[0]=LICHEN_360/100000*16+(LICHEN_360%100000)/10000;
LICHEN_360=LICHEN_360%10000;
lichen_360h[1]=LICHEN_360/1000*16+(LICHEN_360%1000)/100;
LICHEN_360=LICHEN_360%100;
lichen_360h[2]=LICHEN_360/10*16+LICHEN_360%10;
Clr_WDog(); //清w-dog
//如果写满数据区标志为1,即累计行驶时间已超过360小时,则重新计算累计里程,否则累计里程等于360里程
if(flag_wr_full)
{
Get_Pls_Cur(); //求出当前脉冲
/* 特征系数为CANSHU转/公里,每转有8个脉冲,则得到(8*CANSHU)脉冲/公里,现假设累计脉冲为D个脉冲,
为使里程数精确到小数点后面1位,将脉冲数乘以10,((D*10)/(8*CANSHU))公里即为所求的里程的10倍;
累计脉冲共5个字节,最高字节为:hi_pls_end,低4个字节为:pulse_end_rec */
pulse_anydate=pulse_cur_time;
if(hi_pls_end==0&&pulse_anydate<0x19999999) //如果累计脉冲数不太大
{
pulse_anydate*=10;
pulse_anydate>>=3;
LICHEN_ALL=pulse_anydate/CANSHU;
}
else //如果累计脉冲数比较大
{
/* 累计里程数:LICHEN_ALL
=[(hi_pls_end*0XFFFFFFFF+pulse_anydate)*10/8]/CANSHU
=hi_pls_end*{[(0XFFFFFFFF/8)/CANSHU]*10}+[(pulse_anydate/CANSHU)*10]/8 */
//先算加号左边
temp_long=0X1FFFFFFF/CANSHU; //(0XFFFFFFFF/8)=0X1FFFFFFF
temp_long*=10; //此时 temp_long={[(0XFFFFFFFF/8)/CANSHU]*10}
temp_long*=hi_pls_end;
LICHEN_ALL=temp_long;
Clr_WDog(); //清w-dog
//再算加号右边
temp_long=pulse_anydate/CANSHU;
temp_long*=10;
temp_long>>=3;
LICHEN_ALL+=temp_long;
}
}
}
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
//||||| |||||//
//||||| 主 函 数 |||||//
//||||| |||||//
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
main()
{
uchar i;
uchar j;
WDTRST=0X1E; //开WATCHDOG
WDTRST=0XE1;
P11=1;
P10=1;
//P13=0;// DELETE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
Initiate(); //----初始化
Clr_WDog(); //清w-dog
SelfTest(); //----自检
Clr_WDog(); //清w-dog
Displaycheck(); //根据各个标志的值,显示出提示信息该函数,如果自检出错,就执行——whie(1);
//Clr_WDog(); //清w-dog
/*
P11=0;P10=0;
while(1)
{
i=0;} */
//首先根据FLAG_INIT的值,判断是复位或第一次启动
if(FLAG_INIT!=0XA5) //FLAG_INIT!=0XA5,表示是第一次启动
{
P11=1;
P10=1;
//为T0中断程序需要的变量赋初值
hi_counter=0; //计数器高字节赋0值
hi_pls_end=0; //累计脉冲数的最高字节,初值为0
//为T1中断程序需要的变量赋初值
P11=0;
P10=0;
for(ptr_minaero=0;ptr_minaero<0x8000;ptr_minaero++)
{
Clr_WDog(); //清w-dog
*ptr_minaero=0; //将0页的所有字节清0
}
P11=1;
P10=1;
//开关量数组清0
P11=0;
P10=1;
index_KGL=0;
for(temp1_all=0;temp1_all<4000;temp1_all++)
{
Clr_WDog(); //清w-dog
for(j=0;j<7;j++) KGL[temp1_all][j]=0; //开关量的记录清0
}
P11=1;
P10=1;
old_kgl=0; //开关量初值为0
OLD_YEAR=TNIAN;
OLD_MONTH=TYUE;
OLD_DAY=TRI;
OLD_HOUR=TSHI;
OLD_MIN=TFEN;
OLD_SEC=TMIAO;
P11=1;
P10=1;
TL0=0; //TL0和TL1的初值为0
TH0=0;
TL0_save=0;
TH0_save=0;
t1_1s=0; //中断服务程序中使用,125毫秒自加1,加到8,即为1秒
flag_wr_full=0; //写满数据区标志
flag_wr_empty=0; //未写过数据区标志
index_26s=623; //26秒数据下标,加1即为0
sec_index=623; //26秒数据下标的备份
pulse_start_rec=0; //计算1小时内的脉冲数时用,该小时的起始脉冲数,初值为0
t1_pls_1sb=0; //1秒钟前的脉冲数,初值为0
t1_pls_1mb=0; //1分钟前的脉冲数,初值为0
ptr_minaero=0X1000; //总记录区的当前指针,初值为0X1000
addr_ptr_minaero=0X1000; //备份当前指针,初值为0X1000
for(i=0;i<26;i++) //26秒数据区清0
for(j=0;j<24;j++)
{
Clr_WDog(); //清w-dog
sec_cur_data[i*24+j]=0;
}
for(i=0;i<2;i++) //3天数组的第0,1行年清零
day_three[i][0]=0;
day_three[2][0]=OLD_YEAR; //第1次运行,在数组的第2行写下当天的日期
day_three[2][1]=OLD_MONTH;
day_three[2][2]=OLD_DAY;
index_threeday=2; //3天日历天数组的行下标,初值为2
//为标志位赋初值
FL_RUN=0; //行驶状态标志,初值为0
FL_OLDRUN=0; //行驶上一状态标志,初值为0
FL_1M=0; //满1分钟的标志,=1表示满,=0表示未满,初值为0
FL_RDSEC=0; //允许读时间的标志,初值为0
FLAG_LEGAL=0; //非法驾驶标志,=0表示非法,FL_BACKUPA的4位
FL_BACKUPA=0X80; //对标志位备份置: 10000000
FL_BACKUPB=0XE0; //对标志位备份置: 11100000
//为数组及其下标赋初值
for(i=0;i<10;i++)
{
Clr_WDog(); //清w-dog
for(j=0;j<18;j++) num_10[i][j]=0; //疑点数据对应的驾驶证号码数组
}
for(temp1_all=0;temp1_all<300;temp1_all++)
{
Clr_WDog(); //清w-dog
for(j=0;j<28;j++) drvr_drv_time[temp1_all][j]=0; //流水记录所有驾驶员的驾驶情况
}
index_drv_time=0;
for(i=0;i<18;i++)
drvr_drv_time[0][i]=0X30; //第1次,非法驾驶,存入0X30
drvr_drv_time[0][18]=OLD_YEAR;
drvr_drv_time[0][19]=OLD_MONTH;
drvr_drv_time[0][20]=OLD_DAY;
drvr_drv_time[0][21]=OLD_HOUR;
drvr_drv_time[0][22]=0;
for(temp1_all=0;temp1_all<360;temp1_all++) //脉冲数组,计算里程用,清0
{
Clr_WDog(); //清w-dog
pulse_spd_buf[temp1_all]=0;
}
index_pls_spdbuf=0; //脉冲数组的下标
index_stp_pls=0; //停车时脉冲数组的下标
for(i=0;i<2;i++) pulse_2s[i]=0; //2秒脉冲数组清0
index_pulse_2s=0;
for(j_temp=0;j_temp<10;j_temp++) //20秒数据清0
for(temp1_all=0;temp1_all<326;temp1_all++)
{
Clr_WDog(); //清w-dog
sec_data[j_temp][temp1_all]=0;
}
for(i=0;i<15;i++) //15分钟数据,每分钟数据的驾驶证号码的第1位赋“0XFF”
{
Clr_WDog(); //清w-dog
speed_15min[i][3]=0XFF;
new_speed_15min[i][3]=0XFF;
}
for(i=0;i<21;i++)
{ //超时记录,每条记录的结束时间的“年”赋“0XFE”
overtime_rec[i][23]=0XFE;
Clr_WDog(); //清w-dog
}
num_ovrec=0; //超时记录的列下标,初值为0
for(i=0;i<11;i++) //10个驾驶员的行驶情况,清0
for(j=0;j<13;j++)
{
Clr_WDog(); //清w-dog
all_drv_rec[i][j]=0;
all_drv_rec[i][j]=0;
}
for(i=0;i<7;i++) //将当前驾驶员代码赋0值
cur_id[i]=0;
for(i=7;i<25;i++) //将当前驾驶证号码赋0x30
{
Clr_WDog(); //清w-dog
cur_id[i]=0x30;
}
for(j=0;j<10;j++) //id1[],存放10个合法+1个非法驾驶员的代码和驾驶证号码
for(i=0;i<7;i++) //将合法驾驶员的代码赋0XFF
{
id1[j][i]=0xFF;
Clr_WDog(); //清w-dog
}
for(i=0;i<7;i++) //非法驾驶员的代码赋0
id1[10][i]=0;
for(i=7;i<25;i++) //非法驾驶员的驾驶证号码赋0x30
{
Clr_WDog(); //清w-dog
id1[10][i]=0x30;
}
index_id1=0; //行下标为0
driver_cur=10; //当前驾驶员是第几位,初值为10,非法
for(i=0;i<10;i++)
for(j=0;j<5;j++)
{
Clr_WDog(); //清w-dog
down_time[i][j]=0; //与上位机的通信时间,清0
}
index_dw_tm=9; //与上位机通信时间数组下标,初值为9
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++) //速度缓冲区,清0
{
Clr_WDog(); //清w-dog
time_speed[i]=0;
}
for(i=0;i<41;i++)
{
Clr_WDog(); //清w-dog
vin[i]=0x30; //VIN赋0x30
}
tzxs[0]=0X0; tzxs[1]=0X2;tzxs[2]=0X70; //特征系数数组赋初值:0x000270
CANSHU=624; //特征系数赋初值:624转/公里
flag_have_run=0; //某小时内开过车的标志,初值为0
ptr_stp_min=0X1000; //初值为0X1000
stop_time=30; //驾驶员的休息时间,初值为30
sec_hang=9; //20秒数据区的2维数组的行下标,初值为9,这样加1就为0
number_15m=14; //排序前的15分钟速度数组下标,初值为14,这样加1就为0
stop_3day[6]=0XFF; //停车时间的当天的“年”赋0XFF,显示、打印程序根据该值判断是否执行相应程序
MAXSPEED=120; //超速门限,赋初值120km/h
pljssj=180; //疲劳驾驶时间
tcxxsj=20; //停车休息时间
FLAG_INIT=0XA5; //赋初值完毕,在FLAG_INIT写入0XA5
P11=1;
P10=1;
Clr_WDog(); //清w-dog
}
else //复位
{
P11=1;
P10=1;
//恢复TH0和TL0
TH0=TH0_save;
TL0=TL0_save;
index_26s=sec_index; //恢复26秒数据下标
ptr_minaero=addr_ptr_minaero; //恢复指针
P11=1;
P10=1;
//根据FL_BACKUPA和FL_BACKUPB的值恢复各标志位的值
if(FL_BACKUPA&0x40) FL_OVERTIME=1;
else FL_OVERTIME=0;
if(FL_BACKUPA&0x10) FLAG_LEGAL=1;
else FLAG_LEGAL=0;
if(FL_BACKUPB&0x08) FL_RUN=1;
else FL_RUN=0;
if(FL_BACKUPB&0x04) FL_OLDRUN=1;
else FL_OLDRUN=0;
if(FL_RUN||(FL_RUN==0&&FL_OLDRUN==1))
{
Wr_Time(); //记下停车时间(年月日时分)
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))公里/小时即为该分钟内的速度。 */
Clr_WDog(); //清w-dog
temp_long=temp1_all;
temp_long*=60;
temp_long>>=3;
temp_long=temp_long+CANSHU/2; //为纠正成4舍5入,人为加上(CANSHU/2)
speed_1min=temp_long/CANSHU;
time_speed[MINUTE+5]=speed_1min; //在速度缓冲区的后60个字节写入速度值
if(speed_15min[number_15m][0]!=OLD_HOUR||speed_15min[number_15m][1]!=OLD_MIN)
number_15m=(number_15m+1)%15; //将当前分钟速度存放到15分钟速度数组
speed_15min[number_15m][0]=OLD_HOUR;
speed_15min[number_15m][1]=OLD_MIN;
speed_15min[number_15m][2]=speed_1min;
for(i=0;i<18;i++) //将当前驾驶证号码存放到15分钟速度数组
{
Clr_WDog(); //清w-dog
speed_15min[number_15m][i+3]=cur_id[i+7];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -