|
- #define uchar unsigned char
- #define uint unsigned int
- #include <reg52.h>
- /*****定義控制位**********************/
- 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 SN_Red=P1^7; //SN紅燈
- sbit EW_Yellow=P1^2; //EW黃燈
- sbit EW_Red=P1^3; //EW紅燈
- 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=10,SN=10,EWL=3,SNL=3; //程序初始化賦值,正常模式
- uchar EW1=10,SN1=10,EWL1=3,SNL1=3; //用于存放修改值的變量
- uchar code table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0~~~~9段選碼
- uchar code S[9]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84,0x88};//交通信號(hào)燈控制代碼
- /**********************延時(shí)子程序************************/
- void delay_ms(unsigned int x) //延時(shí)ms
- {
- unsigned int i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*****************顯示子函數(shù)**************************/
- void Display(void)
- {
- char h,l;
- h=Time_EW/10;
- l=Time_EW%10;
- P0=table[l];
- EW_LED2=1;
- delay_ms(1);
- EW_LED2=0;
- P0=table[h];
- EW_LED1=1;
- delay_ms(1);
- EW_LED1=0;
- h=Time_SN/10;
- l=Time_SN%10;
- P0=table[l];
- SN_LED2=1;
- delay_ms(1);
- SN_LED2=0;
- P0=table[h];
- SN_LED1=1;
- delay_ms(1);
- SN_LED1=0;
-
- }
- /**********************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) //測(cè)試南北黃燈標(biāo)志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1) //測(cè)試東西黃燈標(biāo)志位
- {EW_Yellow=~EW_Yellow;}
- }
- if(count==20) {
- Time_EW--;
- Time_SN--;
- if(Flag_SN_Yellow==1)//測(cè)試南北黃燈標(biāo)志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1)//測(cè)試東西黃燈標(biāo)志位
- {EW_Yellow=~EW_Yellow;}
- count=0;
- }
-
- }
- /*********************主程序開(kāi)始**********************/
- void main(void)
- {
- TMOD=0x01;//定時(shí)器工作于方式1
- TH0=(65536-50000)/256;//定時(shí)器賦初值
- TL0=(65536-50000)%256;
- EA=1; //CPU開(kāi)中斷總允許
- ET0=1;//開(kāi)定時(shí)中斷
- TR0=1;//啟動(dòng)定時(shí)
- /*******S0狀態(tài)(初始狀態(tài))**********/
- Time_EW=3;
- Time_SN=3;
- while(Time_SN>=0||Time_EW>=0)
- {
- Flag_EW_Yellow=0; //EW關(guān)黃燈顯示信號(hào)
- P1=S[8]; //所有路口紅燈
- Display();
- }
-
- while(1)
- {
- /*******S1狀態(tài)(主干道直行狀態(tài))**********/
- Time_EW=EW;
- Time_SN=SN;
- while(Time_SN>=4)
- {
- Flag_EW_Yellow=0; //EW關(guān)黃燈顯示信號(hào)
- P1=S[0]; //SN通行,EW紅燈
- Display();
- }
-
- /*******S2狀態(tài)(主干道直行黃燈閃爍狀態(tài))**********/
- P1=0x00;
- while(Time_SN>=0)
- {
- Flag_SN_Yellow=1; //SN開(kāi)黃燈信號(hào)位
- EW_Red=1; //SN黃燈亮,等待左轉(zhuǎn)信號(hào),EW紅燈
- Display();
- }
-
-
-
- /***********賦值(主干道通行變次干道通行)**********/
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
-
- /*******S3狀態(tài)(次干道直行狀態(tài))**********/
- Time_EW=SN;
- Time_SN=EW;
- while(Time_EW>=4)
- {
- Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
- P1=S[4]; //EW通行,SN紅燈
- Display();
- }
-
- /*******S4狀態(tài)(次干道直行黃燈閃爍狀態(tài))**********/
- P1=0X00;
- while(Time_EW>=0)
- {
- Flag_EW_Yellow=1;//EW開(kāi)黃燈信號(hào)位
- SN_Red=1;//EW黃燈亮,等待左拐信號(hào),SN紅燈
- Display();
- }
-
-
-
- /***********賦值(次干道通行變主干道通行)**********/
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
- }
- }
- //注意:需要在proteus仿真軟件進(jìn)行仿真必須將上述C語(yǔ)言代碼生成為后綴名為.hex的文件
復(fù)制代碼
|
|