Diseño de semáforo basado en 51 microcontroladores
/****************************************** ***********Programa C control semáforo cruce
*************************** ** *******************************/
#define?uchar?unsigned char p>
#define?uint?unsigned int
#include?
/*****Definir bit de control******* ***** ***********/
sbit Time_Show_LED2=P2^5;//Time_Show_LED2 bit de control
sbit Time_Show_LED1=P2^4; //Bit de control Time_Show_LED1
sbit?EW_LED2=P2^3;?//Bit de control EW_LED2
sbit?EW_LED1=P2^2;?//Bit de control EW_LED1
sbit ?SN_LED2=P2^1;?//bit de control SN_LED2
sbit?SN_LED1=P2^0;?//bit de control SN_LED1
sbit SN_Yellow=P1 ^6;// luz amarilla SN
sbit EW_Yellow=P1^2;//luz amarilla EW
sbit EW_Red=P1^3;//luz roja EW
sbit SN_Red =P1^7;//SN luz roja
sbit EW_ManGreen=P3^0;//EW acera luz verde
sbit SN_ManGreen=P3^1;/ /SN luz verde acera p>
sbit Special_LED=P2^6;//Luz indicadora de tráfico normal
sbit Busy_LED=P2^7;//Luz indicadora de tráfico ocupado
sbit Nomor_Button=P3^ 5;//Botón de tráfico normal
sbit Busy_Btton=P3^6;//Botón de tráfico intenso
sbit Special_Btton=P3^7;//Especial botón de tráfico?
sbit Add_Button=P3^3;//Tiempo agregado
sbit Reduces_Button=P3^4;//Tiempo reducido
bit Flag_SN_Yellow; /SN bandera de luz amarilla
bit Flag_EW_Yellow;//EW bit de bandera de luz amarilla
char?Time_EW;//Unidad de cuenta regresiva este-oeste
char?Time_SN ;//Unidad de cuenta atrás norte-sur
uchar EW=60,SN=40,EWL=19,SNL=19; //Asignación de inicialización del programa, modo normal
uchar EW1= 60,SN1=40,EWL1= 19,SNL1=19;//Variables utilizadas para almacenar valores modificados
tabla de códigos uchar[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D ,0x07,0x7F,0x6F} ;//1~~~~selección de código de 9 segmentos
código uchar S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84 };//Código de control de semáforo
/************************Subrutina de retraso******** ********** ********/
¿nulo?Retraso(ucha
r? a) { uchar?i; i=a; mientras(i--){;} }
/******************Mostrar subfunción******************************/
void?Display(void) { char h, l; h=Tiempo_EW /10; l=Tiempo_EW%10; P0=tabla[l]; EW_LED2=0;
P0=tabla[h]; 1; Retraso(2); EW_LED1=0; h=Tiempo_SN/10; l=Tiempo_SN%10; P0=tabla[l]; Retraso(2); P0=tabla[h]; SN_LED1=1; Retraso(2); SN_LED1=0; h= EW1/10; l= EW1%10; p>
Time_Show_LED1=0; P0=table[h]; Time_Show_LED2=1; Retraso(2);
Time_Show_LED2=0;
}
/*** *******************Rutina de servicio de interrupción externa 0********************* ***/
void?EXINT0(void)interrumpir 0 usando 1 { EX0=0; //Desactivar interrupción
if(Add_Button==0) //Agregar tiempo {
EW1+=5;
SN1+=5; si(EW1>=100) {
EW1=99;
SN1= 79; }
}
if(Reduces_Button==0) //Reducción de tiempo {
EW1-=5;
SN1 -=5; p>
if(EW1<=40) {
EW1=40;
SN1=20; if(Nomor_Button==0 )//Prueba si el botón está presionado, es normal si se presiona
{
EW1=60;
SN1=40 ;
EWL1=19;
SNL1=19;
Busy_LED=0;//Apaga la luz de señal de ocupado
Special_LED =0;//Apaga la luz de señal especial p>
}
if(Busy_Btton==0) //Prueba si el botón está presionado. Al presionarlo significa que está ocupado
.{ EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED= 0;//Apaga la luz de señal especial
Busy_LED=1;//Enciende la luz de señal de ocupado
}
if(Special_Btton==0 )//Prueba si el botón está presionado, presionarlo es un estado especial
{ EW1=75;
SN1=55;
EWL1=19;
SNL1=19;
Busy_LED=0 ;//Apaga la luz de señal de ocupado Special_LED =1;//Enciende la luz de señal especial
} ?EX0=1
;//Habilitar interrupciones}
/************************Rutina de servicio de interrupción T0******** **** *********/ void timer0(void)interrumpir 1 usando 1
{ recuento de uchar estático; TH0=(65536-50000)/256; 50000)%256 ; count++; if(count==10) { if(Flag_SN_Yellow==1) //Prueba las banderas de luz amarilla norte y sur {SN_Yellow=~SN_Yellow;} if(Flag_EW_Yellow==1)? las banderas de luz amarilla del este y del oeste { EW_Yellow=~EW_Yellow;} } if(count==20) { Time_EW--; Time_SN-- if(Flag_SN_Yellow==1)//Prueba las banderas de luz amarilla del norte y del sur p>
{SN_Yellow=~SN_Yellow ;} if(Flag_EW_Yellow==1)//Prueba las banderas de luz amarilla del este y del oeste
{EW_Yellow=~EW_Yellow;} count=0; p>
}
/************************Se inicia el programa principal******** ***************/
void?main(void)
{ Busy_LED=0; Special_LED=0; //¿INT0 disparador de transición negativa?
TMOD= 0x01;//El temporizador funciona en modo 1 TH0=(65536-50000)/256;//El temporizador asigna un valor inicial TL0=(65536-50000 )%256; EA=1; //La interrupción de la CPU siempre está permitida ET0= 1;//Habilitar interrupción programada EX0=1;//Habilitar interrupción INTO externa
TR0=1;//Iniciar interrupción programada
while(1)
{/*******S0 estado************/
EW_ManGreen =0;?//EW acera prohibida
SN_ManGreen=1; //SN tráfico en la acera
Flag_EW_Yellow=0 //EW apaga la luz amarilla para mostrar la señal
Time_EW=EW;?
Time_SN=SN;? p>
while(Time_SN>=5) {P1=S[0];? //SN pasa, EW rojo Pantalla de luz();}
/*******Estado S1 **********/ P1=0x00;
mientras(Tiempo_SN>= 0) {Flag_SN_Yellow=1;? //SN enciende el bit de señal de luz amarilla EW_Red=1;? //La luz amarilla SN está encendida, esperando la señal de giro a la izquierda, luz roja EW
Display();
}
/************Estado de S2* *********/ Flag_SN_Yellow=0 //SN se apaga; luz amarilla para mostrar la señal
Time_SN=SNL;
while(Time_SN>=5)
{P1=S[2];//La luz verde para SN gira a la izquierda está encendida, la luz roja para EW
Display();}
/******* Estado S3******** ***/
P1=0x00;
while(Time_SN>=0) {Flag_SN_Yellow=1;?//SN está en amarillo
Bit de señal de luz EW_Red=1;? //La luz amarilla SN está encendida, esperando la señal de parada, luz roja EW
Display();} /*************** ***Asignación**** ******/
EW=EW1;
SN=SN1;
EWL=EWL1; p>
SNL=SNL1 ;
/*******Estado S4**********/
EW_ManGreen=~EW_ManGreen;/ /Acceso a la acera EW
SN_ManGreen=~SN_ManGreen;//La acera SN está prohibida
Flag_SN_Yellow=0; //SN apaga la luz amarilla para mostrar la señal
Time_EW=SN;
Time_SN=EW; while(Time_EW>=5) {P1=S[4];? //EW pasa, luz roja SN
Display( );}
/* ******Estado S5***********/
P1=0X00;
while(Time_EW>=0) {Flag_EW_Yellow=1;/ /EW enciende el bit de señal de luz amarilla SN_Red=1;//La luz amarilla EW está encendida, esperando la señal de giro a la izquierda, ¿luz roja SN Display(); }
/********Estado de S6** ********/
Flag_EW_Yellow=0; //EW apaga la pantalla de luz amarilla señal
Time_EW=EWL;
while(Time_EW> =5)
{P1=S[6];//EW la luz verde de giro a la izquierda está encendida , Luz roja SN
Pantalla();}
/* ******Estado S7**********/
P1=0X00;
while(Time_EW>=0) {Flag_EW_Yellow=1; / /EN enciende el bit de señal de luz amarilla SN_Red=1;//La luz amarilla EW está encendida, esperando señal de parada, SN luz roja? Display();}
/******************Asignación **********/ EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
p>} }