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

📄 zone.c

📁 ASC 信号机控制程序,国内最先进的信号机控制程序
💻 C
字号:
#include <absacc.h>
#include <reg51.h>
sbit   WatchDog = P1^3;       //看门狗
unsigned char xdata sequ_code=0;
unsigned char xdata zone_count[5][60]; //5个路口,没个路口60个备用变化,每个阶段提供60秒的变化范围
unsigned char xdata zone_step_time[5][60];//对应的阶段时间
unsigned char xdata zone_now_step_key[5][60];//对应的阶段历时
unsigned char xdata zone_differ[5]={2,3,4,5,7};//5个路口的 相位差
unsigned char xdata zone_step_number[5][60];//变化时刻的阶段号
unsigned int  xdata zone_number[5];     //路口编号
unsigned char xdata tran_inform_flag=0;

unsigned char  pq1,pq2,pq3;
unsigned int   pq0;

extern  unsigned char step_time;
extern  unsigned char now_step_key;
extern  unsigned char step_counter;              //阶段号

extern unsigned int xdata data_address;
extern unsigned int xdata address;
extern unsigned int xdata tr_flagaddr;
sbit FarContrlLed=P1^1;

//发送:路口编号,阶段时间,阶段历时,阶段号
tran_split(unsigned int troadnumber,unsigned char tstep_time,unsigned char  tstep_now_key,unsigned char tstep_number) using 1

{
  unsigned char i;

  data_address=((XBYTE[0XA021]<<8)+XBYTE[0XA022]+1);        //首地址 偏移量
  address=data_address;                                 //首地址 偏移量
  data_address=data_address+12;                         //发送数据长度12字节
  if(data_address>0x7f0)data_address=data_address-0x7f0+0x80;
  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+12;            //应答数据长度12字节
  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]=0x9F;                    //新增协议0X9F
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=0xc5;                    //新增协议0XC5

  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=(troadnumber>>8);       //从机路口编号

  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=troadnumber;
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=tstep_time;
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=tstep_now_key;
  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=tstep_number;

  address++;
  if(address>0xa7f0)address=0xa080;
  XBYTE[address]=XBYTE[0XC008];           //发送月
  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];           //秒

  XBYTE[tr_flagaddr]=0x02;
  FarContrlLed= !FarContrlLed;
}



//本函数对状态发生后的需要计时,与相位差比较的数据进行初始化 只在关键点,阶段更迭,绿时修改的情况下运行
deal_zone()
{
  unsigned char xdata i;
//关键点到来时刻,每个从机路口相应的标志置为1,并保留相对应的阶段时间和阶段数,阶段号
  for(i=0;i<5;i++){
        zone_count[i][sequ_code]=1;                   //开始计数
        zone_step_time[i][sequ_code]=step_time;       //保留当时的阶段时间
        zone_now_step_key[i][sequ_code]=now_step_key; //保留当前的阶段历时
        zone_step_number[i][sequ_code]=step_counter;                   //发生时刻的阶段号

                   }

  sequ_code++;
  if(sequ_code>=60)sequ_code=0;
}
//在秒中断中每秒执行一次,没秒对个从机的相位差与事件发生点的时间进行比较
send_zone()
{
  unsigned char xdata i,j;
  unsigned char xdata t1,t2;
  EA=0;
  for(i=0;i<5;i++){
       WatchDog = !WatchDog ;
       for(j=0;j<60;j++){ //秒计数,使用的区域没秒增一
          t1= zone_count[i][j];                        //读取计数
          t2=zone_differ[i];                           //读取相位差
          if(zone_count[i][j]!=0)zone_count[i][j]++;   //对于使用的计数器增1
          //if(zone_count[i][j]>=zone_differ[i]}{
          if(t1>t2){                                  //计数值超过相位差
                        tran_inform_flag=1;
                        zone_count[i][j]=0x00;
                        pq0=zone_number[i];           //从机路口编号
                        pq1=zone_step_time[i][j];     //区域控制的当前阶段时间:倒计时开始的时间
                        pq2=zone_now_step_key[i][j];  //在当前阶段中的历时
                        pq3=zone_step_number[i][j];      //当前阶段号
                      //  if(pq0==0x0051){
                      //           tran_split(pq0,pq1,pq2,pq3);
                      //                  }

                        tran_split(pq0,pq1,pq2,pq3);
                        tran_split(pq0,pq1,pq2,pq3);
                        tran_split(pq0,pq1,pq2,pq3);

                                               }
                         }
                   }
   EA=1; 
   return 1;
}

⌨️ 快捷键说明

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