/*----------------------------------------- ---
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> 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 p>
{
P1=0xf0;
P3=0xff;
leddisplay(sn); //Llamar al digital subrutina de visualización del tubo p>
}
if((flag>1200)&
;&(flag<=1300)) //La luz amarilla del medio parpadea durante 5 segundos
{
P3=0xff;
leddisplay(wait1); p>
}
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)) p>
{
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--;
} p>
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]; p>
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...