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

📄 main.c

📁 记录仪
💻 C
📖 第 1 页 / 共 4 页
字号:
         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分钟速度数组
             speed_15min[number_15m][i+3]=cur_id[i+7];


         dif_pulse=pulse_cur_time-pulse_start_rec; //求出该小时的脉冲数

         index_stp_pls=index_pls_spdbuf;        //将当前脉冲数组下标复制给停车数组下标
         pulse_spd_buf[index_stp_pls]=dif_pulse;//存入脉冲数

         //将速度缓冲区数据复制到总记录区
         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;
         }
         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
         }

         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;
         }
         stop_time=0;                                  //stop_time清0
         all_drv_rec[driver_cur][10]=0;                //当前驾驶员的休息时长清0

         for(i=0;i<5;i++)                              //记下当前驾驶员的停车时间
           all_drv_rec[driver_cur][i+5]=temp_date[i];  //temp_date[]已在停车时由中断程序用Wr_Time()函数写入

         Get_15mSpeed(number_15m);  //将15分钟速度按照时间先后排序

         Get_20sdata();             //根据停车前20秒脉冲数算出相应速度,按照时间先后排列,并加上停车时间

         //根据FL_OVERTIME是否为1,判断该记录是否为超时记录
         if(FL_OVERTIME==1)     //超时
         {
            Save_Ovrec();        //将上一条记录的起始、结束时间和驾驶员存入超时记录区
            num_ovrec=(num_ovrec+1)%21;
         }

         FL_OLDRUN=0;           //把当前行驶标志保存
         FL_BACKUPB=FL_BACKUPB&0XFB;
       }

     } //else
     scankey();                //扫描键盘

     P11=1;
     P10=1;
     Clr_WDog();       //清w-dog
  }

}
                                   //------------------------------------------------------------#################
                                   //------------------------------------------------------------#               #
                                   //------------------------------------------------------------#  中断服务程序 #
                                   //------------------------------------------------------------#               #
                                   //------------------------------------------------------------#################


void service_counter1(void) interrupt 3 using 1       //本中断使用using 1,每个中断使用不同的工作寄存器组,本中断为1
{
   bit T1_P11;      //中断程序保护页面地址用
   bit T1_P10;
   //bit FLAG_KGL;      //当前开关量

   ET1=0;          //关中断
   Clr_WDog();       //清w-dog

   T1_P11=P11;      //先保存页面 ,后面结束时恢复
   T1_P10=P10;

   P11=1;             //使页面为3
   P10=1;

   //每次中断必须处理1次
   OLD_YEAR=TNIAN;       //读时钟,并存放至指定地址
   OLD_MONTH=TYUE;
   OLD_DAY=TRI;
   OLD_HOUR=TSHI;
   OLD_MIN=TFEN;
   OLD_SEC=TMIAO;
   if(OLD_MIN!=TFEN)
   {
       OLD_YEAR=TNIAN;       //读时钟,并存放至指定地址
       OLD_MONTH=TYUE;
       OLD_DAY=TRI;
       OLD_HOUR=TSHI;
       OLD_MIN=TFEN;
       OLD_SEC=TMIAO;
   }
   Get_Time();           //将时间由BCD码转化为16进制
   //从计数器0读数
   t1_hp_cur=TH0;                             //读计数器0高位字节
   t1_lp_cur=TL0;                             //读计数器0低位字节
   t1_hp_cur2=TH0;                            //再读1次高字节
   if(t1_hp_cur2!=t1_hp_cur)                 //两次读的结果不相等,则再读1次
   {
      t1_hp_cur=TH0;                             //读计数器0高位字节
      t1_lp_cur=TL0;                             //读计数器0低位字节
   }
   TH0_save=t1_hp_cur;
   TL0_save=t1_lp_cur;

   //计算当前脉冲数
   t1_pls_cur=t1_hp_cur;               //当计数器的高字节
   t1_pls_cur<<=8;
   t1_pls_cur+=t1_lp_cur;              //加上计数器的低字节

   t1_long_temp=hi_counter;            //将脉冲量的高字节存入t1_long_temp
   t1_long_temp<<=16;                  //t1_long_temp左移2个字节
   t1_pls_cur+=t1_long_temp;           //再加上t1_long_temp左移2个字节,得到当前的脉冲数

   //循环存放26秒脉冲
   index_26s=(index_26s+1)%624;
   sec_cur_data[index_26s]=t1_hp_cur;
   index_26s++;
   sec_cur_data[index_26s]=t1_lp_cur;
   index_26s++;
   sec_cur_data[index_26s]=KAIGUANLIANG;

   sec_index=index_26s;

   t1_1s=(t1_1s+1)%8;         //计秒标志,加到8表示1秒

   t1_temp1=KAIGUANLIANG;  //读取开关量状态
   t1_temp1=t1_temp1&0X3F; //取低6位
   if(t1_temp1!=old_kgl)   //如果开关量状态发生变化
   {
       P11=0;
       P10=1;

       KGL[index_KGL][0]=OLD_YEAR;       //记下当时的年
       KGL[index_KGL][1]=OLD_MONTH;      //记下当时的月
       KGL[index_KGL][2]=OLD_DAY;        //记下当时的日
       KGL[index_KGL][3]=OLD_HOUR;       //记下当时的时
       KGL[index_KGL][4]=OLD_MIN;        //记下当时的分
       KGL[index_KGL][5]=OLD_SEC;        //记下当时的秒

       KGL[index_KGL][6]=t1_temp1;       //记下当时的状态
       index_KGL++;
       if(index_KGL>=4000)    index_KGL=0;

       P11=1;
       P10=1;
       old_kgl=t1_temp1;                 //将当前开关量状态保存
   }

   //每秒钟处理1次
   if(t1_1s==7)
   {
     Clr_WDog();       //清w-dog
     Clk_Init();             //每秒钟初始化时钟1次

     FL_RDSEC=1;           //允许读时间

     //计算该秒内的脉冲差,每秒大于1个且连续5秒,表示行驶
     t1_dif_pls_1s=t1_pls_cur-t1_pls_1sb;//得到1秒内的脉冲数
     t1_pls_1sb=t1_pls_cur;              //将当前脉冲数保存,留待下1秒钟用

     //计算5秒内的脉冲差
     t1_dif_pls_2s=t1_pls_cur-pulse_2s[index_pulse_2s];  //得到2秒内的脉冲数
     pulse_2s[index_pulse_2s]=t1_pls_cur;                //将当前脉冲数保存
     index_pulse_2s=(index_pulse_2s+1)%2;                //下标加1



     if(t1_dif_pls_1s>1)
     {
        t1_start_add++;              //如果该秒内的脉冲数大于1,t1_start_add自加1
        t1_end_add=0;                //t1_end_add清零
     }
     else
     {
        t1_end_add++;               //如果该秒内的脉冲数小于或等于于1,t1_end_add自加1
        t1_start_add=0;             //t1_start_add清零
     }
     if(t1_start_add>=5)            //连续5秒,每秒脉冲数都大于1
     {
        t1_start_add=4;              //t1_start_add=4,这样当下一秒的脉冲数大于1个时,t1_start_add=5

        if(!FL_RUN)
        {
           FL_RUN=1;                      //行驶标志置1
           FL_BACKUPB=FL_BACKUPB|0X08;    //保存行驶标志
        }
     }
     if(t1_end_add>=5)              //连续5秒,每秒脉冲数都小于或等于1
     {
         t1_end_add=4;                //t1_end_add=4,这样当下一秒的脉冲数小于或等于1个时,t1_end_add=5

         if(FL_RUN)
         {
            FL_RUN=0;                      //行驶标志置0
            FL_BACKUPB=FL_BACKUPB&0XF7;    //保存行驶标志
            Copy_20sdata();//如果车是刚停,将20秒数据复制到临时数组
            Wr_Time();                       //记下停车时间
         }
     }
   }


   if(t1_1s==6)
   {
     if((OLD_SEC==0x0)&&(OLD_MIN==0x0))    //1小时执行1次,当“秒”为0,且“分”也为0时
     {
         Clr_WDog();       //清w-dog
         if(flag_have_run==1)
         {
             for(t1_temp2=0;t1_temp2<65;t1_temp2++)         //将速度缓冲区速度值复制到总记录区
             {
                 t1_temp1=time_speed[t1_temp2];
                 P11=0;
                 P10=0;
                 *ptr_minaero=t1_temp1;
                 ptr_minaero++;

                 P11=1;
                 P10=1;
             }
             P11=1;
             P10=1;
             flag_wr_empty=1;     //未写过数据区标志置1
             if(ptr_minaero>=0X6B68)
             {
                 flag_wr_full=1;    //写满数据区标志置1
                 ptr_minaero=0X1000;     //写满数据区,指针清0
             }
             addr_ptr_minaero=ptr_minaero;

             pulse_end_rec=t1_pls_cur;            //将当前脉冲数作为已经过去的1小时的结束脉冲数
             dif_pulse=pulse_end_rec-pulse_start_rec; //求出已经过去的1小时内的脉冲数
             pulse_spd_buf[index_pls_spdbuf]=dif_pulse;//存入脉冲数
             index_pls_spdbuf=(index_pls_spdbuf+1)%360;

             flag_have_run=0;
         }

         //开始新的1小时记录
         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(t1_temp1=5;t1_temp1<65;t1_temp1++)
         {
           Clr_WDog();       //清w-dog
           time_speed[t1_temp1]=0;       //将速度值清0
         }
         pulse_start_rec=t1_pls_cur;          //将当前脉冲数作为正开始的1小时的起始脉冲数

     }

     if((OLD_SEC==0x02)&&(OLD_MIN==0x02)&&(OLD_HOUR==0x0))    //每天执行1次,当“秒”为2,“分”为2,且“时”为0
     {
         Clr_WDog();       //清w-dog
         Write_Curday();
     }

     if(OLD_SEC==0x59)   //每分钟执行1次,当秒为59时,计算该1分钟内的速度
     {
       Clr_WDog();       //清w-dog
       t1_dif_pls_1m=t1_pls_cur-t1_pls_1mb;  //得到1分钟内的脉冲数
       t1_pls_1mb=t1_pls_cur;                //将当前脉冲数保存,留待下1分钟用


       /* 特征系数为CANSHU转/公里,每转有8个脉冲,则得到(8*CANSHU)脉冲/公里,现假设已测得1分钟内共计有C个脉冲,
       则60C为每小时的脉冲数, (60C/(8*CANSHU))公里/小时即为该分钟内的速度。 */

       t1_long_temp=t1_dif_pls_1m;
       t1_long_temp*=60;
       t1_long_temp>>=3;
       t1_long_temp=t1_long_temp+CANSHU/2;            //为纠正成4舍5入,人为加上(CANSHU/2)
       speed_1min=t1_long_temp/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(t1_temp1=0;t1_temp1<18;t1_temp1++)                         //将当前驾驶证号码存放到15分钟速度数组
       {
           Clr_WDog();       //清w-dog
           speed_15min[number_15m][t1_temp1+3]=cur_id[t1_temp1+7];
       }
       if(FL_RUN)            //1分钟到,且汽车行驶中,1分钟标志置1
       {
           FL_1M=1;           //1分钟到
           FL_BACKUPB=FL_BACKUPB|0X01;
       }
       else
       {
           //给停车时间计数
           stop_time++;                      //stop_time自加1
           if(stop_time>tcxxsj)  stop_time=tcxxsj+10;
       }

     }
   }

   if(t1_1s==5)
   {
       if(OLD_SEC==0)   //每分钟执行1次,当秒为0时,判断是否超速
       {
           if (FL1_OVERSPEED)    ctr_chaosu=5;
           else    ctr_chaosu=0;
       }
       if(ctr_chaosu>0)
       {
           P15=1;    //超速蜂鸣器鸣叫
           ctr_chaosu--;
       }
       else    P15=0;    //超速蜂鸣器静音

       if(OLD_SEC==0x30)   //每分钟执行1次,当秒为30时,判断是否超时
       {
           if (FL_OVERTIME)    ctr_chaoshi=5;
           else    ctr_chaoshi=0;
       }
       if(ctr_chaoshi>0)
       {
           P16=1;    //超时蜂鸣器鸣叫
           ctr_chaoshi--;
       }
       else    P16=0;    //超时蜂鸣器静音

   }


   P11=T1_P11;     //恢复页面
   P10=T1_P10;
   ET1=1;
}


//计数器0溢出产生高字节的中断程序
void service_counter0(void) interrupt 1 using 2
{
   TH0=0;
   TL0=0;
   Clr_WDog();       //清w-dog
   hi_counter++;
   if(hi_counter==0) hi_pls_end++;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -