(分享設計)通過定時器計數,數碼管顯示倒計時,led燈顯示通行狀態(tài)。按鍵1功能是在緊急車輛通過時,按下開關,使四個方向均為紅燈,放行20S。按鍵2可改變紅綠燈的狀態(tài)。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
交通燈.png (28.92 KB, 下載次數: 109)
下載附件
protues仿真圖
2018-11-22 17:43 上傳
單片機源程序如下:
- /*****************************************************
- 十字路口交通燈控制 C 程序
- ******************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*****定義控制位**********************/
- //東西方向交通燈
- sbit EW_LED2=P2^3; //EW_LED2控制位
- sbit EW_LED1=P2^2; //EW_LED1控制位
- //南北方向交通燈
- sbit SN_LED2=P2^1; //SN_LED2控制位
- sbit SN_LED1=P2^0; //SN_LED1控制位
- sbit SN_Yellow=P1^6;//SN黃燈
- sbit EW_Yellow=P1^2;//EW黃燈
- bit Flag_SN_Yellow; //SN黃燈標志位
- bit Flag_EW_Yellow;//EW黃燈標志位
- uchar flag_EW=0;//EW方向交通管制標志位
- uchar flag_SN=0;//SN方向交通管制標志位
- int Time_EW;//東西方向倒計時單元
- int Time_SN;//南北方向倒計時單元
- static uchar count; //計數用的變量
- uchar a,b,c,d,e,f,g; //保護斷點變量
- char red_time=30,yellow_time=5,green_time=25; //程序初始化賦值,正常模式
- uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰極段碼0~~~~9段選碼
- uchar code S[5]={0XD7,0XE7,0X7D,0X7E,0x77};//交通信號燈控制代碼
- /**********************延時子程序************************/
- void Delay(uchar a)
- {
- uchar i;
- i=a;
- while(i--){;}
- }
- /*****************顯示子函數**************************/
- void Display(void)
- { //顯示東西方向交通燈
- char h,l;
- h=Time_EW/10;
- l=Time_EW%10;
- P0=table[l];
- EW_LED2=1; //東西方向選中個位
- Delay(2);
- EW_LED2=0; //清屏
- P0=table[h];
- EW_LED1=1; //東西方向選中十位
- Delay(2);
- EW_LED1=0; //清屏
- //顯示南北方向交通燈
- h=Time_SN/10;
- l=Time_SN%10;
- P0=table[l];
- SN_LED2=1; //南北方向選中個位
- Delay(2);
- SN_LED2=0; //清屏
- P0=table[h];
- SN_LED1=1; //南北方向選中十位
- Delay(2);
- SN_LED1=0; //清屏
- }
- /**********************T0中斷服務程序*******************/
- void timer0(void)interrupt 1 using 1
- {
- TH0=(65536-50000)/256; //定時器定時50ms
- TL0=(65536-50000)%256;
- count++;
- if(count==10)
- { //黃燈閃爍程序
- if(Flag_SN_Yellow==1) //測試南北黃燈標志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1) //測試東西黃燈標志位
- {EW_Yellow=~EW_Yellow;}
- }
- if(count==20)
- {
- //倒計時
- Time_EW--;
- Time_SN--;
- //黃燈閃爍程序
- if(Flag_SN_Yellow==1)//測試南北黃燈標志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1)//測試東西黃燈標志位
- {EW_Yellow=~EW_Yellow;}
- count=0;
- }
- }
- /*********************主程序開始**********************/
- void main(void)
- {
- TMOD=0x01;//定時器工作于方式1
- TH0=(65536-50000)/256;//定時器賦初值
- TL0=(65536-50000)%256;
- EA=1; //CPU開中斷總允許
- ET0=1;//開定時中斷
- TR0=1;//啟動定時
- EX0=1;//外部中斷0允許位
- IT0=1;//選擇外部中斷0是跳沿觸發(fā)
- EX1=1;//外部中斷1允許位
- IT1=1;//選擇外部中斷1是跳沿觸發(fā)
- while(1)
- { flag_EW=0;//EW方向交通管制標志位
- Flag_EW_Yellow=0; //EW關黃燈顯示信號
- Time_EW=red_time;
- Time_SN=green_time;
- while(Time_SN>0)
- {
- P1=S[0]; //SN通行,EW紅燈
- Display();
- }
- /*******黃燈閃爍**********/
- P1=0xF7;
- Time_SN=yellow_time; //
- while(Time_SN>0)
- {
- Flag_SN_Yellow=1; //SN開黃燈信號位
- Display();
- }
-
- flag_SN=0;//SN方向交通管制標志位
- Flag_SN_Yellow=0; //SN關黃燈顯示信號
- Time_EW=green_time;
- Time_SN=red_time;
- while(Time_EW>0)
- {P1=S[2]; //EW通行,SN紅燈
- Display();}
- /*******黃燈閃爍**********/
- P1=0X7F;
- Time_EW=yellow_time;
- while(Time_EW>0)
- {Flag_EW_Yellow=1;//EW開黃燈信號位
- Display();}
- }
- }
- /*
- *********************外部中斷0服務程序******************
- 緊急情況按下鍵后四個方向的燈都變?yōu)榧t色并倒計時20秒
- */
- void int0_int (void) interrupt 0 using 0
- {
- EA=0;
- a=TH0;b=TL0;c=Time_EW;d=Time_SN;e=Flag_EW_Yellow;f=P1;g=count;//保護斷點
- EA=1;
- IP=0x02;
- Time_EW=Time_SN=20;
- while(Time_EW>0)
- {P1=0X77;Display();}
- Flag_EW_Yellow=0;
- Flag_SN_Yellow=0;
- while(Time_EW==0)
- {TH0=a;TL0=b;Time_EW=c;Time_SN=d;Flag_EW_Yellow=e;P1=f;count=g;}//恢復現(xiàn)場
- }
- /**********************外部中斷1服務程序******************
- 在SN放行期間,若EW有車而SN無車,按下開關K供EW放行15S;
- 在EW放行期間,若SN有車而EW無車,按下開關K供SN放行15S。
- */
- void int1_int (void) interrupt 2
- {
- EA=0;
- a=TH0;b=TL0;c=Time_EW;d=Time_SN;e=Flag_EW_Yellow;f=P1;g=count;//保護斷點
- EA=1;
- IP=0X02;
- if(P1==S[0])
- {
- if(flag_EW==0)
- {
- Time_EW=Time_SN=15;
- while(Time_EW>0)
- {P1=S[2];Display();}
- Flag_EW_Yellow=0;
- Flag_SN_Yellow=0;
- }
- flag_SN=1;
- }
- if(P1==S[2])
- {
- if(flag_SN==0)
- {
- Time_EW=Time_SN=15;
- while(Time_EW>0)
- {P1=S[0];Display();}
- Flag_EW_Yellow=0;
- Flag_SN_Yellow=0;
- }
- flag_EW=1;
- }
- while(Time_EW==0)
- {TH0=a;TL0=b;Time_EW=c;Time_SN=d;Flag_EW_Yellow=e;P1=f;count=g;}//恢復現(xiàn)場
- }
復制代碼
所有資料51hei提供下載:
交通燈.zip
(43.53 KB, 下載次數: 173)
2018-11-22 21:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|