📄 zone.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 + -