Sei sulla pagina 1di 40

1.

Microcontroladores 8051
1.1. Caractersticas de los microcontroladores
8051/8052
En la siguiente lista se indican las caractersticas ms importantes de los
microcontroladores de la familia 8051/8052.

Arquitectura basada en el 80C51 con CPU de 8 bits.

Procesador booleano con soporte de operacin sobre bits.

Memoria de programa integrada de 8k 8 EPROM (caso 87C52).

Sin memoria de programa interna ROMless (caso 80C32).

Memoria RAM interna de 256 8 .

Tres contadores temporizadores de 16-bit (counter/timers).

Un canal serie asncrono Full duplex para las comunicaciones RS-232.

Capacidad de direccionamiento de memoria 64k ROM y 64k RAM.

Modos de funcionamiento en bajo consumo (Idle mode Power-down mode).

Compatible con las tecnologas digitales CMOS y TTL.

Frecuencias de trabajo de reloj comprendida ente 3,5 y 33MHz.

Oscilador interno.

6 fuentes de interrupcin con distintos niveles de prioridad.

2 interrupciones externas.

3 interrupciones para los contadores/temporizadores (timers).

1 interrupcin para el puerto serie.

El diagrama en bloques de los microcontrolador 80c32 se puede observar en la siguiente


figura.

2. Estructura de la
memoria en los
microcontroladores 8051
2.2. Memoria de datos interna
Los microcontroladores 8051 disponen de una memoria interna muy
limitada, un total de 256 posiciones destinadas a los datos, registros de trabajo y
registros especiales. En la familia de microcontroladores 8052 se ha ampliado
mediante la incorporacin de 128 nuevas posiciones entre las posiciones de
memoria 80H y FFH que se solapan con las actuales. Para poder acceder a un
grupo o al otro se ha de hacer por medio del direccionamiento, de esta forma, a
la memoria principal se accede mediante el direccionamiento directo y a la
secundaria o solapada mediante el indirecto. Atendiendo a los modos de
direccionamiento del microcontrolador, podemos distinguir tres zonas de
memoria:

rea de direccionamiento directo e indirecto.

rea de direccionamiento solo directo.

rea de direccionamiento solo indirecto (en el 8052).

Memoria de datos de los microcontroladores 8051/8052

Acceso a la zona de memoria mediante el Direccionamiento Directo.


Para el acceso al rea de memoria de direccionamiento directo, se utiliza la
direccin a la cual se desea acceder. Por ejemplo, para situar el valor 05H en el
puerto P0 (80H).

MOV 80H,#05H ; Poner el dato inmediato (constante)


05H en la posicin 80H
Acceso a la zona de memoria mediante el Direccionamiento
Indirecto.
Para el acceso a la zona de memoria de direccionamiento indirecto se ha de
utilizar
el
registro
interno
R0
o
R1.
Por ejemplo, para poner 4 posiciones, de la 90H a la 93H de memoria a 0.

MOV R0,#90H
acceder
MOV @R0,#00H
contenido
INC R0
(91H)
MOV @R0,#00H
INC R0
(92H)
MOV @R0,#00H
INC R0
(93H)
MOV @R0,#00H

; Mover la direccin a la que se desea


al
registro
R0
; Mover de forma indirecta, mediante el
de
R0
el
dato
inmediato
0
; Incrementar el registro R0 apuntador
; Mover un 00H a la direccin apuntada
; Incrementar el registro R0 apuntador
; Mover un 00H a la direccin apuntada
; Incrementar el registro R0 apuntador
; Mover un 00H a la direccin apuntada

2.2.1. Memoria de acceso directo e indirecto

El rea de direccionamiento directo e indirecto est formada por los


primeros 128 Bytes de la memoria interna del microcontrolador. Esta a su
vez se encuentra dividida en tres segmentos diferenciados por su utilizacin.

Area de direccionamiento directo e indirectos de la memoria RAM interna

Los bancos de registros.


Los registros internos o auxiliares del Acumulador son 8, del R0 al R7, su
misin es dar soporte al Acumulador en su proceso de trabajo. El conjunto de
instrucciones del microcontrolador 8051 est orientado de forma directa para
trabajar con un registro nico, el Acumulador y unos registros secundarios del
R0 al R7.
A su vez los registros R0 a R7 se encuentran agrupados en 4 bancos de
registros, RB0 a RB3 que coinciden con las primeras posiciones de memoria

interna, tenemos el RB0 que ocupa las posiciones 00H a 07H, el RB1 de la 08H
a 0FH y as sucesivamente (ver la siguiente figura).
Se puede conmutar de banco de registros de trabajo por software
mediante la configuracin de los bits B3 y B4 del registro de estado PSW. Este
sistema se utiliza para salvaguardar el estado de los registros internos entre
diferentes procesos del software con la CPU, se puede conmutar de banco de
registros cuando se accede o retorna en una subrutina, ante una peticin de
interrupcin etc.
rea de direccionamiento bit a bit
El rea de direccionamiento bit a bit est formada por 16 Bytes en las posiciones
de la RAM interna 20H a 2FH. Cada Byte est dividido en 8 bits, con nmeros
correlativa entre el 0 y el 127 da un total de 128 bits, a los cuales se puede
acceder con instrucciones especificas de direccionamiento bit a bit. Para hacer
referencia a un bit en concreto, se puede indicar su numeracin o la de la
posicin de memoria y el bit en cuestin desde el 0 al 7. Por ejemplo, el bit 0 es
el 20.0, el 1 el 20.1, el 9 es 21.0 y as sucesivamente.
Esta zona tambin admite el direccionamiento normal por Byte. Por ejemplo,
podemos activar el bit 09H por medio de instrucciones de bits.

SETB 09H ; Poner a 1 el bit 9


O mediante instrucciones de manipulacin de Bytes.

ORL 21H,#00000010B ; Suma lgica (OR) en el Byte 21H


el dato inmediato 00000010B
rea Scratch Pad
El rea de memoria Scratch Pad o memoria de acceso rpido denominada
Bloc de notas se encuentra situada en la RAM interna de la posicin 30H a 7FH.
Est destinada al trabajar con datos, como memoria de trabajo del usuario, es
ms gil que la memoria RAM externa al microcontrolador, pero mientras que
la RAM externa puede tener una capacidad suficiente para cualquier aplicacin
(64KB), el rea Scratch Pad est limitada a 96 Bytes.
Si descartamos la memoria RAM externa (XRAM), la capacidad de
almacenamiento de estos microcontroladores es muy limitada, 96 Bytes del
Scratch Pad ms 128 Bytes de memoria de acceso solo indirecto.

2.3. Registros de funciones especiales


(SFR) de los microcontroladores 8051
El rea de registros o funciones especiales (SFR) est comprendida entre
la direccin 80H y FFH de la memoria interna del microcontrolador.
Esta zona de memoria no se puede utilizar como memoria de datos,
resulta evidente que si escribimos de forma descontrolada en la memoria
asignada a un registro especial, se modifica el comportamiento del
microcontrolador, obtenindose resultados inesperados segn el registro
afectado. Aunque las posiciones de memoria que no estn asignadas a un
registro especial pueden ser utilizadas para contener datos, no es aconsejable su
uso, se ha de tener en cuenta que estas pueden estar reservadas y asignadas a
registros especiales en otros modelos de microcontroladores o de fabricantes y
nuestro programa entrar en conflicto cuando cambiemos de modelo.
Los puertos de entradas y salidas tambin ocupan unas posiciones especficas o
direcciones de memoria. Las posiciones de memoria del lateral izquierdo (80H,
88H, 90H..) estn reservadas para el direccionamiento de bit por lo que los
registros que las ocupan se podrn acceder mediante este sistema.
En la siguiente tabla se detalla la disposicin de cada registro del
microcontrolador 8051 y 8052.
F8H
F0H B *
E8H
E0H ACC *
D8H
D0H PSW *
T2CON
C8H
*#
C0H
B8H IP *
B0H P3 *
A8H IE *
A0H P2 *
98H SCON *

FFH
F7H
EFH
E7H
DFH
D7H
RCAP2L # RCAP2H # TL2 # TH2 #

SBUF

CFH
C7H
BFH
B7H
AFH
A7H
9FH

90H P1 *
88H TCON *
80H P0 *

TMOD TL0
SP
DPL

TL1
DPH

TH0

TH1

97H
8FH
PCON 87H

La siguiente tabla muestra la descripcin y los smbolos de cada bit o pin de los
registros internos (SFR) de la familia de microcontroladores 8051/8052.
Regist Descripci Direcci Smbolo del bit o funcin alternativa
ro
n
n
del puerto
LS
MSB
B
Acumulado
r
ACC*
E0H
E7
E6 E5 E4 E3 E2 E1 E0
(Accumulat
or)
Registro B
B*
F0H
F7
F6 F5 F4 F3 F2 F1 F0
(register B)
Apuntador
a
datos
DPTR: (Data
pointer) (2
bytes)
Byte alto
del DPTR
DPH
(Data
83H
pointer
high)
Byte bajo
del DPTR
DPL
(Data
82H
pointer
low)
AF
AE AD AC AB AA A9 A8
Habilitaci
n
de
interrupcio
ET
ET EX
EX
IE*
A8H
EA

ES
ET0
nes
2
1
1
0
(Interrupt
enable)
BF
BE BD BC BB BA B9 B8
Prioridad
de
las
interrupcio
PT
PT PX
PX
IP*
B8H

PS
PT0
nes
2
1
1
0
(Interrupt
priority)
87
86 85 84 83 82 81 80
P0*
Puerto
0 80H
AD7 AD AD AD AD AD AD1 AD

Valor
del reset

00H

00H

00H

00H

0x00000
0B

0x00000
0B

FFH

(Port 0)
P1*

P2*

Puerto
(Port 1)
Puerto
(Port 2)

90H

A0H

97

6 5 4 3
96 95 94 93

2
92

0
90

A7

A6
A1
4
B6
W
R

A5
A1
3
B5

GF GF
PD
1
0

IDL

D7

D6 D5 D4 D3 D2 D1

D0

CY

AC F0

A15
B7

Puerto
3
B0H
(Port 3)
Control del
PCON consumo
87H
1
(Power
control)
P3*

PSW*

Palabra de
estado del
programa
D0H
(Program
status
word)

RD

SMO

T1

91
T2E

T2 FFH
X
A4 A3 A2 A1 A0
A1
A11 A10 A9 A8 FFH
2
B4 B3 B2 B1 B0
INT INT
Rx
T0
TxD
FFH
1
0
D

RS RS
OV
1 0

0xxxxxxx
B

00H

Valor
Regist Descripci Direcc Smbolo del bit o funcin alternativa
del
ro
n
in
del puerto
reset
MS
LSB
B
Byte alto
RCAP2 de captura
CBH
00H
H#
(Capture
high)
Byte Bajo
RCAPL de captura
CAH
00H
#
(Capture
low)
Buffer de
datos serie
xxxxxx
SBUF (Serial
99H
xxB
data
buffer)
9F 9E 9D 9C 9B
9A 99 98
SCON* Control
98H
SM SM SM RE TB8 RB TI RI
00H
puerto
0
1
2
N
8
serie
(Serial

SP

controller)
Puntero
del stack
81H
(Stack
pointer)

Control de
las
temporizad
TCON*
88H
ores
(Timer
control)
Control del
T2CO timer
2
N*#
(Timer 2
control)
Temporiza
dor 0 parte
TH0
alta
(Timer
high 0)
Temporiza
dor 1 parte
TH1
alta
(Timer
high 1)
Temporiza
dor 2 parte
TH2# alta
(Timer
high 2)
Temporiza
dor 0 parte
TL0
baja
(Timer low
0)
Temporiza
dor 1 parte
TL1
baja
(Timer low
1)
Temporiza
dor 2 parte
TL2# baja
(Timer low
2)
TMOD Modo de

C8H

07H
8F

8E

8D

8C 8B

8A 89 88

TF1

TR
TF0 TR0 IE1
1

IT1 IE0 IT0

CF

CE CD CC CB

CA C9 C8

TF2

EX RC TCL EXE TR C/T CP/R


00H
F2 LK K
N2
2 2 L2

00H

8CH

00H

8DH

00H

CDH

00H

8AH

00H

8BH

00H

CCH

00H

89H

GAT C/T M1 M0 GAT C/ M1 M0

00H

los
temporizad
ores
(Timer
mode)

* Registro
con
direccionamiento
a
nivel
# Registros aadidos en la familia de microcontroladores 8052.

de

bit.

3. Modos de
direccionamiento 8051
3.1. Directo (Dir)
Dir. En el direccionamiento directo, se indica la direccin a operar de forma
absoluta.
Para la familia de microcontroladores 8051 se dispone de 256 direcciones
directas, correspondientes a (Ram interna + Registros SFR).
El OpCode va seguido de un byte que representa la direccin.

MOV A,30H ; A<-(30H), El contenido de la direccin


30H
se
mueve
al
acumulador
ADD A,31H ; A<-(A)+(31H), Se suma el contenido de
acumulador
con
el
de
la
direccin
31H
;
el resultado
se deposita
en el
acumulador

3.2. Por registro (Rn)


Rn. Para el direccionamiento por registro el cdigo de la instruccin (OpCode)
contiene la informacin del registro a operar, del banco de registros
seleccionado.

MOV R1,A ; R1<-(A), El contenido del acumulador se


mueve al registro R1
OpCode de (MOV Rn,A) es F8H, en binario:
1

Los tres ltimos bits identifican el registro sobre el cual se opera.


R0
R1
R2
R3
R4
R5
R6
R7

0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1

3.3. Indirecto (@)


@. Se especifica un registro que contiene la direccin del dato a operar.
R0, R1 cuando se accede a la memoria interna de direccionamiento indirecto
256
Bytes.
DPTR para el acceso a la memoria externa 64K Bytes.

MOV R0,#30H ; RO<-30H, mover al registro 0 el dato


inmediato
30H
(constante)
MOV A,@R0
; A<-((R0)), mueve el contenido de la
posicin de memoria indicada en R0 al Acc

Direccionamiento indirecto

3.4. Implcito
La instruccin indica implcitamente el registro sobre el que se ha de operar.

INC A
;
A<-(A)+1,
incrementar
el
acumulador
CPL A ; A<-(), complementa el acumulador

3.5. Inmediato (#)


#. El OpCode est seguido de una constante que representa el valor con el que
se operar.

MOV A,#0
;
A<-0,
poner
cero
en
el
Acc
MOV R1,#123 ; R1<-123, poner el valor 123 (decimal)
en el registro uno

3.6. Indexado
Se utilizan dos registros para apuntar a la direccin que contiene el dato. La
suma del contenido del DPTR ms el acumulador determina la direccin a
operar.
Este direccionamiento esta limitado a dos nicas instrucciones que mueven
datos de la ROM al acumulador.

MOVC A,@A+DPTR ; A<-((DPTR+A)), el contenido de la


posicin que apunta el DPTR+A se deposita en el Acc

Direccionamiento indexado

4. Tipos de instrucciones
en los microcontroladores
8051

El conjunto de instrucciones de los microcontroladores 8051 se puede dividir en


los siguientes grupos:

Instrucciones de transferencia de datos.

Instrucciones aritmticas.

Instrucciones lgicas (booleanas).

Instrucciones de control del programa (saltos).

Instrucciones de manipulacin de bits.

Ver gua de referencia de los microcontroladores 8051.

4.1. Instrucciones de transferencia de


datos

Instrucciones de transferencia de datos microcontroladores 8051.


Realizan movimiento de datos entre los registros, memoria y puertos.
MOV destino, procedencia. Movimiento de datos en la memoria RAM
interna. Este tipo de instrucciones admiten prcticamente todos los
direccionamientos, directo, indirecto, por registro e inmediato.

MOV A,P0 ; Mueve el contenido del puerto 0 al


acumulador
MOV R1,A ; Mueve el contenido del Acumulador al
registro 1

MOVX. Movimiento de datos en la memoria RAM externa (XRAM). Este tipo


de movimiento solo admite el direccionamiento indirecto, de 8bits mediante
registro R0 o R1 y de 16 bits por mediacin del registro DPTR.

MOV DPTR,#2000H ; Mover al registro apuntador DPTR


el
dato
inmediato
2000H
(direccin)
MOVX A,@DPTR
; Mover el contenido de la memoria
que apunta el DPTR (2000H) al Acumulador
MOVC. Permite el movimiento de la ROM a Acumulador. Mediante esta
instruccin se puede realizar la manipulacin o movimiento de tablas desde la
memoria de programa.
XCH. Intercambia el contenido del Acumulador y la memoria RAM interna.
XCHD. Intercambia el contenido de los 4 primeros bits del Acumulador con la
memoria RAM interna.
PUSH y POP. Para la transferencia de datos a la pila o Stack.

4.2. Instrucciones aritmticas

Instrucciones aritmticas microcontroladores 8051.


Las instrucciones aritmticas de estos microcontroladores son muy limitadas,
permiten sumar, restar, incrementar, decrementar y excepcionalmente se ha
integrado el producto y la divisin de nmeros enteros.
ADD A, byte. Suma de 8 bits. Suma el contenido del Acumulador con un Byte,
con el direccionamiento indicado, el resultado queda en el acumulador.

MOV A,#3
inmediato
MOV R0,#2
inmediato

A<-3

Mueve

A<-2

Mueve

al
al

Acumulador
registro

el
el

dato
3
dato
2

ADD A,R0 ; A<-(A)+(R0) Se suma el Acumulador con el


Registro 0, el resultado queda en el Acumulador
ADDC A, byte. Suma con Carry. La suma con Acarreo permite realizar sumas
de nmeros enteros superiores a 8 bits.
Ejemplo: Suma de dos variables enteras de 16 bits que se encuentran el las
posiciones de memoria 30H y 32H. El resultado ha de quedar en una tercera
variable en la posicin 34.

MOV A,30H ; A<-(30H) Mueve el contenido de 30H al


Acumulador,
parte
baja
de
Variable
1
ADD A,32H ; A<-(A)+(32H) Suma el Acumulador con la
posicin
32H,
parte
baja
de
la
Variable
2
MOV 34H,A ; 34H<-(A) Mueve el Acumulador a la
posicin 34H, el resultado a parte baja de la
Variable
3
MOV A,31H ; A<-(31H) Mueve el contenido de 31H al
Acumulador,
parte
alta
de
Variable
1
ADDC A,33H ; A<-(A)+(32H) Suma el Acumulador y el
Carry con la posicin 33H, parte alta de la Variable
2
MOV 35H,A ; 35H<-(A) Mueve el Acumulador a la
posicin 35H, el resultado a parte alta de la
Variable 3
La siguiente figura muestra un esquema del contenido de la memoria para
realizar la suma de dos nmeros enteros de 16 bits. Se supone que los datos de
la suma (35FEH+00003H) se han establecido previamente y no son objeto del
estudio en este ejemplo.

Suma de nmeros enteros de 16 bits en Ensamblador


SUBB A,byte. Resta con Carry. Resta al contenido del Acumulador un Byte,
con el direccionamiento indicado, el resultado queda en el acumulador.

MOV A,#5
; A<-5 Mueve al Acumulador el dato
inmediato
5
CLR C
; C<-0 Pone a 0 el carry, por si en
operaciones anteriores ha sido afectado, para que no
interfiera
en
la
resta
SUBB A,#03H ; A<-(A)-3 Se resta al Acumulador el
dato inmediato
3, el
resultado queda
en el
Acumulador
INC byte. Incremento. Incrementa una unidad el contenido de un Byte (Acc,
registro, memoria), con el direccionamiento indicado.

MOV R0,#30H
; R0<-30H Mueve al registro 0 el dato
inmediato
30H
INC @R0
; ((R0))<-((R0))+1 Incrementa el
contenido de la posicin de memoria que indica R0
DEC byte. Decremento. Decremento de una unidad el contenido de un Byte
(Acc, registro, memoria), con el direccionamiento indicado.

DEC R1
de R1

; (R1)<-(R1)-1 Decrementa el contenido

DA A. Ajuste decimal del acumulador. Esta instruccin realiza el ajuste en


formato BCD (0-9) de los nibbles de acumulador (b0-b3 bits menos
significativos y b4-b7 bits ms significativos) del resultado de la suma con las
instrucciones ADD o ADDC. Esta instruccin es utilizada cuando se trabaja con
dgitos de 7 segmentos y es necesario trabajar en BCD.
MUL AB. Multiplicacin de 8 bits. Realiza una multiplicacin de nmeros
enteros de 8 bits sin signo de los valores contenidos en el registro A y el B. El
resultado es un nmero entero de 16 bits, quedando la parte menos significativa
en el acumulador y la parte ms significativa en el registro B.
DIV AB. Divisin entera de 8 bits. Realiza la divisin de nmeros enteros de 8
bits sin signo de acumulador entre el registro B. En el acumulador queda el
resultado (cociente), mientras que el resto de la divisin entera queda en el
registro B.

3. Instrucciones lgicas

Instrucciones lgicas microcontroladores 8051.


Instrucciones lgicas para el tratamiento booleano de datos.
ANL destino,origen. AND (Y) lgica. Realizala operacin lgica Y entre el
byte de origen y el byte de destino.

MOV A,#0F0H
; A<-F0H Mover al acumulador el dato
inmediato
F0H
ANL A,#10H
; A<-(A).10H Realiza la AND lgica
entre el acumulador y el dato inmediato.

AND lgica.
ORL destino,origen. OR (O) lgica de bits. Realizala operacin lgica O entre
el byte de origen y el byte de destino.
XRL destino,origen. XOR (O exclusivo) lgica de bits. Realizala operacin
lgica O exclusivo entre el byte de origen y el byte de destino.
A
0
0
1
1

B
0
1
0
1

Del acumulador
CLR A. A = 0, Borrar el acumulador.

XOR
0
1
1
0

CPL A. A = , Complementar el acumulador (complemento A1).


SWAP A. A3-0 <-> A7-4, intercambia los nibbles del acumulador.
Rotaciones de bits
RL A. Rotacin a la izquierda del acumulador.
RLC A. Rotacin a la izquierda del acumulador a travs del carry.
RR A. Rotacin a la derecha del acumulador.
RRC A. Rotacin a la derecha del acumulador a travs del carry.

Rotaciones del Acumulador microprocesadores 8051

4.4. Instrucciones de manipulacin de


bits

Intrucciones de manipulacin de bits nicroprocesadores 8051


CLR bit. Poner a cero el bit especificado.
SETB bit. Poner a uno el bit especificado.
CPL bit. Complementar el bit indicado.
MOV bit_destino,bit_procedencia. Transferir o mover un bit.
ANL C,bit_procedencia. AND (Y) lgica entre el carry y el bit indicado.
ORL C,bit_procedencia. OR (O) lgica entre el carry y el bit indicado.

4.5. Instrucciones de control del


programa

Intrucciones de control del programa de bits nicroprocesadores 8051


Instrucciones de salto incondicional
LJMP addr16. Salto incondicional de 16bits (salto largo).
AJMP addr11. Salto incondicional de 11bits (salto corto).
SJMP rel. Salto incondicional relativo a la posicin actual.
Si se utiliza un ensamblador, los saltos se pueden expresar con su expresin
genrica JMP para salto incondicional y CALL para salto a subrutina, el
software ensamblador se encargar de reemplazar el salto genrico por el
especfico del microprocesador ms adecuado a cada caso.
JMP etiqueta. Salto genrico incondicional.
En el siguiente fragmento de cdigo, en JMP SALTO1 se realiza un salto
incondicional desde la posicin actual hasta la lnea que tiene la
etiqueta SALTO1, el ensamblador se encargar de sustituir la
etiqueta SALTO1 por el valor de la direccin correspondiente.

JMP SALTO1

Salto

incondicional

SALTO1: MOV A,#05H


...
Salto a subrutinas
LCALL addr16. Salto a subrutina de 16bits ( salto largo).

...
...
SALTO1
...
...

ACALL addr11. Salto a subrutina de 11 bits (salto corto).


CALL etiqueta. Salto genrico a subrutina.
Salto indirecto
JMP @A+DPTR. Salto indirecto a la posicin resultante de la suma de los
datos contenidos en los registros DPTR y Acumulador.
4.5.1. El PSW Program Status Word

Registro PSW Program Status Word

El registro PSW (Program Status Word) o palabra de estado del


programa, contiene la informacin del estado de la CPU. Contiene los
indicadores o flags que usan las instrucciones condicionales para tomar
decisiones. Estos indicadores se cambian de forma automtica cuando alguna de
las instrucciones que se muestran en la siguiente tabla es ejecutada, tambin
pueden ser modificados por el usuario. El PSW se encuentra en la direccin
directa 0D0H (zona de SFRs) y sus bit admiten el direccionamiento bit a bit.
Indicadores o flags

C: Indicador de acarreo.

Ac: Indicador de acarreo auxiliar, indica el acarreo del bit 3, se utiliza en las
operaciones BCD.

F0: Indicador de usuario o de propsito general.

Ov: Indicador de desbordamiento, cuando se produce un acarreo en el 6 y 7


bit al mismo tiempo.

P: Indicador de paridad, indica 1 cuando el nmero de unos del Acc es impar.

Rs0 y Rs1: Seleccin del banco de registros.

Rs1

Rs0

Banco

Direccin

00H a 07H

08H a 0FH

10H a 17H

18H a 1FH

Instrucciones que afectan a los flags


Instruccin

Ov

Ac

ADD

ADDC

SUBB

MUL

DIV

DA

RRC

RLC

SETB C

CLR C

CPL C

ANL C,Bit

ANL C,/Bit

ORL C,Bit

ORL C,/Bit

MOV C,Bit

CJNE

5.2. Estructura de un programa en


ensamblador
El siguiente programa muestra la estructura bsica de un programa en
ensamblador.
;**********************************************************
; Ejemplo de estructura de un programa en ensamblador para
; los microcontroladores 8051.
;
; Programa para hacer parpadear todos los bits del puerto 0
; con un tiempo determinado.
;
; Autor: Rafa Aranda
; Fecha: 20-10-2009
; Versin: 1.0
;**********************************************************
$NOMOD51
$INCLUDE (REG51.INC)

STACK EQU

NAME

ESTRUCTURA

030H

;Direccin del puntero del stack

;*************************************
; Iniciar los vectores de interrupcin
;*************************************
USING 0
ORG
0H
(Posicin de la memoria ROM)
VECTOR:

JMP

;Origen

INICIO

del

;Reset

ORG

VECTOR+3H

;INT0

ORG

VECTOR+0BH

;Timer 0

ORG

VECTOR+13H

;INT1

ORG

VECTOR+1BH

;Timer 1

ORG

VECTOR+23H

;Puerto serie RI + TI

cdigo

ORG

VECTOR+2BH

;Timer 2

;********************************
; Tareas iniciales de preparacin
;********************************
ORG

VECTOR+30H

INICIO:
del stack

MOV

MOV
de registros 0
MOV

SP,#STACK-1

PSW,#00000000B
P1,#0H

;Fijar

el

puntero

;Selecciona el banco

;Preparar el puerto

;*******************
; Programa principal
;*******************
PROGRAMA:
0 a 0

MOV

P1,#0H

;Poner los bits del puerto

CALL
MOV

RETARDO
P1,#0FFH

;Realizar un retardo
;Poner los bits del puerto

CALL
JMP

RETARDO
PROGRAMA

;Realizar un retardo
;Reiterar de forma infinita

0 a 1

;***************************
; Subrutina de temporizacin
;***************************
RETARDO:
RET_3:
RET_2:
RET_1:

END

MOV
MOV
MOV
DJNZ
DJNZ
DJNZ
RET

R2,#7FH
R1,#0FFH
R0,#0FFH
R0,RET_1
R1,RET_2
R2,RET_3

5. Programacin en
Ensamblador
5.1. Ejemplos bsicos de programacin
Ejemplos de programas en ensamblador de los microcontroladores 8051.
E-1. Contador en el Acumulador de 0 a 99 en Hexadecimal

NAME

CONTADOR_HEX

ORG
INICIO:
REPETIR:

0
MOV
INC
CJNE

A,#0
A
A,#99,REPETIR

END

Diagrama de flujo del contador en hexadecimal.


E-2. Contador en el Acumulador de 0 a 99 en BCD

NAME

CONTADOR_BCD

ORG
INICIO:
REPETIR:

0
MOV
ADD
DA
CJNE

A,#0
A,#1
A
A,#99,REPETIR

END

Diagrama de flujo del contador en decimal BCD.


E-3. Rotacin de 1 bit a mano derecha en el Acumulador.

NAME

ROTACION_ACUMULADOR

ORG
INICIO:
REPETIR:

0
MOV
RR
JMP

A,#1
A
REPETIR

END
E-4. Retardo por programa de 256 instrucciones DJNZ.
El tiempo de un retardo por programa no tiene un valor fijo, este depende
de las instrucciones que forman parte del bucle (los ciclos mquina utilizados) y
de la velocidad del reloj del microprocesador (CPU).
Para este ejemplo en cuestin, el bucle se realiza sobre la instruccin DJNZ, la
cual necesita dos ciclos mquina para su ejecucin. Cada ciclo mquina utiliza
12 periodos de reloj. Si la frecuencia de la CPU es de 12MHz, el tiempo
empleado en realizar las 256 iteraciones es de 512 s (microsegundos).

NAME

RETARDO_1

ORG
INICIO:
RET1:

0
MOV
DJNZ

R0,#0FFH
R0,RET1

END

Diagrama de flujo de un temporizados por programa.


E-5. Retardo por software anidado de tres registros R0, R1 y R2.
Para poder realizar retardos por software con tiempos superiores al
segundo se ha de realizar mediante el anidamiento de bucles. En la figura se
muestra un anidamiento de bucles con los registros R0, R1 y R2. En este
sistema, por cada decremento del registro R1, el registro R0 se ha decrementado
256 veces, y por cada decremento de R2 el R1 ha realizado 256 iteraciones, por
lo que el resultado final es de 2^24 = 16777216 iteraciones. El tiempo
resultante es aproximadamente 33,554432 segundos, segn las condiciones
expuestas en el ejemplo anterior.

Para determinar el tiempo se han de modificar los bits que representan los
valores ms significativos, correspondientes al R2.
Malgastar la capacidad de clculo de la CPU en temporizaciones o retardos por
software solo tiene sentido cuanto el microprocesador nicamente ha de
atender a un proceso. El trabajo normal es utilizar los timers y las
interrupciones para realizar las tareas de temporizacin, y dejar a la CPU libre
para otros procesos.

NAME

RETARDO_2

ORG
RETARDO:
RET3:
RET2:
RET1:

0
MOV
MOV
MOV
DJNZ
DJNZ
DJNZ
END

R2,#0FFH
R1,#0FFH
R0,#0FFH
R0,RET1
R1,RET2
R2,RET3

Diagrama de flujo de un temporizador por software con tres registros.

5.3. Stack o pila


Stack o pila es una estructura de datos con acceso del tipo LIFO (Last In First
Out), ltimo en entrar, primero en salir. Como similitud se puede asociar a un
almacenamiento de libros formando una pila, en la que se almacenan uno sobre
otro, los nuevos elementos se apilan sobre el ltimo, y cunado se retiran se
extrae el ltimo que se ha apilado.
Este tipo de estructura de datos es fcil de desarrollar por los sistemas
microprocesadores y resulta de gran utilidad para trabajar con listas de datos y
es imprescindible para el trabajo interno del microprocesador en las subrutinas
e interrupciones.
Algunos microprocesadores pueden tener el Stack en su interior, representando
un sistema muy rpido pero de tamao limitado, la mayora de
microprocesadores disponen el stack en la memoria externa, hecho que
proporciona una gran capacidad de almacenamiento y el control de su
ubicacin, aunque el acceso sea ms lento.

5.3.1. Puntero de la pila (stack pointer)

El puntero del stack SP (stack pointer) como su propio nombre indica es un


registro apuntador a la posicin de memoria donde se encuentra la pila. En la
familia 8051 el registro SP se encuentra en la zona de memoria SFR 81H.
Al realizar un reset el registro SP se pone de forma automtica con el
valor 07H, por lo que la pila se establece por defecto en la posicin 08H, zona
que es utilizada por los bancos de registros. Es recomendable cambiar la pila a
otra zona de memoria, por ejemplo a la posicin 30H (fuera de la zona de
registros). Para situar el puntero del stack se pone como primera instruccin del
programa:

MOV SP,#2FH ;
posicin 30H

Situar

el

puntero

del

stack

en

la

Puntero de la pila (stack pointer)


5.3.2. PUSH

La instruccin PUSH, sita en la pila el contenido de la direccin indicada,


primero se incremente el puntero de la pila y acto seguido el contenido de la
direccin se copia en la RAM que indica el apuntador de la pila SP.
Instruccin PUSH Dir
1

(SP) = (SP)+1

((SP))
(Direccin)

Incrementa el puntero del Stack a la siguiente posicin


= Situar en la pila (direccin apuntada por SP) el contenido de
la direccin

Ejemplo:

MOV A,#3 ; Cargar el acumulador con la constante 3


MOV B,#5 ; Cargar el registro B con la constante 5
...

...
PUSH A ; Situar
Acumulador
PUSH B ; Situar
registro B

en

el

Stack

el

contenido

del

en

el

Stack

el

contenido

del

Instruccin PUSH
5.3.3. POP

La instruccin POP, lee el contenido de la direccin de la pila que ndica el SP


(apuntador del stack) y lo sita en la direccin especificada, despus
decrementa el apuntador de la pila SP dejndolo en la posicin anterior.
Instruccin POP Dir
1

(Direccin) =
((SP))

Recupera en la direccin indicada el contenido de la pila


(apuntado por SP)

(SP) = (SP)-1

Decrementa el puntero del Stack a la posicin anterior

Se ha de tener en cuenta que por el propio funcionamiento de la pila, el ltimo


dato que se ha introducido ha de ser el primero en recuperarse, si nos
centramos en el ejemplo anterior, se ha puesto en la pila el contenido del
registro A y despus el B, a la hora de recuperar los datos se ha de hacer en
orden inverso al introducido, primero el B y despus el A.
Ejemplo:

...
...
POP B ; Recupera en el registro B el contenido del
Stack
POP A ; Recupera en el acumulador el contenido del
Stack

Instruccin POP

5.4. Subrutina o subprograma


Una subrutina o subprograma en una seccin o parte de programa
separado del programa principal que puede ser llamado para realizar una
funcin especfica. La subrutina puede ser requerida por el programa principal
u otra subrutina tantas veces como sea necesario. Cuando se llama a una
subrutina la ejecucin del programa en curso se detiene, el contador de
programa PC (program counter) se carga con la posicin de memoria de la
subrutina, ejecutndose hasta llegar a la instruccin RET (final de subrutina),
donde se produce el retorno al programa principal reanudndose su ejecucin.
El los lenguajes de nivel alto como C, Basic se conoce a las subrutinas con el
nombre funciones o procedimientos.
En las subrutinas se han de tener en cuenta las siguientes consideraciones:

Realizan funciones concretas y no son operativas por si mismas.

Siempre estn ligadas a un programa principal o a otras subrutinas.

Pueden ser llamadas tantas veces como sea necesario por lo que se
reduce el cdigo el programa al tener el efecto de reutilizacin de
cdigo.

Permiten la divisin del programa en bloques por lo que realizan la


funcin de estructuracin. Proporcionando mayor visibilidad y
comprensin del mismo.

Como buen consejo, se recomienda siempre que sea posible la divisin del
programa en subrutinas o subprogramas y se minimice el contenido de
sentencias en el programa principal. Sobre todo, las subrutinas son necesarias
cuando una parte de un programa se ha de ejecutar mltiples veces.
Conseguiremos que el programa se mas sencillo y que ocupe menos espacio en
la ROM.

Si una subrutina est formada por pocas instrucciones, puede ser no aconsejable
crearla, ya que el mecanismo de llamada y retorno puede hacer que sea ms
lenta su ejecucin que situar las instrucciones directamente en el programa
principal.

Subrutina o subprograma en sensamblador


Instruccin CALL
Llamada a una subrutina. El contador de programa es substituido por la
direccin indicada donde se contina con la ejecucin. El contenido del PC
(siguiente posicin en curso) se guarda en el Stack.
LCALL Dir
1
2
3
4
5
6

(PC) = (PC)
+3
(SP) = (SP)
+1
((SP))
=
(PC7-0)
(SP) = (SP)
+1
((SP))
=
(PC15-8)
(PC)
=
Addres15-0

Lee la instruccin y el contador del programa PC apunta a la


siguiente

Guarda en el Stack el contador de programa PC que se


encuentra apuntando a la siguiente instruccin

El control del programa es transferido a la instruccin cuya


direccin est especificada en los bytes 2 y 3 de la

instruccin CALL actual

Instruccin RET
Retorno de subrutina. Se recupera del stack el contador del programa PC y se
contina la ejecucin del programa en la siguiente instruccin de la llamada a la
subrutina CALL.
RET
(PC15-8)
=
((SP))
(SP) = (SP)2
1
(PC7-0)
=
3
((SP))
(SP) = (SP)4
1
1

Se recupera el contador del programa PC de la memoria de


Stack

La ejecucin del programa se reanuda en la siguiente


posicin a la llamada a la subrutina

Anidamiento de subrutinas

Anidamiento de subrutinas

6. Programacin en C
6.1. Tipos de datos
Declaracin de los tipos de memoria
En la declaracin de la variable se puede indicar en que tipo de memoria se
almacenar.
La siguiente tabla muestra el tipo de memoria que se puede especificar.

code Memoria de programa (64 KBytes). Con acceso mediante la


instruccin MOVC @A+DPTR.

data Direccionamiento directo a la memoria de datos interna. Para un


acceso rpido a las variables (128 bytes).

idata Direccionamiento indirecto a la memoria de datos interna. Con


acceso a toda la memoria interna (256 bytes).

bdata Memoria de datos interna con direccionamiento bit a bit. Permite


el acceso a la zona de bits con direccionamiento por bit y por byte (16
bytes).

xdata Memoria de datos externa (64 KBytes). Acceso mediante la


instruccin MOVX @DPTR.

pdata Paginado (256 bytes) memoria de datos externa. Acceso mediante


la instruccin MOVX @Rn.

Normalmente al trabaja en C, no es necesario especificar el tipo de memoria en


la que se almacenar el contenido de las variables, se asume que sta es la RAM
de trabajo. Pero en este tipo de microcontroladores al disponer de variadas
zonas de memoria con comportamiento distinto, es necesario especificar si la
variable se ha de asignar una u otra memoria segn la necesidad. Por defecto, si
no se indica nada la variable se asigna a la memoria data.
Ejemplos:
char data Var1;
char code text[] = "Entrar temperatura:";
unsigned long xdata MiArray[100];
float idata x,y,z;
unsigned int pdata Dimension;
unsigned char xdata vector[10][4][4];
char bdata Indicador;
Tipos de datos
Un tipo de dato define el rango de valores que puede tener una variable a lo
largo de la ejecucin del programa as como el nmero de bytes de memoria
asignados para contener la informacin.
Tipo de dato
bit*
signed char
unsigned char
enum
signed short

Bits
1
8
8
8 / 16
16

Bytes
1
1
1 or 2
2

Rango
0a1
-128 a +127
0 a 255
-128 a +127 o -32768 a +32767
-32768 a +32767

unsigned short
signed int
unsigned int
signed long
unsigned long
float
sbit*
sfr*
sfr16*

16
16
16
32
32
32
1
8
16

2
2
2
4
4
4
1
2

0 a 65535
-32768 a +32767
0 a 65535
-2147483648 a 2147483647
0 a 4294967295
1.175494E-38 a 3.402823E+38
0a1
0 a 255
0 a 65535

Las comunicaciones en
serie
Las comunicaciones en serie RS-232 es una interfaz de comunicaciones
para la transmisin de datos en serie entre dispositivos electrnicos como
ordenadores,
mdems
etc.
La
norma RS-232C establecida
por
la EIA (Electronic Industries Alliance) determina las caractersticas fsicas de la
comunicacin de datos binarios entre dispositivos, DTE (Data Terminal
Equipment o Equipo Terminal de Datos) normalmente asociado a un ordenador
y dispositivos DCE (Data Communication Equipment o Equipo de
Comunicacin de Datos) para los quipos perifricos como mdems o autmatas.

Secuencia de bits de la RS-232


Bps bits por segundo.
La velocidad de transmisin de datos en las comunicaciones serie se mide
en bits por segundo bps (bit rate), es decir, el nmero de bits que son
transferidos en 1 segundo. Si el tiempo de un bit corresponde al tiempo de
permanencia de un estado lgico, la velocidad de transmisin resulta la inversa
del tiempo de 1 bit.

En muchas ocasiones se realiza una equiparacin directa entre bps (bit rate)
y Bps (baud rate o baudios por segundo) y esto solo es cierto cuando el smbolo
que se trasmite corresponde a un bit.

Los baudios (baud rate) corresponde al nmero se smbolos que se


transmiten por segundo, todo depende de que se entienda como smbolo, si este
corresponde a 1 bis ambos trminos coinciden pero un baudio puede ser
representado por varios bits.

7.1. El Timer 1 como generador de


Baudios
El registro TMOD (89H, 137)
Registro de configuracin de los temporizadores/contadores Timer 0 y Timer 1.
MSB
GATE

C/T
M1
Timer 1

M0

GATE

LSB
M0

C/T
M1
Timer 0

M0 y M1. Seleccin del modo de operacin del temporizador.


M1
0
0
1
1

M0
0
1
0
1

Seleccin del modo de operacin


Modo 0 Temporizador/contador de 13 bits
Modo 1 Temporizador/contador de 16 bits
Modo 2 Temporizador/contador de 8 bits con autorecarga
Modo 3 Varios contadores

C/T. Funcionamiento como contador o como temporizador.


0 -> Contador, los pulsos se toman
1 -> Temporizador, pulsos del terminal Tx.

de

la

seal

de

reloj.

GATE. Establece el control del timer.


0 -> Hace que el Timer se controle mediante el bit TRx. Si TRx es 1 se pone en
macha el Timerx y con TRx a 0 se para (x identifica al timer 0 1).
1-> El Timer se controla por hardware, mediante el estado de la entrada
(pin) INTx.
Para que el Timer 1 funcione como generador de baudios se ha de configurar en
modo 2 (temporizador de 8 bits con autorecarga).
Timer en Modo 2, auto-recarga de 8 bits

Timer 1 en modo 2, temporizador de 8 bits con autorecarga


Baudios (bits por segundo)
Si se utiliza el Timer 1 como generador de baudios cuando se trabaja
en Modo 1 y 3 (UART de velocidad variable) el clculo de la velocidad en
Baudios o bis por segundo viene establecido pos la siguiente frmula:

En la tabla inferior se puede observar la comparacin de las configuraciones de


los valores de recarga del Timer 1 en funcin de las distintas velocidades de
comunicacin posibles. Para poder obtener un conjunto de velocidades de
comunicacin normalizadas es necesario utilizar un cristal de cuarzo de 11,0592
MHz.
Baudios
segundo)

(bits

Modo 0: 1 M (mx.)
Modo 2: 375 K
Modo 1, 3: 62,5 K
19200
9600
4800
2400
1200
137500
110000
110000

por Frecuencia
reloj
12 MHz
12 MHz
12 MHz
11,0592 MHz
11,0592 MHz
11,0592 MHz
11,0592 MHz
11,0592 MHz
11,0592 MHz
6 MHz
12 MHz

del

Timer 1
SMOD
Valor
C/T Modo
recarga
X
X X
X
1
X X
X
1
0 2
FFH
1
0 2
FDH
0
0 2
FDH
0
0 2
FAH
0
0 2
F4H
0
0 2
E8H
0
0 2
1DH
0
0 2
72H
0
0 1
FEEBH

7.2. El puerto serie (la UART)

de

Los microcontroladores de la familia MCS-51 disponen del hardware necesario


para realizar comunicaciones serie full duplex (transmiten y reciben de forma
simultnea), mediante la incorporacin de una UART o Transmisor y
Receptor Asncrono Universal (Universal Asynchronous ReceiverTransmitter).
El registro SCON (98H, 152)
Registro de configuracin del puerto serie.
MSB
SM0
9FH

SM1
9EH

SM2
9DH

REN
9CH

TB8
9BH

RB8
9AH

TI
99H

LSB
RI
98H

SM0 - SM1. Seleccin del modo de operacin del puerto serie.


Modo
0
1
2
3

SM0
0
0
1
1

SM1
0
1
0
1

Descripcin
Registro de desplazamiento
UART de 8 bits
UART de 9 bits
UART de 9 bits

Velocidad de operacin
fija (reloj / 12)
variable
fija (reloj / 64 o reloj / 32)
variable

SM2. Configuracin especial de los modos de operacin.

En modo 0: SM2 ha de permanecer a 0.

En modo 1: Si SM2 est a 1, RI no se activar si no se recibe el bit se Stop.

En los modos 2 y3: Si SM2 est a 1, habilita el modo multiprocesador,


y RI no se activa si el 9 bit (RB8) vale 0.

REN. Control de la recepcin


0
->
Inhibir
la
1
->
Permite
la
recepcin
En modo 0: 0 -> Transmisin, 1-> Recepcin.

de

recepcin.
caracteres.

TB8. Para comunicaciones con control de paridad, transmisin.


Corresponde a 9 bit (bit de paridad) a trasmitir en las comunicaciones de 9 bits
con control de paridad, en los modos 2 y 3.
RB8. Para comunicaciones con control de paridad, recepcin.

En modo 0: No se utiliza.

En modo 1: Recoge el bit se Stop.

En los modos 2 y3: Recibe el 9 bit (bit de paridad).

TI. Indicador o flag de interrupcin de transmisin.


Este flag indica el final de la transmisin de un carcter. Se activa al inicio del
bit
de Stop.
En
modo
0,
se
activa
al
final
del
8
bit.
Se ha de borrar por programa.
RI. Indicador o flag de interrupcin de recepcin.
Este flag indica la recepcin de un nuevo carcter que se encuentra disponible
en SBUF. Se activa al final del 8 bit en modo 0, y dentro del bit de Stop en el
resto de los modos (con la excepcin del modo multiprocesador).
Se ha de borrar por programa.

Potrebbero piacerti anche