Papel sobre material de embalaje LED
Microcontrolador AT89C51, temporizador de cuenta atrás de 30 segundos, diodo emisor de luz
Hay muchas formas de diseñar y fabricar un temporizador de cuenta atrás de 30 segundos. El temporizador de cuenta regresiva de 30 segundos presentado en este artículo utiliza AT89C51 como unidad de control, usa dos tubos digitales para mostrar la hora y usa tres botones para controlar el inicio, el reinicio y la pausa del temporizador, respectivamente. El estado inicial del temporizador de cuenta regresiva muestra "30". Cuando el árbitro presiona el botón del cronómetro, la cuenta regresiva comienza después de 30 segundos. Cuando el tiempo se reduce a 0, el cronómetro emitirá una alarma sonora y luminosa para recordarle al árbitro que se acabó el tiempo.
Primero, diseño del circuito
El circuito del temporizador de cuenta regresiva de 30 segundos se compone principalmente de un circuito de alimentación, un sistema mínimo de microcontrolador, una entrada clave, un circuito de control de pantalla y un circuito de alarma. El circuito de control del temporizador de cuenta regresiva de 30 segundos se muestra en la Figura 1.
Figura 1 Esquema del circuito del temporizador de cuenta regresiva de 30 segundos
1. Entrada clave
El "temporizador de cuenta regresiva de 30 segundos" utiliza tres botones para comenzar a contar y restablecer. , pausar/continuar contando y otras funciones.
(1) Tecla K1: botón de inicio (P3.2).
Presione la tecla K1, el contador comienza la cuenta regresiva y el número que se muestra en el tubo digital comienza la cuenta regresiva desde 30 cada segundo. Cuando llegue a cero, el circuito de alarma enviará una señal de alarma visual y audible. Cuando el contador está en estado de pausa, al presionar la tecla K1 se volverá al estado de sincronización.
(2) Tecla K2: botón de reset (P3.3).
Presione la tecla K2, no importa en qué estado esté funcionando el contador, el contador se restablecerá inmediatamente al valor preestablecido "30". En el estado de alarma, presione la tecla K2 para cancelar la alarma.
(3) Tecla K3: botón de interruptor de pausa/temporizador (P3.4).
Cuando el contador esté en el estado de sincronización, presione esta tecla para pausar el temporizador, y el número mostrado en el tubo digital permanecerá sin cambios cuando el contador esté en el estado de pausa, presione esta tecla y el el contador volverá al estado de sincronización; clave Inválido en el estado inicial.
2. Circuito de control de pantalla
El "temporizador de cuenta regresiva de 30 segundos" utiliza dos * * * tubos digitales para mostrar la hora, y el modo de visualización de los tubos digitales es visualización dinámica. . En el circuito del controlador de pantalla, el pin de segmento del tubo digital está conectado al puerto P1 del microcontrolador a través de una resistencia de 470 ohmios, y los dos pines de selección del chip están conectados a la fuente de alimentación positiva de 5 V a través de un 9012, controlado por P3. 0 y P3.1.
4. Circuito de alarma
Cuando el tiempo de sincronización se reduce a 0, cuando el tubo digital de la pantalla muestra "00", el LED D1 es controlado por P3.5 para enviar una luz. alarma y zumbador. La alarma sonora se controla mediante P3.7.
2. Ideas de programación de software
1. Variables globales
El proceso de acción del "temporizador de cuenta regresiva de 30 segundos" está controlado principalmente por tres variables globales. La primera es la variable de bit "act". Cuando "act" es "1", la cuenta atrás comienza y se detiene cuando es "0". El valor inicial de "act" es "0", que se puede establecer en "1". " o mediante el botón Se borra la operación. La segunda variable global es la variable char "time", que almacena el tiempo de cuenta regresiva. Cuando el tiempo de cuenta atrás llegue a 0, sonará una alarma visual y audible. El valor inicial de la variable "tiempo" es 30. Cuando "actuar" es 1, la rutina de servicio de interrupción del temporizador restará 1 cada 1, y cuando disminuya a 0, permanecerá en 0. Presione el "Botón Restablecer" para restablecer el "Tiempo" a 30. La tercera variable global es la variable int "t", que registra el número de veces que el tiempo de respuesta se interrumpe en 0. Según la definición de inicialización, el temporizador 0 funciona en modo 1 y emite una solicitud de interrupción cada 1 ms. El programa de control solo activa la interrupción del temporizador 0, por lo que no habrá interrupciones de nivel superior a la interrupción del temporizador 0, por lo que cada solicitud. Se responderá inmediatamente. Después de responder, agregue 1 a la variable global "T" en la rutina del servicio de interrupción para registrar el número de respuestas a la interrupción. Cada respuesta de 1000 veces es 1 segundo.
El valor inicial de la variable "t" es 0 y la rutina del servicio de interrupción suma 1. Cuando "t" es 2000, la rutina del servicio de interrupción lo borra. En el controlador de clave, cuando se presionan la tecla de inicio, la tecla de reinicio y la tecla de pausa/inicio, "t" se borra a 0 para que el conteo comience desde 0 ms
2. p>El programa principal se utiliza principalmente para detectar la variable global "tiempo", y cuando "tiempo" sea 0, emitirá una "alarma acústica y visual". El controlador de botón, el controlador de pantalla y la operación de "tiempo" se realizan en el programa de servicio de interrupción del temporizador 0. El flujo de control se muestra en la Figura 2.
Figura 2 Diagrama de flujo de control
3. Diseño del programa de software
1. Controlador de tubo digital
Dos tubos digitales del temporizador de forma dinámica muestra el tiempo de sincronización "tiempo" (variable global), el LED1 muestra diez dígitos de "tiempo" y el LED2 muestra un dígito de "tiempo".
(1) Defina el puerto de datos del código de segmento y la señal de selección de chip.
Según el circuito real, el puerto de datos del código de segmento definido en C51 es P1, y las dos señales de selección de chip son P3.0 y P3.1 respectivamente. La definición es la siguiente:
#Definición segmento P1
sbit wei1=p3^0
sbit wei2=p3^1; p>( 2) Defina el código de fuente
Los números de pantalla LED del 0 al 9 y la tabla de códigos de fuente completamente destruida se colocan en la matriz zixing[]. El código de fuente es una tabla fija. Agregar la palabra clave "código" al definir significa que esta tabla se almacena en la memoria del programa.
Código de carácter sin firmar zixing[]=
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xff
};
(3) Defina las variables de visualización de LED1 y LED2.
Para aumentar la portabilidad del controlador, el autor define variables de visualización para LED1 y LED2. La variable de visualización es la interfaz externa de este controlador. Los programas externos pueden cambiar el valor mostrado por el tubo digital cambiando el valor de la variable de visualización. La definición es la siguiente:
Carácter sin signo led_str[2]={10, 10};
Led_str[0] corresponde directamente al LED 1, LED_STR [1] corresponde directamente a LED2. En este proyecto, el cálculo de la variable global tiempo se divide en dos partes, led_str[0] y led_str[1], mediante una subrutina especial.
void js()
{
led _ str[1]= tiempo/10 10;
led _ str[0 ]= tiempo 10;
}
(4) Controlador de tubo digital
El controlador de tubo digital "agente vacío (char i)" está en la interrupción programada Se llama y ejecuta el programa de servicio. Según la definición del programa de inicialización, el programa de servicio de interrupción programada se ejecuta cada 1 ms. En el programa de servicio de interrupción programada, la variable global "t" se utiliza para registrar el número de veces que se ingresa al programa de servicio. 2000 veces, el programa de servicio de interrupción programado borra "t" a cero.
El parámetro "char i" del controlador de tubo digital se utiliza para determinar si el LED1 o el LED2 están actualmente encendidos. Cuando el parámetro es "0", se enciende el LED1 y cuando el parámetro es "1", se enciende el LED2. Si queremos encender el LED1 al ingresar al programa de servicio de interrupción temporizada un número par de veces y encender el LED2 al ingresar al programa de servicio de interrupción temporizada un número impar de veces, podemos usar la instrucción de llamada del programa "Cushi (t 2);" lograrlo fácilmente.
Después de ingresar al controlador del tubo digital, primero llame a la subfunción js() para calcular el led_str[0] y el led_str[1] actuales. A continuación, apague ambos tubos digitales para evitar el resplandor. Finalmente, encienda el tubo digital que necesita encenderse y envíe el código de fuente.
El código del controlador es el siguiente:
Invalid char i)
{
js() // Calcular variables de visualización
sección; = 0xff//Ir a Afterglow
Wei 1 = I wei2=! Yo; //Confirmar selección de película
Segmento = Zixing[led_str[I]]; //Enviar código de fuente
}
2. /p>
El controlador de claves se divide en dos partes: reconocimiento de claves y ejecución de funciones claves. La función de la tecla se puede ejecutar cuando se presiona la tecla o después de que se levanta la tecla. La función de la tecla está diseñada para ejecutarse después de que se levanta la tecla.
(1) Definir direcciones de E/S clave.
Según el circuito real, los tres botones (botón de inicio, botón de reinicio, botón de pausa/inicio) están conectados a los pines P3, P3.3 y P3.4 del puerto P3 respectivamente. Para obtener cómodamente el valor de la clave, el puerto P3 también se define como "iokey", que se puede definir en el programa de la siguiente manera:
#define iokey·P3
sbit key1=p3^2 ;
sbit key2=p3^3;
sbit key3=p3^4;
(2) Proceso de conducción de claves
Clave El proceso general de identificación es el siguiente: Escriba "1" en E/S → Determine si se presiona un botón → Retrase la agitación → Determine el valor de la clave → Espere a que se levante el botón → Ejecute la función del botón . En el controlador del botón se definen dos variables estáticas "ts" y "kv", que se utilizan para el rebote retardado y el almacenamiento de valores clave, respectivamente.
(3) Retraso en el rebote
La variable estática "ts" se utiliza para el retraso en el rebote. En la rutina de servicio de interrupción del temporizador, el controlador clave se ejecuta cada 1 milisegundo. Cuando se presiona una tecla "ts" y se agrega 1, se borrará si no se presiona ninguna tecla. Si se presiona una tecla continuamente durante 20 milisegundos, la tecla se detecta cuando el controlador de clave se ejecuta 20 veces seguidas. En este momento, la variable estática "ts" se ha acumulado hasta 20, lo que puede confirmar que el botón está efectivamente presionado.
Para evitar que "ts" se desborde cuando se mantiene presionado el botón, el valor de "ts" se puede mantener en 20 o un valor mayor que 20, como por ejemplo 21.
(4) Obtener el valor de la clave
Después de confirmar que se presionó una tecla, puede obtener el valor de la clave leyendo el estado del puerto de E/S de la clave. Para leer el estado de los pines de P3.2, P3.3 y P3.4 y proteger la influencia de otros pines del puerto P3, el valor leído se puede enviar a la variable estática "kv" bit a bit o hacia arriba. a 11000111b (0x E3).
La variable estática "kv" almacena el valor clave de la clave. Después de que no se presiona ninguna tecla o se levanta la tecla, el valor de kv es 0. Kv = 111110111b (0x FB) cuando se presiona el botón de inicio, Kv = 1165448 cuando se presiona el botón de reinicio. Cuando se presiona la tecla pausa/inicio tecla3, KV = 11011111b (0x ef).
(5) Ejecutar función de clave
Cuando el controlador de clave se ejecuta por primera vez después de levantar la clave, la variable estática "kv" guarda el valor final de la clave cuando la clave se presiona. , el valor de la clave se utiliza como parámetro para llamar al actuador de clave "act key(kV);" Una vez finalizada la llamada, el valor kv se borra inmediatamente para garantizar que la función clave se ejecute una vez. El código del controlador es el siguiente:
void key()
{
carácter estático sin firmar kv = 0;
carácter estático sin firmar ts = 0;
tecla 1 = 1; tecla 2 = 1; clave 3 = 1;
if (! (tecla 1 amp; tecla2 amp clave 3))
{
ts;
if(ts gt; = 20)ts = 20; //Se presiona una tecla.
If (ts==20)
kv = iokey | 0xe3//Obtener el valor clave
}
Otros p >
{//No se presiona ni levanta ninguna tecla.
clave de acto(kv);
ts = 0;
kv = 0; }
La función actkey(kv) se utiliza para realizar las operaciones correspondientes en función del valor clave "kv". Cuando "kv" es igual a 0xFB, significa que se presiona la tecla de inicio key1 y la función actkey (kv) asigna la variable global act a "1". Cuando "kv" es igual a 0xF7, significa que se presiona la tecla de reinicio key2 y la función actkey (kv) restablece la variable global "tiempo" a "30". Cuando "kv" es igual a 0xEF, significa que se presiona la tecla pausa/inicio y la función actkey(kv) invierte la variable global act. Cada vez que se presiona el botón, la variable global "t" se borrará, de modo que cada vez que se reinicie o inicie el temporizador, el número de interrupciones del temporizador se contará desde 0; de lo contrario, el primer segundo no se contará con precisión. El código del programa es el siguiente:
void actkey (carácter sin firmar k)
{
Interruptor (k)
{ p>
caso 0x FB: acto = 1; t = 0;
caso 0xf7: tiempo = 30; t = 0; actuar = ~ actuar; t = 0; romper;
}
}
Cuatro. Conclusión
Este artículo utiliza ideas de programación orientada a objetos para encapsular dos tubos digitales LED y tres botones independientes durante el proceso de programación. Al llamar a su controlador en el programa de servicio de interrupción programada, el programador solo necesita operar su interfaz: la matriz "led_str[2]" y la función "actkey(unsigned char k)" para cambiar la función sin tocar directamente el hardware. , mejorando la versatilidad y portabilidad del software.