Red de conocimiento del abogados - Ley de patentes - 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 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)

{

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

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

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;

}

}