Red de conocimiento informático - Material del sitio web - Diseño de semáforo basado en 51 microcontroladores

Diseño de semáforo basado en 51 microcontroladores

/****************************************** ***********Programa C control semáforo cruce

*************************** ** *******************************/

#define?uchar?unsigned char

#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

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;

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

}

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

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

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;

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>

} }