Diseño de sistema de control por microcontrolador para semáforos simulados

/*----------------------------------------- ---

Nombre del programa: Programa de control de semáforos en cruces

CPU: 51 microcontroladores

Función: Realizar el control de cuatro grupos de semáforos en los cruces , con visualización de Hora

, control de emergencia y control de vuelta al trabajo normal

----------------------- - ---------------------*/

#include

unsigned int i,j, shi ,flag,ge,ew=25,sn=45,wait1=3,wait2=3;

sbit duan=P2^6; //Estroboscópico de segmento de tubo digital (el primer estroboscópico 74HC573)< / p>

sbit wei=P2^7; //Estroboscópico de tubo digital (el primer estroboscópico 74HC573)

sbit accident=P2^5; //Botón de emergencia

sbit work=P2^3; //Botón de trabajo normal

tabla de códigos de caracteres sin firmar[]={0x3f,0x06, //Defina la matriz para almacenar el código de visualización 0~9 del tubo digital

0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void inittimer();

void leddisplay(unsigned int x); p>

void delay();

void main()

{

inittimer(); //Inicialización del temporizador

while(1)

{

accidente=1;

i=accident; //Leer botón accidente

if ( i==0) //Entrar cuando se presiona el botón de emergencia

{

wei=1; //Cerrar la visualización de la hora del tubo digital

P0 = 0xff;

wei=0;

P1=0xcf; //Todas las luces rojas están encendidas

P3=0xfc;

work= 1;

while(work) //Después de presionar el botón de emergencia pero no presionar el botón de regreso a trabajo, la luz roja permanecerá encendida

ew=25; El estudio restablece el valor de conteo inicial

sn=45;

wait1=3;

wait2=3;

flag= 0 ;

}

if(flag<=1200) //El tráfico norte-sur es de 60 segundos, 1200*50=60000ms=60s, el tráfico norte-sur se realiza dentro del Rango de tiempo de los 60

{

P1=0xf0;

P3=0xff;

leddisplay(sn); //Llamar al digital subrutina de visualización del tubo

}

if((flag>1200)&

;&(flag<=1300)) //La luz amarilla del medio parpadea durante 5 segundos

{

P3=0xff;

leddisplay(wait1);

}

if((flag>1300)&&(flag<=1800)) //25 segundos para el tráfico de este a oeste

{

P1 =0xff;

P3=0x00;

leddisplay(ew);

}

if((bandera >1800)&&( flag<1900)) //La luz amarilla parpadea durante 3 segundos

{

//P1=0x0f;

P3=0xff ;

leddisplay(wait2);

}

}

}

/*---- ------ --------------------------

Nombre de función: Programa de inicialización del temporizador 1

Función: Establece el modo de trabajo en modo 1 (modo de conteo de 16 bits)

Carga el valor inicial (hace que cada tiempo de conteo sea de 50 ms)

Habilita la interrupción del temporizador e inicia el temporizador

------------------------------------------ ---*/

void inittimer()

{

TMOD=0X01; //Método 1

TH0=0X3C; //Cargar valor inicial

TL0 =0Xb0;

EA=1; //Habilitar interrupción total

ET0=1 //Habilitar interrupción del temporizador 0

TR0=1; // Iniciar temporizador 0

}

/*------------------ -------------- ---

Nombre de la función: subrutina de servicio de interrupción del temporizador 0

Función: recargar el valor inicial, aumentar y disminuir el conteo

------ -----------------*/

temporizador vacío0( ) interrumpir 1

{

TH0=0X3C;

TL0=0Xb0;

flag++; // Indicador de conteo total, agregar 1 después de 50 ms.

if(flag<=1200)

{

if((flag%20)==0) //El tiempo norte y sur disminuye en 1 segundo, y el resto del indicador 20 es igual a 0, lo que significa que son suficientes 1s, el tiempo de visualización se reduce en 1

sn--;

}

if((bandera>1200)&&(bandera<=1300))

{

P1=0x0f;

if(bandera %5==0) //La luz amarilla parpadea cada 250 ms

P1= (~P1)|0x0f;

if(flag%20==0) //Luz amarilla esperar menos 1

esperar1--;

}

if((flag>1300)&&(flag<=1800))

{

if(flag%20==0) //El tiempo este-oeste disminuye en 1 en segundos

ew--;

}

if((bandera>1800)&&(bandera<1900))

{

P1=0x0f;

if(bandera%5 ==0)

P1=(~P1)|0x0f;

if(flag%20==0) //Luz amarilla espera menos 1.

wait2--;

}

if(flag==1900) //Reiniciar el conteo después de un período de conteo lento

{

bandera=0 ;ew=25,sn=45,wait1=3,wait2=3;

}

}

/*--- ----- -----------------------

Nombre de la función: subrutina de visualización del tubo digital

Función : El contenido a mostrar se muestra dinámicamente como un parámetro

------------------------ -- ------*/

void leddisplay(unsigned int x)

{

shi=x/10; que se mostrará El dígito de las decenas

ge=x%10 //Obtiene el dígito de las unidades del número que se mostrará

wei=1;

P0; =0xaa; // Luz estroboscópica del tubo digital de diez dígitos

wei=0;

duan=1;

P0=table[shi];

duan=0;

delay(); //Retraso en el borrado

wei=1;

P0=0x55; dígito Tubo digital

wei=0;

duan=1;

P0=table[ge];

duan=0;

retardo(); //Retraso en blanco

}

void retardo()

{

int t=200;

while(t--);

}

El programa te lo he implementado, espero. cumplirás tu palabra. Da puntos...