Colección de citas famosas - Consulta de diccionarios - Programación de semáforos en intersecciones con control por microordenador de un solo chip

Programación de semáforos en intersecciones con control por microordenador de un solo chip

Si una unidad de tiempo es 1 segundo, los semáforos de la intersección configurados aquí funcionarán en cuatro pasos de la siguiente manera: 8?5 60 unidades de tiempo, norte y sur en rojo, este y oeste en verde 8?5 10; unidad de tiempo, norte y sur rojo, este y oeste amarillo; 8?5 60 unidad de tiempo, norte y sur verde, este y oeste rojo; 8?5 10 unidad de tiempo, norte y sur amarillo, este y oeste rojo;

Solución: Utilice el puerto P1. Los 6 pines controlan el semáforo. La luz de alto nivel está encendida y la luz de bajo nivel está apagada.

Código

#include lt;at89x52.hgt;

//sbit se utiliza para definir una dirección de bit de símbolo para facilitar la programación y mejorar la legibilidad y la portabilidad.

sbit SNRed =P1^0; //luz roja norte-sur

sbit SNYellow =P1^1; //luz amarilla norte-sur

sbit SNGreen =P1^2; //Luz verde en dirección norte-sur

sbit EWRed =P1^3; //Luz roja en dirección este-oeste

sbit EWYellow =P1^ 4; //Dirección este-oeste Luz amarilla

sbit EWGreen =P1^5; //Luz verde este-oeste

/* Utilice software para generar un retraso de una unidad de tiempo */

void Delay1Unit( void )

{

unsigned int i, j

for( i=0; ilt; 1000; i )

for (jlt; 0; jlt; 1000; j); //A través de la medición real, ajuste el número de j ciclos para producir un retraso de 1 ms

// También puede calcular el número de ciclos de instrucción generando un programa ensamblador, combinado con la frecuencia del cristal. Para ajustar el número de ciclos j, cerca de 1 ms

}

/* Retraso n unidad de tiempo*/

void Delay( unsigned int n ){ for( ; n!=0; n-- ) Delay1Unit() }

void main( void )

{

while( 1 )

{

SNRed=0; SNYellow=0; EWRed=1; 0; EWVerde=0; Retraso( 60 );

EWVerde=0; EWVerde=0; >

SNRed=1; SNYellow=0; SNRed=0; EWGreen=0; SNRed=0; 0; EWRed=0; EWYellow=1; EWGreen=0; Delay(10);

p>

}

}

Sección 4: Controlador de tubo digital

Pantalla "12345678"

El puerto P1 está conectado a 8 El polo del segmento del tubo digital catódico conectado SLED8: P1.7 está conectado al segmento h,..., P1. 0 está conectado al segmento a

El puerto P2 está conectado al polo del segmento del tubo digital de 8 cátodos conectados SLED8: P2.7 está conectado al cátodo *** de la izquierda,... , P2.0 está conectado al cátodo *** a la derecha

Descripción del proyecto: la frecuencia del oscilador de cristal fosc = 12MHz, el tubo digital usa el modo de actualización dinámica para mostrar y el tiempo es de 1ms Implementado en el programa de servicio de interrupción

Código

#include lt;

unsigned char DisBuf[8]; //Búfer de visualización global, DisBuf[0] corresponde al SLED derecho, DisBuf[7] corresponde al SLED izquierdo,

void DisplayBrush( void )

p>

{ código unsigned char cathode[8]={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; //Código de control del cátodo

Código unsigned char Seg7Code[16 ]= //Utilice números hexadecimales como subíndices de matriz para obtener directamente los bytes de codificación de siete segmentos correspondientes

{0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

static unsigned char i=0; // (0≤i≤7) Visualización de actualización del bucle, ya que es una variable estática, esta asignación solo se realiza una vez.

P2 = 0xff; // Pantalla en blanco para evitar que el siguiente valor del código se muestre en el SLED anterior

P1 = Seg7Code[ DisBuf[i] ] //Desde la pantalla buffer Saque los datos originales del área, busque la tabla y cámbielos a un código de siete segmentos y luego envíelos para su visualización

P2 = cathode[ i ] //Establezca el cátodo correspondiente en nivel bajo; y muestra

if( i gt; = 8 ) i=0; //Apunta al siguiente tubo digital y los datos correspondientes

}

void Timer0IntRoute( void ) interrupción 1

{

TL0 = -1000; //Dado que TL0 solo tiene 8 bits, asigne los 8 bits inferiores de (-1000) a TL0

TH0 = (-1000)gt;gt; 8; //Tomar Los 8 bits superiores de (-1000) se asignan a TH0 y se reprograman a 1 ms

DisplayBrush(); >

}

void Timer0Init( void )

{ TMOD=(TMOD amp; 0xf0) //Inicialización, temporizador T0, modo de trabajo 1

TL0 = -1000; //Tiempo 1ms

TH0 = (-1000)gt;

TR0 = 1; /p>

ET0 = 1; //Permitir que T0 genere una solicitud de interrupción cuando el recuento se desborde

}

void Display( índice de caracteres sin firmar, valor de datos de caracteres sin firmar){ DisBuf[ index ] = dataValue; }

void main( void )

{

unsigned char i; 0; ilt; 8; i ){ Display(i, 8-i } //DisBuf[0 ] es el derecho, DisBuf[7] es el izquierdo

Timer0Init(); >

EA = 1; //Permitir que la CPU responda a las solicitudes de interrupción

While(1)

}

;