Red de conocimiento informático - Material del sitio web - Circuito de control de semáforo y programa en lenguaje C basado en 51 microcontroladores

Circuito de control de semáforo y programa en lenguaje C basado en 51 microcontroladores

Idea:

Deténgase en el semáforo en rojo, avance en el semáforo en verde y encienda la luz amarilla para recordar a los peatones que el semáforo está a punto de cambiar. Hay una pantalla roja, amarilla, verde y dos tubos digitales en cada una de las cuatro direcciones.

Los carriles este-oeste son aceras (20 segundos) y los carriles norte-sur son calzadas (60 segundos). Cuando la luz amarilla se retrasa durante los últimos tres segundos, parpadea y se enciende.

En tercer lugar, diseño del circuito de hardware

Este diseño de circuito utiliza el microcontrolador AT89C51, 74LS47 (controlador de tubo nixie) y 74LS373 (pestillo de salida del controlador de tubo nixie), 8 tubos digitales que muestran su valor de retardo. 4 luces indicadoras rojas, amarillas y verdes. La clave del diseño del hardware es garantizar que la salida de la pantalla de 10 dígitos permanezca sin cambios cuando se considera la pantalla de un solo dígito en la pantalla retardada. Por lo tanto, se puede agregar un pestillo de salida. Durante los últimos tres segundos del retraso, haga que la luz amarilla parpadee mientras muestra el número (este paso es muy importante en el diseño de software).

4. Programa de software (lenguaje C)

A continuación se muestra el programa de software completo diseñado, que se puede compilar directamente en formato *. El código hexadecimal se puede descargar al microcontrolador y ejecutarlo directamente a través del circuito anterior.

//*********************************//

/ /Nombre del programa: Control de semáforo en cruces

//Autor: Huang Tingjian

//Fecha de la primera redacción: 1.2, 2009.

//Funciones del programa: carriles norte y sur, un retraso de 60 segundos; carriles este y oeste, un retraso de 20 segundos, los últimos 3 segundos de luz amarilla antes de cambiar se muestran durante 2 segundos.

//Descripción de la CPU: microcontrolador AT89C51;? Oscilador de cristal de 24MHZ

//Tiempo de finalización: 65438+6 de octubre de 2009

//******************** **** *************//

# incluir & ltstdio.h & gt

# incluir & ltreg 51. h & gt;

# include & ltintrins.h & gt

sfr? ¿p0? =?0x80

sfr? ¿p1? =?0x90

sfr? ¿p2? =?0xA0

sfr? ¿p3? =?0xb0//Esta parte del contenido en realidad está en "# include

sbitsw=?p0^0;

sbit?oe=p0^6;

sbit?le=p0^7; //74LS373 definición del terminal de control de pestillo

chardisplay[]={? };? // Llamada de visualización de tiempo del tubo digital P1, usando código 74L74BCD, salida de controlador de 8 bits

//Declaración de función

voiddelay1(int? count);

p>

retraso nulo _ long(int número 1, int? número 2

void people _ car _ drive()

/ /Declaración de fin de función

p>

/* * * * * * * * * * * * * * * * * * */Retraso de subrutina

voiddelay1 (entero )

{?inti

for(I = count;i>0;i-)

{?;}?

}

retraso nulo _ long(int número 1, int? número 2)

{

int? A, B;

for( a = número 1; a & gt0; Respuesta -)

{

for(b = número 2; b & gt0;b -)

{? _ nop _();? /p>

}

}

/* * * * * * * * * * * * * * * * */Subrutina de retardo

¿No es válido? people_car_drive()

{

int? p_1=2, I, j=9, p_2 = 6; * * * *** /p>

mientras(p_1->;0)

{?LE = 1;

OE = 0;

if(p _ 1 = = 0) { OE = 1 } // Cuando el dígito de las decenas se reduce a 0, solo se muestra el dígito de las unidades

p 1 = Mostrar [p _ 1] ;

retraso 1(1000);

LE = 0;

j = 9;

for(I = 10;i>0 ;i- )

{?

if(p _ 1 = = 0 & &j==3) roto;? //Cuando disminuya a 3, sal del bucle y deja que su luz amarilla parpadee.

p 1 = display[j-];

delay_long(16000, 2);

if(sw==1) regresa;?

}

}?

//************************ ************************************************** * *****//

p2 = 0x 12; //Las luces amarillas norte y sur parpadean durante tres segundos para recordar a los peatones.

P3 = 0x 12;?

p 1 =mostrar[3];?

delay_long(8000, 1);

p2 = 0x00?

p3 = 0x00?

delay_long(14000, 1);

p2 = 0x 12;

P3 = 0x 12;

p 1 =mostrar[ 2];

delay_long(8000, 1);

p2 = 0x00?

p3 = 0x00

delay_long(14000, 1);

p2 = 0x 12

P3 = 0x 12; p>

P3 = 0x 12;

p>

p 1 = mostrar

delay_long(8000, 1

p2 = 0x00?

p3 = 0x00

delay_long(14000, 1);

//* * * * * * * * * * * * * *Los siguientes son vehículos 60 segundos de retraso al pasar //

p2 = 0x24? //Las luces verdes norte y sur están encendidas.

p3=0x09? //La luz roja está encendida.

mientras(p_2 ->0)

{?LE = 1

OE = 0

si(p _ 2; = = 0){OE = 1;}?//Cuando el dígito de las decenas se reduce a 0, solo se muestran los dígitos individuales.

p 1 = mostrar [p _ 2];

retraso 1(1000);

LE = 0

j =; 9;

for(I = 10;I>0;I-)

{?

if(p_2 = = 0 && ampj==3) roto; //Salga del ciclo cuando se reduzca a 2.

p 1 = display[j-];

delay_long(16000, 2);

if(sw==1) regresa;?

}

}

p2 = 0x 12; //Las luces amarillas norte y sur parpadean durante tres segundos para recordar a los peatones.

P3 = 0x 12;?

p 1 =mostrar[3];?

delay_long(8000, 1);

p2 = 0x00?

p3 = 0x00?

delay_long(14000, 1);

p2 = 0x 12;

P3 = 0x 12;

p 1 =mostrar[ 2];

delay_long(8000, 1);

p2 = 0x00?

p3 = 0x00

delay_long(14000, 1);

p2 = 0x 12

P3 = 0x 12; p>

P3 = 0x 12;

p>

p 1 = mostrar

delay_long(8000, 1

p2 = 0x00?

p3 = 0x00

delay_long(14000, 1); //Las luces amarillas norte y sur parpadean durante tres segundos. ¿Excede

}

voidmain()? //Entrada a la función principal

{

P0 = 0x 01

p 1 = 0x 00

p2 = 0x00

p>p>

p3 = 0x00? //Inicializar cada puerto

{?And (1)?

{

if(sw==0)

{ personas_coche_conducir();}

Otro

{

p2 = 0x00

p3 = 0x00//Apaga todos los semáforos

}

}

}

}

Para más detalles, visite:/hjiannew/