Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Unidad I
Contenido:
1 Portada.
2 Temario.
3 Manual del Curso.
4 Anexos
Objetivos del Curso
Practicas
Antes de comenzar a analizar los microprocesadores modernos, se debe primero entender qué
fue lo que paso con estos dispositivos en los primeros años.
La primera computadora digital electrónica fue construida por un equipo dirigido por los ingenieros
John Mauchly y John Eckert, de la universidad de Pennsylvania, en 1946. Esta máquina electrónica fue
llamada ENIAC (Electronic Numerical Integrator and Computer), tenía más de 18000 bulbos y consumía
200 Kw.
Tiempo después, cuando se integró a este equipo el Ing. y matemático Húngaro, naturalizado
norteamericano, John Von Neumann fue diseñada una nueva computadora llamada EDVAC (Electronic
Discrete Variable Automatic Computer). Las ideas de Von Neumann resultaron tan fundamentales para su
desarrollo, que es considerado el padre de las computadoras.
Estas ideas consistieron en permitir que en la memoria coexistieran datos con instrucciones para que
la computadora pudiera ser programada por medio de software y no por medio de hardware. Alrededor de
este concepto gira toda la evolución de la industria y la ciencia de la computación.
Más adelante, se utilizaron los transistores y los componentes electrónicos de estado sólido para
construir las poderosas computadoras de la década de 1960. Con el advenimiento, de los circuitos
integrados se llegó al perfeccionamiento del microprocesador.
Más tarde, en 1971, al percatarse que el microprocesador era un producto, viable para
comercialización, Intel Corporation produjo el 8008, el primer microprocesador de 8 bits. El tamaño
ampliado, de la memoria (16K * 8) y las instrucciones adicionales (un total de 48). Con este nuevo
microprocesador se lograron aplicaciones más avanzadas.
Conforme los ingenieros desarrollaban usos más demandantes para el microprocesador, la
memoria y el juego de instrucciones del 8008 pronto limitaron su utilidad. Por tanto, en 1973, Intel
Corporation introdujo el 8080, el primero, de los microprocesadores modernos de 8 bits.
Pronto, otras empresas empezaron a lanzar sus propias versiones de los procesadores de 4 y de
8 bits. En la tabla 1-1 se enumera muchos de estos primeros microprocesadores.
En el año de 1971 cuando surge el primer microprocesador de 8 Bit Intel, las técnicas de diseño
de los equipos de instrumentación y control sufrieron un cambio. Los fabricantes de microprocesadores,
conscientes de la importancia de este mercado, pusieron a disposición de los ingenieros una gran
variedad de circuitos integrados complementarios los cuales constituyen, para cada fabricante, su familia.
En el año de 1976, gracias al aumento en la densidad de integración, salió a la luz la primera
computadora en un chip, es decir, se integraron junto con el microprocesador los subsistemas que
anteriormente formaban unidades especializadas e independientes, pero unidas por las pistas de
circuitos impresos con el microprocesador formando lo que se conoce como sistema mínimo. A este
nuevo circuito integrado se le denominó MICROCONTROLADOR.
(1) Decodificador
Acumulador. (ACC) de Instruccion (2)
(4) Unidad
Reg de Instrucción. Aritmetica.
Timing and y Logica.
Contador del Programa Control.
(3) (ALU)
Figura 1.2
1) Los Registros: Son localizaciones que sirven para almacenar temporalmente datos, pueden ser de 8
o de 16 bits. Los tres registros más usados son, el Acumulador, el Contador del Programa y el
registro de instrucciones que son de propósito específico. El registro de Instrucciones es usado para
almacenar la instrucción que se está ejecutando en ese momento por el microprocesador. El
contador de Programa contiene la dirección de la siguiente instrucción del programa.
2) La unidad aritmético-lógica (ALU, Arithmetic-logic unit): Es una red combinacional que acepta
dos palabras de datos y una palabra de control que especifica el tipo de operación que ha de
ejecutarse con los datos. El bus de datos del sistema o cualquiera de los registros internos del
procesador pueden proporcionar palabras de datos. La palabra de control se define por la unidad de
control. La ALU realiza la operación especificada y genera una palabra de salida que representa el
resultado de la operación aritmética o lógica y un conjunto de señales de estado que indican, por
ejemplo, si se produjo un acarreo o desbordamiento aritmético. La palabra resultado se puede dirigir
a cualquiera, de los registros internos o al bus de datos. El destino específico se define por la unidad
de control, dependiendo de la naturaleza de la Operación que se esta realizando. Las señales de
estado se dirigen a un registro interno específico del procesador para almacenamiento, denominado
registro de códigos de condición.
Figura 1.3
El puntero de pila (SP, stack pointer): El puntero de pila es, un registro de autoincrementación
y autodecrementación, que significa que cada vez que se proporciona un dato su contenido se
Fig. 1.5
El registro de códigos de condición: (PSW) ó (CCR) Almacena la información que describe los
resultados de operaciones anteriores. Esta información se almacena asignando un bit en el registro. En
algunos microprocesadores, el registro del código de condición. Contiene ocho bits, El bit menos
significativo es el bit de acarreo, o bit C, que se pone a 1 cuando se produce un acarreo aritmético. El bit
de desbordamiento, o bit V, se pone a 1 si se produce un desbordamiento. El bit cero, o bit Z, el tercer bit
en el registro de códigos de condición se pone a 1 cuando se produce el resultado cero. El bit negativo, o
bit N, se pone a 1 cuando el resultado es negativo. El bit de semi acarreo, o bit H, se pone a 1 cuando se
produce un acarreo desde el bit 3. El bit H se utiliza con cálculos aritméticos con datos codificados en
BCD. Los bits C, V, Z, N y H se ponen a 1, o a 0, automáticamente por el procesador, dependiendo de la
naturaleza de la operación que se está ejecutando y el resultado de está operación, además, los bits C, V
e I pueden ser puestos a 1, o a 0, por el programador utilizando instrucciones especiales para cada bit.
Figura 1.9
Fiugura 1.8 Diagrama General De Los Microcontroladores 8031-8051-89C51-8751
Figura 1.10
Descripción de las Terminales:
Puerto0 (P0): Se encarga de multiplexar en el tiempo por sus 8 líneas la parte baja del Bus de
direcciones durante el acceso a la memoria externa, y el Bus de datos.
Puerto1 (P1): Este puerto además de ser de proposito general también recibe la parte baja de
direcciones, durante la programación y verificación de la memoria EPROM interna.
Puerto2 (P2): El puerto 2 emite la parte alta del Bus de direcciones en los accesos de memoria externa
cuando utilizan 16 bits de dirección (MOVX @DPTR, A). Durante el acceso a la memoria de
datos externa con direccionamiento de 8 bits (MOVX @R1,A), los pines del Puerto 2 emiten el
contenido del registro P2 del SFR (Registro de funciones especiales).
Puerto3 (P3): Este puerto puede usarse para propósito general cuando trabaja como microcontrolador
pero tiene otras funciones especiales cuando trabaja como microprocesador o con acceso a
memoria de datos externa, como se muestra en la sig. Tabla.
EA/VPP: (External Access), cuando se mantiene un nivel alto, se ejecuta sólo el programa de la EPROM
interna, a menos que el contador de programa exceda de FFF (4K) para el 8751. Si EA se
mantiene un nivel bajo, se ejecuta el programa de la memoria externa siempre,
independientemente de la dirección del programa.
ALE/PROG: (Address Latch Enable) es un pulso que emite el MICROCONTROLADOR para amarrar el
<<byte bajo>> del Bus de direcciones en el acceso a la memoria externa. ALE se emite con una
frecuencia de 1/6 de la frecuencia de emisión del reloj.
PROG: Es el pin de entrada de los pulsos de programación de la memoria EPROM lo utiliza solamente el
programador de micros.
PSEN: Es la señal de strobe para leer en la memoria de <<programa externo>>. La memoria externa
tiene dos modalidades, de programa y de datos. Para diferenciarlas, utiliza la señal PSEN. PSEN
no se activa cuando se está ejecutando el programa de la ROM o EPROM interna.
XTAL1 y XTAL2: Son la entrada y salida respectivamente, de un amplificador inversor que puede ser
configurado para su uso como un chip oscilador. Se puede utilizar indistintamente un cristal de
cuarzo o un resonador cerámico.
Figura 1.11
Figura 1.12
Una característica importante de este Microcontrolador es que los puertos pueden ser utilizados
como buses de direcciones, de datos y control, debido a estas caracteristicas se dice que el
Microcontrolador puede trabajar como Microprocesador.
Los drivers de salida de los puertos P0 y P2 y los buffers de entrada del puerto P0 se pueden
utilizar para acceder a la memoria externa del sistema. En estas condiciones, el puerto P0 se configura
como salida del byte bajo del bus de direcciones (A0 a A7), de un bus que consta de 16 bits (capacidad
de direccionamiento 64K). Multiplexado en el tiempo como bus de datos bidireccional (D0 a D7). El puerto
P2 se configura como salida del byte alto del bus de direcciones (A8 a A15). De esta manera el
microcontrolador se configura a modo de Microprocesador de un sistema externo con unas capacidades
de expansión definibles por el usuario. Naturalmente, en estas condiciones, le queda como puerto
íntegro, para el control de periféricos, el puerto P1 y parte del puerto P3, puesto que hay señales que se
utilizan para el control del sistema (bus de control).
Las memorias son dispositivos que almacenan el programa y los datos. En esencia la memoria es
un grupo de celdas de almacenamiento. Cada celda puede almacenar un bit de información el cual puede
ser 1 ó 0. Por ejemplo la sig. Figura muestra un grupo de 8 celdas o bit almacenados como un patrón
binario que representa la letra “P”.
0 1 0 1 0 0 0 0
Otras letras ó otros tipos de información requieren otros tipos de combinación. La mayoría de los
microprocesadores almacenan instrucciones y datos en grupos de 8 bits (1 Byte). Para almacenar más de
una letra es necesario más de un byte.
0 1 0 0 1 0 0 1 =I 105
0 1 0 1 0 1 0 0 =T 106
0 1 0 0 1 1 1 0 =N 107
Cada byte almacenado en memoria tiene una dirección. Por ejemplo ITN puede estar almacenado en las
direcciones 105 a 107. Los µP de 8 bit son capaces de direccionar 65,536 bytes.
Cuando un RESET ocurre el programa comienza a partir de la dirección 0000H, del programa.
Cuando una interrupción es producida, el Contador de Programa (PC) almacena su
contenido temporalmente dentro del SP (apuntador de apilamiento) y se carga con la dirección de la
localidad donde se encuentra la rutina de servicio de la interrupción correspondiente. Una vez
posicionado en esa localidad deberá de comenzar la ejecución de la rutina de servicio, hasta que
encuentre la instrucción RETI, que le permitirá al PC recuperar nuevamente su valor original almacenado
en el SP, y continuar con el programa anterior a la interrupción.
Como se puede observar en la Tabla 1.4 Anterior el intervalo físico entre dos interrupciones es de
8 bytes, espacio capaz de albergar una pequeña rutina, pero si éste no fuera suficiente se desviaría el
contador del programa (PC) mediante una instrucción de salto (JMP) a una zona amplia de la memoria de
programa capaz de contener dicha rutina.
Como se ha dicho la memoria de programa puede ser interna (en el propio micro) ó externa (en
otro chip). La selección se realiza por hardware, con la señal EA (External Access). Conectado a Vcc ó
Vss respectivamente.
Figura 1.15
• El Puerto P0 emite el <<byte bajo>> del contador del programa PC (PCL). Una vez estabilizada la
señal sobre P0, la señal ALE (Address Latch Enable) introduce esta dirección dentro del circuito
integrado latch 74LS373, que pasa a apuntar la dirección de la memoria externa de programas. Al
mismo tiempo que el Microcontrolador emite el PCL por P0, la parte alta del contador del programa
(PCH) se emite por P2. Entonces PSEN autoriza la lectura al Microcontrolador del código de
instrucción a través del Puerto P0.
Para un mejor entendimiento y seguimiento de los diagramas de tiempos, en la figura 1.13 se
dibuja un circuito esquematico en el que aparece el microcontrolador comandando una memoria RAM
(6116) y una memoria EEPROM (2816).
Figura 1..17
CICLO MAQUINA:
Un ciclo maquina, para esta familia de Microcontroladores, consiste en una secuencia de 6
<<estados>>, nombrados S1 a S6. Cada estado esta formado dos periodos de la señal de reloj que se
denominan <<fases>> (fase 1 y fase 2). Teniendo en cuenta que cada ciclo maquina tiene 12 periodos (6
estados por 2 fases), si el oscilador genera una señal de reloj de una frecuencia de 12 Mhz, la duración
del ciclo maquina será de 1 μsegundo.
Figura 1.18
FF
SFR
Solo Directo. 64 KBytes
80
Memoria Externa
7F
Directo é
Indirecto
00
0000
RD WR
FIG. 1.19
En la memoria de datos interna se puede acceder a un total de 256 bytes para el 8751 incluido el
área de los registros especiales (SFR),
B: Registro B es usado durante operaciones de multiplicación y división, para otras instrucciones puede
ser tratado como un registro común.
DPL y DPH: Data Pointer: Este registro puede ser manipulado como un registro de 16 bits o como dos
registros de 8 bits.
PSW: Program Status Word: Contiene información del estado del CPU en cada ciclo de instrucción.
b7 b6 b5 b4 b3 b2 b1 b0
CY AC F0 RS1 RS0 OV - P
Un Microprocesador tiene un camino para comunicarse con el mundo real, y este camino sirve
para introducir datos y obtener resultados. Los puertos de entrada y salida son circuitos que auxilian al
Microprocesador a comunicarse con los humanos o a controlar un proceso. Son normalmente llamados
Peripheral interface. Estos chips pueden ser programados como entradas o salidas del Microprocesador.
C P U (µP)
Memory Rom
Amplificador Drive
and Circuit.
A/D Converter.
Figura 1.20
(CS)Chip Select: Una entrada baja en este pin habilita la comunicación entre el 8255 y el Micro.
(RD)Read: Una entrada baja en este pin habilita el 8255 para leer datos del puerto especificado a la
Computadora.
(WR)Write: Una entrada baja en esta pin habilita al 8255 para escribir información del Micro a un puerto
o al registro de control.
A1 A0 RD WR CS OPERACIONES DE LECTURA
0 0 0 1 0 Del Puerto A --> Al bus de Datos
0 1 0 1 0 Del Puerto B --> Al bus de Datos
1 0 0 1 0 Del Puerto C--> Al bus de Datos
OPERACIONES DE ESCRITURA
0 0 1 0 0 Del bus de Datos--> Al Puerto A
0 1 1 0 0 Del bus de Datos--> Al puerto B
1 0 1 0 0 Del bus de Datos--> Al puerto C
1 1 1 0 0 Del bus de Datos-> Reg. de Control
FUNCIONES DE 3 ESTADOS
X X X X 1 Bus de Datos--> 3 Estados.
1 1 0 1 0 CONDICION ILEGAL.
X X 1 1 0 Bus de Datos --> 3 Estados
TABLA 1.6
GRUPO DE CONTROL A Y GRUPO DE CONTROL B.
La configuración funcional de cada puerto es programada por el software del sistema. En
esencia, el CPU manda la palabra de control al 8255. La palabra de control contiene información acerca
del modo de control y sirve para inicializar al 8255.
Cada uno de los grupos de control (Grupo A y Grupo B) acepta comandos de lectura/escritura y
control lógico, recibe la palabra de control desde el bus de datos interno y emite su propio comando que
esta asociado con un puerto.
• El grupo de control A se refiere al puerto A y a los cuatro bit superiores del puerto C.
• El grupo de control B se refiere al puerto B y a los cuatro bits inferiores del puerto C.
• El registro de control solamente se puede escribir y no se puede leer.
PUERTO A, B Y C.
El 8255 contiene tres puertos de 8 bits, puerto (A, B y C). Todos cuentan con buffer en la entrada
y salida y pueden ser configurados con variadas características de funcionamiento por medio de software
pero cada uno tiene su propia personalidad por lo que el 8255 tiene mucha flexibilidad.
PUERTO A: Cuenta con latch/buffer de 8 bit de salida y solamente latch de entrada.
PUERTO B: Cuenta con un latch/buffer de 8 bit de entrada/salida.
PUERTO C: Cuenta con un latch/buffer de salida y un buffer de entrada. Este puerto puede ser dividido
en dos puertos de 4 bit.
A continuación se muestra la configuración interna del 8255 cuando funciona como dispositivo de
salida por habilitación estroboscópica en Modo 1. El funcionamiento con salida por habilitación es similar
al Modo 0, execpto que se incluyen las señales de control para que haya un protocolo de reconocimiento.
Siempre que se escriben datos en un puerto programado como salida por habilitación
estroboscópica, la señal OBF (registro de salida, lleno), se activa con un 0 lógico para indicar que los
datos están en el registro del puerto. Esta señal indica que los datos están disponibles para un dispositivo
de E/S externo que, al tomar los datos activa la entrada ACK (reconocimiento) de habilitación al puerto.
La salida ACK desactiva la señal OBF otra vez a un 1 lógico para indicar el registro de salida esta vacío.
1. OBF. Registro de salida, lleno: Una salida que se pone a 0 siempre que hay salida de datos (OUT)
por el puerto A o el puerto B. Esta señal se desactiva a 1 lógico siempre que el dispositivo externo
retroalimente con el pulso ACK.
2. ACK. Reconocimiento: Es la respuesta de un dispositivo externo con la que indica que recibio los
datos desde el puerto 8255. Un ejemplo de salida mediante habilitacion es la coneccion con una
impresora.
En modo 2, que solo se permite para el grupo A, el puerto A se vuelve bidireccional y permite
transmitir y recibir datos por el mismo puerto. Un canal de datos bidireccional es útil cuando se conectan
dos computadoras. También se utiliza para la interface paralela estándar IEEE-488, de alta velocidad
(canal de instrumentacón de uso general, GPIB1). A continuación se muestra la estructura interna de
Modo 2.
1. INTR. Solicitud de interrupción: salida utilizada para interrumpir la computadora para condiciones de
entrada y salida.
2. OBF: Registro de salida, lleno: una salida que indica que el registro de salida contiene datos para el
canal bidireccional.
3. ACK: Reconocimiento.
4. STB: Habilitación:
5. IBF: Registro de entrada lleno:
6. INTE, Habilitación de Interrupción Interna
• • • • • • • • • • • • • •
14 13 12 11 10 9 8 7 6 5 4 3 2 1
BD5 debe estar a 1, DB4 especifica el tamaño del bus (4 ó 8 bits), y el DB3 el numero de líneas del
display. Se debe dar un retardo de 40μS antes de enviar la siguiente instrucción.
2. Se limpia toda la memoria del display y se regresa el cursor a la posición inicial.
Código RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
01H 0 0 0 0 0 0 0 0 0 1
Esta instrucción toma un tiempo de 1.64 mS.
3. Se establece el movimiento del cursor hacia la derecha, la pantalla del display 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
Esta instrucción toma un tiempo de 40μS.
4. Se prende la pantalla del display y se prende el cursor señalando la posición del proximo carácter de
entrada, 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
Esta instrucción toma un tiempo de 40μS.
5. A partir de aquí se puede comenzar a enviar los caracteres que se desean mostrar dejando un
tiempo de 40μS como mínimo y colocando RS=1. Por ejemplo se enviara la palabra
“TECNOLOGICO” por lo tanto se escribirá el siguiente código ASCII.
Primero el código de la letra “T”
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
54H 1 0 0 1 0 1 0 1 0 0
T __
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 0 1 0 0 0 1 0 1
45H
CODIGO RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
43H 1 0 0 1 0 0 0 0 1 1
T E C __
REGISTROS.
El LCD tiene 2 registros de 8-bits, uno es el registro de instrucciones (IR) y otro el registro de
datos (DR).
• Escribir en el registro IR.
El IR almacena código de instrucción para display clear y cursor shift, etc., y también para escribir
una nueva dirección en el registro AC (Address Counter), que es el registro encargado de apuntar, tanto
a la DD RAM (RAM de Datos del Display) como a la CG RAM (RAM Generador de Caracteres).
• Leer del IR.
Permite la lectura del registro AC, del cual sólo son válidos los 7 bits de menos significativos DB0-DB6, el
bit de mayor peso, DB7 informa del estado del Busy Flag o indicador del display Ocupado.
• Escritura en el DR.
Permite escribir en DD RAM o CG RAM donde se encuentre apuntando el registro AC.
• Leer del DR.
RS R/W Operación
0 0 Escribir en IR:Borrar Display, etc., o modificar AC.
0 1 Leer el IR: Leer el AC(DB0-6) y el Busy Flag (DB7).
1 0 Escribir en DR: Escribir en DD RAM o CG RAM
1 1 Leer el DR: Leer de DD RAM o CG RAM
Tabla 1.2
• Busy Flag (BF):
Cuando se encuentra a “1” indica que el LCD está ocupado realizando operaciones internas y no puede
aceptar nuevas instrucciones. Hay que esperar que el Busy Flag valga “0” para enviar la siguiente
instrucción.
• Contador de Dirección (AC):
Indica la dirección donde serán leídos o escritos los datos sobre DD RAM o CG RAM. Este registro puede
modificarse realizando una escritura en el IR.
Tipos de Interrupciones.
Una interrupción puede ser iniciada:
• Por un periférico o circuito externo ajeno al microcontrolador. (Interrupción Externa)
• Dentro del propio microcontrolador. (Interrupción Interna)
Cada una de las fuentes de interrupciones pueden ser individualmente habilitadas o inhabilitadas
poniendo a <<uno>> o a <<cero>. El bit correspondiente del registro IE (Interrupt Enable Register)
perteneciente a SFR (Special function Register).
IE: Es un registro para habilitar las interrupciones, Permite que se atiendan todas las interrupciones por el
microcontrolador o sólo las que el usuario considere aceptables.
Niveles de Prioridad
EJEMPLO: Este programa pretende simular el funcionamiento de luces deslizantes. Un bit se desplaza
de izquierda a derecha y de derecha a izquierda y excitara 8 leds situados a la salida del puerto 1 (P1).
Cuando por el pin 12(INT0), se presente una transición, el microcontrolador ejecutara una rutina,
asociada a la interrupción que consistirá en hacer parpadear diez veces todos los leds del puerto 1 (P1),
una vez concluida esta secuencia, continuar con el programa principal de bits deslizantes.
DEFSEG INTER,ABSOLUTE
SEG INTER
ORG 0H
JMP START
ORG 3H
JMP Tek_INTO
ORG 100H
Tek_INTO: MOV IE,#0
PUSH ACC
MOV A,PSW
PUSH ACC
MOV A,R0
PUSH ACC
MOV R0,#0AH
SALTO5: MOV P1,#0FFH
CALL RETARDO
MOV P1,#00H
CALL RETARDO
DJNZ R0, SALTO5
POP ACC
MOV R0,A
POP ACC
MOV PSW,A
POP ACC
MOV IE,#081
RETI
END
Todos los modelos de la familia MCS-51 ejecutan el mismo set de instrucciones. Estas
instrucciones están optimizadas para el control de aplicaciones de 8 bits.
Instrucciones Ejecutables:
Cada instrucción ejecutable en lenguaje ensamblador es una representación simbólica de una
instrucción en lenguaje máquina. Por lo tanto, la instrucción en lenguaje ensamblador debe definir la
operación aritmética - lógica; el modo de direccionamiento y el operando, dirección o desplazamiento de
la dirección cuando sea necesario. Además las instrucciones ejecutables en lenguaje ensamblador
suelen contener una sentencia o comentario que indica la razón fundamental de la instrucción. Por último,
es frecuente asignar una etiqueta, o nombre a una función, para facilitar su referencia. Toda esta
información se organiza en cuatro campos:
Las instrucciones en los microprocesadores son actualmente una secuencia de 0 y 1’s que
representan la operación que se ejecutara. La notación hexadecimal es usada para abreviar la
representación de la instrucción. Una forma fácil de escribir y entender un programa es escribirlo en
Lenguaje ensamblador. En lenguaje ensamblador, la combinación de bits es representada por un nombre
o un mnemónico al cual le corresponde la acción de la instrucción. Por ejemplo la instrucción del 8051
que suma el contenido del registro R7 con el Acumulador A es representada por:
00101111B ó 2FH. En ensamblador ADD A, R7
Esta representación es llamada Lenguaje Maquina debido a que esta representación es la que
utiliza el Microprocesador. Esta instrucción tiene dos campos distintos, estos campos son la operación y
el registro fuente, como se muestra en las tablas de instrucciones.
Direccionamiento Directo.
En este direccionamiento el operando se especifica en la instrucción por un campo de dirección
de 8 bits. Sólo la RAM interna de datos (primeros 128 bytes) y la zona de SFR se pueden direccionar de
esta forma.
Ejemplo:
ADD A, 4CH es decir, suma el contenido del acumulador con el contenido de la
posición de memoria (4CH):
A<-- (A)+(4C)
Nota: Un registro o número entre paréntesis se refiere al contenido. Así
(A) es el contenido del acumulador.
(4C) es el contenido de la posición de memoria 4C.
ADD A, 7FH ;El acumulador es sumado al dato que se encuentra en la dirección 7FH de la Ram
interna y el resultado será almacenado en el acumulador.
MOV A, 2EH ; El Acumulador es cargado con el dato que se encuentra en la dirección 2EH de la
memoria RAM interna.
MOV 3DH, 4EH ; El contenido de la dirección 3DH es cargado con el dato que se encuentra en la
dirección 4EH.
Direccionamiento Indirecto:
La instrucción específica un registro que contiene la dirección del operando. Tanto la memoria RAM
interna, como la externa se pueden direccionar indirectamente.
Los registros para direccionar sobre el mapa de 8 bits son el R0 y R1 del banco de registros
seleccionado, o el Stack Pointer. El registro para direccionar sobre 16 bits sólo puede ser el DPTR.
Ejemplo:
ADD A, @R0 ; Así, si (R0)=4CH la operación será:
MOVX A, @DPTR; El Acumulador es cargado, con el dato que se encuentra en la dirección apuntada por
el DPTR.
MOVX @DPTR, A El contenido del acumulador es guardado en la dirección apuntada por el DPTR.
Direccionamiento Implícito.
En estas instrucciones se especifica, implícitamente, el registro sobre el que van a operar, como el
acumulador, el puntero de datos, etc. No necesitan especificar el operando por que está implícito en el
código de operación.
Ejemplo:
INC A; A Å (A) + 1 Incrementa el contenido del acumulador:
INC DPTR; DPTR Å (DPTR) + 1 Incrementa puntero de datos;
DEC R0; Decrementa el registro R0.
• Direccionamiento Indexado
Este direccionamiento sólo es posible en la memoria de programas y sólo permite la lectura. Es
utilizado para la lectura de tablas. Un registro base de 16 bits (el DPTR o el Contador del Programa)
apunta a la base de la tabla y el contenido del acumulador es el offset que permite acceder a la lectura de
esa posición de la tabla.
MOVC A, @A+DPTR ;Mueve una constante que se encuentra en la, memoria del programa. El
Acumulador es, cargado con el dato que se encuentra apuntado por la dirección formada por la suma del
Acumulador A y el Apuntador de Datos.
MOVC A,@A+PC; El Acumulador es cargado con dato que se encuentra, en la dirección formada por la
suma del mismo Acumulador A y el Contador del Programa (PC).
Como norma general, una instrucción requiere de uno o más ciclos máquinas, en función de:
a) El código de operación
Por ejemplo, la instrucción INC A (figura 3.1 A) tiene 1 de byte de instrucción y requiere 1 ciclo
máquina, la instrucción INC DPTR, también, de 1 byte de instrucción requiere de 2 ciclos máquina (figura
3.1C) y la instrucción MUL AB requiere de 4 ciclos máquina para su total ejecución y ocupa 1 byte en la
memoria.
b) El número de bytes
Por ejemplo, la instrucción MOV A, # data tiene 2 bytes de instrucción y requiere de 1 ciclo máquina
(figura 3.1B). En cambio la instrucción MOV direct, # data al constar de 3 bytes necesita de 2 ciclos
Cabe destacar también en la figura 3.1 que en cada ciclo máquina se producen 2 accesos a la
memoria. El primero, si es comienzo de ciclo de instrucción, siempre leerá el código de operación, el
segundo que normalmente se descarta. Se utiliza para leer el segundo byte, operando de la instrucción,
como ocurre en la figura 3.1B.
Figura 1.14
Antes de comenzar con el estudio y comprobación de los puertos de E/S, se muestra la interface
para la conexión de los puertos a los dispositivos de salida, que en un principio pueden ser unos simples
LED (Figura 1.15).
Para controlar cargas de mayor consumo de energía, como relés, se recomienda utilizar, entre el
puerto y la carga, drivers no inversores, como el ULN 2003, e inversores, como el ULN 2803, que tienen
una cargabilidad de 500 mA y soportan hasta 50v.
Figura 1.15
<dest> = <destino>
<src> = <fuente>
Ejemplo:
Antes de ejecutar la instrucción:
(3A)= 35H : (3D) = 78H
MOV 3AH, 3DH Después de ejecutarla:
(3A)= 78H : (3D) = 78H
• La instrucción MOV DPTR.# data 16 bits, permite transferir datos de 16 bits para inicializar el DPTR
(Data pointer = puntero de datos) en el tratamiento de tablas en la memoria de programas o para
acceder a los datos de la memoria externa.
• La instrucción PUSH <src> actúa incrementando el SP (stack pointer = puntero de la pila) y copiando
el dato dentro de la pila. La instrucción POP <dest> actúa decrementando el SP y reponiendo el dato
• La instrucción XCH A,<bite>, intercambia los datos del acumulador y del byte direccionando. La
instrucción XCHD A,@Ri es similar a la anterior, pero sólo implica en el intercambio el nibble bajo; es
una instrucción especializada en la manipulación de datos en el código BCD.
Ejemplos:
Antes de ejecutar la instrucción:
(A)= 37H y (2D) = 23H
XCH A, 2DH Después de ejecutarla:
(A) = 23H y (2D) = 37H
Antes de ejecutar la instrucción:
XCHD A, @R0 (R0) = 2DH = 37H y (A) = 23H
Después de ejecutarla:
(A) = 27H y (2D) = 33H
¿Qué sucedería si se tuviera que implementar estas instrucciones en al zona de memoria por
encima de la dirección 2000H? Es decir:
Sustituida
85H ------------------- 2085H
F3H------------------- 20F3H
Se llegaría a la conclusión de que no se podría procesar estas instrucciones, contando que los
registros R0 y R1 no pueden direccionar por encima de la posición de memoria FFH. Pero aquí es donde
entran en juego las instrucciones MOVX con el DPTR como operando. La sustitución, en el caso de tener
que operar en el espacio de memoria comprendiendo entre 0000H y FFFFH. Sería:
Sustituida
MOVX A, @Ri -------------------- MOVX A, @DPTR
MOVX @ Ri, A -------------------- MOVX @DPTR,A
Recuérdese que en la tabla 3.4 hay una instrucción que es:
MOV DPTR, # data 16
Con la que se podría acceder a todo el mapa de memoria.
A0H INC A
A1H MOVC A, @A+PC
A2H RET
A3H 20H
A4H 21H
A5H 22H
MOV A, #01H
CALL TABLA
TABLA: INC A
MOVC A. @A+PC
RET
DATO0
DATO1
DATO2
DATO3
Se pretende acceder inicialmente al DATO1, por esta razón se carga al acumulador con 01H, se
salta a la rutina de tratamiento de la tabla.
Ya en al rutina, se incrementa el acumulador, con lo que su valor será:
(A) ------ (A) +1
02H ------01H + 1
En la instrucción MOVC A, @A+PC el valor del acumulador es 02 y el PC apunta a la instrucción
RET, por lo que la suma A2H + A4H, luego:
AÅ(A4H)
(A) = 21H
PROCESO
He aquí una descripción del proceso, desde el punto de vista de su relación con el mundo exterior, según
los tres tipos de señales principales:
• Entrada de información: SENSORES.
• Actuación sobre los elementos finales: ACTUADORES.
• Señalización del proceso: INDICADORES.
1. Sensores (entradas)
El sensor A señala el nivel mínimo de agua. Por debajo de este nivel, se indicará <<VACIO>> en el
cuadro de INDICADORES.
El sensor B señala el nivel óptimo y cuando se alcance se indicará <<LLENO>>.
El sensor C señala el nivel peligroso e indica <<REBOSE>>.
END
Como se puede observar, el programa utiliza el direccionanmiento indexado para acceder a la
información escrita previamente el la tabla de datos, situada en las posiciones de memoria comprendidas
entre la 0100H y 0107H.
• El primer bloque del flujograma inicializa el puntero DPTR en la dirección de comienzo de la tabla de
datos.
• El segundo bloque lee la información de las sondas a través del Puerto P0.
• El tercer bloque enmascara la información del puerto P0, dejando solamente los tres primeros bits
útiles de P0.
ENTRADAS SALIDAS
P3.2 P3.1 P3.0 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
C B A N.C N.C AL RE LL V B2 B1
0 0 0 0 0 0 0 0 1 1 1
0 0 1 0 0 0 0 0 1 1 1
0 1 0 0 0 1 0 0 0 0 0
0 1 1 0 0 0 0 1 0 0 1
1 0 0 0 0 1 0 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 0 1 0 0 0 0 0
1 1 1 0 0 0 1 0 0 0 0
Ejemplo:
A = 5FH
DIV AB B = 0AH
1001 Æ A
1010 0101 1111
0101 Æ B
• La instrucción DA A justa el resultado en binario puro producido por las instrucciones ADD y ADDC a
formato BCD. Esta instrucción no convierte el contenido del acumulador en BCD, sino que hace
ajuste BCD de la suma (resultado), por lo tanto, esta instrucción debe ir inmediatamente después de
la instrucción ADD o ADDC.
C b7 ÅACCÆ b0
• Las instrucciones de Rotación RLC A y RRC A desplazan el contenido del acumulador implicando al
bit de acarreo.
C Å B7 ÅACCÆ B0
Este ejercicio muestra cómo se puede realizar la operación de lectura y escritura por el mismo
Puerto P0. Para ello dividimos el Puerto P0 en dos nibbles, el nibbles bajo (P0.0 a P0.3) leerá la
información que se sacará por el nibbles alto (P0.4 a PO.7) (Figura 6.8).
Las instrucciones que aparecen en las tablas son: MOVE, SET, CLEAR, NOT, OR y AND.
Se observa cómo en casi todas las instrucciones se hace referencia al flag Carry (C). Se podría
decir que cumple todas las características que tiene el acumulador en el procesamiento de palabras. El
flag Carry se direcciona directamente dentro de la palabra de estado PSW, en la posición <<bit7>>.
B7 b5 b0
C F0
Todos los bits del PSW son direccionables bit a bit, como todos los registros señalados del SRF.
Es importante reseñar la presencia del flag F0 (b5 del PSW) de propósito general, disponible como flag
del usuario. ¿Por qué no utilizarlo como indicador, en las operaciones aritméticas de signo (flag N)?
Comentario aparte exige el tratamiento de las instrucciones booleanas de salto. Hay instrucciones
que producen el salto cuando el bit direccionado está en estado <<1>>, como son las instrucciones JC,JB
y JBC; también están las que producen el salto cuando el bit direccionado está puesto <<0>>, como son
las instrucciones JNC, y JNB. JBC Produce el salto si el bit direccionado es <<1>> y pone a <<0>>este
bit, siendo la única instrucción que detecta y pone a <<0>> el bit direccionado.
Secuencias de operaciones:
JC rel JNC rel
(PC)Å (PC) +2 (PC)Å (PC) + 2
Si (C) = 1 Si (C) = 0
Entonces entonces
(PC) Å (PC) + rel (PC) Å (PC) + rel
SJMP rel : (short jump). La dirección destino del salto viene dada por un <<offset relativo>>, igual que en
las instrucciones de salto booleanas. La instrucción tiene dos bytes, correspondientes al código de
operación y al byte de offset relativo. El rango del salto está limitado a –128 y + 127 byte relativos. al
primer byte siguiente a la instrucción de salto.
(PC) Å(PC) +2
CPC) Å(PC) +
LJMP addr 16: ( Long jump). La dirección destino del salto viene dad por una constante de 16 bits. La
instrucción está formada por 3 bytes, 1 byte para el código de operación y 2 para la dirección del salto.
Por tanto, la dirección de destino está ubicada dentro del área de los 64K de la memoria de programa.
PC Å addr 16
AJMP addr 11: (Absolute jump). La dirección destino del salto viene dada por una constante de 11 bits.
La instrucción tiene 2 bytes, uno para el código de operación que también contiene en sí misma 3 de los
11 bits de direcciones, y otro byte que contiene los 8 bits bajos de la dirección de destino. El código de la
instrucción y el operando es :
a10 a9 a8 0 0 0 0 1 A7 a6 a5 a4 A3 a2 a1 a0
CODIGO DE OPERACIÓN OPERANDO
LCALL addr 16 : utiliza un formato de 16 bits para direccionar la subrutina y esa área de direccionamiento
es el máximo de 64 Kbytes de la memoria de programas.
Secuencia de operaciones:
• (PC)Å (PC) + 3
• (SP)Å (SP) + 1
• ((SP))Å (PC 7-0 )
• (SP)Å (SP) + 1
• ((SP))Å (PC15-8 )
• (PC)Å addr15-0
ACALL addr 11: utiliza un formato de direccionamiento de 11 bits, por lo que la subrutina debe estar
dentro del área de los 2 Kbytes, a partir de la siguiente instrucción.
Secuencia de operaciones:
• (PC)Å (PC) +2
• (SP)Å (SP) + 1
• ((SP))Å (PC7-0)
• (SP)Å (SP) + 1
• ((SP))Å (PC15-8)
• (PC10-0)Å dirección de la página
Lo mismo que se indicó en los saltos incondicionales, el programador cuando trabaja en ensamblador
sólo debe preocuparse de colocar la etiqueta; el programador ensamblador determinerá la longitud del
salto y el formato que debe dar al código de instrucción según la longitud del salto.
RET: Las subrutinas terminan su ejecución con la instrucción RET, que es la instrucción que indica la
vuelta al programa principal, justo en la dirección de memoria de la instrucción siguiente a la instrucción
CALL.
Secuencia de operaciones:
• (PC15-8)Å ((SP))
• (SP)Å (SP) – 1
• (PC7-0)Å ((SP))
• (SP)Å (SP) – 1
RETI: Utilizada para retornar de las rutinas del servicio de interrupciones. Las interrupciones se estudian
de forma especial en el capitulo 10.
Secuencias de operaciones:
X =Si =No
Nota: en la tabla 3.10 se señalara como posible operando <byte>, pudiendo ser <byte>:
a) El acumulador.
b) Los registros R0 a R7 con direccionamiento directo.
Los registros R0 y R1 con direccionamiento indirecto.
JZ y JNZ:
Salta si es cero y salta si no es cero. Para determinar si cumple las condiciones de las instrucciones JZ, y
JNZ, la CPU no pasa revista al registro de estado como ocurre en otros micros, sino que directamente el
registro acumulador, pues este microcontrolador no tiene << flag cero >> en el registro de estado.
Secuencias de operaciones:
JZ rel JNZ rel
• (PC)Å (PC) + 2 (PC)Å (PC) + 2
• Si (A) = 0 Si (A)<> 0
DJNZ:
Decrementa y salta si no es cero. Esta instrucción está especializada en lazos de control. Para que
ejecute un lazo n veces se carga un <<contador>> con n y, cada vez que se ejecute el contenido del
lazo, el contador decrementa una unidad, saliendo del lazo cuando el contenido del contador sea cero.
• (PC)Å(PC) + 2
• (<byte>)Å (<byte>) – 1
• Si (<byte>)> 0 o (<byte>)< 0
Entonces
(PC)Å (PC) + rel
Ejemlpo:
Ejecutar el lazo 10 veces.
MOV CONTADOR, # 10
LAZO: (comienzo del lazo)
------------------------ ÆInstruciones que se van a ejecutar mientras
-------------------------- CONTADOR sea distinto de <<cero>>.
( fin del lazo)
DJNZ CONTADOR , LAZO
CJNE:
Compara y salta, si el resultado de la comparación no es igual.
En este caso hay dos formatos, según la comparación se haga con el acumulador o con un operando tipo
<byte>, que puede ser:
• Con direccionamiento indirecto ( registros R0 y R1).
• Con direccionamiento directo ( registros R0 y R7 )
CASO 1.MODELO ÆCJNE A,<byte>, salto relativo
Secuencia de operaciones:
• (PC)Å (PC) + 3
• Si (A) <> (<byte>)
Entonces
(PC)Å (PC) + rel
Si (A) < (<byte>)
Entonces
(C) Å 1
sino
(C)Å 0
Notas sobre el significado de los operandos de las instrucciones que se describen a continuación:
Rn..................... Registros R0-R7 del banco de registros seleccionado.
Direct............... Dirección del dato de 8 bits de la memoria interna. Puede ser un dato de la RAM
interna (0-127 para el 8051 o 0-225 para el 8052) o un registro del SFR (por ejemplo,
puerto de E/S, registro de control, registro de estado (128-255).
@Ri.................. Se refiere a los registros R0 y R1, que permiten el direccionamiento indirecto para
acceder a los datos de 8 bits de la RAM interna (80-FFH)
Solapada con el SFR para el 8052 y (000-7FH) para el 8052/8051.
# data............... Operando constante de 8 bits
# data 16.......... Operando constante de 16 bits.
addr 16............. Dirección destino de 16 bits. Utilizada por las instrucciones de salto LCALL y LJMP
para permitir el salto dentro del espacio de 64K bytes de la memoria de programas.
addr 11........... Dirección destino 11 bits. Utilizada por las instrucciones de salto ACALL y AJMP
para permitir el salto dentro de la página de 2Kbytes de la memoria de programas a
partir del primer byte de la siguiente instrucción.
Rel.................. Salto relativo en formato de 8 bits en complemento a 2. Utilizado por la instrucción
SJMP y todos los saltos condicionales. El rango del salto (8 bits) está comprendido
entre –128 a = 127 bytes a partir del primer byte de la siguiente instrucción.
Bit................. Direccionamiento directo <<bit a bit>> dentro del área de la memoria RAM interna y
de los registros SFR que lo permiten.
ADD A,direct Add direct byte to Accumulador. 0010 0101 Direct address 2 12
ADD A, # data Add immediate data to Accumulador 0010 0100 Dato Inmediato 2 12
ADDC A, direct Add direct byte to Accumulador with Carry 0011 0101 Direct address 2 12
ADDC A,@Ri Add indirect RAM to Accumulador with Carry 0011 011i 1 12
ADDC A,# data Add immediate data to Acc with Carry 0011 0100 Immediate data 2 12
SUBB A,Rn Subtract Register from Acc with boorrow 1001 1rrr 1 12
SUBB A, direct Subtrac direct byte from Acc with boorrow 1001 0101 Direct address 2 12
SUBB A,@Ri Subtract indirect RAM from ACC with boorrow 1001 011i 1 12
SUBB A, # data Subtract immediate data from Acc with boorrow 1001 0100 Immediate data 2 12
ANL A,# data AND immediate data to Accumulator 0101 0111 Immediate data 2
ANL Direct,A AND Accumulator to direct byte 0101 0010 Direct address 2
ANL Direct,# data AND immediate data to direct byte 0101 0011 Direct address Immediate data 3
ORL Direct.#data OR immediate data to direct byte 0100 0011 Direct address Immediate data 3
XRL A,direct Exclusive-OR direct byte to Accumulator 0110 0101 Directs address 2
XRL A.#dat Exclusive-OR immediate data to Accumulator 0110 0110 Immediate data 2
XRL Direct,A Exclusive-OR Accumulator to direct byte 0110 0010 Direct address 2
XRL Direct,# data Exclusive-OR immediate data to direct byte 0110 0011 Direct address Inmediate data 3
MOV A,direct Move direct byte to Accumulator 1110 0101 Direct address 2
MOV A,#data Move immediate data to Accumulator 0111 0100 Immediate data 1
MOV Rn,,direct Move direct bute to regiter 1010 1rrr Direct address 2
MOV Rn,#data Move immediate data to regiter 0111 1rrr Immediate data 1
MOV Direct,Rn Move register to direct byte 1000 1rrr Direct address 2
MOV Direct,direct Move direct to direct 1000 1010 Dir. Addr. (src) Dir. Addr (dest) 3
MOV Direct,@Ri Move indirect RAM to direct byte 1000 011i Direct address 2
MOV Direct,# data Move immediate data to direct bute 0111 0101 Direct address Immediate data 3
MOV @Ri,direct Move direct byte to indirect RAM 1010 011i Direct address 2
MOV @Ri,# data Move immediate data to indirect RAM 0111 011i Immediate data 2
MOV DPTR,#data 16 Load data pointer with a 16-bit constant 1001 0000 Immed. Data 15-8. Immed. Data 7-0 3
MOVC A,@A+DPTR Move code byte relative to DPTR to Acc 1001 0011 1
MOVX A,@Ri Move External RAM (8-bit addr) to Acc 1110 001i 1
MOVX A,@DPTR Move External RAM (16-bit addr) to Acc 1110 0000 1
MOVX @Ri,A Move Acc to external RAM (8-bit addr) 1111 001i 1
MOVX @DPTR,A Move Acc to External RAM (16- bit addr) 1111 0000 1
PUSH Direct Push direct byte stack 1100 0000 Direct address 2
POP Direct Pop direct byte from stack 1101 0000 Direct address 2
XCH A,direct Exchange direct byte with Accumulator 1100 0101 Direct address 2
XCHD A,@Ri Echange low-order digit indirect RAM with Acc 1101 011i 1
Tabla 4.9 instrucciones booleanas
CLR C Clear Carry 1100 0011 1 12
ANL C.bit AND direct bit to Carry 1000 0010 Bid address 2 24
ANL C,/bit ANDcomplement of direct bit to Carry 1011 0000 Bid address 2 24
MOV Bit, C Move Carry to direct bit 1001 0010 Bit address 2 24
JNC Rel Jump if Carry not set 0101 0000 Rel address 2 24
JB Bit,rel Jump if direct bit is set 0010 0000 Bit address Rel, address 3 24
JNB Bit,rel Jump if direct bit is not set 0011 0000 Bit address Rel, address 3 24
JBC Bit,rel Jump if direct bit is set & clear bit 0001 0000 Bit address Rel, address 3 24
CJNE A,direct,rel Compare direct byte to Acc and jump if not Equal 1011 0101 diret.address rel.address 3
CJNE A,#data , rel Compare immediate to Acc and jump if not Equal 1011 0100 immediate data rel.address 3
CJNE Rn,#data,rel Compare immediate to registrer and jump if not 1011 1rrr immediate data rel.address 3
Equale
CJNE @R1,#data,rel Compare immediate to indirect and jump if Not Equale 1011 010i immediate data rel.address 3
DJNZ Rn,rel Decrement register and jump if Not Zero 1101 1rrr rel.address 2
DJNZ Direct,rel Dcrement direct byte and jump if Not Zero 1101 0101 direct address rel.address 3
ORG 0
START: CALL INIT_LCD
MOV DPTR, #REN1
CALL PRINTLCD
Bin_to_d_digits: CLR C
MOV 30H,#255 ;30H = Digito mas significativo (X..)
MOV 31H,#255 ;31H = (.X.)
MOV 32H,#0 ;32H = Digito Menos significativo (..X)
_digit_1: SUBB A,#100
INC 30H
JNC _digit_1
ADD A,#100
CLR C
_digit_2: SUBB A,#10
INC 31H
JNC _digit_2
ADD A,#10
_digit_3: MOV 32H,A
RET
ORG 100H
REN1: DB "Practica LCD Eduardo", 0
REN2: DB "Temperatura= . GC", 0
END
Figura 1.5.1
La función como Timer ó como Counter es seleccionada por el bit de control C/T perteneciente al
registro TMOD (Timer/Counter Mode Control Register). El registro TMOD no es direccionable <<bit a
bit>>. Estos dos timer tienen cuatro modos de operación y se seleccionan mediante los bits (M0, M1) en
el registro TMOD (Modo 0, 1, ó 2).
REGISTRO TMOD
B7 B6 B5 B4 B3 B2 B1 B0
GATE C/T M1 M0 GATE C/T M1 M0
Timer 1 Timer 0
BIT NOMBRE Y COMENTARIO
TCON: Timer/Counter Control Register: Este es un registro que controla fundamentalmente el modo de
operación de los Timer 0 y 1 en relación con las interrupciones y los flancos de activación de los mismos.
REGISTRO TCON
B7 B6 B5 B4 B3 B2 B1 B0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
BIT NOMBRE Y COMENTARIO
B0 IT0: Control de Interrupción externa 0. (INT0).
- Si IT0=0 entonces es activada por un nivel bajo.
- Si IT0=1 Entonces es activada por un flanco de bajada.
B1 IE0: Flag de interrupción para la interrupción externa 0 (INT0).
- Se pone a uno cuando se detecta interrupción externa.
- Se repone automáticamente al atender la interrupción por flanco.
B2 IT1: Control de Interrupción externa 1 (INT1).
La autorización para contar pulsos, procedentes del reloj interno o bien del pin 15 (T1) (actuando
como contador), se produce en el Timer 1, cuando TR1=1 y las entradas GATE=0 o INT1=1.
Una aplicación podría ser, para medir el ancho de pulso a través del pin INT1 ó INT0.
ORG 30H
INICIO: MOV TMOD,#10H ;M0=1 de Timer1,GATE=0,C/T=0
SETB P1.0 ; Poner a Uno el P1.0
CALL TEMPO ; LLAMA A SUBRUTINA
CLR P1.0 ; PONER A ZERO P1.0
CALL TEMPO ; LLAMADA A SUBRUTINA
JMP INICIO ; REPITE TODO NUEVAMENTE
END
EJEMPLO No.2 Timer 1 en Modo 1 como temporizador de 16 bits con arranque por hardware desde el
exterior. El bit 0 del puerto P1 (P1.0), prendera y se apagara en función de los valores de carga del Timer
1 (TH1+TL1) cuando se aplica un nivel alto por el pin exterior 13 (INT 1).
EJEMPLO No.3 Timer 1 en Modo 2 como temporizador de 8 bits con auto-recarga arranque por hardware
desde el exterior. El contenido de TL1 es enviado por el puerto P0, cuando se aplica un nivel alto por el
pin exterior 13 (INT 1).
REGISTRO SCON
b7 B6 b5 b4 b3 b2 b1 b0
SM0 SM1 SM2 REN TB8 RB8 TI RI
BIT NOMBRE Y COMENTARIO
b0 RI: Bandera de interrupción de recepción.
Se activa por hardware al finalizar la recepción del 8° bit en el modo 0 ó hacia la mitad del intervalo de tiempo del
bit de stop en los otros modos.
Debe ser desactivado por software.
b1 TI: Bandera de interrupción de transmisión.
Se activa por hardware al finalizar la tranmisión del 8° bit en el modo 0 ó al comienzo bit de stop en los otros
modos.
Debe ser desactivado por software.
b2 RB8: En modos 2 y 3 es el 9° bit que se recibe.
- En modo 1, si SM2=0, RB8 es el bit de stop.
- En modo 0, no se utiliza.
b3 TB8: Corresponde al 9° bit de datos en los modos 2 y 3.
Es programable por el usuario. Habitualmente es el bit de paridad.
b4 REN: - Si REN=1 (por software) permite la recepción.
- Si REN=0 no la permite
b5 SM2: En modo 2 y 3, Si SM2=1 entonces RI no se activará si el 9° bit de datos (RB8) es igual a cero.
- En Modo 1, si SM2=1 entonces RI no se activará si el bit de stop no se ha recibido.
- En Modo 0, SM2 debe estar a cero.
B6-b7 SM0 SM1 MODO DESCRIPCION VELOCIDAD
0 0 0 Desplaza 8 bit Reloj/12
0 1 1 8 bit-UART Variable
1 0 2 9 bit-UART Reloj/64 ó Reloj/32
1 1 3 9 bit-UART Variable
SBUF: Serial Data Buffer: son dos registros buffer aparentemente separados, pero físicamente el mismo,
buffer de transmisión y buffer de recepción. Cuando un dato es movido a SBUF, este va al buffer del
transmisor, cuando un dato es movido de SBUF, este viene del buffer del receptor.
PCON: Power Control Register: Para aplicaciones en donde la característica de consumo sea crítica, la
versión CHMOS ofrece dos modos de trabajo de bajo consumo: el modo POWER DOWN y el IDLE.
También ofrece, este registro, posibilidades de variar la velocidad de comunicación en el canal serie.
SMOD - - - GF1 GF0 PD IDL
SMOD Dobla el “BAUD RATE” para el puerto serie cuando se utiliza el timer para generar el BAUD RATE.
GF1 Propósito general.
GF0 Propósito general.
PD Bajo consumo de energía. (80C51 solamente)
IDL Bajo consumo de energía. (80C51 solamente)