Sei sulla pagina 1di 28

Universidad de Guadalajara

Centro Universitario de Ciencias Exactas e Ingenieras


Juego Snake con el micro AT89S52 y Matriz de LEDs Proyecto:

Jonatan Cesar Gonzalez Meza

INDICE
Introduccin

PAGINA 3 3 4 4 4 5 6 8 9 11 12 14 17

Antecedentes Alcance Descripcion Microcontrolador AT89S52 Push buttons Planeacion Diagrama Diseo/Implementacion Conclusiones Manual de usuario Manual de captacion Apendices

INTRODUCCIN
El juego de la serpiente es un proyecto previamente realizado, lo que se pretende con esto es documentarlo para futuras referencias y as facilitar que en determinado caso o momento que alguien quiera retomar nuevamente este proyecto tenga todo lo necesario para entender desde el funcionamiento del juego a nivel de programador, que conozca sus partes y componentes mas bsicos y su funcionamiento, que se familiarice con el cdigo y en caso de que as se requiera de su modificacin pero todo de una manera mucho mas sencilla, facilitando mucho esta tarea que de otro modo seria tediosa y habra de requerir de mucho tiempo y dedicacin tanto para lograr descifrar el cdigo como el funcionamiento de cada parte de los componentes que se utilizaron para este proyecto.

ANTECEDENTES
Se decidi realizar este videojuego como una manera de demostrar lo que se puede desarrollar a partir de un microcontrolador (en este caso el ATMEL 89S52), ser una referencia para futuros estudiantes o personas con inters en los microcontroladores vean algunas de las alternativas que tienen para trabajar con sus micros.

El lenguaje de programacin que decidimos utilizar para este videojuego es C, optamos por l porque es un lenguaje de programacin muy reconocido y popular para la programacin de sistemas al igual que para aplicaciones, adems de que es un lenguaje que se nos facilita su entendimiento y con el que se pueden lograr grandes cosas sabindole sacar provecho.

En cuanto al medio fsico o interfaz grfica que se utilizo fue una matriz de diodos leds, tambin conocidas como cartel de leds o publik ya que son muy utilizadas para anuncios publicitarios y por lo mismo que son un algo llamativas decidimos darle un toque diferente al juego de la culebrita, dejando un poco de lado la tpica forma de jugarlo generalmente a partir de display LCD, que adems de ser una nueva forma de mostrar el juego se implementacin de la cual hablaremos ms adelante es si no fcil, bastante sencilla.

ALCANCE
Bsicamente es poder jugar el clsico juego de la serpiente usando una interfaz grfica (matriz de LEDs) por medio de botones (push-buttons). Con este videojuego pretendemos mostrar a travs de esta aplicacin (videojuego) una de tantas posibilidades que tienen los estudiantes, amateurs y personas interesadas en los microcontroladores para desarrollar distintos usos que pueden hacer con la programacin en C para estos microcontroladores.

DESCRIPCIN
Se trata de imitar el funcionamiento del popular juego de la culebrita (snake) donde simularemos una serpiente que tiene que ir recolectando comida y devorndola para hacerse ms grande, es decir cada que vaya devorando algo su tamao ira incrementando y a la vez que va comiendo se deber evitar que se estrelle contra las paredes o incluso con su propio cuerpo ya que esto dara por finalizado el juego y habra que empezar de cero nuevamente, el nivel de dificultad depender de loa grande que llegue a crecer la culebrita, entre ms grande sea, ms difcil ser manipularla y darle direccin ya que la comida aparecer en un determinado punto aleatorio dentro de la matriz de leds. En cuanto a la manipulacin de los movimientos ser algo sencillo ya que solo podr hacer movimientos en forma vertical u horizontal dentro de la matriz de leds y dichos movimientos estarn controlados por los botones de direccin es decir, al presionar uno de los botones esta cambiara de direccin dependiendo el botn que se haya presionado. En cuanto a los dems componentes fsicos (Hardware) lo describiremos a continuacin:

MICROCONTROLADOR AT89S52
El microcontrolador AT89S52 es desarrollado y manufacturado por Atmel y es un microcontrolador de alto rendimiento CMOS 8-bits de bajo consumo con 8 Kbytes de memoria flash, est fabricado con alta densidad de memoria no voltil y de tecnologa basada en la arquitectura estndar 8051, el cual esta programado con las funciones necesarias para poder almacenar los datos obtenidos por interrupciones que el usuario manipula de acuerdo a las reglas del juego simulado.
4

Las instrucciones aritmticas de estos microcontroladores son bsicas, permite sumar, restar, incrementar, decrementar y excepcionalmente se ha integrado el producto y la divisin de nmeros enteros

Estas son las instrucciones Aritmeticas:

PUSH BUTTONS
Los push buttons como su nombre lo refiere son botones de pulso que bloquean o abren el paso de la corriente que en este caso funciona como una seal enviada a la matriz de leds provocando que se apaguen o enciendan los leds simulando que la serpiente va avanzando, movindose e incluso aumentando su tamao.

Decidimos utilizar push buttons porque es la manera ms prctica de jugar un video juego mediante el envi se seales o impulsos elctricos que contralan en este caso la direccin o el movimiento de la culebrita, que adems es la forma ms comn de hacerlo, todos los mandos de los videojuegos funcionan bajo este mecanismo, por lo que es algo muy familiar para el usuario.

PLANEACIN

Mes Etapas Recopilacin de informacin del microcontrolador AT89S52 Presentacin de la propuesta Construccin del sistema mnimo Programacin del videojuego en lenguaje C Pruebas para el videojuego en simulador asistido por computadora Programacin en el microcontrolador Integracin de las interfaces al sistema mnimo Pruebas finales Documentacin

II

III

IV

Para lograr esto primero tuvimos que simularlo antes de llevarlo acabo, para esto utilizamos ISIS (Intelligent Schematic Input System) Professional Proteus un programa muy til para el diseo y simulacin de circuitos en el que se cre el diagrama de las conexiones de todos los componentes para as corregir errores que se fueron presentando durante el desarrollo. Otro detalle que nos ayud mucho de ISIS Professional Proteus es que el programa nos permites simular el sentido de las corrientes adems de el de disponer de varios niveles de luz para sus indicadores, es decir ofrece varios tipos de iluminaciones distintas para leds, con esto se puede comprobar la intensidad del voltaje que se iba a requerir para el juego, se pueden agregar resistencias en la simulacin para ver la intensidad de

iluminacin de los leds mismas que despus quitamos al conseguir el nivel de voltaje adecuado. Dentro del diagrama conectamos conforme a la hoja de datos del AT89S52 (la cual se incluye al final del documento), tambin se utilizaron dos circuitos 74LS373 que es un buffer tri-estados que adems funciona como un latch octal. El latch y el buffer son controlados independientemente por el Latch Enable (LE) y el Output Enable (OE), la ventaja de usar un latch octal es que contiene 8 latches en el paquete. Se decidi por este tipo de buffers por su buen funcionamiento y ya que es muy eficiente para el propsito de nuestro juego, cuando el buffer no es habilitado permanece en alta impedancia, por lo tanto disminuye la carga en el bus. Para el nuestro juego utilizamos los pines del 21 al 39 del microcontrolador AT89S52 para las conexiones que van de la matriz de leds a los buffers y de los buffers al micro y utilizamos los pines del 10 al 15 para los push buttons que como se explica anteriormente sern nuestro mando o control del videojuego, en este cuatro necesitamos seis push buttons dos de los cuales se utilizan como start y pause y los otros cuatro para direccin (arriba, abajo, izquierda y derecha). A continuacin se muestra el diagrama esquemtico con todas las conexiones que utilizamos para el juego para que se pueda asi entender mejor la explicacin anterior sobre la configuracin de los pines del microcontrolador y los buffers.

DIAGRAMA
RP1
RESPACK-8

VCC

U2 C1
33p

C2
33p GND

X1
19 12 mhz

U1
XTAL1 P0.0/AD0 P0.1/AD1 P0.2/AD2 P0.3/AD3 P0.4/AD4 P0.5/AD5 P0.6/AD6 P0.7/AD7 P2.0/A8 P2.1/A9 P2.2/A10 P2.3/A11 P2.4/A12 P2.5/A13 P2.6/A14 P2.7/A15 P3.0/RXD P3.1/TXD P3.2/INT0 P3.3/INT1 P3.4/T0 P3.5/T1 P3.6/WR P3.7/RD P1.0/T2 P1.1/T2EX P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 89S52 PACKAGE=DIL40 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8

3 4 7 8 13 14 17 18 1 11

D0 D1 D2 D3 D4 D5 D6 D7 OE LE 74LS373

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

2 5 6 9 12 15 16 19

18

XTAL2

VCC

RST

U3
3 4 7 8 13 14 17 18 1 11 D0 D1 D2 D3 D4 D5 D6 D7 OE LE 74LS373 Arriva Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 2 5 6 9 12 15 16 19

29 30 31

PSEN ALE EA

C3
1u

R1
10k

Start

Pause GND

GND

El cdigo del AT89S52 y la hojas de datos de los buffers 74LS373 se anexan al final del documento.

2 3 4 5 6 7 8 9

DISEO/IMPLEMENTACIN La herramienta utilizada para la implementacin de la interfaz para este proyecto fue Keil Vision3. Donde b sicamente la metodologa que se us en el cdigo fue la declaracin de constantes y funciones dedicadas a fines independientes de control siendo organizadas y llamadas desde el main, dando como resultado el cdigo que mas adelante se describe en los comentarios. En la implementacin del hardware requerido para la realizacin ste proyecto fueron necesarios la utilizacin de los siguientes componentes que conforman el sistema completo del juego.

1 Microcontrolador AT89S52 1 Matriz de leds de 8x8 6 Push button 2 Buffers 74LS645E 1 Cristal de 12 Mhz 1 Capacitor de 10 microfaradios 2 Capacitares de 33 picofaradios 2 Resistencias de 10 kOhms 1 Fuente de voltaje de 5 Volts Arreglo de resistencias a 470 Ohms Cables para las debidas conexiones

Se adjuntan las imgenes para la visualizacin de los componentes.

10

CONCLUSIONES La realizacin de ste proyecto requiri de la investigacin acerca de la distribucin de terminales de una matriz de leds de 8x8, lo cual de inicio represent un problema para la correcta implementacin, sin embargo, como se detall a manera de diagrama anteriormente fueron definidas, lo cual permiti el control de las conexiones para la funcionalidad del juego. Cabe sealar que la programacin que implic el presente proyecto requiri la lectura del puerto 3 para la entrada de la informacin o interaccin con el juego proveniente del usuario, para lo cual se tuvieron que definir a manera de constantes cada uno de los bits de ese puerto para establecer la correspondencia con los movimientos que representara en el plano de la matriz de leds. Adems del uso de los puertos P0 y P2 para la visualizacin de la interfaz fsica (matriz de leds). Bsicamente los algoritmos utilizados se basaron en las sentencias for, while, switch case e if anidados. Dando como resultado un cdigo eficiente que cumple con el objetivo del proyecto adems de permitir de manera sumamente digerible y visual las ventajas que representa una interfaz robusta como lo es la herramienta usada (Keil Vision 3) y un dispositivo con la practicidad y sencillez que caracterizan al AT89S52.

INTERFACES DE USUARIO Para este proyecto se utiliza una matriz de LEDs de 8 x 8 a modo de interfaz grafica, as como push-buttons (direccionales y control) para manipular la serpiente.

Matriz de LEDs de 8 x 8

Botones direccionales: , , ,

Botones de control: Start, Pause

11

MANUAL DE USUARIO Este videojuego es de dirigir la serpiente para ir comiendo alimento (representado con un LED encendido) que aparecer aleatoriamente por la matriz de LEDs evitando chocar con los bordes de la matriz o con el mismo cuerpo de la serpiente. Antes de usar el videojuego Asegrese de que esta en un lugar seco para prevenir cualquier corto circuito pues este es un dispositivo elctrico Conectando el dispositivo Conecte el dispositivo a la toma de corriente elctrica que deber ser de 110V c. a. a 60Htz. Distribucin de botones y matriz de LEDs

Matriz de LEDs de 8 x 8

Botones direccionales: , , ,

Botones de control: Start, Pause

12

Comenzar a jugar Para comenzar a jugar presione el botn S Pausar el juego Para pausar el juego presione el botn P Usando los botones para direccionar la serpiente Para mover la serpiente en direccin derecha presione el botn Para mover la serpiente en direccin izquierda presione el botn Para mover la serpiente en direccin arriba presione el botn Para mover la serpiente en direccin abajo presione el botn Para comenzar nuevamente Una vez comenzado o terminado el juego puede volver a comenzar el juego presionando el botn S

13

Manual de Captacin Matriz de LEDs videojuego sin conectar

Matriz de LEDs con LEDs apagados

Matriz de LEDs videojuego conectado La serpiente esta en su posicin inicial en la parte superior izquierda en un a posicin horizontal y un cuerpo con una longitud de dos LEDs La primer comida (LED) aparece en el centro de la matriz

Matriz de LEDs Dirigiendo la serpiente a la comida

La serpiente ya a sido dirigida usando los botones para acercarse a su comida.

14

Matriz de LEDs Dirigiendo la serpiente a la comida

La serpiente ha comido

Matriz de LEDs Dirigiendo la serpiente a la comida

La serpiente ha comido, ahora la longitud de su cuerpo de dos paso a ser de tres LEDs

Matriz de LEDs Chocando contra un borde

La serpiente a chocado contra el borde inferior, la serpiente parpadeara para indicar que colisiono y se tendr que comenzar el juego nuevamente

15

Matriz de LEDs Chocando contra su propio cuerpo

La serpiente a chocado contra su propio cuerpo, la serpiente parpadeara para indicar que colisiono y se tendr que comenzar el juego nuevamente

16

APNDICES MICROCONTROLADOR Es un circuito integrado programable, capaz de llevar acabo procesos lgicos y ejecutar las rdenes grabadas en su memoria. Estos procesos o acciones son programados en lenguaje ensamblador por el usuario, y son introducidos en este a travs de un programador.

Est compuesto de varios bloques funcionales, los cuales cumplen una tarea especfica.

Memoria ROM (Memoria de slo lectura). Memoria RAM (Memoria de acceso aleatorio). Lneas de entrada/salida (I/O) Tambin llamados puertos. Lgica de control Coordina la interaccin entre los dems bloques.

Estas son las funciones especiales de las cuales disponen algunos micros

Conversores anlogo a digital en caso de que se requiera medir seales analgicas como temperatura, voltaje, luminosidad, etc. Temporizadores programables (Timer's) Si se requiere medir perodos de tiempo entre eventos, generar temporizaciones, salidas con frecuencia especfica, etc. Interfaz serial para cuando se necesita establecer comunicacin con otro microcontrolador o con un computador. Memoria EEPROM Para desarrollar una aplicacin donde los datos no se alteren a pesar de quitar la alimentacin, que es un tipo de memoria ROM que se puede programar o borrar elctricamente sin necesidad de circuitos especiales. salidas PWM (modulacin por ancho de pulso) Para quienes requieren el control de motores DC o cargas resistivas, existen microcontroladores que pueden ofrecer varias de ellas. Tcnica llamada de "Interrupciones" para cuando una seal externa activa una lnea de interrupcin, el microcontrolador deja de lado la

17

tarea que est ejecutando, atiende dicha interrupcin, y luego contina con lo que estaba haciendo.

BUFFER Es un dispositivo que evita el efecto de carga en un circuito. En su forma ms sencilla es un amplificador operacional funcionando como seguidor. Por consiguiente el voltaje y la corriente no disminuye en el circuito, ya que ste toma el voltaje de la fuente de alimentacin del operacional y no de la seal que se est introduciendo, por lo que si una seal llegara con poca corriente, el circuito seguidor compensara esa prdida con la fuente de alimentacin del amplificador operacional. LATCH Es un circuito electrnico usado para almacenar informacin en sistemas lgicos, puede almacenar un bit de informacin. Los latches son dispositivos biestables asncronos que no tienen entrada de reloj y cambian el estado de salida solo en respuesta a datos de entrada, mientras que los biestables sncronos, cuando tienen datos de entrada, cambian el estado de salida en respuesta a una entrada de reloj. Los latches a diferencia de los conectores no necesitan una seal de reloj para su funcionamiento. El latch lgico ms simple es el RS, donde R y S permanecen en estado 'reset' y 'set'. IMPEDANCIA La impedancia es la propiedad que tiene un componente para limitar el paso de corriente a travs de un circuito. Establece la relacin entre los valores mximos o los valores eficaces de la tensin y de la corriente. La parte real de la impedancia es la resistencia y su parte imaginaria es la reactancia. El concepto de impedancia generaliza la ley de Ohm en el estudio de circuitos en corriente alterna (AC). El trmino fue acuado por Oliver Heaviside en 1886.

18

Buffer 74LS373 (Datasheet)

19

20

MICROCONTROLADOR AT89S52 Configuracin de Pines.

21

Cdigo (Lenguaje C)
#include <reg51.h> #define uchar unsigned char #define SNAKE 40 #define TIME 50 #define SPEED 62 sbit arriva=P3^0; sbit abajo=P3^3; sbit derecha=P3^2; sbit izquierda=P3^1; sbit start=P3^4; sbit pause=P3^5; /******************************************* Declaracion de variables globales *******************************************/ uchar x[SNAKE+1]; uchar y[SNAKE+1]; uchar time,n,i,e; char addx,addy; /******************************************* Retardo *******************************************/ void delay(char MS) { while(MS!=0) MS--; } void delay10ms() { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--) ; } //Retardo corto aprox. 10 us //Definiendo tipos de datos "UNSIGNED CHAR" como "UCHAR" //Constante para Longitud mxima de la serpiente //Constante para Tiempo de retardo //Constante para Velocidad de la viborita //Definimos el bit 0 del puerto 3 para direccionar el comando "Arriba" //Definimos el bit 3 del puerto 3 para direccionar el comando "Abajo" //Definimos el bit 2 del puerto 3 para direccionar el comando "Derecha" //Definimos el bit 1 del puerto 3 para direccionar el comando "Izquierda" //Definimos el bit 4 del puerto 3 para direccionar el comando "Comenzar" //Definimos el bit 5 del puerto 3 para direccionar el comando "Pausa"

//Variable para controlar longitud el eje X un arreglo "x" de tamao 41 //Variable para controlar longitud el eje Y, un arreglo "y" de tamao 41 //Variables usadas como CONTADORES //Variables usadas para controlar el desplazamiento sobre los ejes X e Y

22

/******************************************* Funcion para checar cuando haya colisiones *******************************************/ bit colision() { bit k; k=0; if(x[1]>8||y[1]>8) k=1; for(i=2;i<n;i++) if((x[1]==x[i])&&(y[1]==y[i])) k=1; return k; }

//Colision contra el "marco"

//Colision contra su propio cuerpo

23

/************************** Funcion para checar botones ***************************/ void checaTecla() { if(izquierda==0) { delay10ms(); if(izquierda==0) { addy=0; if(addx!=1) addx=-1; else addx=1; } } if(derecha==0) { delay10ms(); if(derecha==0) { addy=0; if(addx!=-1) addx=1; else addx=-1; } } if(abajo==0) { delay10ms(); if(abajo==0) { addx=0; if(addy!=-1) addy=1; else addy=-1; } } if(arriva==0) { delay10ms(); if(arriva==0) { addx=0; if(addy!=1) addy=-1; else addy=1; } } }

//Cuando se preciona el boton izquierdo // espera 10us

// // // // //

que no se desplace nada en el eje Y si la posision en el eje X es diferene de 1 entonces mover en "uno" a la izqierda (eje X hacia "menos infinito") si no entonces mover en "uno" a la derecha (eje X hacia "mas infinito")

// Cuando se preciona el boton derecho // espera 10us

// que no se desplace nada en el eje Y // si la posision en el eje X es diferene de -1 // entonces mover en "uno" a la derecha (eje X hacia "mas infinito") // si no // entonces mover en "uno" a la izquierda (eje X hacia "menos infinito")

// Cuando se preciona el boton abajo // espera 10us

// que no se desplace nada en el eje X // si la posision en el eje Y es diferene de -1 // entonces mover en "uno" hacia arriva (eje Y hacia "mas infinito") // si no // entonces mover en "uno" a la abajo (eje Y hacia "menos infinito")

// Cuando se preciona el boton arriba // espera 10us

//que no se desplace nada en el eje X // si la posision en el eje Y es diferene de 1 // entonces mover en "uno" hacia abajo (eje Y hacia "menos infinito") // si no // entonces mover en "uno" hacia arriva (eje Y hacia "mas infinito")

24

/******************************* Muestra la posicion en la matriz *******************************/ uchar mux(uchar temp) { switch(temp) { case 8: return 128;break; case 7: return 64; break; case 6: return 32; break; case 5: return 16; break; case 4: return 8; break; case 3: return 4; break; case 2: return 2; break; case 1: return 1; break; default: return 0; break; } } /***************** Funcion muestra *****************/ void display(uchar v) { while(v--) { for(i=0;i<SNAKE+1;i++) { P0=255-mux(y[i]); P2=mux(x[i]); checaTecla(); delay(TIME); } } }

//Muestra rengln //Muestra columna //Checar teclas //Retardo

25

/***************** PRINCIPAL *****************/ void main(void) { e=SPEED; P0=0xff; P2=0xff; P3=0xff; while(1) { for(i=3;i<SNAKE+1;i++) x[i]=100; for(i=3;i<SNAKE+1;i++) y[i]=100; x[0]=4;y[0]=4; n=2; x[1]=1;y[1]=2; x[2]=1;y[2]=1; addx=0;addy=1;

//Inicializacion de la variable e con 62 //Los puertos 0,2 y 3 son puestos a 1's

//Inicializacion //Posision del LED que debe comer al principio //Comienza la serpiente //Genera la serpiente //Cola

while(1) { if(start==0) {

//Checa cuando se presiono el booton start (comenzar)

delay10ms(); if(start==0) break; } display(1); } while(1) { display(e); if(colision()) { e=SPEED; break; } //Checa cuando esta comiendo if((x[0]==x[1]+addx)&&(y[0]==y[1]+addy)) n++; if(n==SNAKE) { n=2; //Checa si hay colisiones

e=e-10; for(i=3;i<SNAKE+1;i++) x[i]=100; for(i=3;i<SNAKE+1;i++) y[i]=100; } x[0]=x[n-1]; y[0]=y[n-1]; }

26

if(pause==0) { delay10ms(); if(pause==0) {

//Checa cuando se preciona "Pause"

// Esperar hasta que se vuelva a presionar el boton pause while(pause==0) ; while(1) { display(1); if(pause==0) { delay10ms(); if(pause==0) break; } } } } for(i=n;i>1;i--) { x[i]=x[i-1]; y[i]=y[i-1]; } x[1]=x[2]+addx; y[1]=y[2]+addy; } } }

27

Apendice B Ayuda en lnea en el enlace: http://jgonzalez.cz.cc/mas_at89s52.html

28

Potrebbero piacerti anche