|
- /*****************************************************
- 十字路口交通燈控制 C 程序
- ******************************************************/
- #define uchar unsigned char
- #define uint unsigned int
- #include <reg52.h>
- /*****定義控制位**********************/
- sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位
- sbit Time_Show_LED1=P2^4;//Time_Show_LED1控制位
- 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黃燈
- sbit EW_Red=P1^3;//EW紅燈
- sbit SN_Red=P1^7;//SN紅燈
- sbit EW_ManGreen=P3^0;//EW人行道綠燈
- sbit SN_ManGreen=P3^1;//SN人行道綠燈
- sbit Special_LED=P2^6;//交通正常指示燈
- sbit Busy_LED=P2^7;//交通繁忙指示燈
- sbit Nomor_Button=P3^5;//交通正常按鍵
- sbit Busy_Btton=P3^6;//交通繁忙按鍵
- sbit Special_Btton=P3^7;//交通特殊按鍵
- sbit Add_Button=P3^3;//時(shí)間加
- sbit Reduces_Button=P3^4;//時(shí)間減
- bit Flag_SN_Yellow; //SN黃燈標(biāo)志位
- bit Flag_EW_Yellow;//EW黃燈標(biāo)志位
- char Time_EW;//東西方向倒計(jì)時(shí)單元
- char Time_SN;//南北方向倒計(jì)時(shí)單元
- uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化賦值,正常模式
- uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的變量
- uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段選碼
- uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信號燈控制代碼
- /**********************延時(shí)子程序************************/
- void Delay(uchar a)
- {
- uchar i;
- i=a;
- while(i--){;}
- }
- /*****************顯示子函數(shù)**************************/
- 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;
-
- 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中斷服務(wù)程序************************/
- void EXINT0(void)interrupt 0 using 1
- {
- EX0=0; //關(guān)中斷
- if(Add_Button==0) //時(shí)間加
- {
- EW1+=5;
- SN1+=5;
- if(EW1>=100)
- {
- EW1=99;
- SN1=79;
- }
- }
- if(Reduces_Button==0) //時(shí)間減
- {
- EW1-=5;
- SN1-=5;
- if(EW1<=40)
- {
- EW1=40;
- SN1=20;
- }
-
- }
- if(Nomor_Button==0)//測試按鍵是否按下,按下為正常狀態(tài)
- {
- EW1=60;
- SN1=40;
- EWL1=19;
- SNL1=19;
- Busy_LED=0;//關(guān)繁忙信號燈
- Special_LED =0;//關(guān)特殊信號燈
- }
- if(Busy_Btton==0) //測試按鍵是否按下,按下為繁忙狀態(tài)
- {
- EW1=45;
- SN1=30;
- EWL1=14;
- SNL1=14;
- Special_LED=0;//關(guān)特殊信號燈
- Busy_LED=1;//開繁忙信號燈
-
- }
- if(Special_Btton==0)//測試按鍵是否按下,按下為特殊狀態(tài)
- {
- EW1=75;
- SN1=55;
- EWL1=19;
- SNL1=19;
- Busy_LED=0;//關(guān)繁忙信號燈
- Special_LED =1;//開特殊信號燈
-
- }
- EX0=1;//開中斷
- }
- /**********************T0中斷服務(wù)程序*******************/
- void timer0(void)interrupt 1 using 1
- {
- static uchar count;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
-
- if(count==10)
- {
- if(Flag_SN_Yellow==1) //測試南北黃燈標(biāo)志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1) //測試東西黃燈標(biāo)志位
- {EW_Yellow=~EW_Yellow;}
- }
- if(count==20)
- {
- Time_EW--;
- Time_SN--;
- if(Flag_SN_Yellow==1)//測試南北黃燈標(biāo)志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1)//測試東西黃燈標(biāo)志位
- {EW_Yellow=~EW_Yellow;}
- count=0;
- }
-
- }
- /*********************主程序開始**********************/
- void main(void)
- {
- Busy_LED=0;
- Special_LED=0;
- IT0=1; //INT0負(fù)跳變觸發(fā)
- TMOD=0x01;//定時(shí)器工作于方式1
- TH0=(65536-50000)/256;//定時(shí)器賦初值
- TL0=(65536-50000)%256;
- EA=1; //CPU開中斷總允許
- ET0=1;//開定時(shí)中斷
- EX0=1;//開外部INTO中斷
- TR0=1;//啟動(dòng)定時(shí)
- while(1)
- { /*******S0狀態(tài)**********/
- EW_ManGreen=0; //EW人行道禁止
- SN_ManGreen=1;//SN人行道通行
- Flag_EW_Yellow=0; //EW關(guān)黃燈顯示信號
- Time_EW=EW;
- Time_SN=SN;
- while(Time_SN>=5)
- {P1=S[0]; //SN通行,EW紅燈
- Display();}
- /*******S1狀態(tài)**********/
- P1=0x00;
- while(Time_SN>=0)
- {Flag_SN_Yellow=1; //SN開黃燈信號位
- EW_Red=1; //SN黃燈亮,等待左拐信號,EW紅燈
-
- Display();
- }
- /*******S2狀態(tài)**********/
- Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號
- Time_SN=SNL;
- while(Time_SN>=5)
- {P1=S[2];//SN左拐綠燈亮,EW紅燈
- Display();}
- /*******S3狀態(tài)**********/
- P1=0x00;
- while(Time_SN>=0)
- {Flag_SN_Yellow=1; //SN開黃燈信號位
- EW_Red=1; //SN黃燈亮,等待停止信號,EW紅燈
-
- Display();}
- /***********賦值**********/
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
- /*******S4狀態(tài)**********/
- EW_ManGreen=~EW_ManGreen;//EW人行道通行
- SN_ManGreen=~SN_ManGreen;//SN人行道禁止
- Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號
- Time_EW=SN;
- Time_SN=EW;
- while(Time_EW>=5)
- {P1=S[4]; //EW通行,SN紅燈
- Display();}
- /*******S5狀態(tài)**********/
- P1=0X00;
- while(Time_EW>=0)
- {Flag_EW_Yellow=1;//EW開黃燈信號位
- SN_Red=1;//EW黃燈亮,等待左拐信號,SN紅燈
- Display();}
- /*******S6狀態(tài)**********/
- Flag_EW_Yellow=0; //EW關(guān)黃燈顯示信號
- Time_EW=EWL;
- while(Time_EW>=5)
- {P1=S[6];//EW左拐綠燈亮,SN紅燈
- Display();}
- /*******S7狀態(tài)**********/
- P1=0X00;
- while(Time_EW>=0)
- {Flag_EW_Yellow=1; //EN開黃燈信號位
- SN_Red=1;//EW黃燈亮,等待停止信號,SN紅燈
- Display();}
-
- /***********賦值**********/
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
- }
- }
復(fù)制代碼 |
|