1、東西干道和南北干道的通行分左行、右行、直行,其中左行、右行固定15秒;直行固定30秒;
2、信號燈分綠燈(3種)、紅燈、黃燈,每次綠燈換紅燈時,黃燈亮3秒鐘;
3、東西干道和南北干道交替控制,每次干道綠燈交替時,有3秒鐘所有干道的交通燈都是黃燈閃爍3秒鐘,提示已經進入路口的車輛迅速通過;
void Display()
{
char h,l;
h=Time_EW/10;
l=Time_EW%10;
P2=table[l];
EW_LED2=0;
Delay(2);
EW_LED2=1;
P2=table[h];
EW_LED1=0;
Delay(2);
EW_LED1=1;
h=Time_SN/10;
l=Time_SN%10;
P2=table[l];
SN_LED2=0;
Delay(2);
SN_LED2=1;
P2=table[h];
SN_LED1=0;
Delay(2);
SN_LED1=1;
緊急中斷程序,全紅燈10s
if(Special_Btton==0) //緊急情況下,全紅燈10S
{
uchar i;
for(i=0;i<50;i++) //循環50次
{Flag_SN_Yellow=0;
Flag_EW_Yellow=0;
P1=0xEE;
Delay(200); //延時200ms
}
}
}
/**********************外部0中斷服務程序************************/
void EXINT0(void)interrupt 0 using 1
{
EX0=0; //關中斷
if(Reduces_Button==0) //時間減
{
EW1-=5;
SN1-=5;
if(EW1<=25)
{
EW1=25;
SN1=15;
}
}
EX0=1;//開中斷
}
/**********************外部1中斷服務程序************************/
void EXINT1(void)interrupt 2 using 1
{
EX1=0; //關中斷
if(Add_Button==0) //時間加
{
EW1+=5;
SN1+=5;
if(EW1>=45)
{
EW1=45;
SN1=35;
}
}
EX1=1;//開中斷
}
/**********************T0中斷服務程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
if(Flag_SN_Yellow==1) //測試南北黃燈標志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //測試東西黃燈標志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//測試南北黃燈標志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1)//測試東西黃燈標志位
{EW_Yellow=~EW_Yellow;}
count=0;
}
}
主程序,利用中斷調用,將不同的交通燈情況列成s1-s7情況
/*********************主程序開始**********************/
void main(void)
{
IT0=1; //INT0負跳變觸發
IT1=1; //INT1負跳變觸發
TMOD=0x01; //定時器工作于方式1
TH0=(65536-50000)/256;//定時器賦初值50ms
TL0=(65536-50000)%256;
EA=1; //CPU開中斷總允許
ET0=1;//開定時中斷
EX0=1;//開外部INTO中斷
EX1=1;//開外部INT1中斷
TR0=1;//啟動定時
Flag_SN_Yellow=0; //SN關黃燈顯示信號
Flag_EW_Yellow=0; //EW關黃燈顯示信號
Time_EW=TZ;
Time_SN=TZ;
P1=0xFF;
while(Time_SN>=0)
{
EW_Red=0; //全紅燈3S 0xEE
SN_Red=0;
Display();
}
while(1)
{ /*******S0狀態**********/
Flag_EW_Yellow=0; //EW關黃燈顯示信號
Time_EW=EW1;
Time_SN=SN1;
while(Time_SN>=0)
{P1=S[0]; //SN通行,EW紅燈 0xBE
Display();}
/*******S1狀態**********/
/*P1=0xFF;
while(Time_SN>=0)
{Flag_SN_Yellow=1; //SN開黃燈信號位
EW_Red=0; //SN黃燈亮,等待左拐信號,EW紅燈 0xDE
Display();}
/*******S2狀態**********/
Flag_SN_Yellow=0; //SN關黃燈顯示信號
Time_SN=SNL;
while(Time_SN>=3)
{P1=S[2];//SN左拐綠燈和直行綠燈亮,EW紅燈 0x3E
Display();}
/*******S3狀態**********/
P1=0xFF;
while(Time_SN>=0)
{Flag_SN_Yellow=1;//SN開黃燈信號位
EW_Red=0; //SN黃燈亮,等待停止信號,EW紅燈 0xDE
Display();}
/***********賦值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
/*******S4狀態**********/
Flag_SN_Yellow=0; //SN關黃燈顯示信號
Time_EW=SN;
Time_SN=EW;
while(Time_EW>=0)
{P1=S[4]; //EW通行,SN紅燈 0xEB
Display();}
/*******S5狀態**********/
/*P1=0XFF;
while(Time_EW>=0)
{Flag_EW_Yellow=1;//EW開黃燈信號位
SN_Red=0;//EW黃燈亮,等待左拐信號,SN紅燈 0xED
Display();}
/*******S6狀態**********/
Flag_EW_Yellow=0;//EW關黃燈顯示信號 0xE3
Time_EW=EWL;
while(Time_EW>=3)
{P1=S[6];//EW左拐綠燈亮,SN紅燈
Display();}
/*******S7狀態**********/
P1=0xFF;
while(Time_EW>=0)
{Flag_EW_Yellow=1; //EN開黃燈信號位
SN_Red=0;//EW黃燈亮,等待停止信號,SN紅燈 0xE7
Display();}
/***********賦值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
}
}
|