Programa de semáforo en lenguaje C del microcontrolador C51
Diagrama esquemático de simulación de Proteus:
El programa es el siguiente:
#include lt;reg51.hgt;
#define uchar unsigned char
#define uint? unsigned int
uchar data buf[4];
uchar data sec_dx=20 //Número predeterminado de cosas
#define uint? p>
uchar data sec_nb=30; //Valores predeterminados de norte y sur
uchar data set_timedx=20;
uchar data set_timenb=30;
int n;
uchar datos set_timedx=20;
uchar datos set_timenb=30;
int n;
p>uchar data b; //Número de interrupciones del temporizador
sbit? k1=P1^6; //Definir 5 grupos de interruptores
sbit?
bit? k3=P2^7;
bit? k4=P3^0;
bit k5=P3^1;
bit Yellow_nb =P2^5;? //Señales de luz amarilla norte y sur
sbit Yellow_dx=P2^2;? //Señales de luz amarilla este y oeste
sbit Green_nb=P2^ 4 ;
sbit Green_dx=P2^1;
sbit Buzz=P3^7;
bit Buzzer_Indicate;
tiempo de bit= 0 ; //Indicador de ciclo de estado de la lámpara
bit? set=1; //Indicador de tecla de cambio de dirección de ajuste de tiempo
tabla de códigos uchar[11]={ //*** Cátodo código de fuente
0x3f,? //--0
0x06,? //--1
0x5b,? >
0x4f,? //--3
0x66,? //--4
0x6d,? //--5
0x7d ,? //--6
0x07,? //--7
0x7f,? //--8
0x6f,? -9
0x00? //--NULL
};
//Parte de declaración de la función
void delay( int ms); //Subrutina de retraso
void key(); //Subrutina de escaneo de claves
void key_to1() //Subrutina de procesamiento de claves
void key_to2 ();
void key_to3();
void display(); //Mostrar subrutina
void logo(); //Arrancar logo? p>
void Buzzer();
//Programa principal
void main()
{
TMOD=0X01 ;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1 ;
TR0=1;
EX0=1;
EX1=1;
logo();
P2=0Xc3; // Inicia el estado predeterminado, luces verdes en el este y el oeste, luces amarillas en el norte y el sur
sec_nb=sec_
dx 5;
while(1)
{
key(); // Llama al escáner de claves
display(); //Llamar al programa de visualización
Buzzer();
}?
}
//Parte de definición de la función p>
void key() //Subrutina de escaneo de claves
{
if(k1!=1)
{
retraso(10);
si(k1!=1)
{
mientras(k1!=1)
{
key_to1();
for(n=0;nlt;40;n)
{ display();}
}
}
}
si(k2!=1)
{
retraso(10)
si(k2!=1)
{
mientras(k2!=1)
{
key_to2();
for(n=0;nlt;40;n)
{ display();}
}
}
}
if(k3!=1)
{?
TR0=1;? Dispositivo de sincronización
Buzzer_Indicate=0;
sec_nb=set_timenb;? //Responder desde la interrupción y aún mostrar el valor establecido
sec_dx=set_timedx; p >
if(tiempo==0)
{ P2=0X99; sec_nb=sec_dx 5; }
si no { P2=0xC3; sec_dx=sec_nb }< / p>
}
if(k4!=1)
{
retraso(5);
if( k4 !=1)
{?
mientras(k4!=1);
set=!set;
}
}
p>}
if(k5!=1)
{
retraso(5) ;
if(k5 !=1)
{
mientras(k5!=1)
key_to3(); p>
}
}
}
void display() //Mostrar subrutina
{
buf[1]=sec_dx/10 ; //El primer dígito es el dígito de las decenas del segundo este-oeste
buf[2]=sec_dx10 //El segundo dígito es el este-oeste; dígito de las decenas del segundo
buf[3]=sec_nb/10; / /El tercer dígito de las decenas del norte y del sur
buf[0]=sec_nb10; dígito Norte y Sur unidades dígito
P1=0xff;?// La luz inicial está apagada
P0=0x00;
P1=0xfe; ?//Selección de chip LCD1
P0=table[buf[1]];
retraso(1);
P1=0xff;
P0=0x00;
P1=0xfd ?//Selección de chip LCD2 p>
P0=table[buf[2]];
retraso (1);
<p>P1=0xff;
P0=0x00;
P1=0Xfb; //Selección de chip LCD3
P0=table[buf[3]] ;
retraso(1);
P1=0xff;
P0=0x00;
P1=0Xf7;
P0=table[buf[0]]; //¿Selecciona chip LCD4?
retraso(1);
}
tiempo nulo0( void) interrumpir 1 usando 1? //Subrutina de interrupción del temporizador
{
b;
if(b==19) //Número de interrupciones del temporizador
{? b=0;
sec_dx--;
sec_nb--; time==0)? //Las luces amarillas este y oeste parpadean
{? Green_dx=0!Yellow_dx;}
if(sec_dxlt;=5amp;amp; time= =1)? //Las luces amarillas del norte y del sur parpadean
{? Green_nb=0;Yellow_nb=!Yellow_nb;}
if(sec_dx==0amp;amp;sec_nb ==5)
sec_dx=5;
if(sec_nb==0amp;amp;sec_dx==5)
sec_nb=5;
if(time==0amp;amp;sec_nb==0)
{ P2=0x99;time=!time;sec_nb=set_timenb;sec_dx=set_timenb 5;}
if( tiempo==1amp;amp;sec_dx==0)
{P2=0Xc3;time=!time;sec_dx=set_timedx;sec_nb=set_timedx 5;}
}
}
void key_to1() //Subrutina de procesamiento del teclado
{
TR0=0; ? p>
if(set==0)
set_timenb; //Agrega 1S al norte y al sur
else
set_timedx; /Agregar 1S al este y al oeste p>
if(set_timenb==100)
set_timenb=1;
if(set_timedx==100)
set_timedx=1;? //Agregar a 100 y establecer en 1
sec_nb=set_timenb; //Los valores establecidos se asignan al este, oeste, norte y sur
sec_dx=set_timedx;?
}
void key_to2() ? //Subrutina de procesamiento del teclado-
{
TR0= 0; //Apaga el temporizador
if(set ==0)
set_timenb--; //Resta 1S de norte a sur
else
set_timedx--;? //Resta 1S de este a oeste
if(set_timenb==0)
set_timenb=99;?
si(set_timedx==0)<
/p>
set_timedx=99;? //Reducir a 1 y restablecer a 99
sec_nb=set_timenb; //Los valores establecidos se asignan al este, oeste, norte y sur p>
sec_dx=set_timedx; ?
}
void key_to3()? //Procesamiento de teclado para paso de vehículos de emergencia
{
TR0=0;
TR0=0;
p>
P2=0Xc9;
sec_dx=00;
sec_nb=00;
Buzzer_Indicate=1;
}
void int0(void) interrumpir 0 usando 1 ?//Permitir solo tráfico de este a oeste
{
TR0=0;
P2 =0Xc3;
Buzzer_Indicate=0;
sec_dx= 00;
sec_nb=00;
}
void int1(void) interrupción 2 usando 1 ?//Solo se permite tráfico norte-sur
{
TR0=0;
P2=0X99;
Buzzer_Indicate=0;
sec_nb=00;
sec_dx=00;
}
void logo()/ /¿Logotipo de arranque? "- - - -"
{ for( n=0; nlt; 50; n )
{
P0=0x40;
P1=0xfe;
retraso(1) );
P1=0xfd;
retraso(1);
P1=0Xfb;
retraso(1); p>
P1=0Xf7;
retraso(1);
P1 = 0xff;
}
} p>
void Buzzer()
{
if(Buzzer_Indicate== 1)
Buzz=!Buzz;
else Buzz=0;
}
void delay(int ms) //Subrutina de tiempo de retardo
{
uint j,k ;
for(j=0;jlt;ms;j)
for (k=0;klt;124;k);
} p>