⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 记录仪
💻 C
📖 第 1 页 / 共 4 页
字号:

    //先算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 + -