Red de conocimiento informático - Computadora portátil - Programa de semáforo en lenguaje C del microcontrolador C51

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

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

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;

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();

}

}

}

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

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; ?

if(set==0)

set_timenb; //Agrega 1S al norte y al sur

else

set_timedx; /Agregar 1S al este y al oeste

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

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);

P1=0Xf7;

retraso(1);

P1 = 0xff;

}

}

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);

}