?? 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個(gè)路口,沒個(gè)路口60個(gè)備用變化,每個(gè)階段提供60秒的變化范圍
unsigned char xdata zone_step_time[5][60];//對應(yīng)的階段時(shí)間
unsigned char xdata zone_now_step_key[5][60];//對應(yīng)的階段歷時(shí)
unsigned char xdata zone_differ[5]={2,3,4,5,7};//5個(gè)路口的 相位差
unsigned char xdata zone_step_number[5][60];//變化時(shí)刻的階段號
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;
//發(fā)送:路口編號,階段時(shí)間,階段歷時(shí),階段號
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; //發(fā)送數(shù)據(jù)長度12字節(jié)
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; //應(yīng)答數(shù)據(jù)長度12字節(jié)
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修改頭尾結(jié)束
XBYTE[0XA024]=0X00;
for(i=0;i<6;i++){ //判斷有無發(fā)送緩沖區(qū)
tr_flagaddr=0XA030+5*i;
if(XBYTE[tr_flagaddr]==0x87)break;
}
if(i==6)return 1; //如果沒有,崩潰
XBYTE[tr_flagaddr+1]=address>>8; //發(fā)送數(shù)據(jù)的首地址
XBYTE[tr_flagaddr+2]=address;
XBYTE[tr_flagaddr+3]=data_address>>8; //發(fā)送數(shù)據(jù)的尾地址
XBYTE[tr_flagaddr+4]=data_address;
address=address+0xa000;
if(address>0xa7f0){
address=0xa080;
}
XBYTE[address]=0x9F; //新增協(xié)議0X9F
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=0xc5; //新增協(xié)議0XC5
address++;
if(address>0xa7f0)address=0xa080;
XBYTE[address]=(troadnumber>>8); //從機(jī)路口編號
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]; //發(fā)送月
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]; //時(shí)
// 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;
}
//本函數(shù)對狀態(tài)發(fā)生后的需要計(jì)時(shí),與相位差比較的數(shù)據(jù)進(jìn)行初始化 只在關(guān)鍵點(diǎn),階段更迭,綠時(shí)修改的情況下運(yùn)行
deal_zone()
{
unsigned char xdata i;
//關(guān)鍵點(diǎn)到來時(shí)刻,每個(gè)從機(jī)路口相應(yīng)的標(biāo)志置為1,并保留相對應(yīng)的階段時(shí)間和階段數(shù),階段號
for(i=0;i<5;i++){
zone_count[i][sequ_code]=1; //開始計(jì)數(shù)
zone_step_time[i][sequ_code]=step_time; //保留當(dāng)時(shí)的階段時(shí)間
zone_now_step_key[i][sequ_code]=now_step_key; //保留當(dāng)前的階段歷時(shí)
zone_step_number[i][sequ_code]=step_counter; //發(fā)生時(shí)刻的階段號
}
sequ_code++;
if(sequ_code>=60)sequ_code=0;
}
//在秒中斷中每秒執(zhí)行一次,沒秒對個(gè)從機(jī)的相位差與事件發(fā)生點(diǎn)的時(shí)間進(jìn)行比較
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++){ //秒計(jì)數(shù),使用的區(qū)域沒秒增一
t1= zone_count[i][j]; //讀取計(jì)數(shù)
t2=zone_differ[i]; //讀取相位差
if(zone_count[i][j]!=0)zone_count[i][j]++; //對于使用的計(jì)數(shù)器增1
//if(zone_count[i][j]>=zone_differ[i]}{
if(t1>t2){ //計(jì)數(shù)值超過相位差
tran_inform_flag=1;
zone_count[i][j]=0x00;
pq0=zone_number[i]; //從機(jī)路口編號
pq1=zone_step_time[i][j]; //區(qū)域控制的當(dāng)前階段時(shí)間:倒計(jì)時(shí)開始的時(shí)間
pq2=zone_now_step_key[i][j]; //在當(dāng)前階段中的歷時(shí)
pq3=zone_step_number[i][j]; //當(dāng)前階段號
// 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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -