實現功能: 1.該控制系統能控制東西南北四個路口的紅黃綠燈正常工作。東西和南北方向分時準行和禁行。 2.兩垂直方向的準行時間均為50s或100s,可以進行控制轉換。 3.準行方向亮綠燈與禁行方向亮紅燈最后3秒時,四個路口同時加亮一黃燈進行閃爍,以警告車輛及行人,準行方向與禁行方向即將改變。 4.四個道口均用數碼管顯示準行或禁行的剩余時間。 5.在交通情況特殊情況下可以通過K1、K2、K3按鍵對交通燈進行控制。實現: 1)當有緊急情況發生時按下K1四個路口同時加亮黃燈進行閃燈(閃燈時間為3s)且倒計時顯示關閉。黃燈閃爍完畢后四路口全變紅燈禁行,處理緊急情況。 2)有某方向上車輛過多,可以使用K2、K3鍵控制東西或南北方向通行,另一方向禁行。按下控制鍵后先在四個路口加3s的黃燈閃爍。
0.png (27.32 KB, 下載次數: 37)
下載附件
2017-12-13 13:51 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit k1=P1^6;
- sbit k2=P1^7;
- sbit k3=P2^7;
- sbit yellowled_nb=P1^4; //南北黃燈
- sbit yellowled_dx=P1^1; //東西黃燈
- uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
- uchar data dig; //位選
- uchar data led; //偏移量
- uchar data buf[4];
- uchar data sec_dx=50;//東西數碼指示值
- uchar data sec_nb=50;//南北數碼指示值
- uchar data set_timedx=50;
- uchar data set_timenb=50;//倒計時設置的鍵值保存
- uchar data b;//定時器中斷次數
- bit time;//燈狀態循環標志
- bit int0_time;//中斷強行標志
- bit set;//調時切換鍵標志
- uint i;
- void delay(int ms)
- {
- uint j,k;
- for(j=0;j<ms;j++)
- for(k=0;k<124;k++);
- }
- void key()
- {
- if (k1!=1) //故障時禁止通行
- {
- while(k1!=1);
- TR0=0;
- for(i=0;i<3;i++)
- {
- yellowled_dx=1;
- yellowled_nb=1;
- delay(500);
- yellowled_dx=0;
- yellowled_nb=0;
- delay(500);
- }
- P1=0xf6;
- sec_nb=88;
- sec_dx=88;
- int0_time=1;
- }
- if(k2!=1&&set==1) //切換準行時間100s
- {
- while(k2!=1);
- TR0=0;
- set_timedx=99;
- set_timenb=99;
- sec_dx=99;
- sec_nb=99;
- set=0;
- }
- if(k2!=1&&set==0) //切換準行時間50s
- {
- while(k2!=1);
- TR0=0;
- set_timedx=50;
- set_timenb=50;
- sec_dx=50;
- sec_nb=50;
- set=1;
- }
- if(k3!=1) //復位
- {
- sec_dx=set_timedx;
- sec_nb=set_timenb;
- TR0=1;
- }
- }
- void display()
- {
- buf[1]=sec_dx/10; //第1位 東西秒十位
- buf[2]=sec_dx%10; //第2位 東西秒個位
- buf[3]=sec_nb/10; //第3位 南北秒十位
- buf[0]=sec_nb%10; //第4位 南北秒個位
- P0=table[buf[led]];
- delay(2); //先延時,提前顯示一位
- P2=dig;
- dig=_crol_(dig,1);
- led++;
- if(led==4)
- {
- led=0;
- dig=0xfe;
- }
- }
- void main()
- {
- TMOD=0x01;
- TH0=0x3C;
- TL0=0xB0;
- EA=1;
- ET0=1;
- TR0=1;
- EX0=1;
- EX1=1;
- P1=0Xf3;// 東西通行
- while(1)
- {
- key(); //調用按鍵掃描程序
- display(); //調用顯示程序
- }
- }
- void t0() interrupt 1 using 1 //定時中斷子程序
- {
- b++;
- if(b==10) // 定時器中斷次數。
- {
- b=0;
- sec_dx--;
- sec_nb--;
- if(sec_nb==3&&time==0)
- {
- yellowled_nb=1;//南北黃燈亮
- yellowled_dx=1; //東西黃燈亮
- delay(500);
- yellowled_nb=0;
- yellowled_dx=0;
- }
- if(sec_nb==2&&time==0)
- {
- yellowled_nb=1;//南北黃燈亮
- yellowled_dx=1; //東西黃燈亮
- delay(500);
- yellowled_nb=0;
- yellowled_dx=0;
- }
- if(sec_nb==1&&time==0)
- {
- yellowled_nb=1;//南北黃燈亮
- yellowled_dx=1; //東西黃燈亮
- delay(500);
- yellowled_nb=0;
- yellowled_dx=0;
- }
- //東西黃燈閃判斷
- if(sec_dx==3&&time==1)
- {
- yellowled_nb=1;//南北黃燈亮
- yellowled_dx=1; //東西黃燈亮
- delay(500);
- yellowled_nb=0;
- yellowled_dx=0;
- }
- if(sec_dx==2&&time==1)
- {
- yellowled_nb=1;//南北黃燈亮
- yellowled_dx=1; //東西黃燈亮
- delay(500);
- yellowled_nb=0;
- yellowled_dx=0;
- }
- if(sec_dx==1&&time==1)
- {
- yellowled_nb=1;//南北黃燈亮
- yellowled_dx=1; //東西黃燈亮
- delay(500);
- yellowled_nb=0;
- yellowled_dx=0;
- }
- if(sec_dx==0||sec_nb==0) //東西或南北先到達1S時即開始重新計時
- {
- sec_dx=set_timedx;
- sec_nb=set_timenb; //第一次循環結束重置
- if(time==1)
- {
- P1=0xF3; //東西通行
- }
- else
- {
- P1=0xde; //南北通行
- }
- time=!time; //取反
- }
- }
- }
- void nb1() interrupt 2 using 1 //南北通行 東西禁行
- {
- TR0=0;
- for(i=0;i<3;i++)
- {
- yellowled_dx=1;
- yellowled_nb=1;
- delay(500);
- yellowled_dx=0;
- yellowled_nb=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (7.71 KB, 下載次數: 66)
下載附件
2017-12-13 13:52 上傳
所有資料51hei提供下載:
智能交通燈.rar
(70.96 KB, 下載次數: 185)
2017-12-13 12:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|