|
電路圖如下所示:
流程圖:
單片機(jī)源程序如下:
- #include <STC12.H>
- #define u8 unsigned char
- #define u16 unsigned int
- sbit LED_NBS=P2^0;//南北數(shù)碼管位選腳
- sbit LED_NBG=P2^1;//南北數(shù)碼管位選腳
- sbit LED_DXS=P2^2;//東西數(shù)碼管位選腳
- sbit LED_DXG=P2^3;//東西數(shù)碼管位選腳
- sbit GNB=P3^0;//綠/南北
- sbit YNB=P3^1;//黃/南北
- sbit RNB=P3^2;//紅/南北
- sbit GDX=P3^3;//綠/東西
- sbit YDX=P3^4;//黃/東西
- sbit RDX=P3^5;//紅/東西
- sbit GRNB=P2^4;//綠/南北人行道
- sbit RRNB=P2^5;//紅/南北人行道
- sbit GRDX=P2^6;//綠/東西人行道
- sbit RRDX=P2^7;//紅/東西人行道
- sbit RADD=P1^0;//加/紅燈
- sbit RSUB=P1^1;//減/紅燈
- sbit GADD=P1^2;//加/綠燈
- sbit GSUB=P1^3;//減/綠燈
- sbit JJ=P3^6;//緊急
- sbit YJ=P3^7;//夜間
- #define Time_Y_Save 5//黃燈間隔時(shí)間
- code u8 seg7code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
- 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //斷碼
- u16 Time=0;//定時(shí)器中斷計(jì)數(shù)
- int Time_NB=20;//南北倒計(jì)時(shí)時(shí)間
- int Time_DX=30;//東西倒計(jì)時(shí)時(shí)間
- int Time_Y=Time_Y_Save;//黃燈倒計(jì)時(shí)時(shí)間
- int Time_NB_Save=20;//調(diào)整后北通行倒計(jì)時(shí)時(shí)間
- int Time_DX_Save=30;//調(diào)整后通行倒計(jì)時(shí)時(shí)間
- u8 Run_Flag=0;//運(yùn)行記錄標(biāo)志
- /******定時(shí)器初始化******/
- void Time0_Init()
- {
- TMOD=0X01;//工作模式
- EA=1;//開(kāi)總中斷
- TR0=1;//開(kāi)啟定時(shí)器0計(jì)時(shí)
- ET0=1;//開(kāi)定時(shí)器0中斷
- TH0=0X3C;//初值
- TL0=0XB0;
- }
- /******************************************************************
- 延時(shí)函數(shù)
- ******************************************************************/
- void delay(u16 t)
- {
- u8 j;
- while(t--)
- for(j=100;j>0;j--);
- }
- /**********************************************************************
- 南北數(shù)碼管動(dòng)態(tài)掃描
- *********************************************************************/
- void Display_NB(u16 Data) //顯示函數(shù)
- {
- u8 s,g;
- s=Data/10; //求十位
- g=Data%10; //求個(gè)位
- P0=seg7code[s];//送十位段選值
- LED_NBG=1;//關(guān)閉個(gè)位顯示
- LED_NBS=0;//開(kāi)啟十位顯示
- delay(10);
- LED_NBG=1;//關(guān)閉個(gè)位顯示
- LED_NBS=1;//關(guān)閉十位顯示
- P0=seg7code[g];//送個(gè)位段選值
- LED_NBG=0;//開(kāi)啟個(gè)位顯示
- LED_NBS=1;//關(guān)閉十位顯示
- delay(10);
- LED_NBG=1;//關(guān)閉個(gè)位顯示
- LED_NBS=1;//關(guān)閉十位顯示
- }
- /**********************************************************************
- 東西數(shù)碼管動(dòng)態(tài)掃描
- *********************************************************************/
- void Display_DX(u16 Data) //顯示函數(shù)
- {
- u8 s,g;
- s=Data/10; //求十位
- g=Data%10; //求個(gè)位
- P0=seg7code[s];
- LED_DXG=1;
- LED_DXS=0;
- delay(10);
- LED_DXG=1;
- LED_DXS=1;
- P0=seg7code[g];
- LED_DXG=0;
- LED_DXS=1;
- delay(10);
- LED_DXG=1;
- LED_DXS=1;
- }
- /******************************************************************
- 特殊模式函數(shù)
- ******************************************************************/
- void TS_Mode()
- {
- while(JJ==0)//緊急模式/全亮紅燈
- {
- P0=1;//關(guān)閉數(shù)碼管
- GNB=1;//南北綠燈滅
- YNB=1;//南北黃燈滅
- RNB=0;//南北紅燈亮
- GRNB=1;//南北人行道綠燈滅
- RRNB=0;//南北人行道紅燈亮
- GDX=1;//東西綠燈滅
- YDX=1;//東西黃燈滅
- RDX=0;//東西紅燈亮
- GRDX=1;//東西人行道綠燈滅
- RRDX=0;//東西人行道紅燈亮
- }
- while(YJ==0)//夜間模式/黃燈閃爍
- {
- P0=1;//關(guān)閉數(shù)碼管
- GRNB=1;//南北人行道綠燈滅
- RRNB=1;//南北人行道紅燈滅
- GRDX=1;//東西人行道綠燈滅
- RRDX=1;//東西人行道紅燈滅
- if(Time<=10)
- {
- GNB=1;//南北綠燈滅
- YNB=1;//南北黃燈滅
- RNB=1;//南北紅燈滅
- GDX=1;//東西綠燈滅
- YDX=1;//東西黃燈滅
- RDX=1;//東西紅燈滅
- }
- else if(Time<=20)
- {
- GNB=1;//南北綠燈滅
- YNB=0;//南北黃燈亮
- RNB=1;//南北紅燈滅
- GDX=1;//東西綠燈滅
- YDX=0;//東西黃燈亮
- RDX=1;//東西紅燈滅
- }
- }
- }
- /******************************************************************
- 按鍵調(diào)整函數(shù)
- ******************************************************************/
- void Key_Adjust()
- {
- u16 count=0;//循環(huán)計(jì)次
- if(RADD==0)//增加?xùn)|西通行時(shí)間
- {
- Time_DX_Save++;
- if(Time_DX_Save>=99)
- Time_DX_Save=99;
- EA=0;//關(guān)中斷
- for(count=0;count<20;count++)
- {
- LED_NBG=1;//南北數(shù)碼管不顯示
- LED_NBS=1;
- Display_DX(Time_DX_Save);//調(diào)整的東西數(shù)碼管顯示時(shí)間
- }
- EA=1;//開(kāi)中斷
- }
- if(RSUB==0)//減少東西通行時(shí)間
- {
- Time_DX_Save--;
- if(Time_DX_Save<=0)
- Time_DX_Save=0;
- EA=0;//關(guān)中斷
- for(count=0;count<20;count++)
- {
- LED_NBG=1;//南北數(shù)碼管不顯示
- LED_NBS=1;
- Display_DX(Time_DX_Save);//調(diào)整的東西數(shù)碼管顯示時(shí)間
- }
- EA=1;//開(kāi)中斷
- }
- if(GADD==0)//增加南北通行時(shí)間
- {
- Time_NB_Save++;
- if(Time_NB_Save>=99)
- Time_NB_Save=99;
- EA=0;//關(guān)中斷
- for(count=0;count<20;count++)
- {
- Display_NB(Time_NB_Save);//調(diào)整的南北數(shù)碼管顯示時(shí)間
- LED_DXG=1;//東西數(shù)碼管不顯示
- LED_DXS=1;
- }
- EA=1;//開(kāi)中斷
- }
- if(GSUB==0)//減少南北通行時(shí)間
- {
- Time_NB_Save--;
- if(Time_NB_Save<=0)
- Time_NB_Save=0;
- EA=0;//關(guān)中斷
- for(count=0;count<20;count++)
- {
- Display_NB(Time_NB_Save);//調(diào)整的南北數(shù)碼管顯示時(shí)間
- LED_DXG=1;//東西數(shù)碼管不顯示
- LED_DXS=1;
- }
- EA=1;//開(kāi)中斷
- }
- }
- /******************************************************************
- 主函數(shù)
- ******************************************************************/
- void main()
- {
- Time0_Init();
- while(1)
- {
- if(Run_Flag==0)//南北綠燈東西紅燈
- {
- Time_NB=Time_NB_Save;//獲取南北綠燈倒計(jì)時(shí)時(shí)間
- Time_DX=Time_NB_Save+Time_Y_Save;//獲取東西紅燈倒計(jì)時(shí)時(shí)間
- Time=0;//初始化計(jì)時(shí)時(shí)間
- while(1)
- {
- TS_Mode();//特殊模式檢測(cè)
- Key_Adjust();//按鍵調(diào)整時(shí)間檢測(cè)
- GNB=0;//南北綠燈亮
- YNB=1;//南北黃燈滅
- RNB=1;//南北紅燈滅
- GRNB=0;//南北人行道綠燈亮
- RRNB=1;//南北人行道紅燈滅
- GDX=1;//東西綠燈滅
- YDX=1;//東西黃燈滅
- RDX=0;//東西紅燈亮
- GRDX=1;//東西人行道綠燈滅
- RRDX=0;//東西人行道紅燈亮
- if(GADD!=0&&GSUB!=0&&RADD!=0&&RSUB!=0)//無(wú)按鍵按下
- {
- Display_NB(Time_NB);//南北數(shù)碼管顯示時(shí)間
- Display_DX(Time_DX);//東西數(shù)碼管顯示時(shí)間
- }
- if(Time_NB==0)
- {
- Run_Flag=1;//即將進(jìn)入南北黃燈東西黃燈
- break;
- }
- }
- }
- if(Run_Flag==1)//南北黃燈東西紅燈
- {
- Time_Y=Time_Y_Save;//黃燈倒計(jì)時(shí)時(shí)間
- Time=0;//初始化計(jì)時(shí)時(shí)間
- while(1)
- {
- TS_Mode();//特殊模式檢測(cè)
- Key_Adjust();//按鍵調(diào)整時(shí)間檢測(cè)
- GNB=1;//南北綠燈滅
- YNB=0;//南北黃燈亮
- RNB=1;//南北紅燈滅
- GRNB=1;//南北人行道綠燈滅
- RRNB=0;//南北人行道紅燈亮
- GDX=1;//東西綠燈滅
- YDX=1;//東西黃燈滅
- RDX=0;//東西紅燈亮
- GRDX=1;//東西人行道綠燈滅
- RRDX=0;//東西人行道紅燈亮
- Display_NB(Time_Y);//南北數(shù)碼管顯示時(shí)間
- Display_DX(Time_Y);//東西數(shù)碼管顯示時(shí)間
- if(Time_Y==0)
- {
- Run_Flag=2;//即將進(jìn)入南北紅燈東西綠燈
- break;
- }
- }
- }
- if(Run_Flag==2)//東西綠燈南北紅燈
- {
- Time_DX=Time_DX_Save;//獲取東西綠燈倒計(jì)時(shí)時(shí)間
- Time_NB=Time_DX_Save+Time_Y_Save;//獲取南北紅燈倒計(jì)時(shí)時(shí)間
- Time=0;//初始化計(jì)時(shí)時(shí)間
- while(1)
- {
- TS_Mode();//特殊模式檢測(cè)
- Key_Adjust();//按鍵調(diào)整時(shí)間檢測(cè)
- GNB=1;//南北綠燈滅
- YNB=1;//南北黃燈滅
- RNB=0;//南北紅燈亮
- GRNB=1;//南北人行道綠燈滅
- RRNB=0;//南北人行道紅燈亮
- GDX=0;//東西綠燈亮
- YDX=1;//東西黃燈滅
- RDX=1;//東西紅燈滅
- GRDX=0;//東西人行道綠燈亮
- RRDX=1;//東西人行道紅燈滅
- if(GADD!=0&&GSUB!=0&&RADD!=0&&RSUB!=0)//無(wú)按鍵按下
- {
- Display_DX(Time_DX);//東西數(shù)碼管顯示時(shí)間
- Display_NB(Time_NB);//南北數(shù)碼管顯示時(shí)間
- }
- if(Time_DX==0)
- {
- Run_Flag=3;//即將進(jìn)入南北黃燈東西黃燈
- break;
- }
- }
- }
- if(Run_Flag==3)//東西黃燈南北紅燈
- {
- Time_Y=Time_Y_Save;//黃燈倒計(jì)時(shí)時(shí)間
- Time=0;//初始化計(jì)時(shí)時(shí)間
- while(1)
- {
- TS_Mode();//特殊模式檢測(cè)
- Key_Adjust();//按鍵調(diào)整時(shí)間檢測(cè)
- GNB=1;//南北綠燈滅
- YNB=1;//南北黃燈滅
- RNB=0;//南北紅燈亮
- GRNB=1;//南北人行道綠燈滅
- RRNB=0;//南北人行道紅燈亮
-
- GDX=1;//東西綠燈滅
- YDX=0;//東西黃燈亮
- RDX=1;//東西紅燈滅
- GRDX=1;//東西人行道綠燈滅
- RRDX=0;//東西人行道紅燈亮
- Display_NB(Time_Y);//南北數(shù)碼管顯示時(shí)間
- Display_DX(Time_Y);//東西數(shù)碼管顯示時(shí)間
- if(Time_Y==0)
- {
- Run_Flag=0;//即將進(jìn)入南北綠燈東西紅燈
- break;
- }
- }
- }
- }
- }
- /*********定時(shí)器中斷**********/
- void Timer0() interrupt 1
- {
- TH0=0X3C;//重裝初值
- TL0=0XB0;
- Time++;//中斷計(jì)次,每進(jìn)一次中斷50ms
- if(Time==20)//計(jì)時(shí)1秒
- {
- Time=0;
- if(JJ!=0&&YJ!=0)//非緊急模式或者夜間模式
- {
- if(Run_Flag==0)//南北綠燈東西紅燈
- {
- Time_NB--;//南北綠燈時(shí)間倒計(jì)時(shí)
- Time_DX--;//東西紅燈時(shí)間倒計(jì)時(shí)
- if(Time_NB<=0)
- {
- Time_NB=0;
- }
- }
- else if(Run_Flag==1)//南北黃燈東西紅燈
- {
- Time_Y--;//黃燈時(shí)間倒計(jì)時(shí)
- Time_DX--;//東西紅燈時(shí)間倒計(jì)時(shí)
- if(Time_Y<=0)
- {
- Time_Y=0;
- }
- }
- else if(Run_Flag==2)//南北黃燈東西黃燈
- {
- Time_DX--;//東西綠燈時(shí)間倒計(jì)時(shí)
- Time_NB--;//南北紅燈時(shí)間倒計(jì)時(shí)
- if(Time_DX<=0)
- {
- Time_DX=0;
- }
- }
- else if(Run_Flag==3)//東西黃燈南北紅燈
- {
- Time_Y--;//黃燈時(shí)間倒計(jì)時(shí)
- Time_NB--;//南北紅燈時(shí)間倒計(jì)時(shí)
- if(Time_Y<=0)
- {
- Time_Y=0;
- }
- }
- }
- }
- }
復(fù)制代碼
附件包括源代碼和仿真文件。
交通燈.zip
(257.17 KB, 下載次數(shù): 85)
2018-5-15 21:49 上傳
點(diǎn)擊文件名下載附件
|
|