Este documento contiene varios ejemplos de código para programar el microcontrolador AT89C52 utilizando el lenguaje ensamblador. En el primer ejemplo, se muestran instrucciones básicas como movimiento de datos entre registros y puertos. Los ejemplos siguientes incluyen parpadear LEDs, promediar números, hallar pendientes, invertir datos en puertos, comparar valores y contar bits en un puerto. El último ejemplo corre un bit a la derecha en un puerto y decrementa registros de forma cíclica.
1. 4. Programando el microcontrolador AT89C52
A. /* en este primer ejercicio se observan una serie de instrucciones que no van a ningún
lado supongo que con este ejercicio se pretende saber y conocer las aplicaciones de el
KEIL UVISION y el ATMEL AT89C52*/
ORG 0X00
W EQU 1FH
REGRESAR: MOV 35H,#35H
MOV 81H,#45H
MOV A,81H
SUBB A,35H
MOV W,#56H
MOV 20H,W
MOV A,#45H
SUBB A,83H
MOV A,84H
MOV A,25H
ADD A,P1
MOV 26H,A
JMP REGRESAR
END
B.1 /* En este programa se pone a parpadear dos diodos LED mediante unas combinaciones
binarias importándolas al p1 y el salto para que lo haga indefinidamente*/
ORG 0X00
REPETIR: MOV P1,#00000010b
MOV P1,#00000100b
JMP REPETIR
END
B.2 /* En este ejercicio realice algo muy interesante leí los números a promediar desde los
puertos y el p2-p3 y la salida quedo en p1*/
2. ORG 0X00
RGS: MOV A,P0
ADD A,P2
ADD A,P3
MOV B,#3
DIV AB
MOV P1,A
JMP RGS
END
B.3 /* Aquí es hallar la pendiente de la recta también las estoy leyendo desde los puertos y el
puerto 1 lo tengo como entrada y salida la formula de la pendiente es la siguiente:
M=Y2-Y1/X2-X1*/
ORG 0X00
REGRESAR: MOV A,P2
SUBB A,P1
MOV B,A
MOV A,P3
SUBB A,P0
DIV AB
MOV P1,A
JMP REGRESAR
END
C. /* Se requiere leer lo del puerto P1 que aparesca en p2 pero invertido aquí con la instrucción
CPL es para complementar y aparecer invertido en el otro puerto*/
ORG 0X00
REGRESAR: MOV A,P1
CPL A
MOV P2,A
JMP REGRESAR
END
E. /* Aquí se están comparando en mayor que menor que e igual que con la instrucción CJNE que
es un principio básico de un comparador utilizando el registro PSW bit del carry y el bit P cuando el
3. mayor el primero que el segundo hay carry cuando es menor el primero que el segundo hay un 1
en el registro P y si es igual no hay desbordamiento osea es un cero el SETB se utiliza para
aumentar un bit puerto p3 en posicion*/
ORG 0X00
RPT: MOV A,P1
MOV 35H,P2
CJNE A,35H,NPREGUNTA
JMP IGUAL
NPREGUNTA: JNC P2_MENOR
JMP P2_MAYOR
IGUAL:
SETB P3.1
JMP FIN
P2_MAYOR:
SETB P3.0
JMP FIN
P2_MENOR:
SETB P3.2
JMP FIN
FIN: JMP RPT
END
F. /*en este la instrucción DJNZ decremento a p2 de uno en uno y salta hasta que llegue a cero y
el salto lo manda al SETB para aumente un bit al Puerto 1 cuando llega a cero salta a pulso y no se
vuelve a activar hasta que p3.0 reciba un bit alto.*/
ORG 0X00
VOLVER: DJNZ P2,SALTO
JMP PULSO
SALTO: SETB P1.0
CLR P1.0
JMP VOLVER
PULSO: JB P3.0,VOLVER
JMP PULSO
END
G. /* En este se requiere contar el numero de unos que se colocan en puerto p3 con el JBC lo hace
bit por bit salta si hay uno y lo borra para que continue con el siguiente bit cuando salta a suma
hay una especie de contador con INC que va contando el numero de 1 que hay luego el cuándo
4. termina de contar se va a última línea y compara uno por uno con el CJNE para que transforme el
incremento a un dato que lea el display 7 segmentos*/
ORG 0X00
INFINITO: MOV A,0X00
JB P3.0,VOLVER
JMP INFINITO
VOLVER: JBC P1.0,SUMA
JBC P1.1,SUMA
JBC P1.2,SUMA
JBC P1.3,SUMA
JBC P1.4,SUMA
JBC P1.5,SUMA
JBC P1.6,SUMA
JBC P1.7,SUMA
JMP FINAL
SUMA: INC A
JMP VOLVER
FINAL:
CJNE A,#00H,NP
MOV P2,#0X7E
JMP INFINITO
NP: CJNE A,#01H,NP1
MOV P2,#0X30
JMP INFINITO
NP1: CJNE A,#02H,NP2
MOV P2,#0X6D
JMP INFINITO
NP2: CJNE A,#03H,NP3
MOV P2,#0X79
JMP INFINITO
NP3: CJNE A,#04H,NP4
MOV P2,#0X33
JMP INFINITO
NP4: CJNE A,#05H,NP5
MOV P2,#0X5B
JMP INFINITO
NP5: CJNE A,#06H,NP6
5. MOV P2,#0X1F
JMP INFINITO
NP6: CJNE A,#07H,NP7
MOV P2,#0X70
JMP INFINITO
NP7: CJNE A,#08H,NP8
MOV P2,#0XFF
NP8:
JMP INFINITO
END
4. analizando código para en el AT89C52
A. /* corre un bit a la derecha de puerto p1 y carga los registros r2 r1 r0 y los decremento, el
corre el bit cuando el decremento de los registros llegue a 0*/
ORG 0X00
MOV A,#0FEH
CICLO: MOV P1,A
RL A
MOV R0,#3
CICLOA: MOV R1,#2
CICLOB: MOV R2,#1
CICLOC: DJNZ R2,CICLOC
DJNZ R1,CICLOB
DJNZ R0,CICLOA
SJMP CICLO
END