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

📄 transflow.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
字号:
#include <reg51.h>
#include <absacc.h>
sbit   WatchDog = P1^3;       //看门狗
extern  unsigned char xdata send_liul[32],send_occ[32];
extern  unsigned int xdata  loop_ratio[32];
unsigned char xdata T;
unsigned char xdata fl,fh;
unsigned char xdata last_recetimeid,record_day;
unsigned char xdata steptime[16];
extern unsigned int xdata data_address;
extern unsigned int xdata address;
extern unsigned int xdata tr_flagaddr;
extern unsigned char xdata now_day_planid;
extern unsigned char xdata period_sch[41];
extern unsigned char xdata now_step_schid;
extern unsigned char xdata timeid;
extern unsigned int xdata savecount;
extern unsigned char xdata sch_step[16];
extern unsigned char xdata selcal_flag;
unsigned char xdata per[24][70];
extern unsigned char xdata per_count;
trans_volum()     //流量和占有率发送程序,在周期结束时,发送到FPGA板
{
  unsigned char i;
  savecount++;
  while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
  XBYTE[0xa023]=0x01;                              //CPU修改头尾
  XBYTE[0xa024]=0X00;

  data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
  data_address=(data_address&0x7ff);

  address=data_address;
  data_address=data_address+70;            //应答数据长度70字节
  if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  data_address--;
  XBYTE[0XA021]=data_address>>8;          //
  XBYTE[0XA022]=data_address;
  XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
  XBYTE[0XA024]=0X00;
  for(i=0;i<6;i++){
           tr_flagaddr=0XA030+5*i;
           if(XBYTE[tr_flagaddr]==0x87)break;
                      }
  if(i==6)return 1;

  XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
  XBYTE[tr_flagaddr+2]=address;
  XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
  XBYTE[tr_flagaddr+4]=data_address;

  address=address+0xa000;                 //发送应答数据
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=0XFD;                    //发送标识
//  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC008];           //发送月
//  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC007];           //日
//  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC004];           //时
//  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC002];           //分
//  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC000];           //秒
//  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
  address++;
  if(address>0xa7f0)address=0xa080;
  for(i=0;i<32;i++){
      XBYTE[address]=send_liul[i];  //发送流量
  //    SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
      address++;
      if(address>0xa7f0)address=0xa080;
      send_occ[i]=(loop_ratio[i]*10/1000)/T;
      XBYTE[address]=send_occ[i];   //发送占有率
    //  SBUF=XBYTE[address];while(!TI);TI=0;      /////////////////////////////////////////
      address++;
      if(address>0xa7f0)address=0xa080;
                     }
  XBYTE[tr_flagaddr]=0x01;
  for(i=0;i<32;i++){
     send_liul[i]=0;
     send_occ[i]=0;
     loop_ratio[i]=0;
                   }
// SBUF=0XFF;
// while(!TI);TI=0;
   for(i=0;i<32;i++){
     send_liul[i]=0;
     send_occ[i]=0;
     loop_ratio[i]=0;
                   }
}

void self_learn() using 1
{
  unsigned char i,j,k;
  unsigned char good;
  unsigned int  addr;

  for(i=0;i<16;i++){ //本周期结束的时候  
      good=period_sch[9+i];
      for(j=0;j<70;j++){
          if((j==good)&&(j!=0))per[i][j]++;
                        }
                    }

  //时段切换后计算学习结果

  if(last_recetimeid!=timeid){
       for(i=0;i<16;i++){ //对上次能学习结果清0
           steptime[i]=0;
                         }
       for(i=0;i<16;i++){
           good=0;
           for(j=0;j<70;j++){
              if(good<=per[i][j])good=per[i][j];
                             }
              k=0;
              do{
                k++;
                 }while(per[i][k-1]!=good);
              k--;
              steptime[i]=k;
                       }
       addr=(last_recetimeid-1)*16;
       record_day=XBYTE[0XC006];
       if(record_day>7)record_day=3;
       addr=addr+(record_day-1)*384;
       addr=addr+0x3f00;
       for(i=0;i<16;i++){//写到0X3F00开始的地址
          XBYTE[addr+i]=steptime[i];
                         }
       for(i=0;i<41;i++){// 清空自学习缓冲区
                 period_sch[i]=0;
                              }
       for(i=0;i<32;i++){    //mei
  	   	  for(j=0;j<70;j++){
  	   	  	  per[i][j]=0;
  	   	  	     	}
  	   	  }
       }
  last_recetimeid=period_sch[3];




}
void tran_psh() //每周期发送一次方案
{
  selcal_flag=0;
//  unsigned char i;
//  period_sch[0]=0x20;              //当前方案号 方案32作为备用降级方案
  period_sch[0]=now_day_planid;    //当前日计划号
  period_sch[1]=now_step_schid;    //当前的阶段表号
  period_sch[3]=timeid;            //当前的时段号
  period_sch[6]=XBYTE[0XC006];     //当前星期号
  self_learn();

/*

  while((XBYTE[0xa023]==0)&&(XBYTE[0xa024]==1)){};    //等待FGPA修改头尾
  XBYTE[0xa023]=0x01;                              //CPU修改头尾
  XBYTE[0xa024]=0X00;
  data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
  address=data_address;
  data_address=data_address+43;            //应答数据长度+1字节
  if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  data_address--;
  XBYTE[0XA021]=data_address>>8;          //
  XBYTE[0XA022]=data_address;
  XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
  XBYTE[0XA024]=0X00;

  for(i=0;i<6;i++){
           tr_flagaddr=0XA030+5*i;
           if(XBYTE[tr_flagaddr]==0x87)break;
                      }
  //if(i==6)return 1;
  XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
  XBYTE[tr_flagaddr+2]=address;
  XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
  XBYTE[tr_flagaddr+4]=data_address;
  address=address+0xa000;                 //发送应答数据
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=0Xc6;                    //采用应答方式发送当前方案给FPGA
  address++;
  if(address>0xa7f0)address=0xa080;
  for(i=0;i<41;i++){
        XBYTE[address]=period_sch[i];
        address++;
        if(address>0xa7f0)address=0xa080;
                    }
        XBYTE[address]=0;      //凑个偶数
   XBYTE[tr_flagaddr]=0x01;
   */
}

void ask_sch()
{
  unsigned char i,day;
  unsigned addr_r;
  day = XBYTE[0XC006]; /*星期*/
  if(day>7)day=3;
  addr_r=0x3f00+(day-1)*384+(timeid-1)*16;
  for(i=0;i<16;i++){
       sch_step[i]=XBYTE[addr_r+i];
                    }

/*  unsigned char i;
  unsigned char te;
  fl=XBYTE[0xa023];
  fh=XBYTE[0xa024];
  while((fl==0)&&(fh==1)){};    //等待FGPA修改头尾
  XBYTE[0xa023]=0x01;                              //CPU修改头尾
  XBYTE[0xa024]=0X00;
  data_address=(XBYTE[0XA021]<<8)+XBYTE[0XA022]+1;
  address=data_address;
  data_address=data_address+3;            //应答数据长度+1字节
  if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  data_address--;
  XBYTE[0XA021]=data_address>>8;          //
  XBYTE[0XA022]=data_address;
  XBYTE[0XA023]=0X00;                      //CPU修改头尾结束
  XBYTE[0XA024]=0X00;
  for(i=0;i<6;i++){
           tr_flagaddr=0XA030+5*i;
           if(XBYTE[tr_flagaddr]==0x87)break;
                      }
  //if(i==6)return 1;
  XBYTE[tr_flagaddr+1]=address>>8;        //发送数据的首地址
  XBYTE[tr_flagaddr+2]=address;
  XBYTE[tr_flagaddr+3]=data_address>>8;   //发送数据的尾地址
  XBYTE[tr_flagaddr+4]=data_address;
  address=address+0xa000;                 //发送应答数据
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=0X86;                   //发送查询标识条件,考虑增加日计划,方案等查询条件
  address++;
  if(address>0xa7f0)address=0xa080;
  te=timeid+1;
  XBYTE[address]=te;                   //查询的时段
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC006];                   //查询的周日类型
  XBYTE[tr_flagaddr]=0x01;
*/
}

⌨️ 快捷键说明

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