Programa de tenis de mesa
Utilice 8 tubos emisores de luz LED (4 rojos y 4 verdes) para desplazarse hacia adelante y hacia atrás para simular el movimiento hacia adelante y hacia atrás de las pelotas de tenis de mesa en ambos lados cuando se juega al tenis de mesa. Ambos lados del juego usan botones (cada lado usa 1 botón) para simular el servicio y la recepción. Es decir, el servidor presiona el botón controlado por él y la pelota se mueve del servidor al oponente (los tubos emisores de luz LED se encienden). uno por uno desde el servidor hasta el oponente, mostrando desplazamiento). Cuando la pelota se mueve hacia el lado receptor, el lado receptor presiona inmediatamente un botón controlado por ella, "golpeando" la pelota para "rebotar" hacia el servidor, y así sucesivamente.
2. Requisitos de diseño
Las reglas de competición pueden hacer referencia a las reglas generales del tenis de mesa. Requisitos:
(1) La bola se mueve a una velocidad de pasar 1 LED cada 0,5 segundos.
(2) Devuelve la bola (presiona el botón) dentro de los 0,5 segundos posteriores al disparo; llega el balón; de lo contrario, se contará como gol;
(3) Presione el botón antes de que llegue el balón y el balón no regresará;
(4) Utilice cuatro códigos de ocho segmentos para sumar puntos para ambos lados (dos para cada lado) Un código de ocho segmentos, contando en base a 10, valor inicial 0:0).
Equipo: circuito de pulso único, interfaz paralela programable 8255, contador de tiempo programable 8253, luces de conducción LED, tubo digital de siete segmentos, interruptores, etc.
1. Principio experimental
El temporizador 1.8253 utiliza el modo 0 para implementar la función de sincronización. Para lograr una visualización continua, los dos tubos digitales de siete segmentos deben actualizarse cada 5 ~ 10 ms. La velocidad de movimiento de la lámpara es de 300 ~ 500 ms. El período de tiempo se establece en 5 ms cuando se detiene el conteo y 8253 salidas. nivel alto, las puntuaciones se mostrarán respectivamente en la posición alta y baja. Después de un cierto número de ciclos de temporización, se realiza la operación de movimiento de la lámpara.
El puerto A y el puerto B de la interfaz paralela 2.8255 se utilizan para controlar la visualización de las luces de marcha LED y los tubos digitales, respectivamente. El puerto C se utiliza para leer el estado de cada interruptor y emitir la señal de selección del chip. El tubo digital.
3. El interruptor de un solo pulso simula el bateo. Cuando la señal de pulso leída por 8255 es de nivel alto, la siguiente dirección de movimiento de la lámpara se puede determinar juzgando la dirección de movimiento actual de la lámpara y la batería.
4. Las luces LED indican el movimiento de las pelotas de tenis de mesa. Cada vez que se mueve la luz, se le debe dar tiempo suficiente al operador para activar el interruptor de velocidad o presionar el interruptor de pulso.
5. El tubo digital de siete segmentos muestra la puntuación simultáneamente con el juego. Los 16 números de control base correspondientes a 0~f son 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d y 0x07. .
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x7b, 0x71.
2. Diagrama de cableado del hardware
3. >
4. Programa fuente
El código fuente del programa es el siguiente:
(incluidos los comentarios)
// -
//Nombre del archivo: table tennis.cpp
//Versión: 1.0 Edición estándar
//Creador: Feng Fei
//Fecha de creación: 01 /12/ 2010
//Descripción: Puedes puntuar, juzgar el resultado y ajustar la velocidad del tenis de mesa.
//Este programa fue escrito por mí mismo.
Si hay alguna similitud, ¡sería un honor para mí!
// -
# incluir ltstdio.h gt
# incluir ltconio.h gt
# incluir ltstring.h gt
# incluir ltiostream.h gt
#Incluir "ApiEx.h"
#comentario pragma (lib, "ApiEx.lib")
int pa = 0x280
int Pb = 0x 281;
int pc = 0x282
int pn 1 = 0x 283;
int p0 = 0x288
int p 1 = 0x 289;
int p2 = 0x28a
int pn2 = 0x28b
int s [16]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x7b, 0x 71};
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
void leddic(carácter sin firmar ampLed, int f) //Función de movimiento de la lámpara
{
int x = led
if(f = = 0)x = x/2; //Si la dirección es correcta, la luz se mueve uno hacia la derecha.
else if(f = = 1)x = x * 2; //Si la dirección es hacia la izquierda, la luz se mueve uno hacia la izquierda.
else printf("¡Error!");
led = x;
}
Velocidad nula (int ampS) // Control de velocidad de la bola, lea el estado del interruptor desde el puerto 8255C,
{//Si es alto, la velocidad de ajuste es rápida.
Datos de caracteres sin firmar;
int x;
Byte de lectura de puerto (datos de PC); /p>
x = x amp4;
if(x = = 0)s = 100; //El valor predeterminado es 5 * 100 milisegundos.
if(x = = 1)s = 60; //Alta velocidad 5*60ms
}
puntuación de vacío (int m)//A través del tubo digital Mostrar partituras.
{
Datos de caracteres sin firmar;
data = s[m];
PortWriteByte(pc, 0x 20);/ / Seleccione el bit alto del tubo digital
PortWriteByte(pa, data); //Mostrar fracción
}
Fracción no válida (entero)
{
Datos de caracteres sin firmar;
data = s[n];
PortWriteByte(pc, 0x 10); //Seleccione el bit bajo; del tubo digital.
PortWriteByte(pa, data); //Mostrar puntuación B
}
inicio vacío (LED de amplificador de caracteres sin signo, int ampf, int amps, int m , int n) //Functor del servidor
{
Datos de caracteres sin firmar;
int x;
PortWriteByte( pn2, 0x 57 ); //8253 inicialización del contador 1, ocho bits bajos, modo 3, palabra de control 01010111b.
PortWriteByte(p1, 0x 10); //8253 el contador 1 cuenta el valor inicial 10.
for(;1lt;2;)
{
Velocidad;
Bytes de lectura de puerto (PC y datos ); p>
x = data;
x = x amp1;
If(x==1) //Si A sirve, la luz va de izquierda a derecha.
{
led = 0x80
f = 0
Romper
}
x = data;
x = x amp2;
If(x==1) //Si B sirve, la luz va de derecha a izquierda.
{
led = 0x 1
f = 1;
Romper
} p>
p>
x = data;
x = x amp8;
If(x==1) // Cuando la salida de 8253 es alta, Se muestra una puntuación.
{
scorem(meter);
}
Else //Cuando la salida del 8253 tiene un nivel bajo, muestra la puntuación de Puntuación B (n);
}
}
anular (diodo emisor de luz de amplificador de caracteres sin signo, int ampf, int ampm, int ampN) / /Sentencia Si el balón sale fuera del campo, el jugador anota.
{
If(f==1) //Cuando la pelota se mueve hacia la izquierda,
{
If(led = =0x0) //El balón está fuera de límites.
{
Printf ("Puntuación B! \ n ");
n
printf ("puntuación: ");
printf("d-d",m,n);
printf("\n\n");
}
}
Else //Cuando la pelota se mueve hacia la derecha,
{
If(led==0x0) //La pelota excede el límite derecho.
{
Printf ("¡Una puntuación! \ n ");
m
printf (" puntuación: ");
printf("d-d",m,n);
printf("\n\n");
}
}
if((m = = 11) amp; amp(m-n gt; = 2))| |((m gt; 11) amp; amp(m-n gt; = 2))//Sentencia Todo el juego se gana o se pierde.
{
Printf("¡A ganó esta ronda! ¡Anota de nuevo! \ n \ n \ n ");
m = n = 0; p>
}
else if((n = = 11) amp; amp(n-m gt; = 2))|((n gt; 11) amp; amp(n-m gt; = 2)))
{
Printf("¡B ganó este juego! ¡Marca de nuevo! \ n \ n \ n "); 0;
}
}
ataque vacío (LED de amplificador de caracteres sin signo, int amp usint. f, int ampm, int ampN) // función de bateador
{
Datos de caracteres sin firmar;
int x, y;
STA:
Printf("Por favor servir! \ n ");
Start(led, f, s, m, n);
PortWriteByte(pn2, 0x 51); //8253 inicialización del contador 1, inferior ocho bits, modo 0, palabra de control 0101001b.
Rojo:
PortWriteByte(pb, led);
for(int I = 1; i lt= s; i)
{
PortWriteByte(p1, 5); //8253 el contador 1 cuenta el valor inicial 5.
Gu:
bytes de lectura de puerto (PC y datos);
x = datos
y = datos
y = y amp8;
if(y = = 0)goto Goo; //Continuar leyendo cuando 8253 no genera un nivel alto.
if(I 2 = = 1)scorem(m);
else puntuación(n);
If(f==1) //bola Muévete hacia la izquierda.
{
x = x amp1;
if((x = = 1) amp; amp(led gt=0x10)) //La pelota es cerca de A, A bateando.
{
f = 0; //Ajusta la dirección del movimiento de la pelota hacia la derecha.
}
}
De lo contrario //La pelota se mueve hacia la derecha.
{
x = datos
x = x amp2
if((x = = 2) amp; amp( led lt=0x8)) //La pelota está cerca de B y B golpea la pelota.
{
f = 1; //Ajusta la dirección del movimiento de la pelota hacia la izquierda.
}
}
}
leddic(led, f
salida(led, f); , m, n);
IF (led==0x0)
{
PortWriteByte(pb, led);
ir a STA
}
Se vuelve rojo;
}
void main()
{
Carácter sin signo
int f=1, s = 0; //f es la dirección de movimiento de la luz, el valor predeterminado es hacia la derecha; s es la velocidad de movimiento de la luz.
int m=0, n = 0; //m es la fracción, n es la fracción.
startup(); //Abre el dispositivo
PortWriteByte(pn1, 0x 81); //Inicialización 8255, salida del puerto A y del puerto B,
/ /Salida de alto nivel del puerto C, entrada de bajo nivel, palabra de control 1000001b.
PortWriteByte(pn2, 0x 27); //8253 inicialización del contador 0, 8 bits altos, modo 3, palabra de control 001001111b.
PortWriteByte(p0, 0x 20); //8253 el contador 0 calcula el valor inicial 2000.
Ataque (led, s, f, m, n); //Llama a la función de bateador
limpiar() //Cerrar el dispositivo
}
Verbo (abreviatura de verbo) Conclusión
Se ha implementado un juego de tenis de mesa simulado que puede anotar y mostrar el puntaje simultáneamente.
Las funciones que se pueden realizar o completar son las siguientes:
1. Las luces LED simulan el movimiento del tenis de mesa.
2. Simular golpes y saques de tenis de mesa.
3. Juzga la puntuación y el resultado de todo el juego como en un juego real.
4. Puedes ajustar la velocidad del servicio.
5. La partitura y la partitura de visualización se realizan simultáneamente