Diseño de recorrido de semáforo de un solo chip
/****************************************** ************
Programa de control de semáforos en cruces
****************** ***************************************/
#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; //Bit de control SN_LED2
>sbit EW_Yellow=P1^2; //EW luz amarilla
sbit EW_Red=P1^3; //EW luz roja
sbit SN_Red=P1^7; /SN luz roja
sbit EW_ManGreen=P3^0; //EW acera luz verde
sbit SN_ManGreen=P3^1;SN acera luz verde
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; >
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 ;
Retardo(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 tiempo
{ ?
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 señal
Tiempo_EW=EW ;
Tiempo_SN=SN;
mientras(Tiempo_SNgt;=5)
{P1=S[0 ];?//SN pasa, luz roja EW
?Display();}
/************Estado S1****** ******/
P1= 0x00;
mientras(Time_SNgt;=0)
{Flag_SN_Yellow=1;?//SN se enciende el bit de señal de luz amarilla
EW_Red=1 ? / /SN la luz amarilla está encendida, esperando la señal de giro a la izquierda, EW luz roja
?Display();
}
/*******Estado de S2 **********/
Flag_SN_Yellow=0;?//SN apaga el luz amarilla para mostrar la señal
Time_SN=SNL;
mientras (Time_SNgt;=5)
{P1=S[2] //SN gira; izquierda y la luz verde está encendida, luz roja EW Display();} /*******Estado S3*** *******/
P1=0x00; p>
while(Time_SNgt;=0)
{Flag_SN_Yellow=1; //SN es el bit de señal de luz amarilla
EW_Red=1; //SN la luz amarilla es ? encendido, 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, semáforo en rojo SN Mostrar();}
/***
****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, la luz roja SN Display() ;}
/************Estado S7*********** */
P1=0X00;
while( Time_EWgt;=0)
{Flag_EW_Yellow=1;?//ES enciende el bit de señal de luz amarilla
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;
EWL=EWL1;
SNL=SNL1;
}
}