Red de conocimientos turísticos - Conocimientos sobre calendario chino - Diseño de recorrido de semáforo de un solo chip

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)

{

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];

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);

Time_Show_LED2=0;

}?

/************************ Rutina de servicio de interrupción externa 0*********** *************/

voidEXINT0(void)interrupt?0?using?1

{

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;

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;

}

}