Diagrama de circuito y programa en lenguaje C basado en 51 microcontroladores para control de semáforos
Idea:
La luz roja se detiene, la luz verde se apaga y la luz amarilla parpadea 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.
La carretera de este a oeste es una acera (20 segundos) y la carretera de norte a sur es una carretera (60 segundos). La luz amarilla parpadeará y cambiará durante los últimos tres segundos del retraso.
3. Diseño de circuito de hardware
Este diseño de circuito utiliza un microcontrolador AT89C51, 74LS47 (controlador de tubo digital) 74LS373 (pestillo de salida del controlador de tubo digital), 8 tubos digitales muestran su valor de tiempo de retardo. cuatro luces indicadoras rojas, amarillas y verdes. La clave del diseño del hardware es que al retrasar la visualización, es necesario tener en cuenta que cuando se muestran dígitos individuales, es necesario garantizar que la salida de la visualización de decenas de dígitos permanezca sin cambios. Por lo tanto, se puede agregar un pestillo de salida. Durante los últimos tres segundos del retraso, la luz amarilla debería parpadear y los números deberían mostrarse al mismo tiempo (este paso es fundamental 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 *. Código hexadecimal. A través del circuito anterior, se descarga al microcontrolador y se puede ejecutar directamente.
//*********************************//
/ /Nombre del programa: Control de semáforo en cruce
//Escrito por: Huang Tingjian
//Primera vez escrito: 2 de enero de 2009
//Funciones del programa : El norte y el sur son carreteras, con un retraso de 60 segundos; el este y el oeste son aceras, con un retraso de 20 segundos, y la luz amarilla se mostrará durante 2 segundos en los últimos 3 segundos antes de cambiar.
//Descripción de la CPU: AT89C51 MCU;? Oscilador de cristal de 24MHZ
//Tiempo de finalización: 6 de enero de 2009
//************ ****** *******************//
#includelt;stdio.hgt;
#includelt; reg51.hgt;
#includelt;intrins.hgt;
sfr?p0=?0x80;
sfr?p1=?0x90;
sfr?p2=?0xA0;
sfr?p3=?0xb0;?//Esta parte del contenido en realidad ya está en "#includelt;reg51.hgt;", pero las definiciones allí Debe distinguir entre mayúsculas y minúsculas aquí, porque mi programa está en minúsculas. Las definiciones de cada puerto y registro en reg51.h están todas en mayúsculas, por lo que se informará un error al compilar y conectar. , Solo uso el puerto y solo lo defino aquí Cuatro, sin cambiar el contenido de reg51.h. De hecho, ambos son iguales.
sbit?sw?=?p0^0;
sbitOE=P0^6;
sbitLE=P0^7;?//74LS373 pestillo Terminal de control definición
char?display[]={?0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99?};?//La visualización de la hora del tubo digital del puerto p1 Llamada , usando código 74L74BCD, salida de controlador de 8 bits;
//Declaración de función?begin
void?delay1(int?count);
void?delay_long (int?number1, int?number2);
voidpeople_car_drive();
//Fin de declaración de función
//******** ***************//Subrutina de retraso
void?delay1(int?count) {?int?i;
para (i =count;igt;0;i--)
{?;}? }
void?delay_long(int?number1, int?number2) {
int?a,b; para(a=número1;agt;0;a--)
{
para(b=número2;bgt;0;b- -) {?_nop_();?}
} }
//************************ //Retraso de subrutina voidpeople_car_drive() {
intp_1=2, i, j=9, p_2=6; /Cuando pasan peatones, demora 20 segundos p2=0x09;?//Las luces rojas norte y sur están encendidas
p3=0x24;?//Las luces verdes este y oeste están encendidas mientras(p_1-- gt;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
p1=display[p_1];
delay1(1000);
LE=0;?
j=9; for( i=10;igt;0;i--)
{? if(p_1==0amp;amp;j==3)break;?//Salir el bucle cuando se reduce a 3 y lo deja en amarillo. La luz parpadea y muestra p1=display[j--]; delay_long(16000, 2); if(sw==1)return;
} }?
//*** ************************************* *************** ****************************// p2=0x12;? //Las luces amarillas norte y sur parpadean durante tres segundos para recordar a los peatones que presten atención a p3=0x12;? p1=display[3];? (14000,1); p2=0x12; p3=0x00; retraso_long(8000, 1);
p3=0x12; p1=mostrar[1]; retraso_long(8000,1); p2=0x00;? **********El siguiente es un retraso de 60 segundos cuando los vehículos pasan //
p2=0x24;?//Las luces verdes norte y sur están encendidas
p3=0x09;? //Las luces rojas este y oeste están encendidas while(p_2--gt;0) {?LE=1;
OE=0;
if(p_2==0){OE=1 ;}//Cuando el dígito de las decenas se reduce a 0, solo se muestra el dígito de las unidades
p1=display[p_2];
retraso1(1000);
LE=0;
j=9; for(i=10;igt;0;i--)
{ ? if(p_2==0amp;amp;j= =3)break;?//Salir del ciclo cuando se reduce a 2 p1=display[j--]; return;?
} } p2 =0x12; //Las luces amarillas norte y sur parpadean durante tres segundos para recordar a los peatones que presten atención p3=0x12;? , 1); p2=0x00;? p3=0x00;? retraso_long(8000,1); p2=0x00;? 0x00; retraso_long(14000,1); p2=0x12; p3=0x00; retraso_long(8000, 1); las luces amarillas norte y sur parpadean durante tres segundos} void?main()//Entrada de la función principal
{
p0=0x01
p1=; 0x00;
p2=0x00;
p3= 0x00; //Inicializar cada puerto {? while(1)? { if(sw==0)
{?people_car_drive();}
else {
p2=0x00;
p3=0x00; //Apaga todos los semáforos} } }
}
Para más detalles, visita: /hjiannew/