加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于51單片機的交通信號燈系統(tǒng)設計

09/23 10:07
1348
服務支持:
技術交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術大咖們分享疑惑和經驗、收獲成長和認同、領取優(yōu)惠和紅包等。

虛擬商品不可退

當前內容為數字版權作品,購買后不支持退換且無法轉移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關方案
  • 方案介紹
  • 相關文件
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

功能:

十字路口交通燈控制程序: 正常時,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"

/********************************************************************************************

* 函數名稱:延時子程序

* 功??? 能:延時,給LED顯示的延時時間

* 入口參數:時間參數

* 出口參數:無

*********************************************************************************************/

void Delay(uchar???? a)

{

uchar?????? i;

i=a;

while(i--){;}

}

/********************************************************************************************

* 函數名稱:顯示子函數

* 功??? 能:EW方向,SN方向主干道數碼管顯示驅動

* 入口參數:無

* 出口參數:無

*********************************************************************************************/

void Display(void)

{

char h,l;

h=Time_EW/10;????????????? //EW方向計時的十位數

l=Time_EW%10;????????????? //EW方向計時的個位數

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方向計時的十位數

l=Time_SN%10;?????????????? //SN方向計時的個位數

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;

}

/********************************************************************************************

* 函數名稱:外部0中斷服務程序

* 功??? 能:中斷,檢測按鈕的類別,執(zhí)行相應的操作;

若Add_Button==0,通行時間加5s ;

若Reduces_Button==0,通行時間減5s ;

若Busy_Btton==0,開繁忙信號燈,關特殊信號燈,通行時間45s,30s;

若Add_Button==0,關繁忙信號燈,開特殊信號燈,通行時間75s,55s;

* 入口參數:無

* 出口參數:無

*********************************************************************************************/

void EXINT0(void) interrupt 0 using 0

{

EA = 0;??????????????????? //關中斷

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;????????????????? //開中斷

}

/******************************************************************************

* 函數名稱:外部中斷1

* 功??? 能:中斷,當遇到緊急情況,需要人工控制時,強制直行的函數處理

若QZ_EW_Btton按下時,EW方向綠燈亮,SN方向紅燈亮 ,并點亮QZ_EW_LED指示燈

若QZ_SN_Btton按下時,EW方向紅燈亮,SN方向綠燈亮 ,并點亮QZ_SN_LED指示燈

* 入口參數:無

* 出口參數:無

********************************************************************************/

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;

}

/******************************************************************************

* 函數名稱:main()

* 功??? 能:主函數

* 入口參數:無

* 出口參數:無

********************************************************************************/

void main(void)

{

QZ_EW_LED = 0;

QZ_SN_LED = 0;

QZ_EW = 0;

QZ_SN = 0;

IT0=1;????? ??????????????????? //INT0負跳變觸發(fā)

IT1=1;????????????????? //INT0負跳變觸發(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關黃燈顯示信號

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關黃燈顯示信號

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;

 

  • 有需要資料的可了解一下.docx

相關推薦

電子產業(yè)圖譜