Diseño de recorrido de semáforo de un solo chip
/****************************************** ***************
Programa de control de semáforos en intersecciones
****************** ** ****************************************/
# defineucharunsigned?char
#defineuintunsigned?int
#includelt;reg52.hgt;
/*****Definir bit de control****** ****** ************/
sbit Time_Show_LED2=P2^5; //bit de control Time_Show_LED2
sbit Time_Show_LED1=P2 ^4; //Bit de control Time_Show_LED1
sbitEW_LED2=P2^3; //Bit de control EW_LED2
sbitEW_LED1=P2^2; //Bit de control EW_LED1
>sbitSN_LED2=P2^1 ; //Bit de control SN_LED2
sbitSN_LED1=P2^0; //Bit de control SN_LED1
sbit SN_Yellow=P1^6; //SN luz amarilla
sbit EW_Yellow=P1^2; //EW luz amarilla
sbit EW_Red=P1^3; //EW luz roja
sbit SN_Red=P1^7 ; //luz roja SN
sbit EW_ManGreen=P3^0; //luz verde de acera EW
sbit SN_ManGreen=P3^1; //luz verde de acera SN
sbit Special_LED=P2^ 6; //Luz indicadora de tráfico normal
sbit Busy_LED=P2^7; //Luz indicadora de tráfico ocupado
sbit Nomor_Button=P3^5; //Botón de tráfico normal
sbit Busy_Btton=P3^6; //Botón de tráfico ocupado
sbit Special_Btton=P3^7; //¿Botón de tráfico especial? >sbit Add_Button=P3^3; //Tiempo más
sbit Reduces_Button=P3^4; //Tiempo menos
bit ?Flag_SN_Yellow;?//SN bit de bandera de luz amarilla
bit ? Flag_EW_Yellow; //Bit de bandera de luz amarilla EW
charTime_EW; //Unidad de cuenta regresiva este-oeste
charTime_SN; /p>
uchar?EW= 60, SN=40, EWL=19, SNL=19;?//Asignación de inicialización del programa, modo normal
uchar?EW1=60, SN1=40, EWL1=19, SNL1=19; // Variables utilizadas para almacenar valores modificados
uchar?code?table[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F , 0x6F}; //1~~ ~~selección de código de 9 segmentos
uchar?code?S[8]={0X28, 0X48
, 0X18, 0X48, 0X82, 0X84, 0X81, 0X84}; //Código de control de semáforo
/********************** Subrutina de retardo************************/
voidDelay(uchar?a)
{ p>
uchari;
i=a;
mientras(i--){;}
}
/ *************************Mostrar subfunción************************ ********/
voidDisplay(void)
{
char?h,l;
h= Hora_EW/10;
l=Hora_EW10;
? P0=tabla[l];
EW_LED2=1;
Retraso( 2);
EW_LED2=0;
P0=tabla[h];
EW_LED1=1;
Retardo(2) ;
EW_LED1= 0;
h=Hora_SN/10;
l=Hora_SN10;
P0=tabla[l];
SN_LED2=1 ;
Retraso(2);
SN_LED2=0;
P0=tabla[h]; p>
SN_LED1=1;
Retardo(2);
SN_LED1=0;
h=?EW1/10;
l=?EW110;
p>
P0=table[l];
Time_Show_LED1=1;
Retraso(2);
Time_Show_LED1=0;
P0=table[h];
Time_Show_LED2=1;
Retraso(2); p>
Time_Show_LED2=0;
}?
/************************ Rutina de servicio de interrupción externa 0*********** ************/
voidEXINT0(void)interrupt?0?using?1 p>
{
EX0=0;//Desactivar interrupción
if(Add_Button==0)?//Agregar hora
{ ?
EW1 =5;
SN1 =5;
? si(EW1gt;=100)
{
?EW1=99;
?SN1= 79
}
}
if(Reduce_Button==0) ?//Reducción de tiempo
{
EW1-=5
SN1-=5
if(EW1lt;=40; )
? {?
?EW1=40;
?SN1=20;
}
}?
if(Nomor_Button==0)//Prueba si el botón está presionado, presionar es normal
{
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0; //Apaga la luz de señal de ocupado
Special_LED?=0; //Apaga la luz de señal especial
}
if (Busy_Btton==0 )?//Prueba si el botón está presionado. Si se presiona, está en estado ocupado
{
EW1=45; SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0; //Apaga la luz de señal especial
Busy_LED=1; //Enciende la luz de señal de ocupado
}
if(Special_Btton==0)//Prueba si el botón está presionado, presionar es un estado especial
{
EW1 =75
SN1=55
EWL1=19; 19;
Busy_LED=0; //Apagar luz de señal de ocupado
Special_LED?=1; //Encender luz de señal especial
}
EX0=1; //Activar interrupción
}
/************** ********Rutina de servicio de interrupción T0************ *************/
void?timer0(void )interrumpir?1?usando?1
{
estático?uchar ?count;
TH0=(65536-50000)/256;
TL0=(65536-50000)256;
cuenta ;
si(cuenta==10)
{ si(Flag_SN_Yellow==1) ?//Probar las banderas de luz amarilla norte y sur {SN_Yellow=~SN_Yellow;} if(Flag_EW_Yellow==1)? // Probar la bandera de luz amarilla este-oeste {EW_Yellow=~EW_Yellow;}?
}
if(count==20)
{
Hora_EW--;
Hora_SN--;
if(Flag_SN_Yellow==1)//Prueba las banderas de luz amarillas del norte y del sur
{SN_Yellow=~SN_Yellow ;}
if(Flag_EW_Yellow==1)// Pruebe la bandera de luz amarilla este-oeste
{EW_Yellow=~EW_Yellow;}
count=0;
}
}
/************************Se inicia el programa principal*** ************* ******/
voidmain(void)
{?
Busy_LED=0 ;
Sp
ecial_LED=0;
IT0=1; //INT0 activa la transición negativa
TMOD=0x01; //El temporizador funciona en modo 1
TH0= (65536 -50000)/256; //Asignar valor inicial al temporizador
TL0=(65536-50000)256;
EA=1;?//La interrupción de apertura de CPU siempre está permitida
ET0=1; //Habilitar interrupción programada
EX0=1; //Habilitar interrupción INTO externa
TR0=1 //Iniciar temporización
p>? while(1)
{/**********Estado S0**********/
EW_ManGreen=0; //La acera EW está prohibida
SN_ManGreen=1; //La acera SN es accesible
Flag_EW_Yellow=0 //EW apaga la luz amarilla para mostrar la señal<; /p>
Tiempo_EW=EW ;
Tiempo_SN=SN;
mientras(Tiempo_SNgt;=5)
{P1=S[0]; ?//SN pasa, luz roja EW
?Display();}
/************Estado S1******* ****/
P1= 0x00;
while(Time_SNgt;=0)
{Flag_SN_Yellow=1;?//SN enciende el amarillo bit de señal de luz
EW_Red=1 ? //La luz amarilla SN está encendida, esperando la señal de giro a la izquierda, luz roja EW
?Display();
}
/*******Estado S2 **********/
Flag_SN_Yellow=0;?//SN apaga la luz amarilla para mostrar la señal
Time_SN=SNL;
mientras (Time_SNgt;=5)
{P1=S[2] //SN gira a la izquierda y la luz verde está encendida, la luz roja EW Display();} /*******Estado S3*** *******/
P1=0x00;
while(Time_SNgt;=0)
{Flag_SN_Yellow=1; //SN está encendido en el bit de señal de luz amarilla
EW_Red=1 //¿La luz amarilla de SN está encendida? , esperando señal de parada, luz roja EW
Display();}
/************Asignación*** *******/
EW=EW1;
SN=SN1
EWL=EWL1;
SNL= SNL1;
/************Estado S4************/
EW_ManGreen=~EW_ManGreen; /Acera EW accesible
SN_ManGreen=~SN_ManGreen; //Acera SN prohibida
Flag_SN_Yellow=0; //SN apagado La luz amarilla muestra señal
Time_EW= SN;
Time_SN=EW;
while(Time_EWgt;=5)
{P1= S[4];?//Pase EW, SN rojo Pantalla de luz();}
/***
****Estado S5************/
P1=0X00;
mientras(Time_EWgt;=0)
{ Flag_EW_Yellow=1; //EW enciende el bit de señal de luz amarilla
SN_Red=1; //La luz amarilla EW está encendida, esperando la señal de giro a la izquierda, SN luz roja
Display();}
/********Estado de S6**********/
Flag_EW_Yellow=0; la luz amarilla para mostrar la señal
Time_EW=EWL;
while(Time_EWgt;=5)
{P1=S[6];//EW gira a la izquierda y la luz verde está encendida, SN luz roja Display() ;}
/************Estado S7**********/
P1=0X00;
while( Time_EWgt;=0)
{Flag_EW_Yellow=1;?//ES enciende el bit de señal de luz amarilla p>
SN_Red=1; //La luz amarilla EW está encendida, esperando la señal de parada, la luz roja SN
Display();}
/**** ************Asignación************/
EW=EW1;
SN=SN1; p>
EWL=EWL1;
SNL=SNL1;
}
}