1 任务目标 某十字路口,南北向为主干道,东西向为支道,每个道口安装一组交通灯:红、黄、绿。设计十字路口的交通灯控制器,使交通灯按状态1 状态2 状态3 状态4 的规律变化,循环不止。 状态1:东西向绿灯亮,南北向红灯亮,其他灯全灭,保持30 秒 状态2:东西向黄灯亮,南北向红灯亮,其他灯全灭,保持5 秒
状态3:东西向红灯亮,南北向绿灯亮,其他灯全灭,保持20 秒
状态4:东西向红灯亮,南北向黄灯亮,其他灯全灭,保持5 秒
/*****************************************************
ååè·¯å£äº¤éç¯æ§å¶ C ç¨åº
******************************************************/
#defineucharunsigned char
#defineuintunsigned int
#include<reg52.h>
/*****å®ä¹æ§å¶ä½**********************/
sbit Time_Show_LED2=P2^5;//Time_Show_LED2æ§å¶ä½
sbit Time_Show_LED1=P2^4;//Time_Show_LED1æ§å¶ä½
sbitEW_LED2=P2^3;//EW_LED2æ§å¶ä½
sbitEW_LED1=P2^2;//EW_LED1æ§å¶ä½
sbitSN_LED2=P2^1;//SN_LED2æ§å¶ä½
sbitSN_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;//æ¶é´å
sbit Reduces_Button=P3^4;//æ¶é´å
bit Flag_SN_Yellow; //SNé»ç¯æ å¿ä½
bit Flag_EW_Yellow;//EWé»ç¯æ å¿ä½
charTime_EW;//ä¸è¥¿æ¹åå计æ¶åå
charTime_SN;//ååæ¹åå计æ¶åå
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};//交éä¿¡å·ç¯æ§å¶ä»£ç
/**********************延æ¶åç¨åº************************/
voidDelay(uchar a)
{
uchari;
i=a;
while(i--){;}
}
/*****************æ¾ç¤ºåå½æ°**************************/
voidDisplay(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ä¸ææå¡ç¨åº************************/
voidEXINT0(void)interrupt 0 using 1
{
EX0=0; //å ³ä¸æ
if(Add_Button==0) //æ¶é´å
{
EW1+=5;
SN1+=5;
if(EW1>=100)
{
EW1=99;
SN1=79;
}
}
if(Reduces_Button==0) //æ¶é´å
{
EW1-=5;
SN1-=5;
if(EW1<=40)
{
EW1=40;
SN1=20;
}
}
if(Nomor_Button==0)//æµè¯æé®æ¯å¦æä¸ï¼æä¸ä¸ºæ£å¸¸ç¶æ
{
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0;//å ³ç¹å¿ä¿¡å·ç¯
Special_LED =0;//å ³ç¹æ®ä¿¡å·ç¯
}
if(Busy_Btton==0) //æµè¯æé®æ¯å¦æä¸ï¼æä¸ä¸ºç¹å¿ç¶æ
{
EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0;//å ³ç¹æ®ä¿¡å·ç¯
Busy_LED=1;//å¼ç¹å¿ä¿¡å·ç¯
}
if(Special_Btton==0)//æµè¯æé®æ¯å¦æä¸ï¼æä¸ä¸ºç¹æ®ç¶æ
{
EW1=75;
SN1=55;
EWL1=19;
SNL1=19;
Busy_LED=0;//å ³ç¹å¿ä¿¡å·ç¯
Special_LED =1;//å¼ç¹æ®ä¿¡å·ç¯
}
EX0=1;//å¼ä¸æ
}
/**********************T0ä¸ææå¡ç¨åº*******************/
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) //æµè¯ååé»ç¯æ å¿ä½
{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;
}
}
/*********************主ç¨åºå¼å§**********************/
voidmain(void)
{
Busy_LED=0;
Special_LED=0;
IT0=1;//INT0è´è·³å触å
TMOD=0x01;//å®æ¶å¨å·¥ä½äºæ¹å¼1
TH0=(65536-50000)/256;//å®æ¶å¨èµåå¼
TL0=(65536-50000)%256;
EA=1; //CPUå¼ä¸ææ»å 许
ET0=1;//å¼å®æ¶ä¸æ
EX0=1;//å¼å¤é¨INTOä¸æ
TR0=1;//å¯å¨å®æ¶
while(1)
{/*******S0ç¶æ**********/
EW_ManGreen=0;//EW人è¡éç¦æ¢
SN_ManGreen=1;//SN人è¡ééè¡
Flag_EW_Yellow=0; //EWå ³é»ç¯æ¾ç¤ºä¿¡å·
Time_EW=EW;
Time_SN=SN;
while(Time_SN>=5)
{P1=S[0]; //SNéè¡ï¼EW红ç¯
Display();}
/*******S1ç¶æ**********/
P1=0x00;
while(Time_SN>=0)
{Flag_SN_Yellow=1; //SNå¼é»ç¯ä¿¡å·ä½
EW_Red=1; //SNé»ç¯äº®ï¼çå¾ å·¦æä¿¡å·ï¼EW红ç¯
Display();
}
/*******S2ç¶æ**********/
Flag_SN_Yellow=0; //SNå ³é»ç¯æ¾ç¤ºä¿¡å·
Time_SN=SNL;
while(Time_SN>=5)
{P1=S[2];//SNå·¦æ绿ç¯äº®ï¼EW红ç¯
Display();}
/*******S3ç¶æ**********/
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ç¶æ**********/
EW_ManGreen=~EW_ManGreen;//EW人è¡ééè¡
SN_ManGreen=~SN_ManGreen;//SN人è¡éç¦æ¢
Flag_SN_Yellow=0; //SNå ³é»ç¯æ¾ç¤ºä¿¡å·
Time_EW=SN;
Time_SN=EW;
while(Time_EW>=5)
{P1=S[4]; //EWéè¡ï¼SN红ç¯
Display();}
/*******S5ç¶æ**********/
P1=0X00;
while(Time_EW>=0)
{Flag_EW_Yellow=1;//EWå¼é»ç¯ä¿¡å·ä½
SN_Red=1;//EWé»ç¯äº®ï¼çå¾ å·¦æä¿¡å·ï¼SN红ç¯
Display();}
/*******S6ç¶æ**********/
Flag_EW_Yellow=0; //EWå ³é»ç¯æ¾ç¤ºä¿¡å·
Time_EW=EWL;
while(Time_EW>=5)
{P1=S[6];//EWå·¦æ绿ç¯äº®ï¼SN红ç¯
Display();}
/*******S7ç¶æ**********/
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;
}
}