?? second.c
字號:
#include <second.h>
unsigned char xdata cmd;
/*遙控處理函數*/
remote_deal()
{
unsigned char i;
for(i=0;i<8;i++){ /*確認當前被遙控的相位數*/
if(re_message[i]==20){
reph_number=(i+1);
//remote_state=1;
}
}
for(i=8;i<12;i++){ /*確認當前被遙控的相位數*/
if(re_message[i]==20){
reph_number=(i+1);
}
}
if((reph_number>0)&&(reph_number<9)){
re_coloc++;
if(re_coloc>100)re_coloc=100;
if(re_coloc==1)re_exe_flag=1; //一旦有合法遙控輸入即建立遙控動作執行標志
re_control=1; //遙控狀態標志
forceacting=0; //清除強制啟動開始標志
if(lastreph!=reph_number){ //遙控的相位和上一次遙控的相位不相等
re_coloc=0;
clear_state=1;
lastreph=reph_number;
act_flag=1;
re_keep_flag=0; //遙控階段維持標志清,遙控進入指定階段后該標志1,有新的遙控輸入0
}else {
act_flag=0;
}
}else{
re_control=0;
act_flag=0;
}
if((reph_number>step_num)||(reph_number==12)){//退出遙控進入自動
re_control=0;
re_coloc=0;
// XBYTE[0X6D28]=0;//手動標志一并歸零
}
lastreph=reph_number;
}
/***************************************************/
//手動處理函數
man_deal()
{
if(force_flag==1){ //6d28單元中字節內容不為0
re_control=0; //清除遙控標志
re_coloc=0;
force_coloc++;
if(force_coloc>100)force_coloc=100;
if(force_coloc==1)force_exe_flag=1;
if(force_number!=last_forcenumber){
forceacting=1; //強制過程開始標志 到運行到指定階段或遙控操作中斷
act_force=1; //進入強制第一秒標志
re_keep_force=0;
force_coloc=0;
}
}
if((force_number>step_num)||(force_flag==4)){//退出遙控進入自動
force_flag=0;
force_coloc=0;
XBYTE[0X6D28]=0;//手動標志一并歸零
}
last_forcenumber=force_number;
}
/*****************************************************************************************************/
// 讀時間
/*****************************************************************************************************/
void read_time() {
now_day = XBYTE[0XC006]; /*星期*/
now_year= XBYTE[0XC009]; /*年份*/
now_month=XBYTE[0XC008]; /*月份*/
now_date= XBYTE[0XC007]; /*日子*/
now_hour= XBYTE[0XC004]; /*小時*/
now_min = XBYTE[0XC002]; /*分鐘*/
now_sec = XBYTE[0XC000]; /*秒*/
now_time=now_hour*60+now_min; //當前時間以分鐘計算
begin_time=XBYTE[0X72E2]*60+XBYTE[0X72E3];
end_time=XBYTE[0X72E4]*60+XBYTE[0X72E5];
if((now_time==begin_time)&&(now_sec==0)){
start_counter=0;
}
if(end_time<begin_time) //時段開始的時間晚于時段結束的時間,即5點開始,第二天4點關機
{
if((now_time>=begin_time) || (now_time<end_time))
work_time=1;
else
work_time=0;
}
else if(end_time>begin_time)
{
if((now_time>=begin_time) && (now_time<end_time))
work_time=1;
else
work_time=0;
}
else
work_time=1;
if((now_hour==0x17)&&(now_min==0x3b)&&(now_sec==0x3B))start_counter=5;
}
/*------------求最大值-----------------------*/
//max(array_time)
//uchar array_time[16];
//{
// uchar max_value,k;
// max_value=array_time[0];
// for(k=1;k<16;k++)
// {
// if(array_time[k]>max_value)
// max_value=array_time[k];
// }
// return(max_value);
//}
/*------------------------------------------*/
uchar search_step_time() using 1 //計算感應控制階段時間=最小綠燈+紅燈+黃燈
{
uchar i,max_temp;
uint j;
uint offset;
mmax_timed=0;
ensensor_flag = 1;
sensor_car_flag= 0;
min_greentime=0;
max_greentime = 0;
for(i=0; i<16; i++) //此循環用于查找當前階段用到的相位
{
j = 18*i;
offset= 0x0001;
offset= offset<<i;
now_phase_temp = offset&inuse_phase[step_counter]; ////inuse_phase:階段用到的相位step_counter:階段號
now_phase_tempn = offset&inuse_phasen[step_counter];
if(now_phase_temp!=0)
{
/* if(((XBYTE[baseaddr_now_phasesch+j+2]&0x04)==0x04) && (now_phase_tempn==0)) //行人
{
max_time=XBYTE[baseaddr_now_phasesch+j+12]+XBYTE[baseaddr_now_phasesch+j+16];
//max_time:=最小綠燈+紅燈
} */
if(((XBYTE[baseaddr_now_phasesch+j+2]&0x04)!=0x04) /*&& (now_phase_tempn==0)*/)
{
no_vehicle_step[step_counter]=1;//該階段有無機動車標志
sensor_distance=XBYTE[baseaddr_now_phasesch+j+11];
//最小綠燈
min_green = XBYTE[baseaddr_now_phasesch+j+12]-XBYTE[baseaddr_now_phasesch+j+17];//;-sensor_distance;
if(min_green>min_greentime)min_greentime =min_green;
// min_greentime =最小綠燈-綠閃-單位步長
//最大綠燈
max_green= XBYTE[baseaddr_now_phasesch+j+13]-XBYTE[baseaddr_now_phasesch+j+17];
if(max_green>max_greentime)max_greentime = max_green;
//查找出最小綠燈中最長的綠燈時間
max_temp=XBYTE[baseaddr_now_phasesch+j+12]+XBYTE[baseaddr_now_phasesch+j+15]+XBYTE[baseaddr_now_phasesch+j+16];
if(max_temp>mmax_timed)mmax_timed=max_temp;
//max_green_flash=XBYTE[baseaddr_now_phasesch+j+17];
}
}
}
return (mmax_timed);
}
/*-----------------------------------*/
void max_clear_time() using 1
{
uchar i;
uint now_phase_temp,now_phase_tempn;
uint toto;
uint phasek;
max_yellow=0;
max_red_clear=0;
max_green_flash=0;
if(step_counter==0x01){
max_yellow=0;
}
for(i=0; i<16; i++)
{
toto = 0x0001;
toto = toto<<i;
phasek = 18*i;
now_phase_temp = (toto&inuse_phase[step_counter]);
now_phase_tempn = toto&inuse_phasen[step_counter];
if((now_phase_temp!=0)/*&& (now_phase_tempn==0)*/)// 本階段包含,下一階段不包含
{
if(max_yellow<XBYTE[baseaddr_now_phasesch+phasek+15])
max_yellow=XBYTE[baseaddr_now_phasesch+phasek+15];
if(max_red_clear<XBYTE[baseaddr_now_phasesch+phasek+16])
max_red_clear=XBYTE[baseaddr_now_phasesch+phasek+16];
if(max_green_flash<XBYTE[baseaddr_now_phasesch+phasek+17])
max_green_flash=XBYTE[baseaddr_now_phasesch+phasek+17];
}
}
clear_time=max_yellow+max_red_clear;//紅燈和黃燈的清空時間
}
/************計算個階段的各相位的清空時間***在每階段的開始時執行一次****************/
/************計算個階段的各相位的清空時間***在每階段的開始時執行一次****************/
void cal_clear_time()
{
uchar i;
uint phasek;
for(i=0; i<16; i++)
{
phasek = 18*i;
red_clear[i] = XBYTE[baseaddr_now_phasesch+phasek+16]; //紅燈清空時間
//red_yellow_clear[i] = red_clear[i]+XBYTE[baseaddr_now_phasesch+phasek+15]; //黃燈清空時間
red_yellow_clear[i] = red_clear[i]+ max_yellow;
red_yellow_green_clear[i] = red_yellow_clear[i]+XBYTE[baseaddr_now_phasesch+phasek+17]; //行人清空時間
}
}
/*****************************************************************************************************/
// 查找燈色
/*****************************************************************************************************/
void search_color() using 1
{
uchar data i,j,difer,diff;
uint data toto,toto1;
uchar data asc_flag=0;
// uint phasek;
for(i=0;i<32;i++){
if(sensor_step[step_counter]!=0){
asc_flag=1;
break;
}
}
if((sensor_virgin_flag)&&(/*sensor_step[step_counter]*/asc_flag==1))
{
sensor_virgin_flag = 0;
step_time = search_step_time(); //階段時間在開始時只加載一次=最小綠燈+紅燈+黃燈
}
run_state=0x01;
use_lamp=use_lamp_sch;
/* if(use_lamp_sch!=0x3fff){
use_lamp_sch=0;
} */
for(i=0; i<16; i++)
{
toto =(0x0001<<i);
if((use_lamp&toto)==toto)lamp_state[i]=4; /*使用的燈組置成紅色先*/
else lamp_state[i]=7; /*不用的燈組滅掉*/
}
max_clear_time();
cal_clear_time();//計算個階段的清空時間
// max_clear_time();
///////////////////////////////////////////////////////////////////////////////
//遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控
////////////////////////////////////////////////////////////////////////////////
if(re_control==1) { //遙控
run_state=0x03;
if(act_flag==1){ //遙控狀態發生時,時間轉移到當前執行階段綠燈最后一秒 遙控發生秒
act_flag=0;
if(clear_flag==0){ //綠燈階段當前階段倒計時置為綠燈最后一秒,
now_uncount =max_green_flash+max_red_clear+max_yellow+1;
} //處于本階段清空時刻,不處理,順其自然
}else{ //非遙控發生秒執行語句
if(re_keep_flag==1){//
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
}else {//遙控的是當前運行階段或處于過時間不需要減少
if(step_counter!=reph_number-1){
now_uncount--;
}else{
if(re_exe_flag==1){
now_uncount =max_green_flash+max_red_clear+max_yellow+1;
re_exe_flag=0;
}
}
}
}
}else{//無強制和遙控的狀態下
//now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
if((re_control==0)&&last_re_control==1){
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
now_step_key=0;
}
}
// last_re_control=re_control;
//遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控遙控
///////////////////////////////////////////////////////////////////////////////////////
//強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制強制
////////////////////////////////////////////////////////////////////////////////////////
if(force_flag==1){ //強制階段號發生變化
run_state=0x02;
// if(force_number!=last_forcenumber){
if(act_force==1){ //進入強制控制的第一秒
act_force=0;
if(clear_force==0){//綠燈階段
now_uncount =max_green_flash+max_red_clear+max_yellow+1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -