Sunteți pe pagina 1din 11

República Bolivariana de Venezuela

Facultad Experimental de Ciencias y Tecnología


Departamento de Computación
Arquitectura del Computador

Practica 4

Profesor:

Prof. José Canache

Estudiantes:
INTRODUCCIÓN

A través de esta práctica con ayuda del block de notas de Windows se ha


elaborado un código para assembler 8051 para un sistema de cambio de luces de
semáforos que están ubicados estratégicamente en un calle de doble sentido en
forma de T haciendo uso de las distintas instrucciones que ofrece assembler 8051
se hace posible e funcionamiento de estos semáforos que pasado cierto tiempo
estos hacen un cambio de luces específicos y se ve reflejado como una salida en
los puertos p1 p2 p3, además de que en el puerto p0 se puede ver la hora actual
por el cual estos semáforos se rigen para alternar entre dos diferentes modos a
una hora en específico.
Marco Teórico

Planteamiento del problema:

Se debe realizar un programa en lenguaje de programación Assambler 8051 que


de por resultado un sistema de cambio de luces para semáforos que se ubican en
distintos puntos de una intercepción en forma de T ( Norte, Sur, Oeste) de los
cuales deben hacer un cambio de luces en un patrón en específico pasando por 6
estados diferentes cuando un contador bcd de 0 a 99 haga 100 cambios, además
de que existe un segundo modo de cambio de luces de dos estados diferentes que
se activa en un rango de horas de 00 hasta las 05 horas luego de las 06 hasta las
23 ejecutara el primer modo ya mencionado. Como lo especifica el archivo
Practi_4_2019.pdf del entorno.

Objetivo:

Llevar a cabo la creación del programa antes mencionado en lenguaje de


programación Assambler 8051 haciendo uso del block de notas de Windows
desarrollar el programa solicitado y que lleve a cabo todo lo ya mencionado con
anterioridad en este informe.

Parte experimental:

Materiales:

 Como material de apoyo teórico se utiliza la práctica uno, dos y tres


además de distintos sitios web.
 Se hace uso del Block de notas de Windows
 Se hace uso de Dosbox para la ejecución de Avsim51
 Avsim51 para la simulación de 8051
Procedimientos:

 Primeramente se elaboró el planteamiento de la solución en un cuaderno a


lápiz para poder tener un boceto del código.
 Luego se elaboró una más pulida en Microsoft Office en pseudocódigo

Inicio
Puertos=0
Contador1=0
CONTADOR2=0
Hora=0
Estado=0
Estado2=0
For contador=0
Si 06 <hora<23
Si contador=99
Caso0
Caso1
Caso2
Caso3
Caso4
Caso5
Caso+1
Si ESTADO=6
ESTADO=0
fsiESTADO
Fsi contador
Fsi hora
MODOB
Si hora<05
Si contador2=19
Caso0
Caso1
Caso+1
Si ESTADO=2
ESTADO=0
fsiESTADO
Fsicontador
Fsi hora
Contador+1
Si contador=99
Si hora=23
Hora=0
fhora
Hora+1
Contador=0
fsicontador
Fin for contador
 A partir de ahí se elaboró un versión temprana del código final la cual
presentaba errores de diversos tipos y líneas innecesarias
DEFSEG INICIO1,ABSOLUTE
SEG INICIO1
JMP INICIO
ORG 100H

INICIO: MOV PSW,#00


MOV R0,#30H
MOV P0,#0H
MOV P1,#0H
MOV P2,#0H
MOV P3,#0H
MOV R5,#07H ;INICIALIZACION DE HORA
MOV R6,#00H ;INICIALIZACION DE CONTADOR
MOV R4,#00H ;INICIALIZACION DE ESTADO
MOV R3,#00H ;INICIALIZACION DE ESTADO2
PORT: MOV @R0,#20H ;INICIALIZACION DE PUERTOS
INC R0
MOV @R0,#30H
INC R0
MOV @R0,#40H
INC R0
MOV @R0,#80H
INC R0
FPORT: MOV @R0,#90H
REPET: MOV A,R5
SUBB A,#06H
JC MODOB ;COMPARA SI 6<HORA
MOV A,#23H
SUBB A,R5
JC MODOB ;COMPARA SI HORA<23 SI NO SALTA A MODO B PARA VER SI ESTA EN EL OTRO
INTERVALO
CJNE R6,#99H,MODOB ;COMPARA SI CONTADOR ES IGUAL A 99 PARA CAMBIAR ESTADO
CASO: CJNE R4,#00H,CASE1
MOV P1,#30H
MOV P2,#20H
MOV P3,#80H
CASE1: CJNE R4,#01H,CASE2
MOV P1,#40H
MOV P2,#20H
MOV P3,#80H
CASE2: CJNE R4,#02H,CASE3
MOV P1,#80H
MOV P2,#30H
MOV P3,#90H
CASE3: CJNE R4,#03H,CASE4
MOV P1,#80H
MOV P2,#40H
MOV P3,#90H
CASE4: CJNE R4,#04H,CASE5
MOV P1,#90H
MOV P2,#80H
MOV P3,#30H
CASE5: CJNE R4,#04H,MAX
MOV P1,#90H
MOV P2,#80H
MOV P3,#40H
MAX: CJNE R4,#04H,INCRE ;COMPARA SI ESTADO=4
MOV R4,#00H ;REINICIA EL ESTADO POR QUE LLEGO AL MAXIMO
INCRE: INC R4 ;INCREMENTA ESTADO
MODOB: MOV A,R5
SUBB A,#00H
JC MODOB ;COMPARA SI 0<HORA
MOV A,#01H
SUBB A,R5
JC MODOB ;COMPARA SI HORA<1 SI NO SALTA
CJNE R6,#19H,MODOB ;COMPARA SI CONTADOR ES IGUAL A 19 PARA CAMBIAR ESTADO
CJNE R3,#00H,CASO1
INC R2
CASO1: CJNE R3,#01H,MAX2
INC R2
MAX2: CJNE R3,#01H,INCRE2 ;COMPARA SI ESTADO=1
MOV R3,#00H ;REINICIA EL ESTADO POR QUE LLEGO AL MAXIMO
INCRE2: INC R3 ;INCREMENTA ESTADO
CJNE R6,#99H,INCHOR ;COMPARA SI CONTADOR ES IGUAL A 99 PARA INCREMENTAR HORA
CJNE R5,#23H,INCHOR ;COMPARA SI HORA ES IGUAL A 23 PARA REINICIAR
MOV R5,#00H
INCHOR: INC R5
DA A
MOV R1,A
FINREP: CJNE A,#100,REPET

FIN: NOP
END

 Luego de muchos testeo se hicieron las correcciones necesarias para


lograr que el código funcione de forma correcta.
 Se toman capturas de pantalla para colocarlas en este informe.

Resultados y análisis:

Luego de corregir el código y terminar de agregar todas las instrucciones para que
funcionara el código paso 86 líneas de código a 126 sin embargo no estaba en
condición óptima así que el código paso por diversas correcciones obtuvimos una
reducción de líneas considerable a 95 líneas
DEFSEG INICIO1,ABSOLUTE
SEG INICIO1
JMP INICIO
ORG 100H

INICIO: MOV PSW,#00H ;AUXILIAR PARA SALVAR VALOR DE A


MOV R0,#30H ;AUXILIAR PARA SALVAR VALOR DE A
MOV P0,#00H
MOV P1,#00H
MOV P2,#00H
MOV P3,#00H
REPET:
MOV @R0,A ;AUXILIAR PARA SALVAR VALOR DE A
MOV A,R5
SUBB A,#06H
MOV A,@R0 ;RESTAURAR VALOR DE A OJO ACARREO SIGUE=1
JC MODOB ;COMPARA SI 6<HORA DEJANDO ACARREO=1
MOV @R0,A ;AUXILIAR PARA SALVAR VALOR DE A
MOV A,#23H
SUBB A,R5
MOV A,@R0 ;RESTAURAR VALOR DE A OJO ACARREO SIGUE=1
JC MODOB ;COMPARA SI HORA<23 SI NO SALTA A MODO B PARA VER SI ESTA EN EL OTRO INTERVALO
CJNE A,#99H,MODOB ;COMPARA SI CONTADOR ES IGUAL A 99 PARA CAMBIAR ESTADO
CASO: CJNE R4,#00H,CASE1
MOV P1,#30H
MOV P2,#20H
MOV P3,#80H
CASE1: CJNE R4,#01H,CASE2
MOV P1,#40H
MOV P2,#20H
MOV P3,#80H
CASE2: CJNE R4,#02H,CASE3
MOV P1,#80H
MOV P2,#30H
MOV P3,#90H
CASE3: CJNE R4,#03H,CASE4
MOV P1,#80H
MOV P2,#40H
MOV P3,#90H
CASE4: CJNE R4,#04H,CASE5
MOV P1,#90H
MOV P2,#80H
MOV P3,#30H
CASE5: CJNE R4,#05H,CMAX
MOV P1,#90H
MOV P2,#80H
MOV P3,#40H
CMAX: INC R4
CJNE R4,#06H,MODOB ;COMPARA SI ESTADO=6 INDICANDO QUE PASO DE 0-5 ESTADOS Y SE REINICIA A 0
MOV R4,#00H ;REINICIA EL ESTADO POR QUE LLEGO AL MAXIMO
MODOB: CLR C ;LIMPIA EL ACARREO
MOV @R0,A
MOV A,#05H
SUBB A,R5
MOV A,@R0 ;RESTAURAR VALOR DE A
JC NRET ;COMPARA SI HORA<5 Y SI NO, SALTA
CJNE R6,#19H,NRET ;COMPARA SI CONTADOR ES IGUAL A 19 PARA CAMBIAR ESTADO
CJNE R3,#00H,CASO1 ;CASO 0
MOV P1,#40H
MOV P2,#40H
MOV P3,#40H
CASO1: CJNE R3,#01H,CMAX2
MOV P1,#00H
MOV P2,#00H
MOV P3,#00H
CMAX2: INC R3
CJNE R3,#02H,NRET ;COMPARA SI ESTADO=2
MOV R3,#00H ;REINICIA EL ESTADO POR QUE LLEGO AL MAXIMO
NRET: CLR C ;LIMPIA ACAREO
ADD A,#1 ;AUMENTA EN 1 EL CONTADOR
MOV @R0,A ;SALVA EL VALOR DE A
MOV A,R6
ADD A,#1 ;CONT2 AUX AUMENTADO
DA A
MOV R6,A
MOV A,@R0 ;RESTAURAR VALOR DE A
CJNE R6,#20H,NRET2 ;NRET SIGNIFICA NO RESET OSEA QUE NO RENICIA ALGUN VALOR Y SALTA A LA SIGUIENTE
INSTRUCCION
MOV R6,#0
NRET2:CJNE A,#99H,NRET3 ;COMPARA SI CONTADOR ES IGUAL A 99 PARA INCREMENTAR HORA
MOV @R0,A ;SALVA EL VALOR DE A
MOV A,R5
ADD A,#1 ;INCREMENTA HORA
DA A
MOV R5,A
MOV P0,R5
MOV A,@R0 ;RESTAURAR VALOR DE A
CJNE R5,#24H,NRET3 ;COMPARA SI HORA ES IGUAL A 23 PARA REINICIAR
MOV R5,#00H
NRET3:CLR C
DA A
FINREP: CJNE A,#99H,BOING
BOING: LJMP REPET

FIN: NOP
END

Iniciamos nuestro progama


En este punto se inicializan todos los puertos a cero y a r0 se le asigna 30 por que
en la dirección se va a usar como auxiliar para guardar el valor del acumulador por
que el muestra nuestro contador (para el modo a) en bcd
En este punto se hace la comparación de que si la hora (actualmente es 0) está en
el intervalo 6 y 23 y el contador esta en 99 pero como no esta va saltar a la
etiqueta modob para encender las luces en el segundo modo

En este punto del código se usa clr c para limpiar el valor de acarreo y poder
seguir haciendo comparaciones con subb en este caso cumple la condición de de
estar en el intervalo de hora (R5) 0 y 5 (R5=0) pero el contador R6 (para modo b)
no está en 19 (para estar cada 20 cambios) asi que salta y sigue hasta que el
contado este en 19 para entrar en ambas condiciones
Aquí adelantamos hasta que hora (R5=0) y el contador b (R6=19) cumplan las
condiciones entonces aquí hay dos casos caso cero y caso uno como el estado b
está en cero entramos en caso cero y asignamos las configuración de luces luego
aumenta el estado b+1 y se reinicia el contador b a cero y sigue asi alternando
el estado b entre cero y uno cambiando las luces hasta que contador a
(acumulador) llegue a 99 este reinica a 0 y aumenta la hora+1 y sigue asi hasta
que no cumpla con la condición de la hora entre 0 y 5 y entramos al modo a

Donde hace los mismo que en el modo b pero este alterna en 6 diferentes
estados el intervalo de horas es de 6 a 23 y el contador a debe estar en 99

Entra en alguno de los 6 casos cambiando las luces y aumenta estado 1 hasta
que llega a 5 y este se reinicia, este código se ejecuta de forma infinita cuando
hora llega a 23 se reinicia a 00 entrando a modo b

Nota Adicional

En el enunciado dice: El contador se incrementa siempre después que se ejecuta


una instrucción del programa principal o de cualquier procedimiento.

Lo cual no tiene mucho sentido ejecutar un aumento después de cada instrucción


por que la velocidad de crecimiento del contador seria exagerada y no llegaría a
funcionar el programa si se implementa de esa manera.
Conclusiones

En esta práctica se propuso una solución al problema plateado originalmente


haciendo uso de todas las herramientas disponibles para el desarrollo de este
código esta solo es una posibles soluciones al problema sin embargo cabe la
posibilidad de que exista una solución más eficiente al problema quizás haciendo
un estudio más profundo al código y usando técnicas más avanzadas e
implementando un mejor uso de la lógica al momento de programar, a pesar de
esto el código presentado cumple con los requerimientos demostrando una de las
posibles de muchas aplicaciones en la vida real que tiene el implementar 8051 en
estas situaciones, que sin lugar a dudas se podría hacer una implementación en
un proyecto de mayor envergadura se espera que en las siguientes practicas se
hagan más demostraciones de este tipo.

S-ar putea să vă placă și