Circuito de control de semáforo y programa en lenguaje C basado en 51 microcontroladores
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
}
} p>
}
}
Para más detalles, visite:/hjiannew/