Solicitud del diseño y producción de un cronómetro de cuenta regresiva de baloncesto de 30 segundos, diseño del circuito digital y documento detallado
Regla abstracta de los 30 segundos del juego de baloncesto: El equipo ofensivo debe tirar dentro de los 30 segundos que tiene el balón en la cancha (24 segundos en partidos de la NBA, 35 segundos en partidos de la NCAA), así durante el partido el árbitro tiene que observar tanto el juego como el cronómetro. El cronómetro de cuenta regresiva de 30 segundos presentado en este artículo puede resolver este problema.
Palabras clave microcontrolador AT89C51, temporizador de cuenta regresiva de 30 segundos, LED
Hay muchas formas de diseñar y producir un temporizador de cuenta regresiva de 30 segundos. El temporizador de cuenta regresiva de 30 segundos que se presenta en este artículo. Utiliza el microcontrolador AT89C51 como unidad de control, usando dos tubos digitales para mostrar la hora y usando tres botones para controlar el inicio, reinicio y pausa del temporizador respectivamente. El estado inicial del cronómetro muestra "30". Cuando el árbitro presiona el botón de cronometraje, comienza la cuenta regresiva de 30 segundos. Cuando el cronómetro llega a 0, el cronómetro emite una alarma audible y visual para recordarle al árbitro que se acabó el tiempo. venció.
1. Diseño del circuito
El circuito del temporizador de cuenta atrás de 30 segundos se compone principalmente de un circuito de alimentación, un sistema mínimo de microcontrolador, 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. Como se muestra en la Figura 1.
Figura 1 Esquema del circuito del temporizador de cuenta regresiva de 30 segundos
1. Entrada del botón
El "temporizador de cuenta regresiva de 30 segundos" utiliza tres botones para iniciar el contador. Contar, restablecer, pausar/continuar contando y otras funciones.
(1) Tecla K1: botón de inicio (P3.2).
Presione la tecla K1 y el contador comenzará la cuenta regresiva. La pantalla digital contará desde 30 por segundo. Cuando disminuya a cero, el circuito de alarma enviará una señal de alarma audible y luminosa. 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/temporización (P3.4).
Cuando el contador esté en el estado de sincronización, presione esta tecla y el contador pausará la sincronización, y el número de la pantalla digital permanecerá sin cambios cuando el contador esté en el estado de pausa, presione esta tecla y el contador; volverá al estado de sincronización; en el estado inicial, esta clave no es válida.
2. Circuito de control de pantalla
El "temporizador de cuenta regresiva de 30 segundos" utiliza dos tubos digitales positivos para mostrar la hora, y el modo de visualización del tubo digital es visualización dinámica. En el circuito del controlador de pantalla, el pin de código de segmento del tubo digital está conectado al puerto P1 del microcontrolador a través de una resistencia de 470 ohmios. Cada uno de los dos pines de selección de chip está conectado a la fuente de alimentación positiva de 5 V a través de un 9012 y está controlado por. P3.0 y P3.1.
4. Circuito de alarma
Cuando el tiempo de sincronización se reduce a 0 y el tubo digital de la pantalla muestra "00", el diodo emisor de luz D1 es controlado por P3.5 para enviar. emite una alarma luminosa y el zumbador es controlado por P3.5. P3.7 controla la alarma sonora.
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", comienza la cuenta regresiva y cuando es "0", la cuenta regresiva se detiene. El valor inicial de "act" es "0", que puede ser. se establece en "1" o se borra mediante la operación del botón "0". La segunda variable global es la variable char "time", que almacena el tiempo de cuenta regresiva. Cuando el tiempo de cuenta regresiva llega a 0, se emite una alarma visual y audible. El valor inicial de la variable "tiempo" es 30. Cuando "actuar" es 1, el programa de servicio de interrupción programada lo disminuye en 1 cada 1 segundo. Cuando se reduce a 0, permanece 0. Presione la "tecla de reinicio" para. cambiar "hora" Restablecer a 30. La tercera variable global es la variable int "t", que registra el número de veces en respuesta a la interrupción temporizada 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 habilita la interrupción del temporizador 0, por lo que no se permiten interrupciones de nivel superior a la interrupción del temporizador 0, por lo que cada solicitud será respondida de inmediato.
Después de responder, agregue 1 a la variable global "t" en el programa de servicio de interrupciones para registrar el número de interrupciones de respuesta. Cada 1000 respuestas es igual a 1 segundo. El valor inicial de la variable "t" es 0, que se incrementa en 1 en la rutina del servicio de interrupción. Cuando "t" es 2000, la rutina del servicio de interrupción lo pone a 0. En el controlador de botones, "t" se borra a 0 cuando se presiona el botón de inicio, el botón de reinicio o el botón de pausa/inicio, para comenzar a cronometrar desde 0 ms.
2. Proceso de control
El programa principal se utiliza principalmente para detectar la variable global "tiempo" y emitir una "alarma acústica y visual" cuando el "tiempo" es 0. 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. Programación del software
1. Controlador del tubo digital
A los dos temporizadores Las pantallas del tubo digital el tiempo de sincronización "tiempo" (variable global) en un modo de visualización dinámica, el LED1 muestra el dígito de las decenas del "tiempo" y el LED2 muestra el dígito de las unidades del "tiempo".
(1) Defina el puerto de datos del código de segmento y la señal de selección de chip
De acuerdo con el circuito real, defina el puerto de datos del código de segmento en C51 como P1 y las dos señales de selección de chip como P3.0 y P3.1. La definición es la siguiente:
#define duan P1
sbit wei1=P3^0
sbit wei2=P3^1; p>( 2) Defina el código de glifo
Los números de pantalla LED del 0 al 9 y la tabla de códigos de glifo completamente extinguidos se colocan en la matriz zixing[]. El código de glifo es una tabla fija. Agregar la palabra clave "código" al definir significa que la 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) Definir las variables de visualización de los tubos digitales LED1 y LED2
Para aumentar la portabilidad del controlador, el autor establece el Variables de visualización para tubos digitales LED1 y LED2. LED2 define las variables de visualización. La variable de visualización es la interfaz externa de este controlador. El programa externo puede cambiar el valor mostrado por el tubo digital siempre que cambie el valor de la variable de visualización. La definición es la siguiente:
unsigned char led_str[2]={10, 10};
led_str[0] corresponde directamente al tubo digital LED1, led_str[1] directamente Corresponde al tubo digital LED2. En este proyecto, una subrutina especial divide el cálculo del tiempo variable global en led_str[0] y led_str[1].
void js()
{
led_str[1]=time/1010;
led_str[0]=time10;
}
(4) Controlador de tubo digital
El controlador de tubo digital "void chushi(char i)" se llama y ejecuta en el programa de servicio de interrupción programada. Según la definición del programa de inicialización, el programa de servicio de interrupción programado se ejecuta cada 1 ms. La variable global "t" se utiliza en el programa de servicio de interrupción programada para registrar la cantidad de veces que se ingresa al programa de servicio. Cuando "t" llegue a 2000, el programa de servicio de interrupción programada lo borrará.
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", el LED1 está encendido y cuando el parámetro es "1". , el LED2 está encendido. Si queremos que el LED1 se ilumine al ingresar al programa de servicio de interrupción programada por un número par de veces, y el LED2 se encienda al ingresar al programa de servicio de interrupción programada por un número impar de veces, podemos lograrlo fácilmente usando la llamada al programa. declaración "chushi(t2);".
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 la aparición de 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:
void chushi(char i)
{
js() //Calcular variables de visualización
duan =0xff; //Eliminar el resplandor
wei1=i; wei2=!i; //Confirmar la selección del chip
duan=zixing[led_str[i]]; Enviar código de fuente
}
2. Controlador de botón
El controlador de botón se divide en dos partes: reconocimiento de botón y ejecución de la función del botón. La función clave se puede ejecutar cuando se presiona el botón o después de levantar el botón. En este artículo, está diseñada para ejecutarse después de levantar el botón.
(1) Defina la dirección de E/S del botón
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 P3 de el puerto P3 2, en los tres pines P3.3 y P3.4. Para facilitar la adquisición del valor 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 unidad de clave
Proceso general de reconocimiento de clave Para: El puerto de E/S escribe "1" → determina si se presiona la tecla → retrasa el rebote → determina el valor de la clave → espera a que se levante el botón → ejecuta la función de la tecla. 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) Retrasar el rebote
La variable estática "ts" se utiliza para retrasar el rebote. El controlador de clave se ejecuta cada 1 ms en el programa de servicio de interrupción temporizada. Cada vez que se detecta una clave, "ts" se incrementa en 1 y "ts" se borra a 0 cuando no se detecta ninguna clave. Si la tecla se presiona continuamente durante 20 ms, se detectará una pulsación de tecla cuando el controlador de clave se ejecute 20 veces consecutivas. En este momento, la variable estática "ts" se acumula en 20, lo que confirma que la pulsación de tecla es válida.
Para evitar que los "ts" se acumulen hasta desbordarse si se presiona el botón todo el tiempo, después de confirmar que se presiona una tecla, el valor de "ts" se puede mantener en 20, o un valor mayor que 20, como 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 P3.2, P3.3 y P3.4 y proteger la influencia de otros pines del puerto P3, el valor leído se puede realizar una operación OR bit a bit a 11100011B (0xE3) y luego enviarlo a la variable estática. "kv".
La variable estática "kv" almacena el valor clave de la clave. El valor de kv es 0 cuando no se presiona ninguna tecla o se levanta la tecla. Cuando se presiona la tecla de inicio tecla1, kv=11111011B (0xFB), cuando se presiona la tecla de reinicio tecla2, kv=11110111B (0xF7), y cuando se presiona la tecla de pausa/inicio tecla3, kv=11101111B (0xEF).
(5) Ejecutar función de tecla
Cuando el controlador de clave se ejecuta por primera vez después de levantar la tecla, la variable estática "kv" conserva el último valor de clave obtenido cuando se Se presiona la tecla. , llame al programa de ejecución de claves "actkey(kv);" con este valor de clave como parámetro para ejecutar la función de clave. El valor kv se borra a 0 inmediatamente después de la llamada, lo que garantiza que la función de la tecla se ejecute una vez que se presiona la tecla.
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;
clave1=1; clave2=1; clave3=1;
if(!(clave1amp; clave2amp; clave3))
{
ts;
if(tsgt;=20)ts=20; //tecla presionada
if(ts==20)
kv=iokey|0xe3; //Obtener el valor de la clave
}
else
{ //No se presionó ninguna tecla o la tecla se ha levantado p >
actkey(kv);
ts=0;
kv=0;
}
} p >
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 un botón, la variable global "t" se borra a 0. El propósito es que cada vez que se reinicia o inicia el temporizador, el número de veces para ingresar la interrupción del temporizador se calcula a partir de 0; de lo contrario, la primera El segundo cronómetro será inexacto. El código del programa es el siguiente:
void actkey(unsigned char k)
{
switch(k)
{ p>
caso 0xfb: acto=1; t=0; descanso;
caso 0xf7: tiempo=30; descanso;
caso 0xef: acto= ~act; t=0; break;
}
}
IV.Conclusión
Este artículo utiliza ideas de programación orientada a objetos. en el proceso de programación Empaquetado con dos tubos digitales LED y tres botones independientes. Cuando se llama a su controlador en el programa de servicio de interrupción programada, los programadores solo necesitan operar su interfaz: matriz "led_str [2]" y función "actkey (unsigned char k)", y pueden cambiar funciones sin programar directamente el hardware, mejorando Mejoras versatilidad y portabilidad del software.