Programación de semáforo MCU

Este es un circuito de control de semáforo que hice, que incluye diagrama de circuito, programa, notas detalladas del programa y diagrama de simulación.

3. /p> p>

Este diseño de circuito eléctrico utiliza el microcontrolador AT89C51, 74LS47 (controlador de tubo digital) y 74LS373 (pestillo de salida del controlador de tubo digital). 8 tubos digitales muestran sus valores de retardo y cuatro indicadores rojos, amarillos y verdes. luces. 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).

(1) Diagrama de conexión del circuito:

3. Programa de software (lenguaje C)

El siguiente es el programa de software para todo el diseño, que puede ser compilado directamente en *. Código hexadecimal. A través del circuito anterior, se puede descargar al microcontrolador y ejecutarlo directamente.

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

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

//Escrito por: Huang Tingjian

//Primera vez escrito: 2 de enero de 2009

//Función 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

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

#include

#include< reg51.h>

#include

sfr?p0=?0x80;

sfr?p1=?0x90;

sfr?p2=?0xA0;

sfr?p3=?0xb0;?//Esta parte del contenido en realidad ya está en "#include", pero las definiciones en aquí debe distinguir entre mayúsculas y minúsculas, 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 conectarse. programa, 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?};//Pantalla de tiempo del tubo digital del puerto P1 Llame, use 74L74BCD código, salida del controlador de 8 bits;

//Declaración de función?begin

void?delay1(int?count);

void?delay_long (int? número1,int?número2);

voidpeople_car_drive();

//Fin de declaración de función

//********* *** *************//Subrutina de retraso

void?delay1(int?count) {?int?i;

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

{?;}? }

void?delay_long(int?number1,int?number2) {

int? a,b; para(a=número1;a>0;a--)

{

para(b=número2;b>0;b- -) {?_nop_ ();?}

} }

//************************ //Retraso de subrutina voidpeople_car_drive () {

intp_1=2,i,j=9,p_2=6;//****************/ /Cuando pasen peatones, retraso 20 segundos p2=0x09;?//Las luces rojas norte y sur están encendidas

p3=0x24;?//Las luces verdes este y oeste están encendidas while(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

p1=display[p_1];

retraso1(1000);

LE=0;?

j=9; (i =10;i>0;i--)

{? if(p_1==0&&j==3)break;?//Salga del ciclo cuando se reduzca a 3 y deje que su la luz amarilla parpadea para mostrar 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 peatones a prestar atención p3=0x12;? p1=display[ 3];? delay_long(8000,1); p2=0x12;? =mostrar[2]; retardo_long(8000,1); p2=0x00; p1=mostrar[1]; ; p2=0x00;? p3=0x00; retraso_long(14000,1);

<

p>//*********************El siguiente es un retraso de 60 segundos para el tráfico de vehículos//

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-->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 =mostrar[p_2];

retraso1 (1000);

LE=0;

j=9; for(i=10;i>0; i--)

{? if (p_2==0&&j==3)break;?//Salir del ciclo cuando se reduce a 2 p1=display[j--]; ; 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 p3=0x12;? [3];? retraso_long(8000,1); p2=0x00;? p3=0x00 ;? retraso_long(8000,1) ; p2=0x00;? p3=0x00; retraso_long(8000,1); p2=0x12; p3=0x00; 14000,1);//Las luces amarillas norte y sur parpadean durante tres segundos} void?main() //Entrada a 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;//Apagar todo semáforos} } }

}

Detalles, puede consultar aquí: /hjiannew/blog/item/b1b17a40f0b52a1a9313c6bb.html

Además, si no No entiendo hardware o software, puedes agregarme en QQ: 314955772 y te guiaré en línea.