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