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 ) p>
{
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)
}
;