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

📄 main.c

📁 记录仪
💻 C
📖 第 1 页 / 共 4 页
字号:
            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 + -