功能:
十字路口交通燈控制程序: 正常時,EW方向計時60s,SN方向計時40s 若按時間加按鍵(Add_Button)按鈕,EW、SN方向各加5s,不可大于99s,79s 若按時間減按鍵(Reduces_Button)按鍵,EW、SN方向各減5s,不可小于40s,20s 若按EW方向強制通行(QZ_EW_Btton)按鈕,EW方向強制通行,SN方向禁止通行 若按SN方向強制通行(QZ_SN_Btton)按鈕,SN方向強制通行,EW方向禁止通行。
仿真原理圖:
/ #define TRAFFIC_GLOBAL 1
#include "TRAFFIC.H"
/********************************************************************************************
* 函數(shù)名稱:延時子程序
* 功??? 能:延時,給LED顯示的延時時間
* 入口參數(shù):時間參數(shù)
* 出口參數(shù):無
*********************************************************************************************/
void Delay(uchar???? a)
{
uchar?????? i;
i=a;
while(i--){;}
}
/********************************************************************************************
* 函數(shù)名稱:顯示子函數(shù)
* 功??? 能:EW方向,SN方向主干道數(shù)碼管顯示驅(qū)動
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void Display(void)
{
char h,l;
h=Time_EW/10;????????????? //EW方向計時的十位數(shù)
l=Time_EW%10;????????????? //EW方向計時的個位數(shù)
P0=table[l];????????????? //顯示EW計時時間的低位
EW_LED2=1;
Delay(2);
EW_LED2=0;
P0=table[h];??????????? //顯示EW計時時間的高位
EW_LED1=1;
Delay(2);
EW_LED1=0;
h=Time_SN/10;??????????????? //SN方向計時的十位數(shù)
l=Time_SN%10;?????????????? //SN方向計時的個位數(shù)
P0=table[l];????????????? //顯示SN計時時間的低位
SN_LED2=1;
Delay(2);
SN_LED2=0;
P0=table[h];??????????? //顯示SN計時時間的高位
SN_LED1=1;
Delay(2);
SN_LED1=0;
h= EW1/10;????????????????????? //直行時間的十位
l= EW1%10;????????????????????? //直行時間的個位
P0=table[l];????????????? //時間的個位顯示
Time_Show_LED1=1;
Delay(2);
Time_Show_LED1=0;
P0=table[h];???????????? //時間的十位顯示
Time_Show_LED2=1;
Delay(2);
Time_Show_LED2=0;
}
/********************************************************************************************
* 函數(shù)名稱:外部0中斷服務(wù)程序
* 功??? 能:中斷,檢測按鈕的類別,執(zhí)行相應(yīng)的操作;
若Add_Button==0,通行時間加5s ;
若Reduces_Button==0,通行時間減5s ;
若Busy_Btton==0,開繁忙信號燈,關(guān)特殊信號燈,通行時間45s,30s;
若Add_Button==0,關(guān)繁忙信號燈,開特殊信號燈,通行時間75s,55s;
* 入口參數(shù):無
* 出口參數(shù):無
*********************************************************************************************/
void EXINT0(void) interrupt 0 using 0
{
EA = 0;??????????????????? //關(guān)中斷
if(Add_Button==0)????????????????? //時間加
{
EW1+=5;?????????????????????????????????? ?? //通行時間加5s
SN1+=5;
if(EW1>=100)????????????? ?? //通行時間不得大于100s,80s
{
EW1=99;
SN1=79;
}
}
if(Reduces_Button==0)??? ?????????//時間減
{
EW1-=5;?????????????????? ????? //通行時間減5s
SN1-=5;
if(EW1<=40)??????????? ????? //通行時間不得小于40s,20s
{
EW1=40;
SN1=20;
}
}
EA = 1;????????????????? //開中斷
}
/******************************************************************************
* 函數(shù)名稱:外部中斷1
* 功??? 能:中斷,當(dāng)遇到緊急情況,需要人工控制時,強制直行的函數(shù)處理
若QZ_EW_Btton按下時,EW方向綠燈亮,SN方向紅燈亮 ,并點亮QZ_EW_LED指示燈
若QZ_SN_Btton按下時,EW方向紅燈亮,SN方向綠燈亮 ,并點亮QZ_SN_LED指示燈
* 入口參數(shù):無
* 出口參數(shù):無
********************************************************************************/
void EXINT1(void) interrupt 2 using 2
{
EA = 0;
if(QZ_EW_Btton==0)????????????? //EW方向強制通行按鍵是否按下
{
QZ_EW = ~QZ_EW; ?????? //
QZ_SN = 0;
if(QZ_EW)
{QZ_EW_LED = 1;
QZ_SN_LED = 0;}
else? ????? ???QZ_EW_LED = 0;
}
if(QZ_SN_Btton==0)???????????? //測試按鍵是否按下,按下為特殊狀態(tài)
{
QZ_SN = ~QZ_SN;
QZ_EW = 0;
if(QZ_SN)
{QZ_SN_LED = 1;
QZ_EW_LED = 0;}
else
QZ_SN_LED = 0;
}
EA = 1;
}
/******************************************************************************
* 函數(shù)名稱:main()
* 功??? 能:主函數(shù)
* 入口參數(shù):無
* 出口參數(shù):無
********************************************************************************/
void main(void)
{
QZ_EW_LED = 0;
QZ_SN_LED = 0;
QZ_EW = 0;
QZ_SN = 0;
IT0=1;????? ??????????????????? //INT0負(fù)跳變觸發(fā)
IT1=1;????????????????? //INT0負(fù)跳變觸發(fā)
TMOD=0x01;???? ?????????????//定時器工作于方式1
TH0=(65536-50000)/256;????? //定時器賦初值
TL0=(65536-50000)%256;
EA=1;?????????????????????? //CPU開中斷總允許
ET0=1;????????????????????? //開定時中斷
EX0=1;????????????????????? //開外部INTO中斷
EX1=1;????????????????????? //開外部INT1中斷
TR0=1;????????????????????? //啟動定時
while(1)
{????????????????????????????????? /*******SN通行,EW紅燈*** ***************/
Flag_EW_Yellow=0;???????????? //EW關(guān)黃燈顯示信號
Time_EW=EW;
Time_SN=SN;
while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
{P1=LIGHT[0];???????? ????????????? //SN通行,EW紅燈
Display();}
/*******SN黃燈亮,等待左拐信號,EW紅燈***/
P1=0x00;
while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
{Flag_SN_Yellow=1; ????????? //SN開黃燈信號位
EW_Red=1;???????????????????? //SN黃燈亮,等待左拐信號,EW紅燈
Display();
}
/*******SN左拐綠燈亮,EW紅燈*************/
Flag_SN_Yellow=0;???????????? //SN關(guān)黃燈顯示信號
Time_SN=SNL;
while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
{P1=LIGHT[2];???????????????? //SN左拐綠燈亮,EW紅燈
Display();}
/*******SN黃燈亮,等待停止信號,EW紅燈******/
P1=0x00;
while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
{Flag_SN_Yellow=1; ????????? //SN開黃燈信號位
EW_Red=1;???????????????????? //SN黃燈亮,等待停止信號,EW紅燈
Display();}
/****EW黃燈亮,等待停止信號,SN紅燈***/
P1=0X00;
while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)
{Flag_EW_Yellow=1;?????????????? //EW開黃燈信號位
SN_Red=1;?????????????????????? //EW黃燈亮,等待停止信號,SN紅燈
Display();}
/*********EW方向強制通行**************/
while(QZ_EW)
{Time_EW = 88;
Time_SN = 88;
EW1 = 88;
Display();
P1=LIGHT[4];???????? ??????????????? //EW通行,SN紅燈
EW1 = 60;
SN1 = 40;}
/*********SN方向強制通行**************/
while(QZ_SN)
{Time_EW = 88;
Time_SN = 88;
EW1 = 88;