8051 Con Programas Echos
8051 Con Programas Echos
8051 Con Programas Echos
MICROCONTROLADOR 8051
Agosto-diciembre 1999
INDICE
Página
INTRODUCCIÓN 3
PRIMERA PARTE.
CAPITULO 1, CARACTERÍSTICAS DEL MICROCONTROLADOR 8051 5
1.1CARACTERÍSTICAS DELµC-8051 6
1.2DESCRIPCIÓN DE LAS LINEAS DEL µC-8051 6
1.3CARACTERÍSTICAS ESPECÍFICAS DEL µC-8051 9
1.3.1 Descripción de los espacios de memoria. 9
SEGUNDA PARTE
CONJUNTO DE INSTRUCCIONES DEL µC- 8051. 43
TERCERA PARTE
APLICACIONES DEL MICROCONTROLADOR 8051. 96
BIBLIOGRAFÍA 42
ANEXOS
.
INTRODUCCIÓN
Para muchas de las aplicaciones los PLD´s son una excelente opción,
desafortunadamente, sus aplicaciones se ven limitadas cuando es necesario
transmisión de información, adquisición y tratamiento de datos, temporizaciones, etc.
Es aquí donde hacen sus aparición los “microcontroladores”, que son dispositivos
mas versátiles que nos permitan llevar a cabo estas nuevas aplicaciones.
P1.0 1 40 Vcc
P1.1 2 39 P0.0
P1.2 3 38 P0.1
P1.3 4 37 P0.2
P1.4 5 36 P0.3
P1.5 6 35 P0.4
P1.6 7 34 P0.5
P1.7 8 33 P0.6
RST 9 32 P0.7
P3.0/RxD 10 8051 31 Vpp/EA
P3.1/TxD 11 8031 30 PROG/ALE
P3.2/INT0 12 8751 29 PSEN
P3.3/INT1 13 28 P2.7
P3.4/T0 14 27 P2.6
P3.6/T1 15 26 P2.5
P3.6/WR 16 25 P2.4
P3.7/RD 17 24 P2.3
XTAL2 18 23 P2.2
XTAL1 19 22 P2.1
Vss 20 21 P2.0
Descripción de conexiones.
EPROM
EXTERNA
RAM
EXTERNA
PSEN=0
1000H__
La tabla 1, muestra las localidades que han sido asignadas por el fabricante, para dar
servicio a las rutinas de interrupción.
Tabla 1. Interrupciones
Una interrupción puede ser causada de manera externa o interna, es decir puede ser
producida por un dispositivo periférico o por programación respectivamente. La
interrupción con mayor alto orden es el RESET el cual no puede ser mascarable.
Cuando el RESET ocurre el programa comienza a partir de la dirección 0000H del
programa.
Cuando se utilizan elementos de la familia del 8051 con memoria interna ROM (o
16K), esta puede ser accesada mediante la conexión de la línea EA =1 (Vcc). Si la
memoria interna es de 4 Kbytes y EA = 1, el CPU seleccionará internamente el ROM,
desde 0000H hasta 0FFFH y de manera externa automáticamente a partir de 1000H
hasta FFFFH.
La línea PSEN (Program Store Enable), que sirve para leer el ROM externo, es
activado en todas las búsquedas (Fetches) del programa. PSEN NO SE ACTIVA en
búsquedas (fetches) del ROM interno. La fig. 1.3 muestra un conexionado a una
EPROM externo.
P0 BUS DE DATOS
µCONTROLADOR
8051
LATCH EPROM
Sujeta Dir. Baja
EA la dir.baja
ALE
P2 Dirección Alta
PSEN OE
Las direcciones de la Memoria Interna de Datos siempre son de un byte (de 00H a
FFH). Sin embargo los modos de direccionamiento para la memoria interna pueden
acomodar hasta 384 bytes, como se ve en la versión 8052, lo cual es posible debido a
que el modo de direccionamiento directo accede un espacio de memoria diferente
físicamente al permitido por el modo de direccionamiento indirecto.
FFH FFH
Registro de Funciones
Accesable por Accesable por Especiales: Puertos,
Alto 128
direccionamiento direccionamiento estado y control de Bits,
indirecto directo timer, SP, acumuladores,
80H 80H
etc.
7FH Accesable por
direccionamiento
directo e
indirecto
Bajo 128
Los primeros 128 bytes, son presentados en todos los dispositivos de la familia
MCS-51, que está mapeados como se presenta en la fig 1.5.
7FH
Bits de selección
ESPACIO LIBRE DE DATOS
del banco de
30H
registros en el
2FH
PSW
ESPACIO DE DIRECCIONAMIENTO
20H POR BITS
1FH
11
18H
17H
10
10H 4 BANCOS DE 8 REGISTROS R0-
R7
0FH
08H
07H VALOR DEL RESET DEL SP
00
00H
Fig. 1.5 Distribución de los 128 Bytes más bajos de la memoria RAM interna.
Como se puede apreciar en la figura anterior, los 128 bytes más bajos son divididos
en 4 bloques de 8 registros cada uno, que contienen los valores de los registros R0 A
R7, los bloques pueden ser seleccionados mediante la escritura en los bits 3 y 4 del
registro PSW (palabra del estado del programa), el cual veremos más adelante. La
utilización de registros permiten un uso más eficiente del espacio de códigos debido a
que sus direccionamientos son de 8 bits únicamente.
En el capítulo anterior habíamos visto que los SFR se encuentran en la parte alta
(128 bytes) de la memoria RAM interna del 8051. Las direcciones de los SFR es
mostrado en la Tabla 2.
F8 FF
F0 B F7
E8 EF
E0 ACC E7
D8 DF
D0 PSW D7
C8 T2CON RCAP2L RCAP2H TL2 TH2 CF
C0 C7
B8 IP BF
B0 P3 B7
A8 IE AF
A0 P2 A7
98 SCON SBUF 9F
90 P1 97
88 TCON TMOD TLO TL1 TH0 TH1 8F
80 P0 SP DPL DPH PCON 87
A continuación veremos con mayor detalle cada uno de los principales registros de
control del 8051.
CY AC F0 RS1 RS0 OV - P
Este registro como ya se vio, reside en el espacio SFR. El registro contiene; el bit de
Carry, El bit Auxiliar (para operaciones BCD), los dos bits de selección del banco de
registros, la bandera de overflow, el bit de paridad y dos banderas sin definir.
SMOD Dobla el “BAUD RATE” para el puerto serie cuando se utiliza el timer
para generar el BAUD RATE.
GF1 Propósitos generales
GF0 Propósitos generales
PD Bajo consumo de energía 80C51BH CHMOS
IDL Bajo consumo de energía
0
INT0
IT0 IED BAJA
1 PRIORIDAD
TF0
0
INT1
IT1 IED SECUENCIA
1 DE
TF1 SERVICIO
DE
RI INTERRUPCIÓN
TI
ACCIÓN
INDIVIDUAL
DESHABILITADOR
GENERAL
El 8051 tiene dos planos de prioridad para trabajar las interrupciones, llamadas alto y
bajo, respectivamente. En la inicialización, todas las interrupciones trabajan en el
plano de baja prioridad. Para pasar del plano de baja prioridad al de alta, es
necesario escribir un 1 lógico en las banderas correspondientes a las interrupciones
que se desean aumentar de prioridad, ubicadas dentro del registro IP (fig.2.6.)
Aunque los registros de control de los puertos del Timer / Contador y Serie
pertenecen a los registros de funciones especiales les vamos a dedicar un capítulo
completo a cada uno de ellos debido a la importancia que presentan para el
desarrollo e interconexión con sistemas periféricos.
En el momento que los bits del registro del contador pasan de todos 1's a
todos 0's, se activa la línea de interrupción interna correspondiente a TF0 o TF1,
generándose, (si ha sido permitida) una interrupción.
IT0 TCON.0 Bit de control del Interrup 0. Activado/Limpiado por software para
especificar el tipo de interrupción, por nivel bajo (IT0= 0) o por
transiente negativo (IT0=1). 3.3 registro de modo de control del
timer/contador.
Existen 4 modos de trabajo para estos puertos, los cuales son definidos por la
escritura en los bits M1 y M0 de TMOD fig 3.2.
TIMER 1 TIMER 0
M1 M0 MODO ESPECIFICACIÓN
0 0 0 Timer/contador de 13 bits
0 1 1 Timer/contador de 16 bits
1 0 2 Timer/contador de 8 bits recargables
1 1 3 Timer 0, TL0 Timer/contador de 8 bits, controlado
por los bits de control del Timer 0 .
TH0 Timer de 8 bits controlado por los bits de Control
del timer 1. ( El Timer 1 no se utiliza )
OSC 1/12
0
C/T TL1 TH1 TF1 Inter
1 5 BITS 8 BITS
ENTRADA T1
TR1
GATE
ENTRADA
INT1
OSC 1/12
0
C/T TL1 TH1 TF1 Inter
1 8 BITS 8 BITS
ENTRADA T1
TR1
GATE
ENTRADA
INT1
Este modo puede ser utilizado tanto por el timer 0 como por el 1, tienen un
registro de conteo de 8 bits (TLx).
OSC 1/12
0
C/T TL1 TF1 Inter
1 8 BITS
ENTRADA T1
TR1
TH1
GATE
ENTRADA
8 BITS
INT1
OSC 1/12
0
C/T TL0 TF0 Inter
1 8 BITS
ENTRADA T0
TR0
GATE
ENTRADA
INT0
TR1
3.4 UTILIZACIÓN DEL TIMER 1 COMO GENERADOR DEL "BAUD RATE” PARA
LA TRANSMISIÓN SERIAL.
El valor 12 que divide a la frecuencia del oscilador proviene del divisor, que
se encuentra en la etapa de control del Timer 1, cuando éste es utilizado como
temporizador.
NOTA: Cabe recalcar que el valor que se almacena en TH1 es el valor negativo de
la cuenta que se desea, debido a que, el contador se incrementa cada vez
que un pulso es detectado, de ahí que en la ecuación se representa como
256-(TH1).
La interrupción del Timer 1 en éste caso no tendría mucha aplicación por lo que
se podría deshabilitar.
La figura 3.7 muestra una tabla de valores de TH1, para generar el Baud
Rate, tomando en cuenta la frecuencia del oscilador.
TIMER1
BAUD F osc SMOD
RATE C/T MODO VALOR DE TH1
19.2 kHz 11.059 MHz 1 0 2 FDH
9.8 kHz 11.059 MHz 0 0 2 FDH
4.8 kHz 11.059 MHz 0 0 2 FAH
2.4 kHz 11.059 MHz 0 0 2 F4H
1.2 kHz 11.059 MHz 0 0 2 E8H
137.5 Hz 11.986 MHz 0 0 2 1DH
110 Hz 6.000 MHz 0 0 2 72H
FIG. 3.7 Tabla de valores para generar el Baud Rate
MODO 1: 10 bits son los que se transmites por la línea (TxD) o se reciben por
línea (RxD). Un bit de inicio (Start bit de nivel 0 lógico). En recepción
el bit de Fin (Stop), se almacena en RB8 de SCON, si SM2=0. El
Baud Rate (frecuencia de transmisión o recepción) es variable.
Los datos serie que entran o salen a través de RxD o TxD respectivamente, son
efectuados mediante 8 desplazamientos, con una frecuencia de transmisión (Baud
Rate) de 1/12 de la frecuencia del oscilador. La figura 4.2 muestra el Puerto Serie
en Modo 0.
La transmisión es iniciada por cualquier instrucción que utilice SBUF como registro de
“Destino”, v.gr. MOV SBUF,A . La escritura a SBUF se produce durante la fase 2 de
estado 6 “S6P2” del ciclo de máquina, también se carga un 1 dentro de la 1ª 9na.
Posición del registro de corrimiento y llama al bloque de control de Tx para que
comience a transmitir. Un ciclo completo de la máquina se efectuará entre la escritura
en SBUF y la activación de la señal de SEND.
SEND acciona la salida del registro de corrimiento la función alterna de la línea P3.0
de salida. También acciona el reloj de corrimiento “Shift Clock” a la función alterna de
la línea P3.1 de salida. El reloj de corrimiento esta en estado bajo, durante los
estados S3, S4 y S5 de cada ciclo de máquina y en estado alto durante S6, S1 y S2.
En la fase 2 del estado 6, S6P2, de cada ciclo de máquina la señal SEND es activada
y el contenido del registro de corrimiento de transmisión es recorrido hacia la derecha
una posición (Fig.4.3).
Cuando los datos van saliendo por la derecha, ceros van entrando por la izquierda.
Cuando el bit más significativo MSB, del caracter, está en la posición de salida del
registro de corrimiento, el 1 que fue inicialmente cargado en la 9na. Posición está
justo a la izquierda del MSB y todas las demás posiciones a la izquierda se
encuentran cargadas de ceros. Esta condición establece al bloque de control Tx a
realizar un último corrimiento y después desactiva SEND y establece TI. Ambas
acciones ocurren en S1P1 del 10mo. Ciclo de la máquina después de la escritura en
SBUF.
La recepción es iniciada por la condición REN=1 y RI=0. En S6P2 del siguiente ciclo
de máquina, la unidad de Control Rx escribe los bits 11111110 al registro de
corrimiento del receptor y en la siguiente fase del reloj activa RECEIVE.
Como los bits del carácter que se recibe entran por ls derecha, 1’s saldrán por la
izquierda. Cuando el cero que fue inicialmente cargado en la posición más hacia la
derecha, llega a la posición mas a la izquierda en el registro de corrimiento, esta
condición establece en el bloque de Control Rx de realizar un último corrimiento y
carga SBUF. En S1P1 del 10mo. Ciclo de máquina (después de haber escrito RI=0 en
SCON), RECEIVE es limpiado y RI establecido.
En este modo, 10 bits son transmitidos (por TxD) o recibidos (por RxD).Un bit de
inicio “START” en nivel 0, 8 bits de datos (primero el LSB), y un bit de paro “STOP” en
nivel 1. En la recepción , el bit de STOP viene en RB8 de SCON. El Baud Rate es
determinado por la frecuencia de los “overflows” del Timer 1. La figura 4.4 muestra un
diagrama del Puerto Serie en MODO 1.
Cada tiempo que dura el bit recibido, es dividido en 16 períodos. Durante los períodos
7mo. 8vo. 9mo., el valor del bit muestreado, el valor aceptado, es el que se obtuvo en
las últimas dos muestras. Esto se hace para eliminar ruido. Si el valor aceptado del
primer bit es 1, el circuito receptor es restablecido y la unidad receptora espera otro
transiente de inicio. Si el bit de comienzo es correcto, es decir 0, la recepción
continúa.
Cuando RI=0, SM2=0 o el bit de stop es = 1, el bit de stop se introducirá en RB8, los 8
bits de datos en SBUF y RI se activa. A partir de este momento la unidad receptora
espera otra transición negativa en la línea RxD.
11 Bits son transmitidos (por la línea TxD) o recibidos (por la línea RxD); un bit de
inicio (0), 8 bits de datos, un bit programable (9no. Bit) y un bit de stop (1).
El primer pulso de corrimiento ocurre un período mas tarde. El primer pulso de reloj
pone un 1 (bit de stop), en la posición del 9no. bit. Después de esto, solo ceros sean
introducidos por la izquierda mientras que los bits de datos salen por la derecha.
Cada tiempo que dura el bit recibido, es dividido en 16 períodos. Durante los períodos
7mo., 8vo. Y 9no, el valor del bit es muestreado, el valor aceptado, es el que se
obtuvo en las últimas dos muestras. Esto se hace para eliminar ruido. Si el valor
aceptado del primer bit es 1, el circuito receptor es restablecido y la unidad receptora
espera otro transiente de inicio. Si el bit de comienzo es correcto, es decir 0, continúa
la recepción.
Cuando RI=0 y SM2=0 o el 9no. bit de datos = 1, el 9no. bit de datos se introducirá en
RB8, los 8 bits de datos en SBUF y RI se activa. A partir de este momento la unidad
receptora espera otra transición negativa en la línea RxD.
EJEMPLO :
Los registros de direcciones de 8 bits, pueden ser los registros R0 y R1 del banco
de registros, o el SP.
EJEMPLO :
EJEMPLO :
EJEMPLO :
Existen 4 bancos de registros, cada banco contiene los 8 registros (R0 a R7). Estos
bancos pueden ser accesados mediante los bits 3 y 4 del PSW.
EJEMPLO :
Para poder mover datos de la memoria interna RAM o SFR, existen 8 instrucciones
principales:
EJEMPLO :
0 0 0
1 0 1
1 1 0
0 1 1
JZ rel ; Salta si A = 0
JNZ rel ; Salta si A ≠ 0
DJNZ <byte>, rel ; Decrementa y salta si no es igual a 0
CJNE A,<byte>,rel ; Salta si A ≠ <byte>
CJNE <byte>,#dato,rel ; Salta si <byte> ≠ #dato
EJEMPLO :
MOV CONTADOR,#10 ; N = 10
DJNZ CONTADOR,LAZO
(continúa)
Las instrucciones que permiten hacer los saltos incondicionados son las
siguientes:
OPERACIÓN: ACALL
(PC) ß (PC)+2
(SP) ß (SP)+1
((SP)) ß (PC7-0)
(SP) ß (SP)+1
((SP)) ß (PC15-8)
EJEMPLO:
ORG 00H
0000 5100 ACALL LAZO1 ; 0101 0001 0000 0000
0002 E8 LAZ02 : MOV A, R0 pág.2 Direc. pág.
0003 C6 XCH A, @R0
0004 E9 MOV A, R1
0005 22 RET
0006 02 0200 LJMP 0200H
ORG 0200H
0200 F8 LAZ01: MOV R0, A
0201 22 RET
0202 1102 ACALL LAZO2; 000 1 0001 0000 0010
0204 END pág.0 Direc. Pág.
La dirección con la cual se carga el PC es 0002. Cabe aclarar que los bits 8 al
12 del OPCODE permanecen siempre constantes (10001), en cualquier llamado del tipo
ACALL.
Como puede observarse también, el valor del nibble de más alto orden del PC INC
y el PC FINAL es el mismo, ello nos limita la longitud del salto.
El destino debe por lo tanto estar dentro del mismo block de 2K de memoria del
programa donde se encuentra la instrucción ACALL.
EJEMPLO:
El Acumulador contiene 0C3H (11000011B) y el registro 0 contiene 0AAH
(10101010B). La instrucción, ADD A,R0, dejaría 6DH (01101101B) en el acumulador con la
bandera del acarreo auxiliar limpiada y las banderas de acarreo y sobreflujo establecidas .
ADD A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0010 1rrr
OPERACIÓN: ADD
(A) ß (A)+(Rn)
ADD A, @Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0010 111i
OPERACIÓN: ADD
(A) ß (A)+((Ri))
ADD A, directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ADD
ADD A, #dato
BYTES: 2CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ADD
EJEMPLO:
ADDC simultáneamente suma el byte variable indicado, la bandera de acarreo y ADDC A, <src-byte>
el contenido del Acumulador, dejando el resultado en el Acumulador. Las banderas de sumar con acarreo
acarreo-auxiliar y la de acarreo están establecidas, respectivamente, si hay acarreo hacia el (carry).
exterior del bit 3 ó del bit 7. De otra forma ellas están limpias.
hacia afuera, o del bit 7 hacia afuera pero no del bit 6 al bit 7. de otro modo OV está limpio.
Cuando se suman enteros signados, el OV indica un número negativo producido como la
suma de dos operandos positivos ó un número positivo producido por la suma de dos
operandos negativos. Cuatro modos de direccionamiento de operandos fuente están
permitidos: registro directo, registro indirecto ó inmediato.
EJEMPLO:
ADDC A, Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0011 1rrr
OPERACIÓN: ADDC
(A) ß (A)+(C)+(Rn)
EJEMPLO:
A = C3 R0=AA C=1 C3 = 11000011
AA= 10101010
CT= 1
1 01101110
ADDC A, @Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0011 011i
OPERACIÓN: ADDC
(A) ß (A)+(C)+((Ri))
ADDC A, directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ADDC
(A) ß (A)+(C)+(directo)
ADDC A, #dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ADDC
(A) ß (A)+(C)+(#dato)
EJEMPLO :
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a1 a1
OPERACIÓN: AJMP
(PC) ß (PC)+2
EJEMPLO :
ORG 00H
0000 C100 AJMP ETA ;ETA =0600H = 0000 0 110 0000 0000B
0600 7450 ETA: MOV A,#50
END
ANL <dest.>,<fuente> ANL Ejecuta la operación lógica AND, bit a bit entre las variables indicadas y
guarda los resultados en la variable destino. Las banderas no son afectadas.
NOTA :
Cuando ésta instrucción es usada para modificar un puerto de salida, el valor usado
como dato del puerto será leído del latch del puerto NO DE LA PATA DEL MISMO.
EJEMPLO :
El byte máscara que determina el patrón de bits que serán limpiados puede ser una
constante contenida en la instrucción o un valor calculado en el acumulador. La
instrucción, ANL P1,#01110011B, limpiará los bits 7, 3, y 2 del latch del puerto de salida 1.
ANL A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0101 1rrr
OPERACIÓN: ANL
(A) ß (A)^(Rn)
ANL A,Directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ANL
(A) ß (A)^(directo)
ANL A,@Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0101 011i
OPERACIÓN: ANL
(A) ß (A)^((Ri))
ANL A,#dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ANL
(A) ß (A)^#dato
ANL directo,A
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ANL
(directo) ß (directo)^(A)
ANL directo,#dato
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ANL
(directo) ß (directo)^#dato
EJEMPLO :
A=C3 R0=55
ANL C, bit Si el valor Booleano del bit fuente es un 0 lógico, limpia la bandera de acarreo; de
AND lógico para otro modo deja la bandera de acarreo en su estado corriente. Un slash ("/") precediendo al
bits variables operando en el lenguaje de ensamblador indica que el complemento lógico del bit
direccionado es usado como el valor fuente, pero el bit fuente por si mismo no es afectado.
Ninguna otra bandera es afectada.
Sólo el direccionamiento directo es permitido por el operando fuente.
EJEMPLO :
ANL C,bit
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ANL
(C) ß (C)^(bit)
ANL C,/bit
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ANL
(C) ß (C)^/(bit)
CJNE. Compara las magnitudes del primero y segundo operando, y brinca si sus CJNE
valores no son iguales. El salto es calculado por la suma algebraica del valor actual del PC y <dest>,<fuente>
el desplazamiento relativo (operando REL). La bandera de acarreo es establecida si el valor Compara y brinca
entero sin signo de la <palabra destino> es menor que el valor entero sin signo de la <palabra si no es igual
fuente>; por otro lado el acarreamiento es limpiado. Ningún operando es afectado.
EJEMPLO :
El acumulador contiene 34H. El registro 7 contiene 56H. La primera instrucción
secuencia,
CJNE R7,#60H,NO_IGUAL
;R7=60H
NO_IGUAL: JC RIG_BAJO ;si R7<60H
;si R7>60H
establece la bandera de acarreo y brinca a la instrucción con la etiqueta NO_IGUAL.
Probando la bandera de acarreo esa instrucción determina si R7 es mayor o menor que
60H.
NOTA :
CJNE A, DIRECTO,REL
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
Entonces:
(C) ß 1
De lo contrario:
(C) ß 0
CJNE A,#DATO,REL
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
Entonces:
(PC) ß (PC) + salto relativo
Si (A) < dato
Entonces:
(C) ß 1
Además:
(C) ß 0
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
1011 1rrr dato inmediato dirección relativa
OPERACIÓN: CJNE
(PC) ß (PC) + 3
Entonces:
De lo contrario:
(C) ß 0
CJNE @Ri,#DATO,REL
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
CLR A CLR A. El acumulador es limpiado (todos los bits se colocan en cero). Las
Limpia el acumulador banderas no son afectadas.
EJEMPLO :
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1110 0100
OPERACIÓN: CLR
(A) ß 0
CLR bit
limpia el bit.
CLR. El bit indicado es limpiado (se convierte a cero). Ninguna otra bandera es
afectada. CLR puede operar sobre una bandera de acarreo o cualquier bit directamente
direccionable.
EJEMPLO :
CLR P1.2
CLR C
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1100 0011
OPERACIÓN: CLR
(C) ß 0
CLR bit
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: CLR
(bit) ß 0
CPL A. Cada bit del acumulador está lógicamente complementado (complemento CPL A
a unos). Los bits que previamente contienen un 1 son cambiados a 0 y viceversa. Las complemento del
banderas no son afectadas. acumulador.
EJEMPLO:
CPL A
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: CPL
(A) ß /(A)
Complemento del acumulador
CPL BIT CPL BIT. La variable bit especificada es complementada. Un bit el cual ha estado
Complemento del bit en 1 es cambiado a 0, y viceversa. Ninguna otra bandera es afectada. CPL puede operar
sobre la bandera de acarreo (carry) o cualquier bit direccionable.
NOTA :
EJEMPLO :
CPL C
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1011 0011
OPERACIÓN: CPL
(C) ß /(C)
CPL bit
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN:
(bit) ß /(bit)
Complemento del acarreo
DA A, Ajusta el valor de los 8 bits del acumulador, resultado de una suma anterior de
DA A
dos variables (cada una en formato BCD), produciendo dos dígitos de cuatro bits. Cualquier
Ajuste decimal del
instrucción ADD o ADDC puede haber sido usada para ejecutar la suma.
acumulador por
adición
Si en el acumulador los bits de 3-0 son, más grandes que 9 (XXXX1010-
XXXX1111), o si la bandera AC es 1, 6 es sumado al acumulador produciendo el dígito en
BCD del nibble de bajo orden. Esta suma interna establecerá la bandera de acarreo si un
acarreo hacia el exterior del campo de los cuatro bits de alto orden, del o contrario, limpiará la
bandera de acarreo.
Si la bandera de acarreo es ahora establecida ó si los cuatro bits de alto orden ahora
excedieron de nueve (1010XXXX-1111XXXX), estos bits de alto orden son incrementados por
seis, produciendo el dígito BCD en el nibble de alto orden. De igual forma, se establecería la
bandera de acarreo si hubiera un acarreo hacia el exterior de los bits de alto orden, de lo
contrario la bandera será limpiada. Así la bandera de acarreo indica si la suma de las dos
variables BCD, originales es más grande que 100, permitiendo sumar múltiples decimales con
precisión. OV no es afectado.
Todo esto ocurre durante el ciclo de una instrucción. Esencialmente, esta instrucción
ejecuta la conversión decimal por adición de 00H, 06H, 60H, ó 66H al acumulador,
dependiendo del acumulador inicial y las condiciones del PSW.
NOTA:
EJEMPLO:
ADDC A,R3
DA A
ejecutará una suma estándar en complemento a dos binario, resultando el valor 0BEH
(101111110) en el acumulador. Las baderas de acarreo y acarreo auxiliar serán limpiadas.
Las variables BCD pueden ser incrementadas o decrementaras por adición de 01H ó
99H respectivamente. Si el acumulador inicialmente contiene 30H (representando los dígitos
del 30 decimal), entonces la secuencia de las instrucciones,
ADD A,#99H
DA A
BYTES:1 CICLOS: 1
CODIGO DE OPERACIÓN:
1101 0100
OPERACIÓN: DA
NOTA:
Cuando ésta instrucción es usada para modificar un puerto de salida, el valor usado
como el dato original del puerto será leído del latch de salida, no de la terminal de entrada.
EJEMPLO:
DEC @R0
DEC R0
DEC @R0
Dejará el registro 0 colocado a 7EH y la localidad de la RAM interna 7EH y 7FH colocada a
0FFH y 3FH. Se indicará además que hubo un sobreflujo, OV = 1.
DEC A
BYTES:1 CICLOS:1
CÓDIGO DE OPERACIÓN:
0001 0100
OPERACIÓN: DEC
(A) ß (A) –1
DEC Rn
BYTES:1 CICLOS: 1
CODIGO DE OPERACIÓN:
0001 1rrr
OPERACIÓN: DEC
(Rn) ß (Rn) - 1
DEC directo
BYTES:2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: DEC
(directo)ß (directo) – 1
DEC @Ri
BYTES:1 CICLOS:1
CODIGO DE OPERACIÓN:
0001 0111
OPERACIÓN:
((Ri)) ß ((Ri)) - 1
DIV AB DIV AB divide el entero no signado del acumulador entre el entero no signado del
Divide registro B. El acumulador recibe la parte entera del cociente; el registro B el residuo. El carry
y la bandera OV serán limpiadas.
EXCEPCIÓN:
EJEMPLO:
DIV AB
BYTES: 1 CICLOS: 4
CODIGO DE OPERACIÓN:
1000 0100
OPERACIÓN: DIV
(A)15-8
ß (A) / (B)
(B))7-0
NOTA:
EJEMPLO:
Las localidades de la RAM interna 40H, 50H y 60H contienen el valor 01H, 70H y
15H, respectivamente. La secuencia de instrucciones,
DJNZ 40H,LABEL_1
DJNZ 50H,LABEL_2
DJNZ 60H,LABEL_3
Causará un salto a la instrucción con la etiqueta LABEL_2 con los valores 00H, 6FH
y 15H, en las tres localidades de la RAM. El primer salto no se efectúa porque el resultado es
cero.
MOV R2,#8
TOGGLE: CPL P1.7
DJNZ R2,TOGGLE
Alternará el P1.7 ocho veces, causando cuatro pulsos de salida que aparecerán en el
bit 7 del puerto de salida 1. Cada pulso durará tres ciclos de máquina; dos por DJNZ y uno por
alterar la terminal.
DJNZ Rn,rel
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: DJNZ
(PC) ß (PC) + 2
(Rn) ß (Rn) – 1
Si (Rn) > 0 ó (Rn) < 0
Entonces:
DJNZ directo,rel
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: DJNZ
(PC) ß (PC) + 2
(directo)ß (directo) – 1
Si (directo) > 0 ó (directo) < 0
Entonces:
(PC) ß (PC) + rel
NOTA :
Cuando asta instrucción es usada para modificar un puerto de salida, el valor usado
como el dato original del puerto será leído del latch de salida, no de la terminal de entrada.
EJEMPLO :
La instrucción secuencia,
INC @R0
INC R0
INC @R0
dejará el registro 0 colocado a 7FH y las localidades de la RAM interna 7EH y 7FH
conteniendo (respectivamente) 00H y 41H.
INC A
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0000 0100
OPERACIÓN: INC
(A) ß (A) + 1
NOTA:
En esta instrucción de INC la bandera de paridad se ve afectada.
INC Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0000 0rrr
OPERACIÓN: INC
(Rn) ß (Rn) + 1
INC directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: INC
(directo) ß (directo) + 1
INC @Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0000 011i
OPERACIÓN: INC
((Ri)) ß ((Ri)) + 1
INC DPTR
INC DPTR. Incrementa el valor del apuntador de datos en 1. El incremento en
incrementa el apuntador de
un registro de 16 bits es optimizado; un sobreflujo del byte de bajo orden del apuntador de
datos.
datos (D L) de 0FFH a 00H incrementará el byte de alto orden (D H). Las banderas no son
afectadas.
EJEMPLO :
INC DPTR
INC DPTR
INC DPTR
INC
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
1010 0011
OPERACIÓN: INC
(DPTR) ß (DPTR) + 1
JB. Si el bit indicado es uno, salta a la dirección formada por la suma algebraica
del PC incrementado y del byte de desplazamiento relativo, REL; de otra manera
procede con la siguiente instrucción. El bit marcado no se modifica. Las banderas no son
afectadas.
EJEMPLO :
El dato presente en el puerto de entrada 1 es CA (11001010B). El acumulador
contiene 56 (01010110B). La secuencia de instrucciones,
JB 1.2,ETIQUETA1
JB ACC.2,ETIQUETA2
JB
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JB
(C) ß (C) + 3
Si (bit) = 1
Entonces:
(C) ß (C) + rel
JBC. Si el bit marcado es uno, lo limpia y salta a la dirección formada por la suma JBC bit,rel
algebraica del C incrementado y del byte de desplazamiento relativo, REL; de otra manera Si el bit esta establecido
procede con la siguiente instrucción. Las banderas no son afectadas. lo limpia y salta.
NOTA : Cuando esta instrucción es usada para examinar una terminal de salida, el valor
usado como dato original será leído del latch de salida, no de la terminal de entrada.
EJEMPLO :
El acumulador contiene 56H (01010110B). La secuencia de instrucciones,
JBC ACC.3,ETIQUETA1
JBC ACC.2,ETIQUETA2
JBC
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JBC
(PC) ß (C) + 3
Si (bit) = 1
Entonces:
(bit) ß 0
(PC) ß (PC) + rel
EJEMPLO:
La bandera de acarreo es limpiada. La instrucción secuencia,
JC ETIQUETA 1
CPLC C
JC ETIQUETA 2
colocará el carry y causará la ejecución del programa ara continuar con la instrucción
identificada por la etiqueta LABEL 2.
JC
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JC
(C) ß (C) + 2
Si (C) = 1
Entonces:
(C) ß (C) + rel
JMP @A+DPTR
salto indirecto.
EJEMPLO :
Un número par de 0 a 6 está en el acumulador. La siguiente secuencia de
instrucciones saltará a una de cuatro instrucciones AJMP en un salto empezando por
JMP_TBL:
MOV DPTR,#JMP_TBL
JMP @A+DPTR
JMP_TBL: AJMP ETIQTA0
AJMP ETIQTA1
AJMP ETIQTA2
AJMP ETIQTA3
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
0111 0011
OPERACIÓN: JMP
EJEMPLO:
JNB P1.3,ETIQTA1
JNB ACC.3,ETIQTA2
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JNB
(PC) ß (PC) + 3
Si (bit) = 0
EJEMPLO :
JNC ETIQTA1
CPL C
JNC ETIQTA2
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JNC
(PC) ß (PC) + 2
Si (C) = 0
JNZ rel salta si JNZ. Si cualquier bit del acumulador es un 1, salta a la dirección formada por
el acumulador no es la suma algebraica del PC incrementado y del byte de desplazamiento relativo, REL; de otra
cero. manera procede con la siguiente instrucción. La bandera de acarreo no es modificada. de
otra manera procede con la siguiente instrucción.
EJEMPLO :
JNZ ETIQUETA1
INC A
JNZ ETIQUETA2
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JNZ
(PC) ß (PC) + 2
Si (A) $ 0
JZ. Si todos los bits del acumulador son cero, salta a la dirección formada por JZ rel
la suma algebraica del PC incrementado y del byte de desplazamiento relativo, REL; de otra salta si el acumulador
manera procede con la siguiente instrucción. El acumulador no se modifica. Las banderas no es cero.
son afectadas.
EJEMPLO :
JZ ETIQUETA 1
DEC A
JZ ETIQUETA 2
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: JZ
(PC) ß (PC) + 2
Si (A) = 0
Entonces (PC) ß (PC) + rel
LCALL llama una subrutina que puede empezar en cualquier parte de la memoria
LCALL dirección 16 de programa (64K bytes). La instrucción suma tres al contador del programa para que apunte
llamada larga. a la dirección de la siguiente instrucción, luego incrementa el SP introduciendo el byte bajo del
PC e incrementa nuevamente el SP para introducir el byte alto del PC. El PC se carga con el
segundo y tercer byte de la instrucción LCALL. La ejecución de las instrucciones de la
subrutina comienza en ésta dirección, hasta que encuentre la instrucción RET, la cual
restablece el PC que había sido almacenado en el SP, continuando nuevamente con el
programa inicial. Las banderas no son afectadas.
EJEMPLO :
BYTES: 3 CICLOS: 2
OPERACIÓN: LCALL
(PC) ß (PC) + 3
(SP) ß (SP) + 1
((SP)) ß (PC7-0)
(SP) ß (SP) + 1
((SP)) ß (PC15-8)
(PC) ß direc.15-0
LJMP dirección 16 LJMP causa un salto incondicional a cualquier parte en el espacio de memoria del
salto largo. programa (64K bytes). El PC se carga con los 2 últimos bytes de la instrucción y salta para
continuar con la ejecución del programa a partir de esa dirección. Las banderas no son
afectadas.
EJEMPLO :
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: LJMP
(PC) ß direc.15-0
EJEMPLO :
La localidad de la RAM interna 30H contiene el dato 40H. El valor de la RAM
interna 40H es 10H. El dato presente en el puerto de entrada 1 es 11001010B (0CAH).
00 ORG 00H
0000 7830 MOV R0,#30H ; R0 ß 30H
0002 E6 MOV A,@R0 ; A ß 40H
0003 F9 MOV R1,A ; R1 ß 4OH
0004 87F0 MOV B,@R1 ; B ß 10H
0006 A790 MOV @R1,P1 ; RAM(40H) ß 0CAH
00088590A0 MOV P2,P1 ; P2 #0CAH
0000 END
deja el valor 30H en el registro 0, 40H en ambos el acumulador y el registro 1, 10H en el
registro B, y 0CAH (11001010B) ambos en la localidad 40H de la RAM y sobre el puerto 2
de salida.
MOV A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1110 1rrr
OPERACIÓN: MOV
(A) ß (Rn)
MOV A,directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(A) ß (directo)
MOV A,@Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1110 011i
OPERACIÓN: MOV
(A) ß ((Ri))
MOV A,#dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(A) ß #dato
MOV Rn,A
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1111 1rrr
OPERACIÓN: MOV
(Rn) ß (A)
MOV Rn,directo
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(Rn) ß (directo)
MOV Rn,#dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(Rn) ß #dato
MOV directo,A
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(directo) ß (A)
MOV directo,Rn
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(directo) ß (Rn)
MOV directo,directo
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(directo) ß (directo)
MOV directo,@Ri
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(directo) ß ((Ri))
MOV directo,#dato
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(directo) ß #dato
MOV @Ri,A
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1111 011i
OPERACIÓN: MOV
((Ri)) ß (A)
MOV @Ri,directo
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
((Ri)) ß (directo)
MOV @Ri,#dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
((Ri)) ß #dato
EJEMPLO :
MOV P1.3,C
MOV C,P3.3
MOV P1.2,C
MOV C,bit
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(C) ß (bit)
MOV bit,C
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
(bit) ß (C)
MOV DPTR,#DATO 16 MOV DPTR.El apuntador de datos es cargado con un dato de 16 bits contenidos
carga al apuntador de datos en el segundo y tercer bytes de la instrucción, que corresponden al byte de alto orden (DPH)
con una constante de 16 bits. y al byte de bajo orden (DPL) del DPTR respectivamente. Las banderas no son afectadas.
Esta es la única instrucción que mueve un dato de 16 bits.
EJEMPLO :
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: MOV
DPH ß #dato15-8
DPL ß #dato7-0
EJEMPLO :
REL_PC: INC A
MOVC A,@A + PC
RET
DB 66H
DB 77H
DB 88H
DB 99H
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
10 01 0011
OPERACIÓN: MOVC
MOVC A,@A + PC
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
10 00 0011
OPERACIÓN: MOVC
(PC) ß (PC) + 1
(A) ß ((A) + (PC))
ATENCIÓN:
Debe tenerse especial cuidado cuando se accese una memoria de 256 bytes, de
utilizar las terminales restantes del puerto de manera correcta, o bien, cuando se utilice una
memoria mayor y se desee accesar por páginas, por medio de los registros R0 o R1,
asegurarse que el P2 señale el número de página adecuado.
EJEMPLO :
MOVX A,@R1
MOVX @R0,A
MOVX A,@Ri
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
1110 001i
OPERACIÓN: MOVX
(A) ß ((Ri))
MOVX A,@DPTR
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
1110 0000
OPERACIÓN: MOVX
(A) ß ((DPTR))
MOVX @Ri,A
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
1111 001i
OPERACIÓN: MOVX
((Ri)) ß (A)
MOVX @DPTR,A
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
1111 0000
OPERACIÓN: MOVX
(DPTR) ß (A)
MUL AB multiplica los ocho bits del acumulador y los del registro B. El byte de
bajo orden del producto de 16 bits, se almacena en el acumulador, y el byte de alto orden en
B. Si el producto es más grande que 255 (0FFH) la bandera de sobreflujo es establecida, de lo
contrario es limpiada.
EJEMPLO :
BYTES: 1 CICLOS: 4
CÓDIGO DE OPERACIÓN:
1010 0100
OPERACIÓN: MUL
(B)15-8
EJEMPLO :
Se desea producir un pulso bajo en la terminal de salida del bit 7 del puerto 2,
exactamente durante los últimos 5 ciclos. Una secuencia SETB/CLR generaría un pulso de un
ciclo, de tal manera, que se necesitarían 4 ciclos adicionales. Esto puede realizarse de la
siguiente manera (se asume que no existen interrupciones):
CLR P2.7
NOP
NOP
NOP
NOP
SETB P2.7
NOP
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0000 0000
OPERACIÓN: NOP
(PC) ß (PC) + 1
NOTA :
Cuando ésta instrucción es usada para modificar un puerto de salida, el valor usado
como dato original, será leído del latch de salida del puerto y no de sus terminales.
EJEMPLO :
ORL A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0100 1rrr
OPERACIÓN: ORL
ORL A,directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
ORL A,@Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
ORL A,#dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
ORL directo,A
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
ORL directo,#dato
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
EJEMPLO :
ORL C,bit
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
ORL C,/bit
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: ORL
EJEMPLO :
POP DPH
POP DPL
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: POP
(directo)---((SP))
(SP)---(SP) - 1
EJEMPLO :
PUSH DPL
PUSH DPH
dejará el apuntador de apilamiento colocado a 0BH y guarda 23H y 01H en las localidades
de la RAM interna 0AH y 0BH, respectivamente.
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: PUSH
(SP) ß (SP) + 1
((SP)) ß (directo)
RET extrae de la pila los bytes de bajo y alto orden del PC, decrementando dos veces
el apuntador de apilamiento. Una vez que el PC es cargado con la nueva dirección,
continúa con la ejecución del programa principal, en la instrucción siguiente a la
instrucción que llamó a la subrutina (ACALL o LCALL). Las banderas no son afectadas.
EJEMPLO :
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
0010 0010
OPERACIÓN: RET
(PC15-8) ß ((SP))
(SP) ß (SP) - 1
(PC7-0) ß ((SP))
(SP) ß (SP) - 1
RETI
retorno de interrupción.
RETI extrae de la pila, los bytes de alto y bajo orden del PC y restablece la lógica
de Interrupción que le permite aceptar interrupciones adicionales de la misma o menor
prioridad. El apuntador de apilamiento es decrementado dos veces. Los otros registros no
son afectados; el estado de pre-interrupción del PSW no es automáticamente resguardado. La
ejecución del programa continúa a la dirección resultante, que generalmente es la
instrucción siguiente al punto en el cual la interrupción fue detectada.
NOTA :
EJEMPLO :
BYTES: 1 CICLOS: 2
CÓDIGO DE OPERACIÓN:
0011 0010
OPERACIÓN: RETI
(PC15-8) ß ((SP))
(SP) ß (SP) - 1
(PC7-0) ß ((SP))
(SP) ß (SP) - 1
RL. Los ocho bits en el acumulador son rotados un bit a la izquierda. El bit 7 RL A
es rotado a la posición del bit 0. Las banderas no son afectadas.
EJEMPLO :
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0010 0011
OPERACIÓN: RL
(An + 1) ß (An) n = 0 - 6
(A0) ß (A7)
RLC. Los ocho bits en el acumulador y la bandera de acarreo son rotados un bit a la
a
izquierda. El bit 7 se mueve a la bandera de acarreo; el estado original de la bandera de
acarreo se mueve a la posición del bit 0. Las banderas no son afectadas.
EJEMPLO :
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0011 0011
OPERACIÓN: RLC
(An + 1) ß (An) n = 0 - 6
(A0) ß (C)
(C) ß (A7)
a
RR. Los ocho bits en el acumulador son rotados un bit a la derecha. El bit 0 es
rotado a la posición del bit 7. Las banderas no son afectadas.
EJEMPLO :
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0000 0011
OPERACIÓN: RR
(An) ß (An + 1) n = 0 - 6
(A7) ß (A0)
RRC. Los ocho bits en el acumulador y la bandera de acarreo son rotados un bit a
la derecha. El bit 0 se mueve a la bandera de acarreo; el valor original de la bandera de
acarreo se mueve a la posición del bit 7. Las otras banderas no son afectadas.
EJEMPLO :
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0001 0011
OPERACIÓN: RRC
(An) ß (An + 1) n = 0 - 6
(A7) ß (C)
(C) ß (A0)
SETB coloca el bit indicado en uno. SETB puede operar sobre la bandera de acarreo
ó cualquier bit direccionable directamente. Las otras banderas no son afectadas.
EJEMPLO :
La bandera de acarreo es limpiada. El puerto 1 de salida ha sido escrito con el valor
34H (00110100B). Las instrucciones,
SETB C
SETB P1.0
SETB C
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1101 0011
OPERACIÓN: SETB
(C) ß 1
SETB bit
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: SETB
(bit) ß 1
EJEMPLO :
NOTA :
Por debajo o por arriba de las condiciones la instrucción siguiente SJMP estará en
102H. Además, el byte de desplazamiento de la instrucción será el offset relativo (0123H-
0102H) = 21H. De otra forma, un SJMP con un desplazamiento de 0FEH sería una
instrucción de lazo infinito.
BYTES: 2 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: SJMP
(PC) ß (PC) + 2
EJEMPLO :
El acumulador contiene 0C9H (11001001B), el registro 2 contiene 54H
(01010100B), y la bandera de acarreo es establecida. La instrucción, SUBB A,R2 dejará el
valor 74H (01110100B) en el acumulador, con la bandera de acarreo y AC limpiados pero OV
establecido.
Note que 0C9H menos 54H es 75H. La diferencia entre éste y el resultado siguiente
es debido a la bandera de acarreo (borrow) que ha sido establecida antes de la operación. Si el
estado del acarreo no es conocido antes de empezar un substracción simple o de precisión
múltiple, él debe de ser limpiado por un instrucción CLR C.
SUBB A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1001 1rrr
OPERACIÓN: SUBB
SUBB A,directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: SUBB
SUBB A,@Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1001 011i
OPERACIÓN: SUBB
SUBB A,#dato
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: SUBB
SWAP A intercambia los “NIBBLES” (campos de 4 bits) de alto y bajo orden del
acumulador (bits 3-0 y bits 7-4). La operación puede también ser vista como una instrucción
de rotación de 4 bits sin acarreo. Las banderas no son afectadas
.
EJEMPLO:
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1 1 00 0100
OPERACIÓN: SWAP
EJEMPLO:
XCH A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1 1 00 1rrr
OPERACIÓN: XCH
XCH A,directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: XCH
XCH A,@Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1100 011i
OPERACIÓN: XCH
XCHD intercambia el NIBBLE de bajo orden del acumulador (bits 3-0), con el
NIBBLE bajo del dato de la RAM interna indirectamente direccionada por el registro
especificado. Las banderas no son afectadas.
EJEMPLO:
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
1101 011i
OPERACIÓN: XCHD
NOTA :
Cuando esta instrucción es usada para modificar un puerto de salida, el valor usado
como dato original del puerto será leído del latch de salida, no de la terminal de entrada.
EJEMPLO:
XRL A,Rn
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0110 1rrr
OPERACIÓN: XRL
XRL A,directo
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: XRL
XRL A,@Ri
BYTES: 1 CICLOS: 1
CÓDIGO DE OPERACIÓN:
0110 011i
OPERACIÓN: XRL
XRL A,#DATA
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: XRL
XRL directo,A
BYTES: 2 CICLOS: 1
CÓDIGO DE OPERACIÓN:
OPERACIÓN: XRL
XRL directo,#dato
BYTES: 3 CICLOS: 2
CÓDIGO DE OPERACIÓN:
OPERACIÓN: XRL
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
38H 0 0 0 0 1 1 1 0 0 0
Se envía la palabra de control al exhibidor (RS=0 y R/W=0), los bits DB5 y DB4
especifican el tamaño del bus, y el bit DB3 el número de líneas del exhibidor.
NOTA: Cada instrucción, toma un cierto tiempo de ejecución que va de 40 µs a 1.64 ms. (Ver
tiempos de ejecución en la Tabla1.)
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
01H 0 0 0 0 0 0 0 0 0 1
3. -Se establece el movimiento del cursor hacia la derecha, la pantalla del exhibidor
permanece fija con la entrada de los caracteres.
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
06H 0 0 0 0 0 0 0 1 1 0
4.-Se prende la pantalla del exhibidor, se activa el cursor señalando la posición del
próximo caracter de entrada y se desactiva el parpadeo.
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0EH 0 0 0 0 0 0 1 1 1 0
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
80H 0 1 0 0 0 0 0 0 0 0
__
6.-A partir de aquí se puede comenzar a enviar los caracteres que se desean exhibir
dejando un tiempo entre cada uno de ellos de 40 µs. mínimo, y con RS=1
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
41H 1 0 0 1 0 0 0 0 0 1
A __
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
42H 1 0 0 1 0 0 0 0 1 0
BUS DE DATOS
33pF 31 39 3 2 10 11 10 11
EA/VP P0.0 D0 Q0 A0 O0 A0 D0
P0.1 38 4 D1 Q1 5 9 A1 O1 12 9 A1 D1 12
19 37 7 6 8 13 8 13
11.05592MHz X1 P0.2 D2 Q2 A2 O2 A2 D2
36 8 9 7 15 7 15
VCC P0.3 D3 Q3 A3 O3 A3 D3
35 13 12 6 16 6 16
P0.4 D4 Q4 A4 O4 A4 D4
18 34 14 15 5 17 5 17
X2 P0.5 D5 Q5 A5 O5 A5 D5
33 17 16 4 18 4 18
33pF P0.6 D6 Q6 A6 O6 A6 D6
10uF 32 18 19 3 19 3 19
P0.7 D7 Q7 A7 O7 A7 D7
9 25 25
RESET RESET A8 A8
21 1 24 24
P2.0 OC A9 A9
22 11 21 21
P2.1 G A10 A10
12 23 23 23
13 INT0 P2.2 24 74LS373 2 A11 2 A11
100K INT1 P2.3 A12 A12
14 25 26 26
T0 P2.4 A13 A13
15 26 27 1
T1 P2.5 A14 A14
27
P2.6
1N4148 1 28 20 20
P1.0 P2.7 CE CE
2 P1.1
22
OE
22
RD
3 17 1 27
P1.2 RD 5V VPP WR
4 P1.3 WR
16
5 29 27256 43256
P1.4 PSEN
6 P1.5 ALE/P
30
7 11
P1.6 TXD
8 P1.7 RXD 10 BUS DE DATOS
8031
EXHIBIDOR
LM 16256
14 7 6 4 2 3 1 6
5V
100K
D
13 Vcc 1 4 7
11 17 D0
12 16 D1 VCC
15 D2 Y1 1 2 5 8
74HC08 14 D3 Y2 2
Y3 3
Y4 4 3 6 9
X1 11
A12 5 OSC X2 10 10K
1 15 X3 8 # 0 *
A Y0
2 14 X4 7
B Y1 0.1uF
3 13 0.01uF 6 KEYB
C Y2
A14 12 12 DA
Y3
11 13 /OE
Y4
6 10 GND
G1 Y5 RESET DEL 8031
4 9 9
G2A Y6
5 7 INTERCONEXIONADO DEL MICROCONTROLADOR
G2B Y7
8051 CON EL TECLADO Y EL EXHIBIDOR
74HC138 Size Document Number REV
A SISTEMA MINIMO2
Date: March 25, 1998 Sheet of
400B
400B A3 INC DPTR
400C 124046 LCALL XCBDOR
4030 ;************************************
4030 ;**** SUBRUTINA DE CONTROL Y PRE-****
4030 ;**** SENTACION DEL EXHIBIDOR ****
4030 ;************************************
4051 ;****************************************
4051 ;**** SUBRUTINA DE TIEMPO DE 40uSEGS ****
4051 ;****************************************
4051 7F14 QARNTA: MOV R7,#20
4053 DFFE TIEMPO: DJNZ R7,TIEMPO
4055 22 RET
4056
;******************************************
;** SUBRUTINA QUE ENVIA EL CARACTER ***
4056 ;** 01 DE CONTROL, Y ADEMAS CONSUME ***
4056 ;** LOS 1.64 mSEGS PARA SU EJECUCION ***
4056 ;******************************************
4075 ;*****************************************
4075 ;**** TABLA DE MENSAJES DEL EXHIBIDOR ****
4075 ;*****************************************
La utilización de un teclado para seleccionar una acción de control o para introducir las
variables solicitadas por el sistema, es siempre indispensable.
Existen dos tipos de teclado los denominados matriciales y los que tienen un punto en
común con todas las teclas. En este ejemplo se trabajará con uno del tipo matricial de 3
columnas por 4 renglones.
Cada vez que se oprime una tecla existen los denominados rebotes, los cuales son
indeseables, debido a que se genera varias veces la demanda de la tecla oprimida. Lo cual
ocasiona que el mismo valor de la tecla sea leído varias veces.
Este circuito tiene además la característica de poder manejar hasta un teclado matricial
de 16 teclas (el 74C923 es de 20 teclas), y de conectarse directamente al bus de datos del
microcontrolador ó microprocesador. Asimismo, mediante una señal de activación DA, nos
indica cuando el dato está estable guardándolo durante todo el tiempo que así se requiera en
fijadores internos.
A continuación se muestra un pequeño programa que toma datos del teclado y los
envía al exhibidor.
;********************************************
;** PROGRAMA PARA TOMAR DATOS DEL TECLADO **
;** Y ENVIARLOS AL EXHIBIDOR **
;** DIRECCIONES DEL EXHIBIDOR **
;** 8000H = CONTROL DEL EXHIBIDOR **
;** 8001H = EXHIBICION DEL DATO **
;** DIRECCION DEL TECLADO = 9000H **
;** EL DA ACTIVA LA INT0 DE MICROCONTR. **
;********************************************
0000 ORG 00H
9000 TEC: EQU 9000H
8000 EXHI: EQU 8000H
0000 020064 LJMP TECLAD
0003 ORG 03H
0003 D200 SETB 20H.0
0005 909000 MOV DPTR,#TEC
0008 E0 MOVX A,@DPTR
0009 540F ANL A,#0FH
000B 2430 ADD A,#30H ;VALOR ASCII
000D 32 RETI
;********************************************
;***** PROGRAMA PRINCIPAL ********
;********************************************
0064 ORG 100
0064 758801 TECLAD: MOV TCON,#01H
0067 9000AE MOV DPTR,#CONTRL
006A 7800 MOV R0,#00H
006C 1191 ACALL SUBEXH
006E 9000B6 MOV DPTR,#TEXTO
0071 118F ACALL SUBEX1
0073 74C0 MOV A,#0C0H
0075 11A5 ACALL POSCUR
0077 9000C7 MOV DPTR,#TEXT1
007A 118F ACALL SUBEX1
007C 3000FD ESPTEC: JNB 20H.0,ESPTEC
007F C200 CLR 20H.0
0081 908001 MOV DPTR,#8001H
0084 F0 MOVX @DPTR,A
0085 7F20 MOV R7,#20H
0087 DFFE TEX: DJNZ R7,TEX
;*********************************************
;****** SUBRUTINA DE EXHIBICION ********
;*********************************************
008F 7801 SUBEX1: MOV R0,#01H
0091 75A080 SUBEXH: MOV P2,#80H
0094 E4 SUBEX: CLR A
0095 93 MOVC A,@A+DPTR
0096 600C JZ FINEXH
0098 F2 MOVX @R0,A
0099 7A10 MOV R2,#10H
009B 79FF LAZEX2: MOV R1,#0FFH
009D D9FE LAZEXH: DJNZ R1,LAZEXH
009F DAFA DJNZ R2,LAZEX2
00A1 A3 INC DPTR
00A2 80ED SJMP SUBEXH
00A4 22 FINEXH: RET
;********************************************
Regreso al
menú principal
INTERCONEXIONANDO UN MOTOR DE PASOS CON EL
MICROCONTROLADOR 8051
El motor de pasos es un motor eléctrico cuyo eje gira una cantidad específica por cada
pulso de entrada que recibe, lo cual permite el control de posición, velocidad, y sentido
(dirección).
A
on
2
S
N
S B S N
S
on N S N on
N N
B’
S S N
N
on A’
A on 4
3
N
S N S
B
N N
on N S N S on
S S
N B’
N S
S
on
A’
Para que gire un tercer paso, desenergizamos las bobinas B-B’ y ahora
volvemos a activar las bobinas A-A’, pero ahora haciendo circular la corriente de A’
hacia A por lo cual el polo superior se polariza positivamente, atrayendo al polo sur del
rotor (parte inferior del rotor), y el inferior negativamente, el cual atrae, al polo norte del
rotor (parte superior del rotor).
Siguiendo con un cuarto paso en el mismo sentido, sea la bobina B-B’, ahora
alimentada en sentido contrario, es decir haciendo circular la corriente de B’ hacia B,
con la bobina A-A’ desactivada. El polo de la derecha se polariza positivamente
atrayendo al polo sur del rotor (parte inferior del rotor), y el de la izquierda
negativamente, el cual atrae, al polo norte del rotor, (parte superior del rotor).
Por último para completar el ciclo, volvamos a conectar las cuatro bobinas como
al inicio por lo cual el rotor girará un cuarto de paso. Si el ciclo se vuelve repetitivo
podremos observar el movimiento del rotor en sentido de las manecillas del reloj. La
velocidad dependerá de la activación y desactivación de las bobinas. Como podemos
observar 4 pasos fueron necesarios para que el motor girara 90 grados de su posición
original, si quisiéramos que el motor girara una vuelta completa tendríamos que darle 12
pasos, es decir repetir el ciclo 4 veces.
Como cada una de las bobinas deben ser energizadas en los dos sentidos,
(fig. 3).
VCC
Rc
Rb
NPN DAR
Rb
PNP DAR
SECUENCIA DE ENERGIZACION
Rc
-VCC
VCC
VCC
R13
VCC
A
3
R1 5 R9
2
4 NPN DAR
1
R2 2
VCC
VCC -VCC
VCC
R3 B
7 R10
1 PNP DAR
6
2 R4 R14
3 SR 15 VCC
A QA VCC
4 14 -VCC R15
5 B QB 13 VCC
C QC VCC
6 12 C
D QD
7
SL R5 9 R11
11 CLK 14
9 8 NPN DAR
S0
10 S1
1
CLR
74194 R6 -VCC
VCC
R7 VCC
D
11 R12 Q?
13 PNP DAR
10
R8
LM339
R16
-VCC
VCC
BUS DE DATOS
33pF
31 EA/VP P0.0
39 3
D0 Q0
2 10
A0 O0
11
38 4 5 9 12
P0.1 D1 Q1 A1 O1
19 37 7 6 8 13
11.05592MHz X1 P0.2 D2 Q2 A2 O2
36 8 9 7 15
P0.3 D3 Q3 A3 O3
VCC 35 13 12 6 16
P0.4 D4 Q4 A4 O4
18 34 14 15 5 17
X2 P0.5 D5 Q5 A5 O5
33 17 16 4 18
33pF P0.6 D6 Q6 A6 O6
10uF 32 18 19 3 19
P0.7 D7 Q7 A7 O7
9 25
RESET RESET A8
21 1 24
P2.0 OC A9
22 11 21
P2.1 G A10
12 23 23
INT0 P2.2 A11
100K 13 24 74LS373 2
INT1 P2.3 A12
14 25 26
T0 P2.4 A13
15 26 27 VCC
T1 P2.5 A14
27
P2.6
1N4148 1 28 20
P1.0 P2.7 CE
2 22
P1.1 OE
3 17 1 2 OHMS
P1.2 RD 5V VPP
4 16 VCC 10 WATTS
P1.3 WR
5 29 27256
P1.4 PSEN
6 30
P1.5 ALE/P
7 11
P1.6 TXD
8 10 A
P1.7 RXD 3
8031 5
VCC
2
4 TIP120
1.2K
10k
1 BOBINA 1 DEL MOTOR
1 2
CLR
10
S1
9
S0
11 B
CLK
VSS
7 10K 7
SL
6 12 1 TIP125
VCC 5 D QD 13 6
C QC
4 14 1.2K
3 B QB 15 VCC
A QA
2 2 OHMS
SR
VSS 2 OHMS
74HC194
C 10 WATTS
10 WATTS
9
14
8 TIP120
1.2K
BOBINA 2
D
TIP125 DEL MOTOR
11
13 VSS
10
1.2K 2 OHMS 10 WATTS
LM339
INTERCONEXIONADO DEL MICROCONTROLADOR
A UN MOTOR DE PASOS
Size Document Number REV
A SISTEMA MINIMO2
Date: March 30, 1998 Sheet of
;********************************************
;**EL MOVIMIENTO SE REALIZARA A LA DERECHA **
;********* S0=1 y S1=0 ***********
;********************************************
0020 758901 MOV TMOD,#01H ;SE ESTABLECE T0 COMO
;*********************************************
;*** RUTINA DE MOVIMIENTO DEL MOTOR ********
;*********************************************
;*********************************************
;******* RUTINA DE PARO DEL MOTOR *********
;*********************************************
Un parámetro importantísimo , que debe ser tomado en cuenta, al inicio de todos los
diseños, es la capacidad de almacenamiento de información de los dispositivos principalmente
en laos sistemas de adquisición de datos, donde, el tratamiento, análisi y cálculo de resultados
es indispensable.
Por tal motivo, en este ejemplo se plantea la transmisión de datos, de la memoria RAM
hacia una computadora del tipo IBM-PC compatible, haciendo uso del puerto serie del
microcontrolador y su interconexión a la interfase del tipo RS-232C.
El primer bit que se transmite es el bit de inicio (Start bit), el cual tiene la característica
de ser siempre un “0” lógico.
Posteriormente los bits que le siguen son los 8 bits de datos, comenzando con el menos
significativo “D0”.
La transmisión termina con el envio de un último bit, denominado bit de paro (Stop
bit), que siempre será un “1” lógico.
C1- T1salida
3 14
C2+ 4 13 R1entrada
C2- 5 12 R1salida
V- 6 11 T1entrada
T2salida 7 10 T2entrada
R2 entrada 8 9 R2 salida
BUS DE DATOS
31 39 3 2 10 11 10 11
33pF EA/VP P0.0 D0 Q0 A0 O0 A0 D0
38 4 5 9 12 9 12
P0.1 D1 Q1 A1 O1 A1 D1
19 37 7 6 8 13 8 13
X1 P0.2 D2 Q2 A2 O2 A2 D2
36 8 9 7 15 7 15
P0.3 D3 Q3 A3 O3 A3 D3
35 13 12 6 16 6 16
11.0592Mhz P0.4 D4 Q4 A4 O4 A4 D4
5V 18 34 14 15 5 17 5 17
X2 P0.5 D5 Q5 A5 O5 A5 D5
33 17 16 4 18 4 18
P0.6 D6 Q6 A6 O6 A6 D6
32 18 19 3 19 3 19
P0.7 D7 Q7 A7 O7 A7 D7
33pF 9 25 25
10uF RESET A8 A8
21 1 24 24
P2.0 OC A9 A9
RESET P2.1 22 11 G 21 A10 21 A10
12 23 23 23
INT0 P2.2 A11 A11
13 24 74LS373 2 2
INT1 P2.3 A12 A12
100k 14 25 26 26
T0 P2.4 A13 A13
15 26 27 1
T1 P2.5 A14 A14
P2.6 27
1N4148 1 28 20 20
P1.0 P2.7 CE CE
2 22 22
P1.1 OE RD
3 P1.2 RD
17
VCC 1 VPP
27
WR
4 16
P1.3 WR
5 P1.4 PSEN 29 27256 43256
6 30
P1.5 ALE/P
7 11
P1.6 TXD
8 P1.7 RXD 10
8031
CONEXIONADO DEL
CONECTOR STANDARD
DEL PUERTO SERIE
DEL LA PC-IBM 18 6
DB0 VI+ Ventrada
17
DB1
1 22uF 16 DB2
14 15 7
DB3 VI- masa analog.
2 8 9 14
TxD RS232 DB4
15 7 10 13 19
DB5 CLKR 150pF
3 6 11 12
RxD RS232 TTL/CMOS DB6
16 5 12 11 10K
TTL/CMOS DB7
4 4 13 4
RQS RS232 CLK
17 3 14 1 VCC
22uF RS232 CS
5 2 15 2 9
CTS RD VREF
18 1 16 3
22uF WR
6 5 8
DSR INTR AGND
19 ICL-232 2
7 3 ADC0801
GND
20 1 1K
DTR
8
CD8
21 22uF 74HC08
9
22 3.3K
A121 15
RI DTR A Y0
10 A132 14 2.5V
3.3K B Y1
23 A143 13
DSR C Y2
11 12
Y3 10K
24 11
Y4
12 6 10
G1 Y5
25 4 9
G2A Y6
13 5 7
G2B Y7
CONNECTOR DB25 74HC138
INTERCONEXIONADO DEL MICRCONTROLADOR PARA
LA TRANSMISION DE DATOS EN SERIE HACIA LA PC
Size Document Number REV
A SISTEMA MINIMO 5
;********************************************
;***** PROGRAMA DE TRANSMISION DE DATOS ****
;* POR EL PUERTO SERIE DEL MICROCONTROLADOR *
;** CON EL CONVERTIDOR A/D SE TOMAN DATOS **
;** CADA 3 SEGUNDOS Y SE ALMACENAN EN RAM **
;** DURANTE 24 HORAS SE TIENEN 28800 DATOS **
;** DESPUES SON TRANSMITIDOS POR EL PUERTO **
;* SERIE. SE UTILIZA UN RELOJ DE 11.0592MHz *
;********************************************
;********************************************
;********************************************
;****** RUTINA DE SERVICIO DE LA *******
;****** INTERRUPCION DEL TIMER 0 *******
;********************************************
000B ORG 0BH
000B 758C1F MOV TH0,#01FH ;SE CARGA LA BASE DE
000E 758A00 MOV TL0,#00H ;TIEMPO 62,500 uSeg.
0011 DC04 DJNZ R4,SALE
0013 D201 SETB BANTEM
0015 7C30 MOV R4,#30H ;30H=48
0017 32 SALE: RETI
;********************************************
;****** RUTINA DE SERVICIO DE LA ********
;****** INTERRUPCION DEL PUERTO SERIE *******
;********************************************
0023 ORG 23H
0023 E0 MOVX A,@DPTR
0024 A3 INC DPTR
0025 32 RETI
Por tal motivo una solución, es el envío de los resultados obtenidos por nuestro sistema, hacia
una computadora, en la cual mediante un programa específico, adecue la información, para
posteriormente ser enviada hacia una impresora obteniéndose la hoja deseada.
En la tabla 1 se puede apreciar las señales características de la interfase paralelo del tipo
Centronics: Asimismo en la fig. 1 se puede apreciar las señales que se activan en el momento
de la impresión de datos.
11 BUSY
Señal de ocupada Baja si la impresora está
lista
12 P.E. Alto cuando no existe papel (Paper End)
13 SELE Alto cuando la impresora está en línea
14 AUTO Autoalimentación, sólo en algunas impresoras
15 ERRO Señal de error. La impresora no puede
continuar
16 INIT Cuando se baja se inicializa la impresora
17 SELE Selección. Alta si la impresora está en línea
18 GND Tierra
19-25 GND Tierra
Tabla 1. Terminales del conector paralelo.
Posteriormente, se muestra el programa para imprimir tres letreros, utilizando control de carro
CR, alimentadores de línea, así como tabuladores horizontales.
BUS DE DATOS
31 39 3 2 10 11 10 11
33pF EA/VP P0.0 D0 Q0 A0 O0 A0 D0
38 4 5 9 12 9 12
P0.1 D1 Q1 A1 O1 A1 D1
19 37 7 6 8 13 8 13
X1 P0.2 D2 Q2 A2 O2 A2 D2
36 8 9 7 15 7 15
P0.3 D3 Q3 A3 O3 A3 D3
35 13 12 6 16 6 16
11.0592Mhz P0.4 D4 Q4 A4 O4 A4 D4
5V 18 34 14 15 5 17 5 17
X2 P0.5 D5 Q5 A5 O5 A5 D5
33 17 16 4 18 4 18
P0.6 D6 Q6 A6 O6 A6 D6
32 18 19 3 19 3 19
P0.7 D7 Q7 A7 O7 A7 D7
33pF 9 25 25
10uF RESET A8 A8
21 1 24 24
P2.0 OC A9 A9
22 11 21 21
RESET P2.1 G A10 A10
12 23 23 23
INT0 P2.2 A11 A11
13 24 74LS373 2 2
INT1 P2.3 A12 A12
100k 14 25 26 26
T0 P2.4 A13 A13
15 26 27 1
T1 P2.5 A14 A14
27
P2.6
1N4148 1 28 20 20
P1.0 P2.7 CE CE
2 22 22
P1.1 OE RD
3 17 1 27
P1.2 RD VCC VPP WR
4 16
P1.3 WR
5 29 27256 43256
P1.4 PSEN
6 30
P1.5 ALE/P
7 11
P1.6 TXD
8 10
P1.7 RXD
8031
2 1
7408
13 SELECT IN
25 GND
12 PAPER END
24 GND 3
11 BUSY
23 GND
10 ACKN
22 GND
9 D7
21 GND 7 5
Y7 G2B
8 D6 9 4
Y6 G2A
20 GND 10 6
Y5 G1
7 D5 11 11
CLK Y4
19 GND 1 12
OC Y3
6 D4 13 3 A14
Y2 C
18 GND 19 18 14 2 A13
Q7 D7 Y1 B
5 D3 16 17 15 1 A12
Q6 D6 Y0 A
17 15 14
Q5 D5
4 D2 12 13 74HC138
Q4 D4
16 9 8
Q3 D3
3 D1 6 7
Q2 D2
15 5 4
Q1 D1
2 D0 2 3 INTERCONEXIONADO DEL MICROCONTROLADOR 8051
Q0 D0
14 A LA INTERFASE DEL TIPO CENTRONICS
1 STROBE 74LS374 Size Document Number REV
A SISTEMA MINIMO 5
CONECTOR PARALELO TIPO CENTRONICS DE LA PC-IBM
Date: April 22, 1998 Sheet of
;********************************************
;**** PROGRAMA PARA IMPRESIÓN DE DATOS *****
;**** UTILIZANDO UN CONECTOR PARALELO *****
;**** TIPO CENTRONICS *****
;**** UTILIZA CUATRO TERMINALES DE P1 *****
;**** Y UN FIJADOR (74374) COMO PERIFE- *****
;**** RICO DE SALIDA DE DATOS. DIR=C000H*****
;**** P1.0 = SELECTOR *****
;**** P1.1 = PAPER END (NO HAY PAPEL *****
;**** P1.2 = BUSY (OCUPADO) *****
;**** P1.3 = STROBE (VALIDACION) *****
;**** INT0 = ACKNOLEDGE (RECONOCIM) *****
;********************************************
0000 ORG 00H
0000 010B AJMP IMPRES
0003 ORG 03H
;*******************************************
;** ESTE PROGRAMA CONTROLARA LA IMPRESORA **
;** PRIMERO SALTARA 4 LINEAS, DESPUÉS ES- **
;** CRIBIRÁ "BIENVENIDOS AL SISTEMA 2000 **
;** VOLVERÁ A SALTAR 2 LINEAS DARA UN TAB **
;** Y ESCRIBIRA "ESTA ES UNA PRUEBA DE **
;** IMPRESIÓN DE DATOS", VOLVERÁ A SALTAR **
;** 2 LINEAS DARA UN TAB Y ESCRIBIRA "PARA**
;** IMPRIMIR LOS CARACTERES HAY QUE ENVIAR**
;** SU CÓDIGO ASCII", POR ÚLTIMO SALTARÁ 2**
;** LÍNEAS DARA UN TAB Y ESCRIBIRA **
;** "123456789" **
;*******************************************