Вы находитесь на странице: 1из 334

EDICIONS

UPC

EDICIONS
UPC

MICROCONTROLADORES MCS-51 Y MCS2-51


Published by
ATARAXIAINC
111 III World Street
Hoboken, NJ 07030-5774
Copyright 2006 by Ataraxiainc, Bogota, Chibchombia
Published by Ataraxiainc, Bogota, Chibchombia
Published simultaneously in the Earth planet
All parts of this publication may be reproduced, stored in a retrieval system or transmitted in any form or
by any means, electronic, mechanical, photocopying, recording, scanning or otherwise, except as no
permitted under Sections of the Copyright Act, without either the prior written permission of the
Publisher, or authorization through payment of the appropriate per-copy fee to the Copyright Clearance
Center, 2*2 Rosewood Drive, Danvers, MA 0+-23, (978) 75.-84/*00, fax (9%) 646-/600. Requests to
the Publisher for permission should be addressed to the Legal Department,
Ataraxiainc, Bogota, Chibchombia e-mail: Ataraxiainc@Gmail.com.
Trademarks: ATARAXIAINC

LIMIT OF LIABILITY/DISCLAIMER OF WARRANTY: THE PUBLISHER AND THE


AUTHOR MAKE NO REPRESENTATIONS OR WARRANTIES WITH RESPECT TO THE
ACCURACY OR COMPLETENESS OF THE CONTENTS OF THIS WORK AND
SPECIFICALLY DISCLAIM ALL WARRANTIES, INCLUDING WITHOUT LIMITATION
WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE. NO WARRANTY MAY BE
CREATED OR EXTENDED BY SALES OR PROMOTIONAL MATERIALS. THE ADVICE
AND STRATEGIES CONTAINED HEREIN MAY NOT BE SUITABLE FOR EVERY
SITUATION. THIS WORK IS SOLD WITH THE UNDERSTANDING THAT THE PUBLISHER
IS NOT ENGAGED IN RENDERING LEGAL, ACCOUNTING, OR OTHER PROFESSIONAL
SERVICES. IF PROFESSIONAL ASSISTANCE IS REQUIRED, THE SERVICES OF A
COMPETENT PROFESSIONAL PERSON SHOULD BE SOUGHT. NEITHER THE
PUBLISHER NOR THE AUTHOR SHALL BE LIABLE FOR DAMAGES ARISING
HEREFROM. THE FACT THAT AN ORGANIZATION OR WEBSITE IS REFERRED TO IN
THIS WORK AS A CITATION AND/OR A POTENTIAL SOURCE OF FURTHER
INFORMATION DOES NOT MEAN THAT THE AUTHOR OR THE PUBLISHER ENDORSES
THE INFORMATION THE ORGANIZATION OR WEBSITE MAY PROVIDE OR
RECOMMENDATIONS IT MAY MAKE. FURTHER, READERS SHOULD BE AWARE THAT
INTERNET WEBSITES LISTED IN THIS WORK MAY HAVE CHANGED OR DISAPPEARED
BETWEEN WHEN THIS WORK WAS WRITTEN AND WHEN IT IS READ.

For general information on our other products and services or to obtain technical support, please contact
our Customer Care Department within the ($=$(%&/&)%$=, outside the U.S. at =$(%(%$$__(/$-$)($, or fax |@##43@#.
Ataraxiainc also publishes its books in a variety of electronic formats. Some content that appears in print
may not be available in electronic books.
Library of Congress Control Number: -!$&$+-+)=(%/
ISBN: !?=)$(%/&-/+*
Manufactured in the Chibchombian World
10 9 8 7 6 5 4 3 2 1
2O/QW/RQ/QU/IN

POLITEXT 97

Microcontroladores
MCS-51 y MCS-251

EDICIONS UPC

POLITEXT

Jos Matas Alcal


Rafael Ramn Ramos Lara

Microcontroladores
MCS-51 y MCS-251

EDICIONS UPC

La presente obra fue galardonada en el sptimo concurso


"Ajuts a l'elaboraci de material docent" convocado por la UPC.

Primera edicin: febrero de 2001

Diseo de la cubierta: Manuel Andreu

Los autores, 2001

Edicions UPC, 2001


Edicions de la Universitat Politcnica de Catalunya, SL
Jordi Girona Salgado 31, 08034 Barcelona
Tel.: 934 016 883 Fax: 934 015 885
Edicions Virtuals: www.edicionsupc.es
E-mail: edicions-upc@upc.es

Produccin:

Barcelona Digital, S.L.


Rossell 77, 08029 Barcelona

Depsito legal: B-10.539-2001


ISBN: 84-8301-454-8
Quedan rigurosamente prohibidas, sin la autorizacin escrita de los titulares del copyright, bajo las sanciones establecidas en las leyes, la reproduccin total o parcial de esta obra por cualquier medio o procedimiento, comprendidos la reprografa y el tratamiento informtico, y la distribucin de ejemplares de
ella mediante alquiler o prstamo pblicos.

A Gemma y Alex, a mi familia, a mis amigos


ms prximos, a mis compaeros de la
EUPVG, y a la memoria de mi padre.

Jos Matas

A Paula y a Rosa, a mi familia, a mis


compaeros de la EUPVG y a mis amigos.

Rafael Ramos

Los autores, 2001; Edicions UPC, 2001.

ndice

ndice
1
1.1
1.2
1.2.1
1.2.2
1.2.3
1.3
1.4

2
2.1
2.2
2.3
2.4
2.5
2.5.1
2.5.2
2.5.3
2.5.4

3
3.1
3.1.1
3.1.2
3.2
3.2.1
3.2.2
3.2.3
3.3
3.3.1
3.3.2
3.4
3.4.1
3.4.2
3.4.3

Estructura bsica de un sistema microprocesador


Introduccin .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
Estructura bsica de un sistema microprocesador ...... .. ... . ... .. .. .. .. ... .. .. .. .. .. .
Unidad central de proceso (CPU) ...... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Mdulo de entradas/salidas (E/S) .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .
Buses del sistema .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Estructura general de un sistema basado en microprocesador .... ... .. .. .. .. .. ... .. .. ..
Estructura general de un sistema basado en microcontrolador ...... .. .. .. .. ... .. .. .. ..

15
15
16
18
18
21
23

Las familias de microcontroladores de Intel y de otros fabricantes


La familia MCS-48 .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
La familia MCS-51 .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
La familia MCS-151 ... .. ... . ... .. .. .. .. .. ... .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ...
La familia MCS-251 ... .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Microcontroladores de otros fabricantes .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Microcontroladores de Philips ... ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Microcontroladores de Siemens .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Microcontroladores de Atmel .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Microcontroladores de Dallas Semiconductor .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ..

25
25
26
27
28
28
30
31
31

Arquitectura de las familias MCS-51 y MCS-251


Arquitectura interna de la MCS-51 .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ... .
Relacin de terminales .. .... . .. .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .
Puertos de entrada/salida .... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... ..
Organizacin de la memoria y de los registros internos de la MCS-51 .. . .. ... .. .. .. .. ..
rea de memoria de cdigo de programa y memoria de datos .... .. .. .. .. ... .. .. .. .. ..
rea de memoria interna y de registros de propsito general .. .. ... .. .. .. .. .. ... .. .. ..
rea de registros especiales (SFR) .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . ... .. .. ..
Arquitectura interna de la MCS-251 ... .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Relacin de terminales .. .... . .. .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .
Estructura interna de los puertos de entrada/salida ... . ... ... . .. .. .. ... .. .. .. .. .. ... .. .
Organizacin de los espacios de memoria de la MCS-251 ... .. .. .. ... .. .. .. .. .. ... .. ..
rea de memoria ... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ... .
rea de registros de propsito genrico ... ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... ..
rea de registros de funcin especfica SFR . .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .

Los autores, 2001; Edicions UPC, 2001.

33
34
36
38
38
40
41
44
45
48
48
49
51
54

Microcontroladores MCS-51 y MCS-251

10

3.4.4 Compatibilidad con la arquitectura de la familia MCS-51 ... . .. .. ... .. .. .. .. .. ... .. .. . 57


3.5
Configuracin de la serie 8XC251Sx . .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .. . 58
3.5.1 Configuracin del acceso a la memoria externa .. .. .. .. .... . .. .. .. ... .. .. .. .. .. ... .. . 58

Programacin de las familias MCS-51 y MCS-251


Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Tipos de direccionamiento .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .
Direccionamiento inmediato . ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. ..
Direccionamiento directo .... . ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .
Direccionamiento por registro .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Direccionamientoindirecto ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Direccionamiento por desplazamiento o indexado .... .. .. .. ... .. .. .. .. .. ... .. .. .. ..
Direccionamiento de bit ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
Direccionamiento relativo .... . .. .. .. ... .. .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. ... .. .
Conjunto de instrucciones de la familia MCS-51 y MCS-251 .. .. .. .. ... .. .. .. .. .. ...
Formato de una instruccin .. . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Directivas de ensamblador ..... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Los registros de estado PSW y PSW1 ..... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .
Instrucciones aritmticas .. ... . .. ... .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .
Instrucciones lgicas . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... ..
Instrucciones de transferencia de datos ... ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Instrucciones booleanas ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Instrucciones de control .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..

4.1
4.2
4.2.1
4.2.2
4.2.3
4.2.4
4.2.5
4.2.6
4.2.7
4.3
4.3.1
4.3.2
4.3.3
4.3.4
4.3.5
4.3.6
4.3.7
4.3.8

63
64
65
66
67
68
69
70
73
73
74
75
77
79
83
86
90
92

El modelo de programacin

5.1
5.2
5.3
5.4
5.5
5.6
5.7
5.8
5.9
5.10
5.10.1
5.10.2
5.10.3
5.10.4
5.10.5
5.10.6
5.10.7
5.10.8
5.10.9
5.10.10

Creacin y consulta a tablas .. .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ... . .


Transferencia de bloques de datos .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .
Funciones booleanas .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Retardos de tiempo ... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .... . . ... .. ..
Suma y resta de datos .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Contador en BCD .. .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Multiplicacin y divisin de datos de 16 bits .... .. .. .. ... .. .. .. ... .. .. .. .. .. .. ... ..
Suma y resta de datos con signo . .. .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .
Multiplicacin y divisin de 16 bits con signo . .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Ejemplos de aplicacin ... ... . .. .. .. ... .. .. .. .. ... .. .. ... . .. .. ... .. .. .. .. .. ... .. .
Generacin de una seal cuadrada ... .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Conexin de teclas al microcontrolador ..... .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Conexin de un dgito de siete segmentos .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Conexin de un teclado matricial de 4 x 4 teclas .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Conexin de varios dgitos de siete segmentos, aplicacin de Su turno .. .. .. .. ... .. .
Contador de piezas .... .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Control de un ascensor ... ... .. .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Control de un calefactor ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... ..
Control de una cinta elevadora .... .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Control de la temperatura de un horno de coccin ... .. .. ... .. .. .. .. .. .... . .. .. .... .

Los autores, 2001; Edicions UPC, 2001.

97
98
99
100
101
103
105
109
109
113
113
115
117
118
121
125
127
129
131
134

ndice

6
6.1
6.2
6.2.1
6.2.2
6.2.3
6.3
6.3.1
6.3.2
6.3.3
6.3.4
6.3.5
6.3.6

7
7.1
7.2
7.2.1
7.2.2
7.2.3
7.3
7.4
7.4.1
7.4.2
7.5
7.5.1
7.5.2
7.5.3
7.6
7.6.1
7.6.2
7.6.3
7.6.4
7.7
7.7.1
7.7.2
7.7.3
7.7.4

8
8.1
8.2
8.3
8.4

11

Las interrupciones
Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Las interrupciones en la familia MCS-51 . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Vectorizacin de interrupciones en la MCS-51 .. .. ... . .. ... .. .. .. .. .. .. ... .. .. .. .. .
Habilitacin de interrupciones y establecimiento de prioridades en la MCS-51 .. . .. .. ..
Tiempos de respuesta del proceso de interrupcin ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. .
El sistema de interrupciones en la familia MCS-251 .. .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Habilitacin de las interrupciones . .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .
Niveles de prioridad de las interrupciones .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Interrupciones externas /INT0 e /INT1 ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Interrupcin de los Timers ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
Interrupcin del array de contadores programables (PCA) .. .. ... .. .. .. .. .. ... .. .. ..
Interrupcin del puerto serie ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..

137
139
142
143
145
152
155
156
158

163
164

165

Temporizadores/contadores internos y watchdog


Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Temporizadores/contadores para la MCS-51 .... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Timer 0 y Timer 1 .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Timer 2 .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .. ... ... . .. .. ... .. .. .. .. .. ...
Timer 0, 1 y 2 como contador ... .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Temporizadores para la MCS-251 ..... .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Funcionamiento de los Timers .. .. ... .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .. ..
Funcionamiento como temporizador .... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Funcionamiento como contador .... .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Timer 0 y Timer 1 .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Habilitacin de los Timers 0 y 1 ... .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Desbordamiento de los Timers 0 y 1 ... .. .. ... .. .. .. .. .... . .. .. .. .. ... .. .. .. .. .. ..
Modos de funcionamiento de los Timers 0 y 1 ... .. .. .. .... . .. .. .. ... .. .. .. .. .. ... .
Timer 2 .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Modo captura ..... .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
Modo autorrecarga ..... .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Modo de generador de baudios (Baud Rate Generator Mode) .... .. ... .. .. .. .. .. ... ..
Modo Clock-out ..... .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Timer watchdog ..... .. .. ... . ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .
Descripcin de funcionamiento . .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Utilizacin del timer WDT ..... .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Timer WDT durante el modo Idle ..... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
Timer WDT durante Power Down .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...

173
174
174
181
186
191
192
193
193
194
194
198
199
213
215
215
217
217
219
219
220
220
220

Memoria externa
Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .
Memorias semiconductoras .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Estructura externa de las memorias .. .. .. .. ... .. .. .. .. .. .... . .. .. .. .. ... .. .. .. .. ..
Ciclos de fetch, de lectura y de escritura .. .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... ..

Los autores, 2001; Edicions UPC, 2001.

221
221
223
224

Microcontroladores MCS-51 y MCS-251

12

Conexin entre la MCS-51 y la memoria externa . .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .


Diagramas de tiempo para la MCS-51 . ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .. .. .. ... ..
Ejemplos de conexin para la MCS-51 .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
Conexin con la memoria externa para la familia MCS-251 .. .. .. .. .. .. ... .. .. .. .. ..
Configuraciones de acceso a la memoria externa . ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
18 bits de bus de direcciones (RD1, RD0 = 00) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
17 bits de bus de direcciones (RD1, RD0 = 01) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
16 bits de bus de direcciones (RD1, RD0 = 10) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
16 bits de bus de direcciones (RD1, RD0 = 11) ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..

8.5
8.5.1
8.6
8.7
8.8
8.8.1
8.8.2
8.8.3
8.8.4

225
225
227
231
233
233
239
240
240

Puerto de comunicacin serie

9.1
9.2
9.3
9.3.1
9.3.2
9.3.3
9.4
9.5
9.6
9.6.1
9.6.2
9.7
9.8
9.9
9.9.1
9.9.2

Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .


La comunicacin serie en la MCS-51 .. .. .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ..
Modos de funcionamiento del puerto serie .. ... .. .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. ..
Modo 0. Modo sncrono ... .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Modos 1, 2 y 3. Modos asncronos .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .
El Timer 2 como base para el puerto serie ..... .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .
Deteccin de errores ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
La comunicacin serie en la MCS-251 ... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Modos de operacin ..... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ... .
Modo 0 o sncrono .... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Modos 1, 2 y 3. Modos asncronos .. .. .. .. .. .. ... .. .. .. ... . ... .. .. .. .. .. ... .. .. .. .
Deteccin de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comunicacin multiprocesador ..... .. .. .. .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Reconocimiento automtico de direcciones ... .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Direcciones given ... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .... . .. .... . . ... .. .. .. .. .. ..
Direcciones broadcast ... .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..

247
248
250
250
250
252
253
262
264
264
267
272
272
273
273
274

10 El array de contadores programables (PCA)


10.1
10.2
10.3
10.3.1
10.3.2

Introduccin .. .. .. .. .. ... ... .. . .. .. ... .. .. .. .. .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .


Temporizador/contador del PCA ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. ..
Mdulos de comparacin/captura del PCA . .. ... .. .. .. .. ... .. .. .. .. .. .. ... .. .. .. .. .
Modo captura ..... .. ... .. ... . .. .. ... .. .. .. .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
Modos de comparacin ..... . .. .. .. .. ... .. .. .. .. .. ... ... . .. .. ... .. .. .. .. .. ... .. .

277
279
280
280
287

11 Entradas y salidas analgicas


11.1
11.2
11.3
11.4
11.5

Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. ... . ... .. ... . .. .. ... .. .. .. .. .. ... .. .


Conexin de un convertidor D/A . ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Convertidor A/D de bajo coste mediante aproximaciones sucesivas .. . .. .. ... .. .. .. ..
Conexin de un convertidor A/D . ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. ..
Conversin A/D utilizando los temporizadores del microcontrolador ..... .. .. .. .. ... .

Los autores, 2001; Edicions UPC, 2001.

297
298
302
305
317

ndice

13

12 Modos especiales de funcionamiento


12.1
12.2
12.2.1
12.2.2
12.3
12.4
12.5

Introduccin .. .. .. .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. ... ... . . ... .. .. .. .. .. ... .. .


Registro de control de potencia (PCON) ... .. ... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .
Bits de control del puerto serie ..... ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. ..
Bit de Power Off (POF) ...... . .. .. ... .. ... . .. .. ... .. .. ... . .. ... .. .. .. .. .. ... .. .. .
Modo Idle ..... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ...
Modo Power Down ..... .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. ..
Modo ONCE (On-Circuit Emulation) ...... .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... ..

327
327
327
327
328
329
330

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251 .. . .. .. ... .. .. .. .. 331


Bibliografa .... .. .. ... ... . .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. ... .. .. .. .. .. .. 337

Los autores, 2001; Edicions UPC, 2001.

Bibliofrafa

337

Bibliografa
BERNARD ODANT; Microcontroladores 8051 y 8052. Paraninfo, 1995.
GONZLEZ VAZQUEZ, J.A; Introduccin a los microcontroladores 8X52, 8X51. Mc Graw Hill,
1992.
ANGULO, J.M; Microprocesadores y Microcontroladores 8085, MCS-51 y ST6. Paraninfo, 1992.
Embedded Microcontroller Users Manual. 8XC251SA, 8XC251SB, 8XC251SP, 8XC251SQ.
SENCER YERALAN Y ASHUSTOSH AHLUWALIA; Programming and interfacing the 8051
Microcontroller. Addison-Wesley, 1995.
JAMES W. STEWART; The 8051 Microcontrollers, Hardware, Software and interfacing. PrenticeHall, 1993.
THOMAS W. SHULTZ; C and the 8051. Programming and Multitasking. Prentice-Hall, 1993.
JOHN UFFENBECK; Microcomputers and Microprocessors. The 8080, 8085, and Z-80. PrenticeHall, 1991.
BARRY B. BREY; Los microprocesadores de INTEL. Arquitectura. Programacin e interfaces.
Prentice-Hall, 1994.
RICHARD J. PRESTOPNIK; The Microprocessor Peripheral IC Reference Manual. Prentice-Hall,
1989.
MATAS, Jos, et al ; Entorno de desarrollo para la placa evaluadora EV80C51FX. Revista Espaola
de Electrnica, pg. 52-55, Abril 1995.
ANDREW TANENBAUM; Structured computer organization. Prentice-Hall, 1990.
DOUGLAS V. HALL; Microprocessors and Interfacing, Programming and Hardware. Mc-Graw
Hill, 1992.
A.C. DOWNTON; Computadores y Microprocesadores. Addison-Wesley, 1993

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

15

1 Estructura bsica de un sistema microprocesador


1.1 Introduccin
Un sistema microprocesador se puede concebir como un sistema procesador secuencial de
instrucciones (figura 1.1), que puede ejecutar un conjunto determinado de instrucciones, lo que hace
que sea un sistema flexible, capaz de controlar una amplia gama de aplicaciones, de abaratar costos y
de reducir el tiempo necesario de diseo.

Algoritmo
o
programa

Salidas

Entradas
Sistema
procesador

Salida del
proceso
Proceso
a
gobernar

Fig. 1.1 Esquema general de un sistema procesador

Un sistema procesador puede ser de programa fijo, como es el caso de las calculadoras de bolsillo no
programables, o de lgica programable, como es el caso de los microprocesadores,
microcontroladores, procesadores digitales de seal (DSP), etc. Los sistemas procesadores tambin
pueden trabajar en paralelo, aumentando la velocidad de ejecucin de los programas.

1.2 Estructura bsica de un sistema microprocesador


La estructura bsica de un sistema microprocesador (figura 1.2), se basa en la arquitectura de Von
Newman que, a pesar de los grandes avances producidos en la tecnologa de los semiconductores, ha
permanecido inalterada desde el momento de su concepcin.
En la estructura bsica de un sistema microprocesador (figura 1.2) se distinguen los siguientes
bloques: la unidad central de proceso CPU, la memoria, el mdulo de entradas/salidas y los buses de
direcciones, de datos y de control.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

16

Memoria

Bus de direcciones

Unidad
central
de
proceso

(M)

(CPU)

Mdulo
de
E/S

Bus de control

Bus de datos
Fig. 1.2 Diagrama de bloques de la estructura bsica de un sistema microprocesador

La CPU est formada principalmente por dos bloques funcionales: la unidad de control y la unidad de
proceso. La unidad de control se encarga de buscar, interpretar y ejecutar las instrucciones
almacenadas en la memoria. La unidad de proceso se encarga de realizar una serie de operaciones
aritmticas, lgicas, de transferencia de datos, etc.
La memoria est destinada a almacenar las instrucciones y los datos del programa y los resultados
obtenidos en su ejecucin. Sobre la memoria opera la CPU, leyendo instrucciones y escribiendo o
leyendo datos. Existen dos tipos bsicos de memoria: la memoria ROM de slo lectura y la memoria
RAM de lectura/escritura. Para acceder a la memoria se deben realizar una seleccin previa de sta,
ms un direccionamiento de la posicin concreta a que se desea acceder para la lectura o la escritura.
El mdulo de entradas/salidas, E/S o I/O, permite la comunicacin del sistema microprocesador con el
exterior, haciendo que este sea un sistema abierto, es decir, accesible por dispositivos externos.
Los buses son el conjunto de lneas fsicas que permiten la transferencia de informacin entre todos
los bloques que constituyen el sistema microprocesador. Los buses se pueden clasificar, en funcin del
tipo de informacin que transportan, en tres tipos: el bus de direcciones, el bus de datos y el bus de
control. El bus de direcciones determina la direccin de memoria a que se va a acceder por la CPU y,
tambin, se utiliza para seleccionar, dentro de un rango de direcciones, distintos tipos de memoria, de
la misma forma que para seleccionar distintos tipos de perifricos a travs del mdulo de E/S.

1.2.1 Unidad central de proceso (CPU)


La CPU est formada por la unidad de control y por la unidad de proceso. La unidad de control
gestiona el funcionamiento completo de la CPU y del resto de los bloques del sistema

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

17

microprocesador, encargndose de buscar, decodificar, ejecutar las instrucciones y de generar las


seales de control adecuadas para ello.
La unidad de proceso est formada por la unidad aritmtico-lgica, ALU, y por los registros del
sistema microprocesador. La ALU se encarga de realizar las operaciones aritmticas y lgicas del
sistema, como pueden ser la suma, resta, multiplicacin, funcin AND lgica, funcin OR lgica, etc.
En los registros se almacenan datos que son el origen o el destino de las operaciones de la ALU, y el
origen o destino de la transferencia de datos entre la CPU (figura 1.2) y la memoria del sistema.
La unidad de control tiene tambin el registro PC (Program Counter), o contador de programa, que es
un registro especial encargado de enviar, por medio del bus de direcciones, la posicin de memoria
que corresponde a la siguiente instruccin que se debe ejecutar. El contador de programa, PC, se
actualiza automticamente cuando se ejecuta una instruccin, de manera que siempre apunta a la
siguiente instruccin que se debe ejecutar en el programa.
El conjunto de bloques formado por la unidad de control y la unidad de proceso constituye la CPU,
que se caracteriza por el repertorio de instrucciones que es capaz de ejecutar.

Bus interno de la CPU


Unidad de proceso (UP)
Registro de
2 operando
Acumulador

Unidad
Registro
de estado

ALU

Control

de
control (UC)

Fig. 1.3 Diagrama de bloques de la CPU

De la figura 1.3 cabe destacar al acumulador como un registro de suma importancia, pues siempre
suele recibir uno de los operandos que intervienen en una operacin aritmtica, o suele ser, en la CPU,
el registro destinatario del resultado obtenido en la operacin.
Otro registro que se debe destacar es el registro de estado, debido a que contiene bits que actan como
indicadores o alarmas de ciertos sucesos acontecidos en las operaciones aritmticas. Uno de los bits
que suele llevar es el bit C de acarreo, que se activa en operaciones de suma y resta; o el bit P de
paridad, que indica la paridad par o impar del nmero contenido en el acumulador.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

18

1.2.2 Mdulo de entradas/salidas (E/S)


El sistema microprocesador necesita de dispositivos de entrada/salida para gobernar y comunicarse
con el entorno de la aplicacin, con la funcin principal de hacer de interfaz entre el sistema y los
perifricos externos asociados a ste.
Bus de direcciones

Bus de control

Mdulo

Enlaces con

de

dispositivos

E/S

perifricos

Bus de datos

Fig. 1.4 Modelo genrico de un mdulo de E/S

Las operaciones de E/S se hacen sobre una amplia gama de perifricos conectados al sistema
microprocesador (impresoras, teclados, monitores, convertidores A/D y D/A, sensores, actuadores,
etc.), y con los que se suelen intercambiar seales de control y de datos. En estas operaciones se debe
coordinar el trfico entre los recursos internos del sistema microprocesador y los perifricos, pues a
menudo la velocidad de transferencia de datos de los perifricos es ms lenta, o necesitan un
determinado sincronismo.
El mdulo de E/S se puede realizar por medio de instrucciones especficas que lo conforman y que
residen en el programa del sistema microprocesador; se puede hacer mediante interrupciones, donde
los perifricos pueden activar lneas de interrupcin de la CPU, que detienen la ejecucin del
programa y pasan a ejecutar un programa especfico pensado para atender al perifrico que ha causado
la interrupcin; se puede hacer tratando las entradas/salidas como posiciones de memoria, donde se
seleccionan los perifricos mediante ciertos rangos de direcciones y se envan y reciben datos que
gestionan al perifrico.
Tambin se ofrecen en el mercado numerosos circuitos integrados de soporte al sistema
microprocesador, que suelen ser configurables mediante software y son capaces de adaptar al sistema
todo tipo de perifricos.

1.2.3 Buses del sistema


Un bus es el medio por el cual se transmite informacin por los distintos mdulos que componen un
sistema microprocesador. Un bus puede ser unidireccional o bidireccional, es decir, puede transmitir
la informacin en una nica direccin, del emisor al receptor, o en ambas direcciones, del emisor al
receptor, y viceversa.
Cuando hay varios dispositivos conectados a un mismo bus, como ocurre, por ejemplo, con el bus de
datos, stos disponen de la caracterstica triestado, que consiste en un estado de alta impedancia en las
lneas del dispositivo conectados al bus, de forma que permite que quede desconectado elctricamente
del bus, y que as la CPU pueda acceder a uno de los distintos dispositivos conectados al mismo.

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

19

Un dispositivo triestado tiene una seal de control que determina si el estado ser de alta impedancia,
o no. El estado en alta impedancia hace que el dispositivo se desconecte elctricamente de la lnea en
cuestin (figuras 1.5 y 1.6).
Buffer

Alta impedancia
0

b
Control

Salidas

Entradas

Control
1

..
..
.
..

b
1

Fig. 1.5 Conexin de dos buffers triestados a una misma


lnea de bus

..
..
.
..

..
..
.
..

Control
Fig. 1.6 Estructura de un buffer triestado

La figura 1.5 muestra la conexin de dos buffers de salida a una misma lnea de un bus. En esta figura
se observa el caso en que, para evitar colisiones entre los estados lgicos de la salida de ambos
buffers, el buffer a permanece en estado de alta impedancia mientras el buffer b est transmitiendo
informacin por la lnea del bus.
El bus de direcciones tiene la tarea de llevar la direccin de la posicin de memoria, o del mdulo de
E/S, a la que la CPU desea acceder. El contenido del bus es unidireccional y siempre lo proporciona la
CPU a travs de la unidad de control. El nmero de lneas del bus de direcciones est relacionado con
la capacidad de direccionamiento de la CPU. Por ejemplo, si se desea direccionar una memoria de
64kbytes, es decir, con 216 posiciones de memoria, sern necesarias 16 lneas de direccin para formar
el bus de direcciones.
El bus de datos debe soportar el traspaso de informacin entre la CPU, la memoria y los mdulos de
E/S. El bus de datos es bidireccional y triestado, pues est compartido por todos los bloques del
sistema microprocesador.
El bus de control est formado por las lneas destinadas a llevar las seales que gobiernan y
sincronizan todo el sistema microprocesador, como son las seales del tipo /RD, /WR, ALE, reset,
lneas de interrupcin, etc. Con estas seales se llevan a cabo distintas operaciones como, por ejemplo,
la seleccin, lectura y escritura en las memorias externas, o en los perifricos externos.
Uno de los problemas que se debe considerar en un bus es la carga que puede soportar, es decir, el
nmero de dispositivos o de puertas lgicas que se pueden conectar a una misma lnea. En general,
cada nuevo dispositivo receptor que se conecta a una lnea supone un incremento en la corriente que

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

20

debe suministrar el emisor cuando est a nivel alto, VOH (1 lgico), y en la corriente que debe absorber
cuando est a nivel bajo, VOL (0 lgico), tal y como se indica en las figuras 1.7 y 1.8, respectivamente.
Las especificaciones de VOH, VOL, IOH, IOL, IIH y IIL, se dan para el peor de los casos y dependen de la
tecnologa o de la familia lgica utilizada. La tabla 1.1 muestra el valor de estos parmetros para
circuitos integrados TTL, CMOS y LSTTL (Low-Power Schottky TTL). En esta tabla las corrientes
negativas indican que la corriente se suministra por el transmisor. Con esta tabla se puede determinar
el nmero mximo de receptores que puede soportar un emisor especfico.
Receptores

Receptores

Emisor

V=VOH

I H1

Emisor

I H4

I H2

I OH

I H3

I L1

V=VOL

I OH [ I H1 I H 2 I H 3 I H 4

I L4

I L2

I OL

I L3

I OL [ I L1 I L 2 I L3 I L 4

Fig. 1.7 Corriente que suministra el emisor cuando su


salida est a nivel alto, VOH (1 lgico)

Fig. 1.8 Corriente que absorbe el emisor cuando su


salida est a nivel bajo, VOL (0 lgico)

Tabla 1.1 Especificaciones de nivel lgico para las familias lgicas TTL, LSTTL y CMOS (esta ltima dada para
la familia GS CD4000 serie B con una tensin de alimentacin de VDD=5V)

Descripcin
VOH
VOL
VIH
VIL
IIH
IIL
IOH
IOL

Valor mnimo de tensin de salida a 1 lgico


Valor mximo de tensin de salida a 0 lgico
Valor mnimo de tensin de entrada
aceptable como un 1 lgico
Valor mximo de tensin de entrada
aceptable como un 0 lgico
Corriente mxima absorbida a 1 lgico
Corriente mxima suministrada a 0 lgico
Corriente mxima de salida a 1 lgico
Corriente mxima absorbida de salida a 0
lgico

TTL
2.4V
0.4V

CMOS
4.95V
0.05V

LSTTL
2.7V
0.5V

2.0V

3.5V

2.0V

0.8V

1.5V

0.8V

40]A
-1.6mA
-400]A

0.3]A
-0.3]A
-0.16mA

20]A
-0.4mA
-400]A

16mA

0.44mA

8mA

Otro problema que es comn a los buses es el de las reflexiones que se pueden producir en las lneas,
debido a que un pulso situado en una lnea de un bus se comporta de manera parecida a una seal de
radio frecuencia en una lnea de transmisin. Este fenmeno afecta sobre todo a las lneas de larga
longitud, haciendo que aparezcan sobreoscilaciones y transitorios repentinos en la recepcin de los
pulsos transmitidos por las lneas, que distorsionan los niveles lgicos transmitidos. Las reflexiones
producidas en las lneas (figura 1.9) son debidas a la falta de adaptacin de impedancias entre el
emisor y el receptor, de forma que el receptor no absorbe toda la energa transmitida y parte de esta
energa se refleja hacia el emisor.

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

Emisin

21

Recepcin
Pulso corto

Pulso largo

Fig. 1.9 Reflexiones en el receptor debidas a reflexiones producidas en la lnea

Para que no se produzcan reflexiones la impedancia de entrada de los receptores debe ser idntica a la
impedancia que presenta la lnea conectada a stos. La impedancia de una lnea trazada en un circuito
impreso suele tener un valor comprendido entre los 100 y 200, por lo que la adaptacin se puede
conseguir conectando una resistencia de adaptacin de 180 220 entre la entrada del receptor y
masa, lo que se denomina terminacin pasiva.
Terminacin pasiva
220

Emisor

Receptor

5V
Terminacin activa
Emisor

470
220

Receptor

Fig. 1.10 Terminaciones pasiva y activa de una lnea de un bus para eliminar o reducir las reflexiones en lneas
de larga longitud

La terminacin pasiva, no obstante, presenta el problema de que la resistencia de adaptacin es una


carga ms para el transmisor, por lo que reduce el nmero de receptores que se le pueden conectar.
Esta situacin se puede mejorar utilizando un divisor de tensin que sita la lnea a la mitad del
margen de tensin para la familia TTL, y que, adems, adapta el receptor a la impedancia
caracterstica de la lnea (figura 1.10). Esta solucin se denomina terminacin activa. Con la
terminacin activa se asegura que, al menos, la amplitud del pulso reflejado ser siempre menor que el
valor del pulso transmitido, eliminando las reflexiones de forma paulatina.

1.3 Estructura general de un sistema basado en microprocesador


La estructura de los diferentes sistemas basados en microprocesadores suele presentar bastantes
caractersticas comunes, como son los dispositivos de entrada/salida, las memorias para albergar

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

22

programas y datos, los dispositivos de comunicacin asncrona con otros sistemas, los dispositivos de
entrada y visualizacin de informacin, como mediante teclados y visualizadores, etc. La figura 1.11
muestra la estructura general de un sistema basado en microprocesador, considerando una buena parte
de los dispositivos necesarios para desarrollar satisfactoriamente cualquier aplicacin, sin llegar a
especificar el tipo de microprocesador, los dispositivos y los perifricos empleados.

RAM
EPROM
EEPROM

CPU

Timers

Generadores
de reloj y
sincronismo

Puerto
serie

Buses de direcciones, control y datos

Puertos
de E/S

E/S
analgicas

Acceso
directo a
memoria
DMA

RS-232C
RS-422
RS-485

Otros
dispositivos

Memorias

Controlador
de teclado y
visualizacin

Fig. 1.11 Diagrama general de bloques de un sistema basado en microprocesador

En la figura 1.11 se pueden distinguir puertos de E/S, memorias, temporizadores, puerto serie de
comunicacin, etc. Cada uno de estos bloques suele estar implementado por un circuito integrado, CI,
que proporcionan los fabricantes como soporte de sus microprocesadores o microcontroladores, y que
facilitan la tarea del diseo y mejoran las prestaciones del sistema.
Las memorias son uno de los elementos de los que hay mayor variedad y oferta en el mercado, donde
se pueden encontrar memorias SRAM, DRAM, PROM, EPROM, EEPROM, FLASH, NOVRAM,
etc. Es imprescindible en todo sistema que exista una memoria no voltil, como la PROM, la FLASH
y la EPROM, para albergar el programa del sistema, como una memoria voltil, como la SRAM o
DRAM, para albergar los datos generados y utilizados por el programa.
En los sistemas basados en microcontrolador las memorias ms ampliamente utilizadas son del tipo
EPROM y SRAM, aunque tambin se usan otro tipo de memorias como la OTPROM (One time
programmable), la NOVRAM (Non-volatile RAM) y memorias del tipo serie que envan y reciben los
datos va serie con la CPU.
Por otra parte, existen circuitos integrados que proporcionan 2, 3 4 puertos de E/S, programables por
el usuario y de propsito general. Estos circuitos integrados se utilizan en los microprocesadores/
microcontroladores, para disponer de E/S o para ampliar el nmero de E/S. A travs de los puertos de
E/S se puede hacer el control de los perifricos, la transmisin y recepcin de datos entre la CPU y los
perifricos, la activacin de actuadores, la lectura del estado de sensores, teclas, finales de carrera, etc.
Un ejemplo de puerto de E/S es el 8255 de Intel Corporation que soporta hasta tres puertos de E/S de

Los autores, 2001; Edicions UPC, 2001.

1 Estructura bsica de un sistema microprocesador

23

8 lneas cada uno, y el PI/T MC68230 de Motorola, que es una interfaz paralela, bidireccional o
unidireccional, de 8 16 bits, con un temporizador programable de 24 bits.
En aplicaciones que requieran de la generacin y del sincronismo de seales, o de la temporizacin de
determinados sucesos, se necesitan circuitos integrados Timers, que son temporizadores/contadores
capaces de contabilizar y temporizar seales de acuerdo con una seal de reloj de entrada. Adems,
tambin hay circuitos integrados especficos para la generacin de varias seales de reloj y el
sincronismo de sistemas basados en microprocesador. En este sentido, por ejemplo, se pueden
encontrar el 8253 y 8254 de Intel, o el MFP MC68901 de Motorola. Este ltimo es un circuito
multifuncin, con cuatro temporizadores programables, un controlador de hasta 16 fuentes de
interrupcin, un puerto de E/S programable y un canal USART de comunicacin serie asncrona.
Otro elemento importante es el puerto serie que proporciona el soporte al sistema microprocesador
para poder comunicarse, va serie, con otros sistemas, empleando estndares del tipo RS-232C, RS422, etc. En este sentido existen en el mercado circuitos integrados que soportan la comunicacin
serie asncrona, haciendo de puerto serie para el sistema microprocesador. Como CI integrado de este
tipo, por ejemplo, se puede encontrar al 8250 de Intel que soporta un puerto serie para la
comunicacin con otros sistemas, o el SIO MC68564 de Motorola que soporta la comunicacin serie
sncrona y asncrona con otros sistemas.
La variedad de circuitos integrados especficos que se ofrecen para el soporte de los sistemas basados
en microprocesador es amplia. Prcticamente, se encuentran disponibles en el mercado circuitos
integrados de todo tipo, como controladores del acceso directo a memoria (DMA), circuitos
integrados capaces de leer un teclado matricial y de gestionar, al mismo tiempo, un visualizador
compuesto por un nmero determinado de dgitos, circuitos integrados para el arbitraje y la gestin de
los buses del sistema microprocesador, circuitos integrados para la gestin de interrupciones, circuitos
integrados para el control y acceso de una unidad lectora de disquetes, circuitos integrados para
detectar las cadas de tensin de la red elctrica, etc. El nmero de circuitos integrados de soporte a un
sistema basado en microcontrolador es considerable y est sometido a un proceso continuo de mejora
y renovacin, por lo que se debe procurar tener un buen conocimiento de estos dispositivos y estar al
tanto de las nuevas propuestas que surgen de forma peridica en el mercado.

1.4 Estructura general de un sistema basado en microcontrolador


En un principio se desarrollaron los sistemas basados en microprocesador y se aplicaron al control de
multitud de procesos industriales, a la computacin y procesado de datos y al procesado de seales. A
medida que la tecnologa de silicio fue evolucionando, permitiendo la integracin de un mayor
nmero de transistores en la misma rea de silicio, la complejidad de los microprocesadores aument
tambin y se produjo una especializacin segn el campo de aplicacin. En este momento, los
microprocesadores se especializan bsicamente en el entorno de la computacin y del procesado de
datos, aunque tambin se aplican en determinados procesos industriales donde se necesita de una
computacin intensa de datos. Por otra parte, aparecen los microcontroladores, especialmente
concebidos para el mbito de control de procesos industriales y para la gestin y el control de
mquinas diversas. Por ltimo, tambin surgen los procesadores digitales de seal (DSP),
especialmente pensados para el procesado de seal, como, por el ejemplo, el procesado de la seal de

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

24

voz en telfonos mviles y el filtrado de seales de televisin; aunque tambin se emplean en el


control de motores y en tareas de control, en general, donde las seales son de rpida variacin.

CI Microcontrolador

RAM
EPROM
EEPROM

CPU

Timers

Generadores
de reloj y
sincronismo

Puerto
serie

Buses de direcciones, control y datos

Puertos
de E/S

E/S
analgicas

Acceso
directo a
memoria
DMA

RS-232C
RS-422
RS-485

Otros
dispositivos

Memorias

Controlador
de teclado y
visualizacin

Fig. 1.12 Concepcin de un microcontrolador basada en la inclusin de la CPU y otros elementos de un sistema
microprocesador en un nico circuito integrado

En cuanto al concepto de microcontrolador, ste se concibe como la inclusin de algunos de los


dispositivos que aparecen en la figura 1.11 dentro del mismo circuito integrado. En consecuencia,
segn la figura 1.12, un microcontrolador est formado por una CPU, ms los elementos
imprescindibles para interactuar con el exterior y para solucionar y simplificar una buena parte de las
aplicaciones que hasta el momento se venan realizando con los sistemas basados en microprocesador.
En la actualidad los microcontroladores suelen incorporar, adems de la CPU, puertos de E/S,
memoria ROM, EPROM, OTPROM o FLASH para albergar el programa realizado, memoria RAM,
registros de propsito general que facilitan la tarea del programador, temporizadores y contadores para
contabilizar y temporizar eventos, puerto serie con el que implementar estndares del tipo RS-232C,
etc, convertidor analgico/digital para la lectura de seales analgicas, salidas con modulacin de
pulsos, etc.
En este momento, en el mercado existen multitud de fabricantes de microcontroladores que, adems,
ofrecen una amplia gama de versiones, capaces de ajustarse a distintos tipos de aplicaciones. En
consecuencia, el diseador debe tener muy claros los criterios de eleccin, en funcin de las
prestaciones y los costos de las herramientas de desarrollo que se deben adquirir, como son los
emuladores, las tarjetas de evaluacin y los programas de software para el desarrollo de la aplicacin.

Los autores, 2001; Edicions UPC, 2001.

2 Las familias de microcontroladores de Intel y de otros fabricantes

25

2 Las familias de microcontroladores de Intel y de otros fabricantes


2.1 La familia MCS-48
La MCS-48 fue la primera familia de microcontroladores de 8 bits de la compaa Intel Corporation.
Esta familia fue diseada para emplearse en pequeas aplicaciones y poda soportar hasta un mximo
de 4k bytes de cdigo de programa y 256 bytes para datos. La MCS-48 ya no se fabrica en la
actualidad. Las principales caractersticas que tena esta familia se resumen en la tabla 2.1.
Tabla 2.1 Principales caractersticas de la familia MCS-48

Versin bsica
Versin con ROM
Versin con EPROM
Memoria RAM interna
Memoria EPROM/ROM
Temporizadores
Fuentes de interrupcin
Lneas de E/S

Microcontroladores
8035AHL
8039AHL
8048AH
8049AH
8748H
8749H
Caractersticas
64
128
1k bytes
2k bytes
1
1
2
2
27
27

8049AHL
8050AHL
256
4k bytes
1
2
27

2.2 La familia MCS-51


La MCS-51 es en la actualidad la familia bsica de microcontroladores de 8 bits de Intel. Esta familia
es adecuada para soportar aplicaciones sencillas y de mediana complejidad y se ha convertido en uno
de los estndares del mercado, puesto que se ha utilizado en multitud de aplicaciones y, adems, otros
fabricantes, como Siemems Components, Atmel, Philips Semiconductors, OKI Semiconductor, etc.,
proporcionan versiones especializadas de sta. La tabla 2.2 muestra los principales componentes de
esta familia, donde se han excluido las versiones con memoria ROM interna, puesto que sta debe ser
implementada por el propio fabricante mediante mscara en la fase de produccin, lo que supone que
tan slo sea rentable en grandes series de produccin; est, pues, lejos del alcance de la economa de
la mayor parte de los usuarios. Las principales caractersticas de la MCS-51 se listan a continuacin:
- 32 lneas de entrada/salida (E/S), distribuidas en 4 puertos de 8 bits cada uno.
- Memoria RAM interna de hasta 256 bytes.
- 4 bancos de 8 registros de un byte cada uno.
- rea de registros de funcin especial (SFR).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

26

- Espacio de memoria para programas de hasta 64k.


- Espacio de memoria para datos de hasta 64k.
- Hasta 3 temporizadores de 16 bits cada uno.
- Comunicacin serie asncrona (UART full-duplex).
- De 5 a 6 fuentes de interrupcin con 2 niveles de prioridad.
- 2 modos especiales de bajo consumo (Power Down y Idle).
- Juego de instrucciones con capacidad de procesamiento booleano.
Tabla 2.2 Microcontroladores de la MCS-51
Versin
8031AH
8751BH
8032AH
8752BH
80C31BH
87C51
87C52
87C54
87C58
87L52
87L54
87L58
80C51FA
87C51FA
87C51FB
87C51FC
87L51FA
87L51FB
87L51FC
80C51GB
87C51GB
80C152JA
80C152JB
80C51SL-BG
87C51SLAH

OTROM/
EPROM

bytes
4K EPROM

8K EPROM

4K EPROM
8K EPROM
16K EPROM
32K EPROM
8K OTPROM
16K OTPROM
32K OTPROM
8K EPROM
16K EPROM
32K EPROM
8K OTPROM
16K OTPROM
32K OTPROM
8K EPROM
16K EPROM

Mem. Lneas N de Lneas de


N
Modos
Veloc.
A/D
RAM de E/S
canales
bajo
reloj
Timers interrup. PCA
Bytes
consumo
Mhz
128
32
2
5
0
0
12
128
32
2
5
0
0
12
256
32
3
6
0
0
12
256
32
3
6
0
0
12
128
32
2
5
0
0
12,16
128
32
2
5
0
0
12,16,20,24
12,16,20,24
256
32
3
6
0
0
12,16,20,24
256
32
3
6
0
0
12,16,20,24
256
32
3
6
0
0
12,16,20
256
32
3
6
0
0
12,16,20
256
32
3
6
0
0
12,16,20
256
32
3
6
0
0
256
32
3
7
5
0
12,16
12,16,20,24
256
32
3
7
5
0
256
32
3
7
5
0
12,16,20,24
12,16,20,24
256
32
3
7
5
0
12,16,20
256
32
3
7
5
0
12,16,20
256
32
3
7
5
0
12,16,20
256
32
3
7
5
0
256
48
3
15
10
8
12,16
256
48
3
15
10
8
12,16
256
40
2
11
0
0
16.5
256
56
2
11
0
0
16.5
16
256
24
2
10
0
4
16
256
24
2
10
0
4

2.3 La familia MCS-151


La familia MCS-151 de microcontroladores de 8 bits es totalmente compatible, a nivel de juego de
instrucciones y de encapsulado, con la MCS-51. Esta familia, al igual que la familia posterior MCS251, es una mejora y actualizacin en prestaciones de la familia MCS-51. El nmero de componentes
de la MCS-151 es reducido y se muestra en la tabla 2.3, y sus principales caractersticas se resumen a
continuacin:
- Procesamiento paralelo de instrucciones Pipeline.
- Juego de instrucciones y encapsulado compatibles con la MCS-51.

Los autores, 2001; Edicions UPC, 2001.

2 Las familias de microcontroladores de Intel y de otros fabricantes

27

- Espacio de memoria para programas de hasta 64k.


- Espacio de memoria para datos de hasta 64k.
- Memoria interna ROM/OTPROM de 8 16k bytes.
- Memoria RAM interna de hasta 256 bytes.
- Hasta 3 temporizadores de 16 bits cada uno.
- 32 lneas de entrada/salida (E/S).
- 7 fuentes de interrupcin con 4 niveles de prioridad.
- Batera o array de contadores programable (PCA).
- Salidas con modulacin de anchura de pulsos (PWM).
- Temporizador de watchdog.
- Comunicacin serie asncrona (UART full-duplex).
- Terminal WAIT de estados de espera para memorias.
- Modos no paginado y paginado de acceso a la memoria externa.
- Modos especiales de bajo consumo (Power Down y Idle).
Tabla 2.3 Microcontroladores de la familia MCS-151

Versin
80C151SB
83C151SA
83C151SB
87C151SA
87C151SB

ROM/OTPROM
8K bytes ROM
16K bytes ROM
8K bytes OTPROM
16K bytes OTPROM

RAM interna
256 bytes
256 bytes
256 bytes
256 bytes
256 bytes

2.4 La familia MCS-251


La familia de microcontroladores de 8 bits MCS-251 es el resultado de la mejora y actualizacin de
las familias MCS-51 y MCS-151. Esta familia presenta un aumento general de prestaciones con
respecto a las anteriores, en cuanto al nmero de instrucciones, velocidad y flexibilidad; mantiene, al
mismo tiempo, la compatibilidad tanto a nivel de hardware como de software, lo que posibilita que
pueda sustituir, con un mnimo coste y de manera directa, a la MCS-51, y actualizar as las
aplicaciones que estn soportadas por esta familia.
El primer miembro de la familia MCS-251 es el 8XC251Sx que se comercializa en varias versiones,
en funcin de la cantidad de memoria interna disponible. En la tabla 2.4 se muestran los
microcontroladores que forman parte de esta familia, y a continuacin se listan sus principales
caractersticas:
- Procesamiento paralelo de instrucciones Pipeline.
- 24 lneas de direccin internas que permiten un espacio de hasta 16 Mbytes de memoria.
- Juego de instrucciones ampliado con respecto a la MCS-51, con instrucciones aritmticas y
lgicas de 16 y de 32 bits.
- Encapsulado y juego de instrucciones, en modo binario, compatibles con la MCS-51.
- Acceso a los registros de propsito general a nivel de byte, de Word (2 bytes) y de Double
Word (4 bytes).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

28

- Puntero de la pila (registro Stack Pointer) de 16 bits, que permite acceder a una memoria de
pila de hasta 64 kbytes.
- Tiempo mnimo de ejecucin de una instruccin de 2 periodos de reloj.
- Memoria interna ROM/OTPROM de 8 16k bytes.
- Memoria RAM interna de hasta 1024 bytes.
- Hasta 3 temporizadores de 16 bits cada uno.
- 32 lneas de entrada/salida (E/S).
- 7 fuentes de interrupcin con 4 niveles de prioridad.
- Batera o array de contadores programable (PCA).
- Salidas con modulacin de anchura de pulsos (PWM).
- Temporizador de watchdog.
- Comunicacin serie asncrona (UART full-duplex).
- Terminal WAIT de estados de espera para memorias.
- Modos no paginado y paginado de acceso a la memoria externa.
- Modos especiales de bajo consumo (Power Down y Idle).
Tabla 2.4 Microcontroladores de la familia MCS-251

OTPROM/
EPROM
(kbytes)
0
0
0
0
0
0
8
16
8
16

Versin
80C251SB
80C251SQ
83C251SA
83C251SB
83C251SP
83C251SQ
87C251SA
87C251SB
87C251SP
87C251SQ

Memoria interna
ROM
(kbytes)

RAM
(bytes)

0
0
8
16
8
16
0
0
0
0

1024
512
1024
1024
512
512
1024
1024
512
512

Estas caractersticas proporcionan importantes mejoras con respecto a la familia MCS-51, como son el
incremento de la velocidad de ejecucin para una misma frecuencia de reloj, el incremento de la
eficiencia en los programas escritos en lenguaje C, debido al acceso en los tipos Word y Double Word,
y la capacidad de procesar programas de mayor tamao.

2.5 Microcontroladores de otros fabricantes


2.5.1 Microcontroladores de Philips
Philips Semiconductors tiene una gran variedad de microcontroladores de 8 bits basados en la
arquitectura de la MCS-51. La oferta que tiene es muy extensa, por lo que es fcil hallar una versin
que se ajuste a las necesidades de un proyecto. Este fabricante tiene microcontroladores con memoria
EPROM, OTPROM o FLASH internas, versiones que soportan el bus serie I2C, temporizador de

Los autores, 2001; Edicions UPC, 2001.

2 Las familias de microcontroladores de Intel y de otros fabricantes

29

watchdog, array de contadores programable PCA, convertidores A/D de 8 y 10 bits, funcionamiento


en baja tensin, etc. La tabla 2.5 muestra los principales componentes de esta familia.

18 12

18
18
18
32
32
32

12
12
12
15
7
8

3
3
3
2
2
2

8
8
8
10
-

4
4
4
6
-

10

4k
128
2
4k
128
2
4k
128
2
16k
16k
512
3
16-64k 512-1024 4
16-64k 1k-2k
4

Timers
2

4k

128



-

16k

16k

512

48 15

80/83C557E4
89C557E4
80C557E6
83C557E6
8xC557E8

32k

32k

1024

48

10

48k

48k

1536

48

10

64k

64k

2048

48

10

8xC524
8xC528
80/83/87C552
80/83/87C652
8xC750
8xC748
8xC751
8xC575
8xC576
8xC749
8xC752
8xC591
8xC592
8xCE598

16k
32k
8k
8k
1k
2k
2k
8k
8k
2k
2k
16k
16k
32k

16k
32k
8-16k
8-16k
1k
2k
2k
2k
2k
16k
16k
32k

512
512
512
256
64
64
256
256
256
64
64
512
512
512

3
3
3
2
1
2
1
3
3
2
1
3
3
3

32 8
32 8
48 15
32 7
19 2
19 2
19 2
32 2
32 2
21 2
21 2
32 15
48 6
48 6

10
10
8
8
10
10
10

8
6
5
5
6
8
8


-

2
2
2
2

2
2
2




-

Max. freq.
(MHz)

A/D (bits)

A/D (canales)
Proteccin
programa



















Carctersticas
especiales

Int. externas

18 12





I2C

Interrupciones

UART

Lneas E/S (I/O)

PCA

Watchdog

RAM (bytes)

OTP o FLASH

2
2
2
2
2
2
2

PWM

87LPC767
87LPC768
87LPC769
8xC591
89C51Rx2
89C66x
8xC554

6
6
6
6
7
7
7

80C31/80C32
128-256 3
8xC51/8xC52
8k
8k
128-256 3
8xC54/8xC58 16-32k 16-32k
256
3
89C5x
4-32k 128-256 3
8xC51Fx
8-32k 8-32k
256
4
8xC51Rx+ 16-64k 16-64k 512-1024 4
89C51Rx+
32-64k 512-1024 4
87LPC762
2k
128
2
87LPC764

32
32
32
32
32
32
32

ROM

Versin

Tabla 2.5 Microcontroladores de Philips Semiconductors

2.7-5.5V,Low-power 33
2.7-5.5V,Low-power 33
2.7-5.5V,Low-power 33
MTP Flash
33
2.7-5.5V
33
2.7-5.5V
33
Flash-12V ISP
33
BOD,PUR,Keypad
20
interrupt.Low-power
BOD,PUR,Keypad
20
interrupt.Low-power
51LPC con A/D
20
A/D y PWM
20
A/D y D/A
20
CAN 2.0B/PeliCAN 16
Flash,5V,ISP/IAP
33
Flash,5V,ISP/IAP 20/33
2.7-5.5V,Capture/
16
compare
Low EMI, 2 PWM
16
Capture/compare
Low EMI, 2 PWM
16
Capture/compare
Low EMI, 2 PWM
16
Capture/compare
24
16
24
24
16
16
16
16
16
16
16
CAN 2.0B/PeliCAN 16
CAN bus controller
16
CAN bus controller
16

Las versiones que tienen bus serie I2C se pueden conectar por medio de este bus a distintos perifricos
y microcontroladores. El bus I2C utiliza tan slo dos terminales del microcontrolador, uno como lnea
de datos y otro como lnea de reloj, y es capaz de operar en un sistema con multi-msters y de soportar
multitud de perifricos en el mismo bus.
Las versiones con un bus del tipo CAN (Control Area Network) se pueden utilizar en aplicaciones

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

30

para la industria del automvil y en sistemas de manufactura automatizada, pues inicialmente este bus
fue concebido para reducir el nmero elevado de cables en un automvil. El bus CAN es un bus serie
de alta velocidad formado por dos hilos, que puede llegar a distancias de hasta 40 metros y con el que
se pueden realizar estructuras de bus con hasta 30 nodos de comunicacin.

2.5.2 Microcontroladores de Siemens


Siemens es un fabricante que tiene una amplia gama de productos en multitud de sectores distintos. En
el ramo de semiconductores tiene la familia C500 de microcontroladores, compatibles tanto a nivel de
hardware como de software con la MCS-51. La tabla 2.6 muestra los principales componentes de esta
familia. Los microcontroladores de Siemens pueden funcionar a altas frecuencias de reloj, pueden
tener memoria ROM o OTPROM, puerto serie full-duplex, modos especiales de bajo consumo, varios
registros de punteros de datos DPTR, etc.

USART
USART
USART
USART
USART+SSC
USART+SSC
USART+SSC
USART
USART
USART
USART
USART
USART
USART
USART+SSC
USART+SSC
USART+UART
USART+UART
USART
USART
USART
USART
USART+UART
USART+UART
USART+UART
USART+UART

1
1
1
1
1
1
1
8
8
8
8
8
1
1
8
8
8
8
1
1
1
1
8
8
8
8

Watchdog

6
6
4
4
4
4
4
4
4
4
4
21
29
4
4
4
4
21
21
21
21

Max. freq. reloj


(MHz)

6
6
12
12
7
7
7
12
12
12
12
12
12
12
15
15
17
19
12
12
12
12
12
14
17
17

Puerto serie

3
3
4
4
3
3
3
3
3
3
3
3
3
3
3
3
4
5
3
3
3
3
3
4
4
4

MDU

8
8
8
8
8
8
8
8
8
8
8
12
15
8
8
8
8
12
12
12
12

PWM (canales)

10
10
10
8
8
10
10
8
10
10
10
10
10
8
8
10
10
8
8
10
10

Punteros de datos
DPTR (16 bits)

Timers (16 bits)

N Interrupciones

32
32
32
32
32
32
32
46
34
34
34
34
56
56
57
57
68
64
56
56
56
56
68
68
68
68

A/D (bits)

256
256
512
512
256
512
512
512
512
512
1280
1280
256
1280
2304
2304
2304
3328
256
256
1280
1280
256
256
2304
2304

A/D (Canales)

RAM (bytes)

-/8k
8k OTP
-/16k
16k OTP
8k
-/12k/16k
16k OTP
32k OTP
-/16k
-/16k
32k OTP
32k OTP
-/8k
-/32k
-/64k
64k OTP
-/32k
8k
32k
8k
32k

Lneas E/S

ROM

C501G-L/-1R
C501G-E
C504-L/-2R
C504-2E
C513-1R
C513A-L/-R/-2R
C513A-2E
C505L-4E
C505-L/-2R
C505C-L/-2R
C505A-4E
C505CA-4E
C515-L/-1R
C515A-L/-4R
C515C-L/-8R
C515C-8E
C517A-L/4R
C509-L
SAB 80C515
SAB 80C535
SAB 80C515A
SAB 83C515A-5
SAB 80C517
SAB 80C537
SAB 80C517A
SAB 83C517A-5

ROM Protegida

Versin

Tabla 2.6 Microcontroladores de Siemens

40
40
40
40
12
12
16
20
20
20
20
20
24
24
10
10
24
16
20
20
18
18
16
16
18
18

Las versiones SAB80C517, SAB80C517A, SAB80C517A-5, SAB80C537, C517A-L/4R y C509-L


tienen una unidad de multiplicacin y divisin por hardware, MDU, que es capaz de realizar
divisiones de datos de 32 bits y multiplicaciones de datos 16 bits. Las versiones C505-L, C505-2R,
C505CA-4E, C515C-L, C515-8R y C515C-8E soportan el bus serie FCAN 2.0B.

Los autores, 2001; Edicions UPC, 2001.

2 Las familias de microcontroladores de Intel y de otros fabricantes

31

2.5.3 Microcontroladores de Atmel


El fabricante Atmel Corporation tiene una familia de microcontroladores de 8 bits basados en la
arquitectura de la MCS-51. Una de las caractersticas ms relevantes de los microcontroladores de este
fabricante es que todos ellos tienen memoria interna flash. Estos microcontroladores tienen un precio
ms reducido que los microcontroladores con memoria interna EPROM. La tabla 2.7 muestra los
microcontroladores con memoria flash de Atmel y las distintas caractersticas de cada uno. Las
caractersticas generales de estos microcontroladores son:
- Memoria interna flash para programas.
- Memoria RAM interna.
- Patillas bidireccionales de I/O accesibles bit a bit.
- Varios temporizadores/ contadores de 16 bits.
- UART Full-Duplex.
- Mltiples fuentes de interrupcin.
- La versin AT89S tiene 2K de memoria EEPROM interna, una interfaz SPI
de bus serie y un temporizador de Watchdog.
Tabla 2.7 Caractersticas de los microcontroladores flash de Atmel
Caractersticas
Memoria flash (bytes)
Memoria RAM (bytes)
Mem. EEPROM interna
Interfaz serie SPI
Proframacin In-system
N de Timers
N de bits de seguridad
(Lock bits)
Watchdog timer
UART serie
Salida de Power Down
mediante interrupcin
Comparador analgico
Terminales de I/O
Fuentes de interrupcin
Bus externo de datos/
direcciones
Modos Power Down y
Idle
Alimentacin Vcc
Frecuencia Clock
Patillas del encapsulado
I/O Current Sink
(por patilla)
Corriente total mxima de
I/O (mA)

AT89C1051 AT89C2051 AT89C51 AT89LV51 AT89C52 AT89LV52 AT89C55 AT89S8252


1K
64
0
-

4K
128
0
SI
2

4K
256
0
SI
3

8K
256
0
SI
3

8K
256
0
SI
3

20K
256
0
SI
4

8K
256
2K

2K
128
0
SI
2

SI
15
3

SI
15
6

32
6

32
6

32
8

32
8

32
8

32
9

2.7-6.0
0-24
20

2.7-6.0
0-24
20

4.0-6.0
0-24
40/44

2.7-6.0
0-24
40/44

4.0-6.0
0-24
40/44

2.7-6.0
0-24
40/44

2.7-6.0
0-33
40/44

2.7-6.0
0-33
40/44

20mA

20mA

10mA

10mA

10mA

10mA

10mA

10mA

80mA

80mA

71mA

71mA

71mA

71mA

71mA

71mA

2.5.4 Microcontroladores de Dallas Semiconductor


Dallas Semiconductor tiene un par de familias de microcontroladores compatibles con la MCS-51.
Una de las familias de este fabricante se centra en la seguridad anticopia del programa, con
encriptacin en tiempo real, y en utilizar memoria del tipo NOVRAM para almacenar el programa, en

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

32

lugar de ROM o EPROM. La segunda familia que oferta es de alta velocidad, capaz de ejecutar las
instrucciones hasta tres veces ms rpidamente que la familia MCS-51.
La primera familia est formada por los microcontroladores DS5000 y DS5002T, cuyas principales
caractersticas son:
- 100% compatible en hardware y software con la MCS-51.
- NOVRAM de 8k 32kbytes.
- Zona particionada para cdigo y para datos.
- Cuatro puertos de E/S.
- Memoria RAM de 128 bytes.
- Dos temporizadores/contadores de 16 bits.
- Una puerto UART serie.
- Watchdog Timer.
- Seguridad anticopia para el cdigo.
- Generador aleatorio de nmero.
- Interrupcin por fallo de tensin.
La familia de alta velocidad est formada por los microcontroladores DS80C310, DS80C320,
DS80C323, DSC390, DS83C520, DS83C530, DS87C520, DS87C530 y DS87C550. Las
caractersticas comunes a estos microcontroladores son:
- 100% compatible en hardware y software con la MCS-51.
- Dos puertos serie UART de alta velocidad.
- Tres temporizadores de 16 bits.
- Deteccin de fallo de tensin.
- Dos punteros de datos, DPTR, para acceder a memoria externa.
- Temporizador de watchdog.
- Memoria RAM interna de 256 bytes.
La versin DS80C320 tiene 13 fuentes de interrupcin, de las que 6 corresponden a fuentes externas.
Las versiones DS87C520 y DS87C530 tienen 13 y 14 fuentes de interrupcin, respectivamente,
1kbyte de memoria SRAM interna accesible con la instruccin MOVX y 16kbytes de memoria
EPROM. La versin DS87C550 tiene estas mismas caractersticas y, adems, incluye un convertidor
A/D de 10 bits y con 8 canales multiplexados, 8kbytes de memoria EPROM y 4 canales de PWM con
una precisin de 8 bits.
La versin DS80C310 es un modelo reducido de la DS80C320, pensada para las aplicaciones donde el
coste es un factor importante. La versin DS80C323 es un modelo de bajo consumo y baja tensin de
la DS80C320; tiene una frecuencia mxima de reloj de 18MHz, consume tan slo 10mA y puede
alimentarse entre 2.7V y 5.5V.
La versin DSC390 incorpora un bus serie CAN dual de alta velocidad, formado por dos interfaces
CAN 2.0B. Esta versin tambin incorpora 4kbytes de memoria SRAM interna. Por ltimo, las
versiones DS83C520 y la DS83C530 tienen 16kbytes de memoria ROM interna, al ser ideadas para
grandes series de fabricacin.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

33

3 Arquitectura de las familias MCS-51 y MCS-251


3.1 Arquitectura interna de la MCS-51
La figura 3.1 muestra el diagrama general de bloques para los microcontroladores de la familia MCS51, cuyas caractersticas generales ya se han descrito en el captulo 2. De esta arquitectura cabe
resaltar el rea de registros especiales y el direccionamiento de la memoria interna.
P0.0 ... P0.7

VCC

Registro de
direcc. RAM

Puerto 0

VSS

RAM

Latch

Latch

interna

Puerto 2

Puerto 0

Stack
Pointer

PSW

RESET

TCON TMOD TH0 TL0


SCON T2CON* TH1 TL1
SBUF RCAP2L* TH2* TL2*
PCON RCAP2H* IE
IP
Interrupciones. Puerto serie.
Temporizadores. PCA

Registro de
direcciones
programa

BUFFER
Incrementador

PC
PC

Registro de
instrucciones

Control
y
secuenc.

SP

TMP2

ALU

PSEN

Memoria
EPROM/
ROM

ACC
TMP1

EA

Puerto 2

Memoria

ALE

P2.0 ... P2.7

DPTR

Latch

Latch

Puerto 1

Puerto 3

OSC
Puerto 1

XTAL2

XTAL1

Puerto 3
* Slo en las versiones con 3

P1.0 ... P1.7

P3.0 ... P3.7

Fig. 3.1 Arquitectura interna de la familia MCS-51

Los autores, 2001; Edicions UPC, 2001.

temporizadores

Microcontroladores MCS-51 y MCS-251

34

El ncleo del microcontrolador est formado por la unidad de control, la unidad aritmtico-lgica
(ALU), el registro de estado (PSW), el acumulador y el contador de programa (PC). Este ltimo es un
registro de 16 bits que se utiliza como puntero hacia la memoria de programas y su valor apunta
siempre a la direccin de memoria que contiene la instruccin a ejecutar.
Cabe destacar, en esta figura, la importancia del acumulador, puesto que interviene en la mayor parte
de las instrucciones, sobre todo en las instrucciones aritmticas.
La familia MCS-51 tiene cuatro puertos: P0, P1, P2 y P3. Los puertos son de 8 bits, y cada bit puede
ser configurado de forma individual como entrada o como salida (E/S), siendo transparente para el
programador. La MCS-51 tiene versiones con memoria interna de programas EPROM, OTPROM o
ROM; no obstante, en caso de necesitar memoria externa, los puertos P0 y P2 soportan un bus de
direcciones de 16 bits y un bus de datos de 8 bits para acceder a sta. En este caso, el byte bajo del bus
de direcciones y el bus de datos comparten el mismo puerto, P0, mediante una multiplexacin
temporal entre ambos buses. En cuanto al byte alto del bus de direcciones, ste queda ntegramente
soportado por el puerto P2. La multiplexacin temporal realizada en el puerto P0 es una manera hbil
de optimizar el nmero de terminales del microcontrolador, minimizando el tamao de su
encapsulado.
En la figura 3.1 aparecen, adems, un bloque que representa la memoria RAM interna, con la cual
opera el puntero de la pila (SP, Stack Pointer), el rea de registros especiales (SFR) y el puerto P3,
que soporta las siguientes funciones alternativas: puerto de comunicacin serie asncrona,
interrupciones externas, el control de lectura y escritura de la memoria externa de datos y las entradas
de los temporizadores/contadores de la familia. El puerto P1 en las versiones 8X51C51FX soporta las
entradas y salidas del array de contadores programable PCA.
3.1.1 Relacin de terminales

7
8
9
10
11
12
13
14
15

8
7
5
1
B
H

35
34
33
32
31
30
29
28
27
26

16

25

17

24

18

23

19

22

20

21

P0.3/AD3

P0.2/AD2

44 43 42 41 40
39

P1.6
P1.7
RESET
RXD/P3.0

38

37

10

36

11

35

NC
TXD/P3.1

12
13

33

(/INT0)/P3.2

14

32

(/INT1)/P3.3
T0/P3.4
T1/P3.5

15

31

16

30

8751BH

34

17
29
18 19 20 21 22 23 24 25 26 27 28

A11/P2.3

P1.5

Fig. 3.2 Microcontrolador 87C51BH en encapsulado DIP o PLCC

Los autores, 2001; Edicions UPC, 2001.

A12/P2.4

36

P0.0/AD0
P0.1/AD1

37

NC
VCC

38

NC

VCC
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
(/EA)/(VPP)
ALE/(/PROG)
/PSEN
P2.7/A15
P2.6/A14
P2.5/A13
P2.4/A12
P2.3/A11
P2.2/A10
P2.1/A9
P2.0/A80

A8/P2.0
A9/P2.1
A10/P2.2

39

P1.2
P1.1
P1.0

40

XTAL2
XTAL1
VSS

(/WR)/P3.6
(/RD)/P3.7

T2/P1.0
T2EX/P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
RESET
RXD/P3.0
TXD/P3.1
(/INT0)/P3.2
(/INT1)/P3.3
T0/P3.4
T1/P3.5
(/WR)/P3.6
(/RD)/P3.7
XTAL2
XTAL1
VSS

P1.4
P1.3

La disposicin de los terminales de esta familia se muestra en la figura 3.2. En concreto se muestra el
encapsulado de los microcontroladores 87C51BH en formato DIP y PLCC.

P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
(/EA)/(VPP)
NC
ALE/(/PROG)
/PSEN
P2.7/A15
P2.6/A14
P2.5/A13

3 Arquitectura de las familias MCS-51 y MCS-251

35

La relacin de terminales que aparecen en la figura es la siguiente:


- VCC: tensin de alimentacin: +5V.
- VSS: terminal de masa.
- P0.0, P0.1 P0.7: puerto bidireccional bit a bit de E/S P0. P0 puede soportar el byte bajo del bus de
direcciones y el bus de datos mediante una multiplexacin temporal en el caso de tener que utilizar
memoria externa (AD0,, AD7).
- P2.0, P2.1 P2.7: puerto bidireccional bit a bit de E/S P2. P2 puede soportar el byte alto del bus de
direcciones (A8,, A15) en el caso de tener que utilizar memoria externa.
- P1.0, P1.1 P1.7: puerto bidireccional bit a bit de E/S P1. P1 es un puerto de propsito general,
aunque para aquellas versiones que tienen 3 temporizadores, los terminales P1.0 y P1.1 realizan las
funciones alternativas T2 y T2EX del temporizador Timer2, respectivamente. El puerto en las
versiones con array de contadores programable PCA soporta las entradas y salidas de sta. Los
terminales P1.3, P1.4, P1.5, P1.6, P1.7 son las entradas/salidas, CEX0, CEX1, CEX2, CEX3 y CEX4,
de la PCA, respectivamente (tabla 3.1). Estos terminales actan como entradas de los mdulos 0, 1, 2,
3 y 4 de la PCA cuando trabaja en modo captura, respectivamente, y como salidas de los mismos
mdulos cuando la PCA trabaja en modo comparacin y en modulacin de anchura de pulsos (PWM).
- P3.0, P3.1 P3.7: puerto bidireccional bit a bit de E/S P3. P3 es un puerto de propsito general; no
obstante soporta las funciones especiales ms importantes de la familia MCS-51, como las seales
TXD y RXD del puerto de comunicacin serie, las entradas de interrupcin /INT0 y /INT1, las
entradas externas T0 y T1 de los temporizadores y las seales de lectura y escritura en memoria
externa de datos /RD y /WR, respectivamente (tabla 3.1).
- ALE/(/PROG): este terminal (ALE, Addres Latch Enable) permite deshacer la multiplexacin
temporal entre el byte bajo del bus de direcciones y el bus de datos, realizada en el puerto P0. La seal
ALE suele conectarse a la seal de reloj de un latch de 8 bits, como por ejemplo el 74373, que permite
deshacer la multiplexacin. En las versiones de la familia con memoria de programa interna EPROM o
OTPROM, este terminal se emplea en modo /PROG en la fase de programacin de la memoria.
-/PSEN: este terminal (/PSEN, Program Store Enable) se activa a 0 lgico cuando el microcontrolador
accede a la memoria externa de programas y se pone a 1 lgico en caso contrario.
- (/EA)/VPP: este terminal (/EA, External Acces) colocado a 1 lgico (Vcc) hace que el
microcontrolador ejecute el cdigo almacenado en la EPROM, OTPROM o ROM internas. Si se
coloca a 0 (masa), el microcontrolador ejecuta el cdigo de programa de la memoria externa de
programas, y activa el bus de direcciones, el bus de datos y las seales de control. Como VPP, el
terminal se utiliza para proporcionar la tensin de programacin necesaria de la memoria EPROM o
OTPROM interna.
- RESET: este terminal cuando se pone a 1 reinicializa el microcontrolador, poniendo el contador de
programa (PC) a 0000H, el puntero de la pila (SP) a 07H, todos los puertos (P0 a P3) a FFH y la
mayora de los registros a cero.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

36

-XTAL1, XTAL2: estos terminales son la entrada de la seal de reloj del microcontrolador. Puede
utilizarse un resonador cermico o un cristal de cuarzo (figura 3.3); aunque, tambin se puede utilizar
una seal de reloj externa.
XTAL2

C
MCS-51
C
XTAL1
VSS

Fig. 3.3 Oscilador con cristal de cuarzo o resonador cermico para la MCS-51.
C=30pF10pF para cristales de cuarzo. C=40pF10pF para resonadores cermicos
Tabla 3.1 Funciones alternativas de los puertos P1 y P3

Nombre

Funcin alternativa

Descripcin de la funcin alternativa

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7

T2*
T2EX*
ECI
CEX0
CEX1
CEX2
CEX3
CEX4
RXD
TXD
/INT0
/INT1
T0
T1
/WR
/RD

Entrada o salida de reloj del Timer 2.


Entrada externa del Timer 2.
Entrada externa de reloj del PCA.
Entrada/salida del mdulo 0 del PCA.
Entrada/salida del mdulo 1 del PCA.
Entrada/salida del mdulo 2 del PCA.
Entrada/salida del mdulo 3 del PCA.
Entrada/salida del mdulo 4 del PCA.
Recepcin del puerto de comunicacin serie.
Transmisin del puerto de comunicacin serie.
Interrupcin externa 0.
Interrupcin externa 1.
Entrada externa del Timer 0.
Entrada externa del Timer 1.
Habilitacin de escritura en memoria externa.
Habilitacin de lectura de memoria externa.

* En todas las versiones con 3 temporizadores


En las versiones con PCA (8XC51FX y 8XL51FX)

3.1.2 Puertos de entrada/salida


La constitucin interna de cada uno de los puertos se muestra en la figura 3.4. En el caso del puerto
P0, cualquier de sus terminales, al disponer de un par de transistores NMOS conectados a P0.X, puede
tener tres estados diferentes: 1 lgico (Vcc) si el transistor NMOS1 est en conduccin y el transistor
NMOS2 en corte, 0 lgico (tierra) si el transistor NMOS1 est en corte y el transistor NMOS2 en
conduccin, y alta impedancia cuando ambos transistores estn en corte, por lo que el terminal queda
flotante desconectado de Vcc y de masa.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

37

El resto de los terminales que pertenecen a los puertos P1, P2 y P3, (figura 3.4), tienen una resistencia
1

de Pull-up y un transistor NMOS conectado a tierra, por lo que tan slo pueden tener dos estados: 1
lgico si el transistor NMOS est en corte y 0 lgico si el transistor est en conduccin.
BIT DEL PUERTO 0 (P0)

BIT DEL PUERTO 2 (P2)

VCC

DIREC/DATO

DIREC

CONTROL

LEE
LATCH

CONTROL

LEE
LATCH

N1
B1

P2.X
BUS INT.

D
Q
LATCH
Q
CL

ESCRIBE
EN LATCH

D
Q
LATCH
Q
CL

N2
0

ESCRIBE
EN LATCH

MUX

B2
LEE
PIN

PULL-UP
INTERNO

B1
P0.X

BUS INT.

VCC

1
0

MUX

B2
LEE
PIN

BIT DEL PUERTO 3 (P3) y PUERTO 1 (P1)


Funcin
alternativa
de salida

LEE
LATCH

VCC
PULL-UP
INTERNO

B1
P3.X
BUS INT.

D
Q
LATCH
Q
CL

ESCRIBE
EN LATCH

B2
LEE
PIN

Funcin alternativa
de entrada

Fig. 3.4 Arquitectura interna de los puertos de la familia MCS-51

Segn la figura 3.4, todos los terminales de los puertos tienen una bscula D interna que se emplea
para almacenar la informacin que se desea leer o escribir en cada terminal, de manera que basta con
que una instruccin ponga un estado determinado en un terminal, para que este estado se mantenga
estable hasta que sea cambiado por otra instruccin del programa. Por ejemplo la instruccin SETB
P1.1 pone a 1 lgico el terminal P1.1: para ello se almacena un 1 lgico en la bscula D, lo que pone
al transistor asociado en corte, pues la puerta NAND fuerza un 0 lgico en su base.
Los puertos P0 y P2 tienen adems un multiplexor, MUX, y una lgica adicional, que permite al
microcontrolador utilizar estos puertos como tales o como bus de direcciones y de datos. En este
ltimo caso, el microcontrolador emplea las seales DIREC, DATO y CONTROL para establecer los
estados adecuados en los terminales de estos puertos.
Los puertos P1 y P3 tienen la misma estructura, pues deben realizar distintas funciones alternativas,
como son las entradas y salidas de la PCA, en las versiones 8XC51FX, y las entradas de
interrupciones /INT0 e /INT1, las entradas T0 y T1 para los temporizadores internos, etc. Estas
funciones alternativas se introducen mediante la puerta NAND que aparece en la figura 3.4.

Pull-up es el trmino anglosajn empleado para definir a una resistencia conectada a la tensin de alimentacin del
circuito, Vcc. Esta resistencia asegura que el terminal est a la tensin Vcc cuando en transistor NMOS est en corte.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

38

Todos los puertos tienen al menos un buffer conectado al pin de entrada (B1), y un buffer conectado a
la salida de la bscula D (B2), que intervienen en el proceso de lectura de los puertos. El buffer B1
est gobernado por la seal Read Latch, mientras que el buffer B2 est gobernado por la seal Read
Pin. En el juego de instrucciones de la MCS-51, existen instrucciones que leen el estado lgico
procedente del buffer B2 y instrucciones que leen el estado lgico procedente del buffer B1. Estas
ltimas son instrucciones que leen el estado lgico de la bscula D, modifican este estado y escriben el
resultado obtenido en la bscula D. A este tipo de instrucciones se les denomina de lecturamodificacin- escritura y, en concreto, son las instrucciones: ANL, ORL, XRL, JBC, CPL, INC,
DEC, DJNZ, (MOV PX.Y,C), CLR PX.Y y SETB PX.Y, siempre que operen con uno de los puertos.
Estas instrucciones leen el estado de la bscula para evitar un posible error producido por una mala
interpretacin del nivel lgico en la entrada del terminal de un puerto.
En cuanto a la conexin de dispositivos externos, los puertos P1, P2 y P3 pueden soportar una
corriente de entrada mxima en un terminal de 1.6mA en estado lgico cero, transistor NMOS en
conduccin. En cambio, el puerto P0 puede soportar hasta una corriente de 3.2mA a cero lgico.

3.2 Organizacin de la memoria y de los registros internos de la MCS-51


En los microcontroladores de la familia MCS-51 se pueden distinguir tres tipos de memoria:
- rea de memoria de programas y memoria de datos.
- rea de memoria interna y de registros de propsito general.
- rea de registros de funcin especial SFR, Special Function Registers.
La memoria de programas y la memoria de datos son reas de memoria externa al microcontrolador,
aunque hay versiones con memoria ROM, EPROM o OTPROM en su interior. La memoria interna y
los registros de propsito general pertenecen a la estructura interna de la MCS-51. Los registros de
funcin especial SFR son registros que configuran los recursos internos de la MCS-51, como son las
interrupciones, el funcionamiento de los temporizadores, la comunicacin serie asncrona, etc.
3.2.1 rea de memoria de cdigo de programa y memoria de datos
El mapa de memoria de la MCS-51 est segmentada en dos bloques de memoria de 64kbytes de
tamao cada uno (figura 3.5), un bloque est destinado a almacenar el cdigo de programa (memoria
de programa) y el otro a contener las variables y datos asociados al programa (memoria de datos).
Estos dos bloques se direccionan a travs de las 16 lneas de direcciones, A0-A15, de la familia. La
2

memoria de programa (figura 3.5a) es de slo lectura y suele ser externa, aunque se han de considerar
las versiones con memoria ROM, EPROM y OTPROM interna, que son de tamao reducido y
3

destinadas a albergar los programas realizados en aplicaciones poco complejas o de tipo medio . El
bloque de memoria de datos (figura 3.5b) (64kbytes) es externo al microcontrolador y puede ser tanto
de lectura como de escritura.

Notar que /PSEN es una seal de lectura que slo acta sobre la memoria externa de programas.
3

Hay versiones con 4k, 8k, 16k o 32kbytes de memoria interna de programas.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

a)

Memoria de programa
(slo lectura)
FFFFH

Memoria de datos
(lectura/escritura)

b)

FFFFH

Mem.
externa
Mem.
externa

EA = 0

39

1000H/2000H
0FFFH/1FFFH

Mem.
interna

Mem. RAM
interna 8032/8052
128 bytes
FFH
(80H-FFH)
FFH
rea de
registros
especiales
SFR
80H
7FH
Mem. RAM
interna

EA = 1

PSEN
0000H

0000H

c)

FFFFH

128 bytes
00H

PSEN
RD

RD128k

Mem.
externa

RD
WR

0000H

Fig. 3.5 Estructura de la memoria de la MCS-51

El microcontrolador activa diferentes seales en funcin del tipo de bloque de memoria al que accede.
Si va a realizar una lectura del cdigo de programa, sita la direccin que desea leer en el bus de
4

direcciones, A0-A15, y activa la seal /PSEN . Por contra, si va a realizar una lectura o escritura en la
memoria de datos, sita la direccin correspondiente en A0-A15 y activa la seal /RD o /WR, segn
vaya a leer o a escribir un dato, respectivamente. La CPU comienza a ejecutar el programa, tras un
reset o al conectar la alimentacin, por la direccin 0000H, puesto que el contador de programa (PC)
se inicializa con este valor.
En las versiones con memoria interna de programa los microcontroladores pueden ir a buscar el
5

cdigo de programa a la memoria interna o a la memoria externa , y para aclarar cul es el tipo de
memoria del que debe leer el cdigo, dispone de la seal /EA. Si /EA est a 0 lgico, el
microcontrolador ejecuta el cdigo almacenado en la memoria externa, y si /EA est a 1 lgico,
ejecuta el cdigo almacenado en la memoria interna. En esta ltima situacin, el microcontrolador no
activa la seal /PSEN ni los buses de direcciones y datos, puesto que no son necesarios. No obstante,
el fabricante contempla la particularidad de que el cdigo de programa pueda estar almacenado en
ambos tipos de memoria, parte en la memoria interna y el resto en la memoria externa. En este caso, el
microcontrolador ejecuta primero el cdigo de programa de la memoria interna y, luego, pasa a
ejecutar el cdigo almacenado en la memoria externa; activa entonces la seal /PSEN y los buses de
direcciones y datos. Cabe destacar que esta particularidad carece de sentido, puesto que los
microcontroladores con memoria EPROM o OTPROM tienen un coste ms elevado que el del resto, y
6

su utilizacin slo se justifica por el mayor nmero de puertos tiles y por la reduccin del rea de
circuito impreso que posibilitan.
La memoria de programas y la memoria de datos pueden combinarse, si se desea, en un nico bloque
de memoria de 128kbytes: para ello se deben combinar las seales /RD y /PSEN para que formen una

La seal /PSEN es activa cuando est en estado 0 lgico.


5

Habitualmente la memoria externa de programa se implementa mediante una memoria EPROM.


6

Debido a que los puertos P0 y P2 no deben formar el bus de direcciones y el bus de datos.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

40

nica seal de lectura, lo que se consigue mediante una puerta AND lgica (figura 3.5c).
3.2.2 rea de memoria interna y de registros de propsito general
Segn la figura 3.6, la familia MCS-51 tiene 128 bytes de memoria interna -posiciones de la 00H a la
7FH- y un rea para los registros de funcin especial (SFR) de 128 bytes -posiciones de la 80H a la
FFH-. El rea de memoria interna est estructurada en tres partes: a) rea de registros de propsito
general formado por cuatro bancos con ocho registros cada uno, b) rea accesible bit a bit y c) rea de
memoria RAM general.
a)
Mem. Int
FFH *
Slo
80H
7FH

7FH

b)

direcc.
indirecto
Direcc.
directo e
indirecto

00H

SFR
Slo
direcc.
directo

FFH

30H
7F 7E
F E
20H 7 6

80H

18H
10H
08H

* Slo en 8032/8052

00H

............
............
............

BANCO 3
BANCO 2
BANCO 1
BANCO 0

2FH
8
0

1FH

Memoria
RAM general
80 bytes
rea direcc.
bit a bit.
16 bytes,
128 bits

17H
0FH

Bancos de
registros
32 bytes

07H

Fig. 3.6 a) Memoria interna de la MCS-51. b) Organizacin de los primeros 128 bytes de esta memoria

a) rea de registros de propsito general


El rea de registros de propsito general -posiciones de la 00H a la 1FH (figura 3.6b)- est formada
por cuatro bancos de registros con ocho registros cada uno, lo que hace un total de 32 registros
disponibles. De estos cuatro bancos de registros, slo uno puede estar activo en un instante
determinado, mediante una seleccin previa con los bits RS0 y RS1 del registro de estado (PSW
Program Status Word, -tabla 3.2-). Luego, en realidad tan slo se pueden usar los ocho registros
correspondientes al banco de registros seleccionado.
A los ocho registros de cada banco de registros se les denomina R0, R1, R2, R3, R4, R5, R6 y R7,
respectivamente. Estos registros, en realidad, ocupan las mismas posiciones de memoria que abarca
cada uno de los bancos: por ejemplo, para el banco 0, el registro R0 est ubicado en la posicin 00H
de la memoria interna, el registro R1 en la posicin 01H, el registro R2 en la posicin 02H, y as
sucesivamente hasta el registro R7, que est en la posicin 07H de la memoria interna; siguiendo este
orden el registro R0 del banco 1 ocupa la posicin 08H de la memoria interna, el registro R0 del banco
2 est en la posicin 10H de la memoria interna y el registro R0 del banco 3 ocupa la posicin 18H de
la memoria interna.
Tabla 3.2 Seleccin del banco de registros

Banco 0
Banco 1
Banco 2
Banco 3

Direcciones
00H-07H
08H-0FH
10H-17H
18H-1FH

RS1 (PSW)
0
0
1
1

Los autores, 2001; Edicions UPC, 2001.

RS0 (PSW)
0
1
0
1

3 Arquitectura de las familias MCS-51 y MCS-251

41

b) Posiciones direccionables bit a bit


En la memoria interna de la MCS-51 existen 16 bytes posiciones entre 20H y 2FH (figura 3.7)- que
son accesibles a nivel de bit, por lo que se dispone de 128 bits accesibles de manera individual.
Memoria RAM interna

Memoria RAM interna

2FH 7

21H 7

20H 7

2FH 7FH 7EH 7DH 7CH 7BH 7AH 79H 78H

21H 0FH 0EH D0H 0CH 0BH 0AH 09H 08H


20H 07H 06H 05H 04H 03H 02H 01H 00H

Fig. 3.7 Posiciones de la memoria interna que son direccionables bit a bit

Existen dos formas de acceder a cada bit de esta zona: la primera consiste es indicar el bit mediante un
punto que lo define como bit de un byte. Por ejemplo, al bit 5 del byte 20H se puede acceder como
20H.5. La otra forma consiste en utilizar una direccin para cada uno de los bits de esta zona, donde
hay un total de 128 bits; por tanto, el primer bit, el 20H.0, tiene asignada la direccin 00H y el ltimo
bit, el 2FH.7, tiene asignada la direccin 7FH 127 en base decimal.
c) rea de memoria RAM general
El rea de memoria RAM general es una zona de 80 bytes comprendida entre las posiciones 30H y
7FH de la memoria interna (figura 3.6b). En las versiones 8032AH, 8052AH y 8752BH esta zona se
ampla en 128 bytes ms, y est situada entre las direcciones 80H y FFH.
3.2.3 rea de registros especiales (SFR)
El rea de registros especiales SFR (tabla 3.3) est ubicada entre las direcciones 80H y FFH de la
memoria interna y contiene los registros que determinan el modo de funcionamiento y la configuracin
de los recursos internos de la familia MCS-51.
La tabla 3.3 muestra la situacin de los registros del SFR dentro del espacio de memoria y el valor que
toman tras la realizacin de un reset. Los registros con el superndice * aparecen en todas las versiones
con 3 temporizadores y los registros con el superndice aparecen en las versiones 8XC51FX. Las
zonas en blanco de la tabla 3.3 no estn implementadas fsicamente, y quedan reservadas para futuras
ampliaciones de registros que desee hacer el fabricante. La tabla 3.4 muestra el listado de los registros
del SFR, una pequea descripcin de stos y la direccin que corresponde a cada registro.
Se debe destacar que todos los registros de la tabla 3.3 que aparecen en la primera columna son
accesibles bit a bit, mientras que el resto de registros no lo son. Los registros de la primera columna
son aquellos que tienen una direccin que acaba en 0 8, es decir: 80H, 88H, 90H, 98H, A0H, etc.
Por tanto, al bit 3 del acumulador se puede acceder como ACC.3, al bit 2 del registro B se puede
acceder como B.2, etc.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

42

Tabla 3.3 Situacin de los registros del SFR de la MCS-51 y su valor tras un reset

F8

CCAP0H

CH

00000000

F0

CCAP1H

CCAP2H

CCAP3H

FF

CCAP4H

XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

F7

00000000

E8

CCAP0H

CL

00000000

E0

CCAP1H

CCAP2H

CCAP3H

EF

CCAP4H

XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

ACC

E7

00000000

D8
D0

CCON

CMOD

00X00000

00XXX000

CCAPM0

X0000000

CCAPM1

X0000000

CCAPM2

X0000000

CCAPM3

X0000000

CCAPM4

DF

X0000000

PSW

D7

00000000

C8
C0
B8
B0
A8
A0

T2MOD

RCAP2L

RCAP2H

TL2

00000000 XXXXXX00 00000000

00000000

00000000

T2CON

TH2

CF

00000000

C7
BF

IP

SADEN

X0000000

00000000

P3

IPH

11111111

X0000000

IE

SADDR

00000000

00000000

B7
AF
A7

P2
11111111

98
90

SCON

SBUF

00000000

XXXXXXXX

9F

P1

97

11111111

88
80

TCON

TMOD

TL0

TL1

TH0

TH1

00000000

00000000

00000000

00000000

00000000

00000000

8F

P0

SP

DPL

DPH

PCON

11111111

00000111

00000000

00000000

00XX0000

X=Estado indefinido

87

* En todas las versiones con 3 temporizadores


En las versiones con PCA (8XC51FX y 8XL51FX)

Las versiones con 256 bytes de memoria interna tienen los 128 bytes altos situados entre las
posiciones 80H y FFH. En consecuencia, comparten las mismas direcciones que el SFR (80H-FFH),
por lo que se produce un solapamiento en cuanto a asignacin de direcciones. Para resolver este
conflicto y poder acceder a ambas zonas de la memoria interna, se utiliza el modo de direccionamiento
7

de las instrucciones de la familia; en concreto, si el direccionamiento se realiza de forma directa


(direccionamiento directo), se accede al rea de SFR; y si, por contra, el direccionamiento se realiza
8

de una forma indirecta (direccionamiento indirecto), se accede al rea ampliada de memoria. Los
distintos modos de direccionamiento se tratarn en el captulo siguiente.

En el direccionamiento directo, la direccin es de forma directa un operando de la instruccin.


Ej.
MOV 90H, #3BH;
Escribe 3BH en la localizacin 90H=P1 (Puerto P1) del SFR.
8

En el direccionamiento indirecto, la direccin est contenida en un registro del microcontrolador. Para un 8052:
Ej.
MOV R0, #90H;
MOV @R0, #3BH;
Escribe 3BH en la posicin de memoria interna 90H.
Nota: # indica el nmero es un dato numrico y @ es el indicativo del direccionamiento indirecto.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

43

Tabla 3.4 Registros del rea de SFR para la MCS-51


Smbolo
P0
P1
P2
P3
SP
DPL
DPH
PCON
TCON
TMOD
TL0
TH0
TL1
TH1
SCON
SBUF
IE
SADDR
IPH
IP
SADEN
T2CON*
RCAP2L*
RCAP2H*
TL2*
TH2*
PSW
CCON
CMOD
CCAPM0
CCAPM1
CCAPM2
CCAPM3
CCAPM4
ACC
CL
CCAP0L
CCAP1L
CCAP2L
CCAP3L
CCAP4L
B
CH
CCAP0H
CCAP1H
CCAP2H
CCAP3H
CCAP4H

Nombre
Puerto 0.
Puerto 1.
Puerto 2.
Puerto 3.
Puntero de la Pila (Stack Pointer).
Byte bajo del puntero de datos DPTR.
Byte alto del puntero de datos DPTR.
Control del consumo de energa (Power Control).
Control de los temporizadores (Timer Control).
Configuracin de los temporizadores (Timer Mode).
Byte bajo del temporizador 0.
Byte alto del temporizador 0.
Byte bajo del temporizador 1.
Byte alto del temporizador 1.
Control de la comunicacin serie (Serial Control).
Buffer de datos de la comunicacin serie (Serial Buffer).
Habilitacin de interrupciones (Interrupt Enable).
Direccin esclavo (Slave Address).
Byte alto del registro de prioridad de interrupciones.
Registro de prioridad (Interrupt Priority).
Mscara de direcciones esclavo (Slave Address Mask).
Control del temporizador 2.
Byte bajo del registro de captura del temporizador 2.
Byte alto del registro de captura del temporizador 2.
Byte bajo del temporizador 2.
Byte alto del temporizador 2.
Registro de estado (Program Status Word).
Registro de control del Timer/Counter del PCA.
Registro de modo del Timer/Counter del PCA.
Registro modo 0 del Timer/Counter del PCA.
Registro modo 1 del Timer/Counter del PCA.
Registro modo 2 del Timer/Counter del PCA.
Registro modo 3 del Timer/Counter del PCA.
Registro modo 4 del Timer/Counter del PCA.
Acumulador.
Byte bajo del Timer/Counter del PCA.
Byte bajo del mdulo 0 de comparacin/captura del PCA.
Byte bajo del mdulo 1 de comparacin/captura del PCA.
Byte bajo del mdulo 2 de comparacin/captura del PCA.
Byte bajo del mdulo 3 de comparacin/captura del PCA.
Byte bajo del mdulo 4 de comparacin/captura del PCA.
Registro B.
Byte alto del Timer/Counter del PCA.
Byte alto del mdulo 0 de comparacin/captura del PCA.
Byte alto del mdulo 1 de comparacin/captura del PCA.
Byte alto del mdulo 2 de comparacin/captura del PCA.
Byte alto del mdulo 3 de comparacin/captura del PCA.
Byte alto del mdulo 4 de comparacin/captura del PCA.

Direccin
80H
90H
A0H
B0H
81H
82H
83H
87H
88H
89H
8AH
8CH
8BH
8DH
98H
99H
A8H
A9H
B7H
B8H
B9H
C8H
CAH
CBH
CCH
CDH
D0H
D8H
D9H
DAH
DBH
DCH
DDH
DEH
E0H
E9H
EAH
EBH
ECH
EDH
EEH
F0H
F9H
FAH
FBH
FCH
FDH
FEH

* En todas las versiones con 3 temporizadores


En las versiones con PCA (8XC51FX y 8XL51FX)

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

44

3.3 Arquitectura interna de la MCS-251


La figura 3.8 muestra el diagrama funcional de bloques de la arquitectura interna de los
microcontroladores de la familia MCS-251. Al igual que en la MCS-51, esta familia dispone de cuatro
puertos de entrada/salida, P0, P1, P2 y P3, de 8 bits cada uno, donde cada bit puede ser configurado
individualmente como entrada o como salida, o bien puede realizar una funcin alternativa relacionada
con los perifricos o con el acceso a la memoria externa. De la misma forma que para la MCS-51, los
puertos P0 y P2 soportan el bus de datos y el bus de direcciones, para el caso de necesitar memoria
externa. Las funciones alternativas de los puertos P1 y P3 estn relacionadas con los perifricos y con
seales de control.
Puertos de entrada/salida
y seales de perifricos

Puertos de entrada/salida y
busesde acceso a memoria
P2.7:0
P0.7:0

Puerto 0
drivers

Puerto 2
drivers

Cdigo
OTPROM/ROM
8Kbytes
16Kbytes

RAM
512 Bytes o
1024 Bytes

P1.7:0

P3.7:0

Puerto 1
drivers

Puerto 3
drivers

Memoria de datos (16)

Memoria de direcciones (16)

Temporizador
watchdog
Intefaz de
los perifricos

Interfaz del Bus

Control de
interrupciones

Bus de datos (8)

SRC1 (8)

SRC2 (8)

ALU

Registros de
propsito
general

Bus de direcciones (24)

Secuenciador
de instrucciones

Bus IB

Temporizadores
contadores

PCA

Clock
y reset

Puerto Serie

Interfaz de
la memoria
de datos

Perifricos

DST (16)
Ncleo de los C de la familia MCS-251
Clock y reset

Microcontroladores 8XC251SA/SB/SP/SQ
Fig. 3.8 Diagrama funcional de la arquitectura interna de la familia MCS-251

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

45

La familia MCS-251 tiene una serie de innovaciones y mejoras con respecto a la MCS-51, sin dejar de
ser compatible con sta en cuanto a encapsulado y juego de instrucciones. A pesar de esta
compatibilidad, el juego de instrucciones en la MCS-251 ha sido considerablemente ampliado, e
incluye instrucciones que operan con datos de 8, 16 y 32 bits y que facilitan el desarrollo de programas
en lenguajes de alto nivel como el lenguaje C. Para mantener al mismo tiempo la compatibilidad con
la MCS-51 y la ampliacin y mejora del juego de instrucciones, se han definido los modos de trabajo
fuente source y binario binary. En el modo fuente se puede emplear las nuevas instrucciones y los
tipos de direccionamientos ideados para la MCS-251, por lo que el cdigo de programa generado
suele ser ms compacto y eficiente. En el modo binario se programa de la misma manera que con la
MCS-51 y por tanto es completamente compatible con sta. Con este modo la MCS-251 puede
sustituir a la MCS-51 de forma directa, en aplicaciones ya desarrolladas, y sin necesidad de tener que
generar nuevos programas.
El espacio de memoria que es capaz de direccionar la familia MCS-251 es de 16Mbytes tanto para
cdigo de programa como para datos, puesto que el contador de programa es de 24 bits, pero en
realidad el espacio de memoria real es de 256kbytes de memoria externa, ya que como bus de
direcciones se dispone de los puertos P0 y P2, y las lneas A16 y A17, que son funciones alternativas
de los puertos P3 y P1, respectivamente.
La MCS-251 incorpora tambin cierta cantidad de memoria interna de programa y datos, as como un
controlador de interrupciones y distintos perifricos como un temporizador Watchdog, tres
temporizadores/contadores, un array de contadores programable (PCA) y un puerto de comunicacin
serie.
Una de las caractersticas de la MCS-51 consiste en que multiplexa temporalmente el byte bajo del bus
de direcciones (A0-A7) y el bus de datos (D0-D7) en el puerto P0. Esta multiplexacin se mantiene
para la MCS-251 y se denomina modo no paginado. Sin embargo, para la MCS-251 la multiplexacin
temporal tambin se puede hacer entre el byte alto del bus de direcciones (A8-A15) y el bus de datos
(D0-D7) en el puerto P2, pues de esta manera y como se explicar ms adelante el acceso a la
memoria externa es ms eficiente, el puerto P0 en este caso permanecera estable con la direccin
correspondiente al byte bajo del bus de direcciones (A0-A7). Esta manera de realizar la multiplexacin
temporal en el puerto P2 se denomina modo paginado.
La familia tambin incorpora dos modos de funcionamiento de bajo consumo denominados Idle y
Power Down, que son adecuados para aplicaciones alimentadas con bateras. El modo Idle para la
seal de reloj de la CPU, detiene la ejecucin del programa y ello hace que el consumo de energa sea
un 40% menor, pero mantiene la seal de reloj en los perifricos, y permite que sigan en
funcionamiento. El modo Power Down detiene las seales de reloj de la CPU y de los perifricos, con
lo que consigue una reduccin en el consumo de energa de hasta un 60%.

3.3.1 Relacin de terminales


La figura 3.9 muestra el encapsulado en formato DIP y PLCC, y la disposicin de terminales de la
MCS-251.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

P1.4/CEX1
P1.3/CEX0
P1.2/ECI
P1.1/T2EX
P1.0/T2
VSS1
VCC
AD0/P0.0
AD1/P0.1
AD2/P0.2
AD3/P0.3

46

40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21

VCC
AD0/P0.0
AD1/P0.1
AD2/P0.2
AD3/P0.3
AD4/P0.4
AD5/P0.5
AD6/P0.6
AD7/P0.7
EA/VP
ALE/PROG
/PSEN
A15/P2.7
A14/P2.6
A13/P2.5
A12/P2.4
A11/P2.3
A10/P2.2
A9/P2.1
A8/P2.0

P1.5/CEX2
P1.6/CEX3/WAIT
P1.7/CEX4/A17/WCLK
RST
P3.0/RXD
VCC2
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1

7
8
9
10
11
12
13
14
15
16
17

8XC251Sx

39
38
37
36
35
34
33
32
31
30
29

AD4/P0.4
AD5/P0.5
AD6/P0.6
AD7/P0.7
EA/VP
VSS2
ALE/PROG
PSEN
A15/P2.7
A14/P2.6
A13/P2.5

18
19
20
21
22
23
24
25
26
27
28

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

P3.6/WR
P3.7/RD/A16
XTAL2
XTAL1
VSS
VSS2
A8/P2.0
A9/P2.1
A10/P2.2
A11/P2.3
A12/P2.4

P1.0/T2
P1.1/T2EX
P1.2/ECI
P1.3/CEX0
P1.4/CEX1
P1.5/CEX2
P1.6/CEX3/WAIT
P1.7/CEX4/A17/WCLK
RST
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD/A16
XTAL1
XTAL2
VSS

6
5
4
3
2
1
44
43
42
41
40

8XC251Sx

Fig. 3.9 Microcontroladores 8XC251Sx en encapsulado DIP 40 pines y PLCC de 44 pines

La relacin de terminales de los microcontroladores de la familia MCS-251 es la siguiente:


- VCC, VCC2: entradas de alimentacin. Vcc y VCC2 se deben poner a +5V. VCC2 permite reducir el
ruido que puede haber en la lnea de alimentacin.
- VSS, VSS1, VSS2: terminales de masa del microcontrolador.
- P0.0, P0.1 P0.7: puerto bidireccional bit a bit de E/S P0. P0 puede soportar el byte bajo del bus de
direcciones y el bus de datos mediante una multiplexacin temporal en el modo no paginado, en el
caso de tener que utilizar memoria externa (AD0,, AD7). En las versiones con memoria interna de
programa, el cdigo de programa se introduce a travs de este puerto, en la fase de programacin y
verificacin.
- P2.0, P2.1 P2.7: puerto bidireccional bit a bit de E/S P2. P2 puede soportar el byte alto del bus de
direcciones y el bus de datos mediante una multiplexacin temporal, en el modo paginado (A8,,
A15) de acceder a la memoria externa.
- P1.0, P1.1 P1.7: puerto bidireccional bit a bit de E/S P1. P1 es un puerto de propsito general, no
obstante soporta varias funciones especiales de la familia MCS-51 (tabla 3.5), que estn relacionadas
con el temporizador Timer 2, con el array de contadores programable PCA, la seal WAIT que
controla los estados de espera en los ciclos de acceso a la memoria externa, la lnea A17 del bus de
direcciones y la seal WCLK que es la salida de reloj para estados de espera en el acceso de memoria
externa.
Los terminales P1.3, P1.4, P1.5, P1.6, P1.7 son entradas/salidas CEX0, CEX1, CEX2, CEX3, CEX4
de la PCA, respectivamente. Estos terminales actan como entradas de los mdulos 0, 1, 2, 3 y 4 de la
PCA cuando trabaja en modo captura, respectivamente, y como salidas de los mismos mdulos cuando
la PCA trabaja en modo comparacin y en modulacin de anchura de pulsos (PWM).
La funcin alternativa de P1.7 se determina mediante RD1 y RD0 del registro de configuracin
UCONFIG0. Si RD1=RD0= 0, su funcin es la lnea A17 del bus de direcciones. No obstante, si el bit
WCON.1 est 1, en P1.7 se genera una seal cuadrada de frecuencia que es la mitad de la seal de
reloj del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

47

- P3.0, P3.1 P3.7: puerto bidireccional bit a bit de E/S P3. P3 es un puerto de propsito general que
soporta diversas funciones especiales de la familia MCS-51 al igual que el puerto P1 (tabla 3.5). Las
funciones que soporta este puerto son las seales TXD y RXD del puerto de comunicacin serie, las
entradas de interrupcin /INT0 y /INT1, las entradas externas T0 y T1 de los temporizadores, las
seales de lectura y escritura en memoria externa /RD y /WR, y la lnea A16 del bus de direcciones.
La funcin alternativa de P3.7 tambin depende del estado de los bits RD1 y RD0 de UCONFIG0. Si
RD1=RD0= 1, su funcin alternativa es /RD y si RD1= 0 y, RD0 = 1 o RD1= 0 y RD0=0, su funcin
alternativa es la lnea A16 del bus de direcciones.
Tabla 3.5 Descripciones de las funciones de los pines de los puertos de entrada/salida

Nombre Nombre del pin con


Descripcin de la funcin alternativa
del pin funcin alternativa
P1.0
T2
Entrada/salida de reloj del Timer 2.
P1.1
T2EX
Entrada externa del Timer 2.
P1.2
ECI
Entrada externa de reloj del PCA.
P1.3
CEX0
Entrada/salida del mdulo 0 del PCA.
P1.4
CEX1
Entrada/salida del mdulo 1 del PCA.
P1.5
CEX2
Entrada/salida del mdulo 2 del PCA.
P1.6
CEX3
Entrada/salida del mdulo 3 del PCA.
P1.7 CEX4, A17, WCLK E/S del mdulo 4 del PCA o A17 del bus de direcciones.
P3.0
RXD
Entrada de datos del puerto serie.
P3.1
TXD
Salida de datos del puerto serie.
P3.2
/INT0
Entrada interrupcin externa 0.
P3.3
/INT1
Entrada interrupcin externa 1.
P3.4
T0
Entrada Timer 0.
P3.5
T1
Entrada Timer 1.
P3.6
/WR
Habilitacin de escritura en memoria externa.
P3.7
/RD, A16
Habilitacin de lectura en mem. externa o A16 del bus de
direcciones
- /PSEN: este terminal se activa cuando el microcontrolador realiza operaciones de lectura en la
memoria externa en determinados rangos de direcciones, dependiendo del valor de los bits de
configuracin RD1 y RD0.
- (/EA)/VP: este terminal puesto a 1 hace que el microcontrolador ejecute el cdigo almacenado en las
EPROM, OTPROM o ROM internas. Si se coloca a 0, el microcontrolador ejecuta el cdigo de
programa de la memoria externa de programas, activa el bus de direcciones, el bus de datos y las
seales de control. VP se utiliza para proporcionar la tensin de programacin necesaria de la
memoria EPROM o OTPROM interna.
- XTAL1, XTAL2: estos terminales son la entrada de la seal de reloj del microcontrolador. Puede
utilizarse un resonador cermico o un cristal de cuarzo. Tambin se puede utilizar una seal externa de
reloj. El esquema circuital es el mismo que el de la figura 3.3 para la MCS-51.
- RST: entrada de reset del microcontrolador. Se debe colocar a nivel alto durante al menos 64
perodos de reloj para realizar la operacin de reset.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

48

3.3.2 Estructura interna de los puertos de entrada/salida


La estructura interna de los puertos de E/S es la misma que la descrita para la MCS-51, salvo alguna
diferencia como el hecho de que el puerto P1 tenga funciones alternativas y se introduzcan los modos
paginado y no paginado de direccionar la memoria. Debido a ello, en el puerto P2 se introduce la seal
DATO para determinar los estados lgicos del puerto, puesto que en el modo paginado el puerto pasa
a soportar el bus de datos adems del byte alto del bus de direcciones; y los puertos P1 y P3 pasan a
tener la misma estructura interna (figura 3.10).
La estructura interna de los puertos de la MCS-251 es prcticamente idntica a la estructura de la
MCS-51, por lo que la explicacin de su funcionamiento se ha realizado en el apartado 3.1.2.
BIT DEL PUERTO 2 (P2)

BIT DEL PUERTO 0 (P0)


VCC

DIRECC/DATO
CONTROL

LEE
LATCH

DIRECC/DATO
CONTROL

LEE
LATCH

N1
B1

VCC

B1
P0.X

BUS INT.

P2.X
BUS INT.

D
Q
LATCH
Q
CL

ESCRIBE
EN LATCH

PULL-UP
INTERNO

D
Q
LATCH
Q
CL

N2
0

ESCRIBE
EN LATCH

MUX

B2

1
0

MUX

B2

LEE
PIN

LEE
PIN

BIT DEL PUERTO 1 y 3 (P1 y P3)


Funcin
alternativa
de salida

LEE
LATCH

VCC
PULL-UP
INTERNO

B1
P3.X
BUS INT.

D
Q
LATCH
Q
CL

ESCRIBE
EN LATCH

LEE
PIN

B2
Funcin alternativa
de entrada

Fig. 3.10 Latchs de los bits de los puertos y buffers de entrada/salida para la MCS-251

3.4 Organizacin de los espacios de memoria de la MCS-251


En los microcontroladores de la familia MCS-251 (figura 3.11), se tienen tres espacios distintos de
memoria:
-El espacio de memoria para programas y datos.
-El rea de registros de propsito general.
-El rea de registros de funcin especial SFR.
En la figura 3.11 se observa cmo los espacios de memoria de la familia MCS-251 se han ampliado
considerablemente respecto a la familia MCS-51.
El espacio de memoria para programas y datos de la MCS-251 se utiliza para almacenar el cdigo del
programa que debe ejecutar el microcontrolador, as como los datos, resultados intermedios y

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

49

resultados finales relacionados con dicho programa. Este espacio tiene un tamao de 16Mbytes de
posiciones de memoria distribuidas en 256 regiones de 64kbytes cada una, numeradas de la 00: a la
FF:.
La familia MCS-251 est diseada para tener hasta un mximo de 64kbytes de memoria interna no
voltil, ubicada en la regin FF:. La memoria RAM interna est ubicada en la regin 00:, comenzando
a partir de la direccin 00:0020H. La dimensin de la memoria interna depende de la versin de
microcontrolador.
El rea de registros de propsito general contiene 64 registros de 8 bits numerados decimalmente del 0
al 63. Estos registros tienen la funcin de guardar los datos y resultados que intervienen con ms
frecuencia en el programa.
El espacio SFR puede tener hasta 512 registros de 8 bits de funcin especfica que estn, en la mayora
de los casos, relacionados con la programacin de los perifricos que incorpora el microcontrolador.
Las direcciones de los registros de este rea van de la S:000H a la S:1FFH. En la direccin de un
registro del rea SFR se utiliza el prefijo S: para diferenciarla de una direccin de memoria.
rea de memoria
16 Mbytes

rea SFR
512 bytes
S:1FFH

FF:FFFFH

S:000H

rea de registros de
propsito general
64 bytes
63
00:0000H

Fig. 3.11 Espacio de direcciones para la familia MCS-251

3.4.1 rea de memoria


En la figura 3.12 se muestra el rea de memoria de los microcontroladores 8XC251Sx. De los
16Mbytes de memoria tericamente tiles, tan slo se pueden usar 8 regiones de 64 kbytes, en
concreto la 00:, 01:, 02:, 03:, FC:, FD:, FE: y FF:, donde se pueden almacenar indistintamente cdigo
de programa o datos. El resto de regiones de memoria, de la 04: a la FB:, estn reservadas y no pueden
ser utilizadas por el usuario.
El nmero de lneas de direcciones de los microcontroladores de la serie 8XC251Sx es configurable
por el usuario: el valor mximo es 18, lo que limita el nmero mximo de posiciones de memoria
externa que se pueden direccionar de forma directa a 256kbytes.
Las 8 posiciones de memoria que van de la direccin FF:FFF8H a la FF:FFFFH estn reservadas para
la configuracin del dispositivo. En concreto, en la versin 8XC251Sx se utilizan slo los bytes

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

50

FF:FFF8H y FF:FFF9H para realizar la configuracin, el resto se reservan para la configuracin de


futuras versiones de este microcontrolador.
En la regin 00: se ubica la memoria RAM interna, en concreto entre la direccin 00:0020H y la
00:021FH, para aquellas versiones que disponen de 512 bytes de memoria RAM interna, o bien entre
la direccin 00:0020H y la 00:041FH para aquellas versiones que disponen de 1Kbyte de posiciones
de memoria RAM interna. La memoria RAM interna est destinada exclusivamente a guardar datos ya
que no se puede ejecutar instrucciones almacenadas en ella. Los primeros 32 bytes de memoria, de la
direccin 00:0000H a la 00:001FH, estn asociados al rea de registros. Por otra parte, las posiciones
de memoria comprendidas entre la 00:0020H y la 00:007FH son accesibles a nivel de bit.
rea de memoria
16 Mbytes
FF:FFFFH

Regin FF:
Bytes de configuracin
FF:FFF8H - FF:FFFFH

FF:0000H

FF:FFF7H
FE:FFFFH

Memoria externa
FE:0000H

Memoria externa
FF:2000H/FF:4000H

OTPROM/ROM interna
FD:FFFFH

Memoria externa

SB, SQ:16 Kbytes (FF:0000H - FF:3FFFH)


SA, SP: 8 Kbytes (FF:0000H - FF:1FFFH)

FD:0000H
FC:FFFFH

Memoria externa
FC:0000H
Regiones reservadas 04: a FB:
03:FFFFH

Memoria externa
03:0000H

Regin 00:

02:FFFFH

Memoria externa
02:0000H
01:FFFFH

00:FFFFH

Memoria externa
00:0220H/00:0420H

Memoria externa
01:0000H
00:FFFFH

00:0000H

RAM interna
SB, SQ: 1 Kbytes (00:0020H - 00:041FH)
SA, SP: 512 bytes (00:0020H - 00:021FH)
32 bytes de registros de trabajo
00:0000H - 00:001FH

Fig. 3.12 Implementacin hardware del rea de memoria de los microcontroladores 8XC251SA, SB, SP y SQ

La memoria interna de lectura est ubicada en la direccin FF:. Las diferentes versiones del
microcontrolador 8XC251Sx disponen de 0, 8 16kbytes de memoria interna del tipo ROM
(83C251Sx) o OTPROM/EPROM (87C251Sx).
En la figura 3.12 las zonas sombreadas se corresponden con la memoria interna, mientras que el resto
de zonas se deben implementar, en caso que se utilicen, mediante de integrados de memoria externos.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

51

3.4.2 rea de registros de propsito genrico


El rea de registros de propsito general de la familia MCS-251 dispone de 64 registros numerados
desde el 0 al 63, aunque los registros que estn ubicados entre las posiciones 32 y 55 estn reservados
para futuras versiones, lo que reduce el nmero total de registros disponibles a 40, como se muestra en
la figura 3.13.
rea de registros
56 57 58 59 60 61 62 63

Posiciones
32-55 reservadas
24
16
8
0

25
17
9
1

26 27
18 19
10 11
2 3

28
20
12
4

29
21
13
5

30
22
14
6

31
23
15
7

Fig. 3.13 rea de registros de propsito general

Los registros situados entre la posicin 0 y 7 estn implementadas fsicamente en las direcciones
00:0000H a 00:001FH. Estas 32 posiciones de memoria constituyen un rea dentro del espacio de
memoria denominada banco de registros, similar a la que poseen los microcontroladores de la familia
MCS-51. Hay en total 4 bancos de registros de 8 posiciones cada uno, que aparecen representados en
la figura 3.14.

rea de registros

rea de memoria

63

FF:FFFFH

8
0 1 2 3 4 5 6 7

0 1 2 3 4 5 6 7

Bancos de registros

00:0020H
18H

1FH

Banco 3

10H

17H

Banco 2

08H

0FH

Banco 1

00H

07H

Banco 0

Fig. 3.15 Ubicacin de las localizaciones 0 7 del rea de registros

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

52

Al igual que ocurre en la familia MCS-51, slo uno de los cuatro bancos es accesible a travs de los
registros. El banco accesible o activo se selecciona a travs de los bits RS0 y RS1 del registro de
estado PSW (tabla 3.6).
Tabla 3.6 Seleccin del banco de registros

Banco
Banco 0
Banco 1
Banco 2
Banco 3

Rango de
direcciones
00H-07H
08H-0FH
10H-17H
18H-1FH

Bits de seleccin de banco


RS1
RS0
0
0
0
1
1
0
1
1

Despus de hacer un reset del microcontrolador, el banco activo por defecto es el banco cero, ya que
los bits RS1 y RS0 se ponen a cero. Para cambiar de banco de registro se debe modificar el valor de
los bits RS1 y RS0 mediante la instruccin adecuada.
El rea de registros tiene la particularidad de que permite acceder a la informacin contenida en ella a
nivel de byte, 16 bits (Word) y 32 bits (Dword), lo cual facilita la tarea de los compiladores de C para
esta familia. No todos los registros del rea de registros son accesibles de las tres formas indicadas: las
localizaciones que son accesibles a nivel de byte son las que van de la cero a la 15. Para identificar un
registro al cual se accede a nivel de byte, se utiliza la letra R seguida del nmero de la localizacin
correspondiente (figura 3.16). Por ejemplo, si se desea escribir el byte 5BH en la localizacin 9 se
debe utilizar el nombre R9 para hacer referencia a esta localizacin:
MOV R9,#5BH
Slo el rango de localizaciones de la 0 a la 31 es accesible a nivel de Word. Un registro tipo Word est
formado por dos localizaciones y se identifica con las letras WR seguido del nmero de la localizacin
de menor peso que interviene en dicho registro. Por ejemplo, el registro WR2 est formado por las
localizaciones 2 y 3. En la figura 3.16 estn indicados todos los registros Word disponibles.
Todas las localizaciones del rea de registros son accesibles a nivel de Dword. Un Dword est
formado por cuatro localizaciones y se identifica con las letras DR y el nmero de la localizacin de
menor peso que interviene en el registro Dword. Por ejemplo, el registro DR28 est formado por las
localizaciones 28, 29, 30 y 31. En la figura 3.16 se indican todos los registros Dwords posibles.
Existen 4 registros del rea de registros que por motivos de compatibilidad con los microcontroladores
de la familia MCS-51 poseen una funcin especfica. Estos registros son:
- R10 es el registro B.
- R11 es el registro acumulador (ACC o A).
- DR56 es el registro puntero de datos extendido, DPX.
- DR60 es el registro puntero de pila extendido, SPX.
Los registros R10, R11, y algunas localizaciones de los registros DR56 y DR60, son accesibles
tambin a travs del rea de registros de funcin especfica (SFR).

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

53

Una de las mejoras que tiene la familia MCS-251 respecto a la MCS-51, es que cualquiera de sus
registros de tipo byte, del R0 al R15, puede realizar la funcin del acumulador en las instrucciones
aritmticas y lgicas, lo que evita el cuello de botella que el acumulador supone para la MCS-51.
En las instrucciones de la familia MCS-51 el registro acumulador era el principal registro en
transferencias y operaciones aritmticas y lgicas. En cambio en la familia MCS-251 cualquier
registro, del R0 al R15, puede realizar la tarea de acumulador. Por lo tanto, el acumulador no tiene, en
esta familia, la importancia que posee en la familia MCS-51.
El puntero de datos extendido DPX est ubicado en el registro DR56 (figura 3.16). Los tres bytes de
menor peso del DPX (DPL, DPH y DPXL) son accesibles tambin a travs del rea SFR. Los registros
DPL y DPH forman el puntero de datos DPTR de 16 bits. En la familia MCS-51 este registro se
emplea de forma nica para acceder a la memoria externa de datos; sin embargo, para la familia MCS251 el acceso a la memoria externa o interna se puede hacer mediante cualquier registro de tipo Word
o Dword. El registro DPXL ubicado en la localizacin 57 del rea de registros, permite seleccionar la
regin de memoria (00:-FF:) a la que se desea acceder a travs del puntero de datos extendido.
Registro byte

R8 R9 R10 R11R12 R13 R14 R15


R0 R1 R2 R3 R4 R5 R6 R7

rea de registros
56 57 58 59 60 61 62 63

Registro word

Localizaciones
32-55 reservadas
24
16
8
0

25
17
9
1

26 27
18 19
10 11
2 3

28
20
12
4

29
21
13
5

30
22
14
6

31
23
15
7

WR24
WR16
WR8
WR0

WR26
WR18
WR10
WR2

WR28
WR20
WR12
WR4

WR30
WR22
WR14
WR6

Registro dword
DR56
DR60
0 1 2 3 4 5 6 7
Bancos de registros

DR24
DR16
DR8
DR0

DR28
DR20
DR12
DR4

Fig. 3.16 Posibilidades de acceso al rea de registros

El registro Dword DR60 es el puntero de datos extendido, SPX (figura 3.17). El byte de la
localizacin 63 es el puntero de pila, SP, de la familia MCS-51. EL byte de la localizacin 62 es la
parte alta del puntero de pila, SPH. Estos dos bytes controlan el funcionamiento de la pila, que en la
familia MCS-251 puede tener una dimensin mxima de 64 kbytes correspondientes a la regin 00: de
memoria.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

54

rea de registros

Area SFR

Parte alta del puntero de pila


Puntero de pila
SPH
60

61

SPH

S:BEH

SP

S:81H

DPXL

S:84H

DPH

S:83H

DPL

S:82H

SP

62

63

DR60 = Puntero extendido de pila, SPX


Parte baja del puntero extendido de datos
Parte alta del puntero de pila
Parte baja del puntero de datos

56

DPXL

DPH

57

58

DPL
59

DR56 = Puntero extendido de datos, DPX

S:F0H

ACC

S:E0H

ACC

R10, Registro B; R11, registro acumulador


Fig. 3.17 Registros dedicados y su correspondencia en el rea de registros SFR

3.4.3 rea de registros de funcin especfica SFR


La mayora de los registros del rea de registros de funcin especfica (SFR) estn vinculados a la
programacin de los perifricos de la familia MCS-251. En la tabla 3.7 aparecen los registros del rea
SFR junto con el valor que adquieren cuando se realiza un reset del microcontrolador.
Las direcciones del rea SFR que no estn ocupadas por registros (zonas sombreadas en la tabla 3.7)
no estn implementadas, por lo que no se pueden utilizar. Al rea SFR slo se puede acceder a nivel
de bit o byte, pero no a nivel de Word o Dword.
En la tabla 3.8 se indican los distintos registros del rea SFR, junto con la direccin y una pequea
descripcin de la funcin que realizan.

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

55

Tabla 3.7 Registros del rea SFR y sus valores de reset


0/8
F8
F0

D8
D0
C8
C0
B8
B0
A8
A0
98
90
88
80

2/A
CCAP0H
xxxxxxxx

3/B
CCAP1H
xxxxxxxx

4/C
CCAP2H
xxxxxxxx

5/D
CCAP3H
xxxxxxxx

6/E
CCAP4H
xxxxxxxx

7/F
FF

B
00000000

E8
E0

1/9
CH
00000000

F7
CL
00000000

ACC
00000000
CCON
00x00000
PSW
00000000
T2CON
00000000
IPL0
x0000000
P3
11111111
IE0
00000000
P2
11111111
SCON
00000000
P1
11111111
TCON
00000000
P0
11111111
0/8

CCAP0L
xxxxxxxx

CCAP1L
xxxxxxxx

CCAP2L
xxxxxxxx

CCAP3L
xxxxxxxx

CCAP4L
xxxxxxxx

EF
E7

CMOD
00xxx000
PSW1
00000000
T2MOD
xxxxxx00

CCAPM0
x0000000

CCAPM1
x0000000

CCAPM2
x0000000

CCAPM3
x0000000

CCAPM4
x0000000

DF
D7

RCAP2L
00000000

RCAP2H
00000000

TL2
00000000

TH2
00000000

SADEN
00000000

CF
C7
BF

SPH
00000000
IPH0
x0000000

SADDR
00000000

AF
WDTRS
xxxxxxxx

A7

SBUF
xxxxxxxx

9F
97

TMOD
00000000
SP
00000111
1/9

TL0
00000000
DPL
00000000
2/A

TL1
00000000
DPH
00000000
3/B

TH0
00000000
DPXL
00000001
4/C

TH1
00000000

5/D

8F

6/E

PCON
00xx0000
7/F

Tabla 3.8 Registros del rea SFR


Mnemnico
Registros
ACC
B
PSW
PSW1
SP
SPH
DPTR
DPL
DPH
DPXL
PCON
IE0
IPH0
IPL0

B7

Nombre
bsicos
Acumulador
Registro B
Registro de estado (Program Status Word)
Registro de estado 1
Parte baja del puntero de pila (Stack Pointer)
Parte alta del puntero de pila
Puntero de datos (Data Pointer)
Parte baja del DPTR
Parte alta del DPTR
Parte baja del puntero extendido de datos
Registro de control de potencia (Power Control)
Registro de habilitacin de interrupciones
Parte alta del registro de prioridad de interrupciones
Parte baja del registro de prioridad de interrupciones

Los autores, 2001; Edicions UPC, 2001.

Direccin
S:E0H
S:F0H
S:D0H
S:D1H
S:81H
S:BEH
-S:82H
S:83H
S:84H
S:87H
S:A8H
S:B7H
S:B8H

87

Microcontroladores MCS-51 y MCS-251

56
Tabla 3.8 Registros del rea SFR (continuacin)
Mnemnico
Registros
P0
P1
P2
P3
Puerto
SCON
SBUF
SADEN
SADDR
Registros
TL0
TH0
TL1
TL2
TL2
TH2
TCON
TMOD
T2CON
T2MOD
RCAP2L
RCAP2H
WDTRST
Registros
CCON
CMOD
CCAPM0
CCAPM1
CCAPM2
CCAPM3
CCAPM4
CL
CH
CCAP0L
CCAP1L
CCAP2L
CCAP3L
CCAP4L
CCAP0H
CCAP1H
CCAP2H
CCAP3H
CCAP4H

Nombre
de los puertos de entrada/salida
Puerto 0
Puerto 1
Puerto 2
Puerto 3
de comunicacin serie
Registro de control del puerto serie
Registro buffer del puerto serie
Mscara de direcciones esclavo (Slave Address Mask)
Direccin esclavo (Slave Address)
del Watchdog y de los Timer/Counter 0, 1 y 2
Parte baja del Timer/Counter 0
Parte alta del Timer/Counter 0
Parte baja del Timer/Counter 1
Parte alta del Timer/Counter 1
Parte baja del Timer/Counter 2
Parte alta del Timer/Counter 2
Registro de control de los Timer/Counter 0 y 1
Registro de control de modo de los Timer/Counter 0 y 1
Registro de control del Timer/Counter 2
Registro de control de modo del Timer/Counter 2
Byte bajo de captura del Timer/Counter 2
Byte alto de captura del Timer/Counter 2
Registro Watchdog
del array de controladores programables (PCA)
Registro de control del Timer/Counter PCA
Registro de modo del Timer/Counter PCA
Registro modo 0 del Timer/Counter PCA
Registro modo 1 del Timer/Counter PCA
Registro modo 2 del Timer/Counter PCA
Registro modo 3 del Timer/Counter PCA
Registro modo 4 del Timer/Counter PCA
Byte bajo del Timer/Counter del PCA
Byte alto del Timer/Counter del PCA
Byte bajo del mdulo 0 de comparacin/captura del PCA
Byte bajo del mdulo 1 de comparacin/captura del PCA
Byte bajo del mdulo 2 de comparacin/captura del PCA
Byte bajo del mdulo 3 de comparacin/captura del PCA
Byte bajo del mdulo 4 de comparacin/captura del PCA
Byte alto del mdulo 0 de comparacin/captura del PCA
Byte alto del mdulo 1 de comparacin/captura del PCA
Byte alto del mdulo 2 de comparacin/captura del PCA
Byte alto del mdulo 3 de comparacin/captura del PCA
Byte alto del mdulo 4 de comparacin/captura del PCA

Los autores, 2001; Edicions UPC, 2001.

Direccin
S:80H
S:90H
S:A0H
S:B0H
S:98H
S:99H
S:B9H
S:A9H
S:8AH
S:8CH
S:8BH
S:8DH
S:CCH
S:CDH
S:88H
S:89H
S:C8H
S:C9H
S:CAH
S:CBH
S:A6H
S:D8H
S:D9H
S:DAH
S:DBH
S:DCH
S:DDH
S:DEH
S:E9H
S:F9H
S:EAH
S:EBH
S:ECH
S:EDH
S:EEH
S:FAH
S:FBH
S:FCH
S:FDH
S:FEH

3 Arquitectura de las familias MCS-51 y MCS-251

57

3.4.4 Compatibilidad con la arquitectura de la familia MCS-51


Las reas de memoria y los registros de la arquitectura MCS-51 estn contenidos dentro de los
espacios de direcciones de la familia MCS-251, lo que posibilita la compatibilidad con los programas
diseados para la familia MCS-51. En la figura 3.18 se muestra cmo quedan ubicados los espacios de
direcciones de la familia MCS-51 dentro de la arquitectura de la familia MCS-251. Los 64kbytes de
memoria de programa de la familia MCS-51 se corresponden con la regin FF: del rea de memoria de
la familia MCS-251.

rea de memoria (16Mbytes)


rea SFR (512 Bytes)

FFFFH

S:1FFH

Memoria de programa
MCS-51
S:100H

FF:0000H 0000H

80H

SFRs MCS-51

FFH
S:07FH

S:000H

02:0000H
FFFFH

Memoria externa de datos


MCS-51

rea de registros (64 Bytes)


63

01:0000H 0000H

8
FFH

Memoria interna de datos


MCS-51
00:0000H 00H

Reg. MCS-51
0

Fig. 3.18 Correspondencia de espacios de direcciones entre la familia MCS-51 y la MCS-251

Los 64kbytes de la memoria de datos externa se ubican en la regin de memoria especificada por el
registro DPXL. Se puede acceder a este registro a travs de la localizacin 57 o a travs de la
direccin S:084H del rea SFR. El valor que adquiere por defecto este registro despus de hacer un
reset es el 01:, como se muestra en la figura 3.18, por lo que inicialmente la memoria externa de datos
est ubicada en la regin 01:. La memoria externa de datos se puede reubicar en otra regin
programando adecuadamente el registro DPXL.
Los 256 bytes de memoria RAM interna de la familia MCS-51 estn ubicados en las direcciones del
rea de memoria 00:0000H-00:00FFH.
Los 128 bytes del rea SFR de la familia MCS-51 estn ubicados dentro de los 512 bytes del rea SFR
de la familia MCS-251 a partir de la direccin S:080H, como se muestra en la figura 3.18, para
mantener la compatibilidad con la familia MCS-251.
Los registros de trabajo R0-R7 de la familia MCS-51, estn ubicados en los 32 primeros bytes del rea
de memoria de la familia MCS-251 para mantener la compatibilidad.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

58

3.5 Configuracin de la serie 8XC251Sx


Una de las caractersticas ms interesantes de la familia de microcontroladores MCS-251 es la
posibilidad de configurar ciertas prestaciones de su funcionamiento para adaptarlo a las exigencias
especficas de la aplicacin, lo que proporciona al usuario una gran flexibilidad en el diseo. Las
opciones de configuracin abarcan diferentes categoras:
[
[
[

Interfaz con la memoria externa.


Modos de obtencin del cdigo de operacin.
Seleccin de los bytes guardados en la pila por una interrupcin.

Reubicacin de los 8kbytes de memoria de lectura interna en la regin 00: para aquellas versiones que
disponen de 16kbytes de memoria interna de tipo ROM/OTPROM/EPROM.
Los bytes utilizados para configurar los microcontroladores de la serie 8XC251Sx son el UCONFIG0,
en la direccin FF:FFF8H, y el UCONFIG1, en la direccin FF:FFF9H (figura 3.19).

UCONFIG0
----

/WSA1 /WSA0 /XALE

RD1

RD0

/PAGE

SRC

/WSA1,0 : Control de insercin de estados de espera para memoria externa


/XALE : Activacin de la seal ALE extendida
RD1,0 : Seleccin del nmero de lneas del bus externo de direcciones
/PAGE : Seleccin de modo paginado o no paginado
SRC :
Seleccin de modo fuente o modo binario

UCONFIG1
----

----

----

INTR

WSB

/WSB1 /WSB0 /EMAP

INTR :
Seleccin de bytes almacenados en la pila por una interrupcin
WSB :
Activacin de estado de espera en accesos a memoria externa
/WSB1,0 : Control de insercin de estados de espera para memoria externa
/EMAP : Reubicacin de la memoria de lectura interna en la regin 00:
Fig. 3.19 Bytes de configuracin UCONFIG0 y UCONFIG1

Para los dispositivos que incorporan memoria ROM/OTPROM/EPROM interna, la informacin sobre
la configuracin se almacena en memoria no volatil en estas direcciones. Para aquellas versiones de
microcontrolador que no disponen de memoria ROM/OTPROM/EPROM interna la configuracin se
almacena en memoria externa en las direcciones indicadas.

3.5.1 Configuracin del acceso a la memoria externa


Existen distintas opciones que permiten configurar el acceso a la memoria externa de forma ms
adecuada a la aplicacin que se est diseando:

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

1.
2.
3.
4.

59

La ubicacin del bus de datos en el puerto cero (modo no paginado) o el puerto 2


(modo paginado).
El nmero de lneas del bus de direcciones externo (16, 17 o 18).
Las regiones de memoria asignadas a las seales de control de lectura /RD y /PSEN.
Los estados de espera en el acceso a la memoria externa (0, 1, 2 3 estados de espera).

La ubicacin de cierta cantidad de memoria de programa interna en la regin 00:.

3.5.1.1 Modos paginado y no paginado


Con respecto a la ubicacin del bus de datos, se puede elegir entre dos posibilidades: modo paginado o
modo no paginado, utilizando el bit /PAGE (bit 1 de la localizacin UCONFIG0).
En el modo no paginado (/PAGE = 1) el bus de datos est ubicado en el puerto cero, al igual que en
los microcontroladores de la familia MCS-51. Por tanto, este modo es el adecuado para aplicaciones
donde se requiera compatibilidad a nivel de hardware con la familia MCS-51.
En el modo paginado (/PAGE = 0) el bus de datos est ubicado en el puerto dos, lo que permite, bajo
ciertas condiciones, reducir el tiempo de acceso a la memoria externa. En este modo se puede leer un
cdigo de operacin en tan slo 2 ciclos de reloj, en lugar de los cuatro ciclos necesarios en el modo
no paginado.

3.5.1.2 Nmero de lneas del bus de direcciones


Los bits RD y RD1 (bits 2 y 3 de la localizacin UCONFIG0) permiten seleccionar el nmero de
lneas de bus de direcciones externas y el rango de direcciones controlado por las seales de lectura
/RD y /PSEN y la seal de escritura /WR.
En la tabla 3.9 se muestran las distintas posibilidades de configuracin con respecto a los bits RD0 y
RD1.
RD1:0 = 00 (18 lneas de bus de direcciones)
Si se programan los bits RD1 y RD0 a cero lgico se obtiene una configuracin de 18 lneas de bus
externo de direcciones, lo que permite direccionar un total de 256kbytes de posiciones de memoria
externas, que es la mxima cantidad de memoria que pueden direccionar los microcontroladores de la
serie 8XC251Sx. Las 16 primeras lneas del bus de direcciones (de la A0 a la A15) estn soportadas
por los puertos P0 y P2, la lnea A16 del bus de direcciones est ubicada en el canal P3.7 y la lnea de
mayor peso, A17, en el canal P1.7. Con esta configuracin se utilizan dos seales para controlar el
acceso ala memoria externa:
[ /PSEN: controla las operaciones de lectura de la memoria externa para cualquier direccin (de
la 00:0000H a la FF:FFFFH).
[ /WR: controla las operaciones de escritura de la memoria externa para cualquier direccin (de
la 00:0000H a la FF:FFFFH).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

60

RD1:0 = 01 (17 lneas de bus de direcciones)


Si se programan los bits RD1 y RD0 con los valores 0 y 1 respectivamente, se obtiene 17 lneas de bus
externo de direcciones: las 16 primeras lneas, A0-A15, implementadas mediante los puertos P0 y P2,
y la lnea A16 implementada con el canal P3.7. Con esta configuracin se pueden direccionar hasta
128kbytes de memoria externa. Las seales que controlan la lectura y escritura en la memoria externa
son las mismas que para la configuracin RD1:0 = 00.
RD1:0 = 10 (16 lneas de bus de direcciones)
La configuracin RD1 =1 RD0 = 0 permite tener un total de 16 lneas de bus de direcciones, de la A0
a la A15, implementadas con los puertos P0 y P2. Esta configuracin permite direccionar hasta
64kbytes de memoria externa. Las seales de control de lectura y escritura son las mismas que en las
dos configuraciones anteriores.
RD1:0 = 11 (16 lneas de bus de direcciones)
Con esta configuracin se tienen slo 16 lneas de bus externo de direcciones, implementadas en los
puertos P0 y P2. Esta es la nica configuracin que mantiene la compatibilidad con la familia MCS-51
y para ello dispone de tres seales de control de acceso a la memoria externa (como en la familia
MCS-51):
[ /PSEN: seal de control de lectura en la memoria externa para las regiones FC:, FD:, FE: y FF:.
[ /RD: seal de control de lectura en la memoria externa para las regiones 00:, 01:, 02: y 03:.
[ /WR: seal de control de escritura en la memoria externa para las regiones 00:, 01:, 02: y 03:.
Tabla 3.9 Seleccin de seales de control para los posibles valores de RD1, RD0

RD1 RD0 P1.7/CEX/A17 P3.7/RD/A16


00
01
10
11

A17
P1.7/CEX4
P1.7/CEX4
P1.7/CEX4

A16
A16
P3.7
/RD

Direcciones asociadas a las seales de control


PSEN
RD
WR
Todas
A16
Todas
Todas
A16
Todas
Todas
P3.7
Todas
] 80:0000H
7F:FFFFH
7F:FFFFH

3.5.1.3 Estados de espera en el acceso a la memoria externa


Los estados de espera permiten alargar los ciclos de acceso a la memoria externa. Esto es necesario
cuando la memoria externa a la que accede el microcontrolador no es suficientemente rpida. Cada
estado de espera alarga la duracin del ciclo 2 perodos de reloj y es posible incluir hasta un mximo
de 3 estados de espera.
Se puede especificar la insercin de estados de espera de forma independiente en la regin 01:, lo cual
permite ubicar una memoria lenta en esa regin manteniendo, sin embargo, un acceso rpido en el
resto de regiones.
Existen 4 bits para especificar los estados de espera: los bits WSA0 y WSA1 (bits 5 y 6 de la
localizacin UCONFIG0), que permiten definir estados de espera para todas las regiones excepto la
01:, y los bits WSB0 y WSB1 (bits 1 y 2 de la localizacin UCONFIG1), que permiten definir estados

Los autores, 2001; Edicions UPC, 2001.

3 Arquitectura de las familias MCS-51 y MCS-251

61

de espera en la regin 01:.


En la tabla 3.10 se muestran los estados de espera que se introducen en funcin de los valores que
adquieren los bits antes indicados.
Tabla 3.10 Configuracin de los estados de espera

Regiones
00: 02: 03: FC: FD: FE: FF:

01:

WSA1 WSA0
0
0
0
1
1
0
1
1
WSB1 WSB0
0
0
0
1
1
0
1
1

Estados de espera
3
2
1
0
3
2
1
0

Por otra parte poniendo a cero el bit /XALE (bit 4 de la localizacin UCONFIG0) se alarga el tiempo
durante el cual la seal ALE est activa.
3.5.1.4 Configuracin del cdigo de operacin
Con respecto a los modos de asignacin de cdigos de operacin a las instrucciones, el usuario puede
seleccionar dos posibles modos: el modo binario que genera un cdigo de operacin compatible con
los microcontroladores de la familia MCS-51, y el modo fuente, que es especfico de la familia MCS251.
Cuando se configura el microcontrolador se debe elegir necesariamente uno de los dos modos. Se debe
elegir aquel modo que permita obtener el cdigo ms eficiente. En principio los microcontroladores de
la familia MCS-251 tienen dos tipos de instrucciones:
[
[

Instrucciones originales de la familia MCS-51.


Instrucciones exclusivas de la familia MCS-251.

En general, las instrucciones originales de la familia MCS-51 generan un cdigo ms eficiente en


modo binario; en cambio las instrucciones exclusivas de la familia MCS-251 generan un cdigo ms
eficiente en modo fuente.
A modo de ejemplo se presenta en la tabla 3.11 varias instrucciones (de la familia MCS-51 y MCS251) con sus correspondientes cdigos de operacin obtenidos en los dos modos.
Tabla 3.11 Ejemplos de cdigos de operacin en modo binario y modo fuente

Instruccin

Familia

DEC A
SUBB A,R4
SUB R4,R4

MCS-51
MCS-51
MCS-251

Cdigo de operacin
Modo binario
Modo fuente
14H
14H
9CH
A5 9CH
A5 9CH
9CH

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

62

3.5.1.5 Reubicacin de memoria de programa en la regin 00:


Para las versiones del microcontrolador 8XC251Sx con 16kbytes de memoria interna, el usuario tiene
la posibilidad de reubicar 8kbytes en la regin 00:, lo cual permite un acceso ms rpido a tablas de
constantes almacenadas en esta memoria usando direccionamiento directo.
Para poder realizar esta reubicacin ser necesario poner a cero el bit /EMAP (bit 0 de la localizacin
UCONFIG1). Con este bit a cero, los 8kbytes de memoria de programa interna que van de la direccin
FF:2000H a la direccin FF:3FFFH quedan reubicados en las direcciones 00:E000H-00:FFFFH
(figura 3.20).

Regin 00:

Regin FF:

00:FFFFH
8 Kbytes

FF:FFFFH
EMAP = 0

00:E000H
00:DFFFH

FF:4000H
FF:3FFFH
8 Kbytes
FF:2000H
FF:1FFFH
8 Kbytes
FF:0000H

00:0000H
Fig. 3.20 Reubicacin de memoria de programa en la regin 00:

3.5.1.6 Bytes cargados en la pila por una interrupcin


En cuanto a los bytes que se cargan en la pila por una interrupcin, el usuario puede elegir entre dos
opciones: una de ellas permite cargar en la pila los dos primeros bytes del contador de programa (PC);
la otra opcin carga los tres bytes del contador de programa y el registro de estado PSW1.
El bit INTR (bit 4 de la localizacin UCONFIG1) configura una de las dos opciones. Si se pone este
bit a cero se almacenan en la pila slo dos bytes del contador de programa. Si se pone a 1 se almacena
todo el contador de programa ms el registro de estado.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

63

4 Programacin de las familias MCS-51 y MCS-251


4.1 Introduccin
El desarrollo de los programas o del software necesarios para una aplicacin determinada de un
sistema basado en un microcontrolador es una fase importante del diseo de este sistema; por ello, el
programador debe tener un slido conocimiento del conjunto de instrucciones que incorpora el
microcontrolador y de las tcnicas de programacin que se pueden desarrollar con las instrucciones
disponibles. La finalizacin del programa est sujeta a un largo proceso de depuracin y de continuas
modificaciones y mejoras realizadas durante el proceso de diseo. En el caso de aplicaciones sencillas,
normalmente el programa tiene un tamao reducido, por lo que se realiza en lenguaje ensamblador
mediante el conjunto de instrucciones que proporciona el fabricante del microcontrolador. No
obstante, cuando la aplicacin resulta complicada y requiere de un tamao mayor de cdigo de
programa, se suele combinar el uso de la programacin en bajo nivel (lenguaje ensamblador) con el
empleo de la programacin en alto nivel (como pueden ser los lenguajes PLM o C).
La realizacin del programa en lenguaje ensamblador permite obtener un tamao de cdigo de
programa mucho ms compacto, eficiente y que usa mejor los recursos disponibles por el
microcontrolador; sin embargo, el desarrollo del programa realizado en este lenguaje resulta ser ms
tedioso y complicado de seguir por cualquier otro programador. Por otra parte, mediante el lenguaje
en alto nivel, la complejidad y el tiempo de realizacin del programa resultan menores y ms fcil de
entender por otros programadores, aunque el cdigo generado por estos lenguajes es de mayor tamao
y de menos eficiencia. En consecuencia, los programas complejos y complicados se suelen hacer en
lenguaje de alto nivel, combinando ste con pequeas rutinas en lenguaje ensamblador, encargadas de
realizar la gestin de aquellas partes del hardware del sistema que necesitan de un cdigo ms
optimizado, eficiente y compacto. Mientras que los programas que resultan ser reducidos y ms
sencillos se suelen realizar en nicamente en lenguaje ensamblador.
En este captulo se explicarn los distintos modos de direccionamiento y se describir el conjunto
completo de instrucciones en lenguaje ensamblador soportados por las familias de microcontroladores
MCS-51 y MCS-251 de Intel. Por ser la familia MCS-251 una versin mejorada de la familia MCS-51
y, adems, ser absolutamente compatible con sta a nivel de encapsulado y de programacin, el
desarrollo de este captulo se orientar primero a la programacin de la familia MCS-51, para luego
proceder a la explicacin de las mejoras introducidas en la familia MCS-251, con las que se superan
las limitaciones en el uso de los registros y en el direccionamiento de la familia MCS-51.
En la elaboracin de un programa en lenguaje ensamblador, el programador debe conocer las tcnicas
ms comunes que se emplean en este lenguaje, y que resultan imprescindibles para llevar a cabo con

Los autores, 2001; Edicions UPC, 2001.

64

Microcontroladores MCS-51 y MCS-251

xito el programa que soluciona una aplicacin. Entre estas tcnicas se encuentran las siguientes:
operaciones aritmticas con ms de un byte, operaciones aritmticas con signo, tratamiento de tablas,
conversin de datos en diferentes formatos (hexadecimal-BCD, hexadecimal-siete segmentos, BCDhexadecimal, etc.), realizacin de rutinas de interrupcin, etc. La exposicin de estas tcnicas de
programacin, junto con los ejemplos y ejercicios propuestos, son el tema central del siguiente
captulo. Por tanto, este captulo, junto con el siguiente, constituye el ncleo fundamental que todo
programador que desee trabajar con las familias de microcontroladores MCS-51 y MCS-251 debe
considerar y conocer.

4.2 Tipos de direccionamiento


Una de las caractersticas de los microprocesadores o microcontroladores, en general, consiste en los
distintos modos de direccionamiento que pueden soportar para llevar a cabo la ejecucin de cualquier
instruccin del conjunto de instrucciones disponible. El modo de direccionamiento determina la forma
de especificar el origen o el destino de los operandos de una instruccin, ya sean stos de tipo bit,
byte, Word o double word. En concreto, las familias de microcontroladores MCS-51 y MCS-251
disponen de siete modos de direccionamiento distintos:
- Direccionamiento inmediato.
- Direccionamiento directo.
- Direccionamiento por registro.
- Direccionamiento indirecto.
- Direccionamiento por desplazamiento o indexado.
- Direccionamiento relativo.
- Direccionamiento de bit.
Tabla 4.1 Notacin utilizada para la descripcin del direccionamiento y del conjunto de instrucciones comunes
a la MCS-51 y a la MCS-251

Mnemnico
dir8
dir16
dir11
#dato
#dato16
Rn
@Ri
bit
rel

Descripcin
Direccin directa de 8 bits. Posiciones de memoria interna o rea de SFR.
Direccin 16 bits de memoria empleada en direccionamientos directos.
Direccin de 11 bits.
Constante de 8 bits.
Constante de 16 bits.
Registro de tipo byte, R0 a R7.
Direccionamiento indirecto a travs de R0 R1. Se accede a las posiciones (00HFFH) de la memoria interna.
Bit de la memoria RAM interna o de un registro del rea de SFR accesible bit a bit.
Direccin de salto. Puede ser un salto incondicional, condicional o de llamada a
subrutina.

A lo largo de este captulo se emplear una notacin especfica que es til para realizar la descripcin
del direccionamiento y de las instrucciones de las familias de microcontroladores. La tabla 4.1 muestra
la notacin utilizada para la familia MCS-51 mientras que la tabla 4.2 muestra la notacin empleada
para la familia MCS-251.
Esta notacin tambin es vlida para la familia MCS-251. No obstante, como en la MCS-251 se

Los autores, 2001; Edicions UPC, 2001.

65

4 Programacin de las familias MCS-51 y MCS-251

pueden emplear operandos del tipo byte Word y double word, la notacin para esta familia aumenta en
cantidad, lo que se muestra en las tablas 4.2 y 4.3.
En estas tablas se indica si la notacin es propia de las instrucciones de la familia MCS-51, de las
nuevas instrucciones que incorpora la familia MCS-251 o de ambas.
Tabla 4.2 Notacin especfica utilizada en las instrucciones de la familia MCS-251

Notacin de los
registros
Rm
Rms
Rmd
WRj
WRjd
WRjs
@WRj+dis16

Descripcin

Registro tipo byte de R0 a R15.


Registro fuente.
Registro destino.
Registro de tipo Word WR0, WR2, ., WR30.
Registro destino.
Registro fuente.
Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente por un
registro de tipo Word (WR0-WR30) mas un valor de desplazamiento de 16 bits.
Registro de tipo DR (Double Word) DR0, DR4, , DR28 DR56, DR60.
DRk,
Registro de destino.
DRkd
Registro fuente.
DRks
Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente por un
@DRk+dis24
registro de doble palabra (DR0, DR4, , DR56, DR60) ms un valor de
desplazamiento de 24 bits.
Dato inmediato
Descripcin
#0dato16
Constante de 32 bits que se direcciona de forma inmediata en una instruccin. Los
#1dato16
16 bits de mayor peso del dato deben ser 0 (#0dato16) 1 (#1dato16).
#short
Constante igual a 1, 2 4, direccionada de forma inmediata en una instruccin.
Direcciones
Descripcin
rel
Direccin relativa de 8 bits expresada en complemento a 2.
addr11
Direccin de 11 bits.
addr16
Direccin de 16 bits.
addr24
Direccin de 24 bits. Permite acceder a cualquier direccin de los 16Mbyte del
espacio de memoria de la familia MCS-251.

4.2.1 Direccionamiento inmediato


En el direccionamiento inmediato el operando de la instruccin es una constante que est definida
dentro de la propia instruccin. Este tipo de direccionamiento es comn para las familias MCS-51 y
MCS-251. Para la familia MCS-51 el tamao de la constante est limitado a 8 bits (1 byte), mientras
que para la familia MCS-251 la constante puede ser de 8 bits (byte), 16 bits (Word) o 32 bits (Double
word).
En la familia MCS-51, por ejemplo, la instruccin MOV A, #09H pone el dato 09H mediante
direccionamiento inmediato en el acumulador. Esta instruccin est formada por un cdigo mquina
de 2 bytes: 74H y 09H. El byte 09H es el operando mientras que el byte 74H es el cdigo de
operacin de la instruccin. El dato 09H est dentro de la propia instruccin; por tanto, es un

Los autores, 2001; Edicions UPC, 2001.

66

Microcontroladores MCS-51 y MCS-251

operando que la CPU coloca de forma directa en el acumulador, sin necesidad de obtenerlo de la
memoria o de algn registro del microcontrolador. Este tipo de instruccin se usa de manera frecuente
a lo largo de los programas y, especialmente, en la inicializacin de stos, puesto que se hace preciso
asignar valores iniciales a las variables definidas por el programador.
El direccionamiento inmediato tambin se emplea en aquellas instrucciones que operan nicamente
con algn registro determinado del rea SFR, como puede ser el acumulador o el registro DPTR. Un
ejemplo de ello es la instruccin INC A que incrementa en una unidad el acumulador. El cdigo
mquina de esta instruccin est formado solamente por el byte 04H; luego en este mismo byte de
cdigo est contenida la direccin del acumulador dentro del rea SFR como operando.
Para la familia MCS-251 las constantes de 32 bits (Dword) deben tener todos los 16 bits de mayor
peso a cero (indicado como #0dato16), o bien, todos a uno (indicado como #1dato16). Las
instrucciones de incremento o decremento de esta familia, adems, incorporan un dato inmediato, que
especifica el valor del tamao del incremento o decremento. Este valor puede ser 1, 2 4. Como
ejemplo, las siguientes instrucciones de la familia MCS-51 utilizan el direccionamiento inmediato:
INC A
MOV A, #255;
1

MOV A, #0FFH
MOV A, #11111111b
MOV DPTR, #1969H

;Incrementa el contenido del acumulador


;Coloca el nmero 255 en el acumulador
;Coloca 0FFH en el acumulador
;Coloca 0FFH (en binario) en el acumulador
;Coloca 1969H en el DPTR

Anlogamente, para la familia MCS-251 las siguientes instrucciones utilizan direccionamiento


inmediato:
INC WR0,#02H
MOV DR4,#FFFF2350H

;Incrementa el registro WR0 en dos unidades


;Carga el dato FFFF2350H en el registro DR4

4.2.2 Direccionamiento directo


En el direccionamiento directo la ubicacin del operando se especifica de forma directa mediante una
direccin de ocho bits. Para la familia MCS-51, con este direccionamiento, es posible leer y escribir
sobre cualquier direccin especificada, que puede corresponder con un byte de la memoria RAM
interna (00H-7FH) o con un registro del rea SFR.
Ejemplo:
ADD A, 3BH

MOV A, 80H

; Suma el contenido del acumulador (A) con el contenido de la posicin de


; memoria 3BH. El resultado se deja en el acumulador (A):
;
A (A) + (3BH)
; Transfiere el contenido del puerto P0 (posicin 80H en el rea de SFR) al
; acumulador:
A (80H)

H indica que el nmero es hexadecimal y b que es uno binario. Cuando no lleva indicativo es un nmero decimal.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

67

Para la familia MCS-251, el direccionamiento directo puede utilizar direcciones de 8 bits o de 16 bits.
Con las direcciones de 8 bits se puede acceder a la memoria RAM interna (00H-7FH), para leer o
escribir un byte o un Word, y tambin se puede acceder al rea de registros de funcin especfica SFR
(S:080H-S:1FFH), para leer o escribir un byte nicamente. Con las direcciones de 16 bits se pueden
realizar accesos de tipo byte o Word en memoria (00:0000H-00:FFFFH).
Ejemplo:
MOV R7,S:090H
MOV R0,1200H

; Carga en el registro R7 el contenido del puerto P2 (direccin S:090H


; del rea SFR):
R7 (S:090H)
; Transfiere el contenido de la direccin de memoria 1200H en el
2
; registro R0:
R0 (1200H)

4.2.3 Direccionamiento por registro


En el direccionamiento por registro el dato que maneja la instruccin est incluido en uno de los
registros del microcontrolador. En el direccionamiento por registro de la familia MCS-51 se utilizan
los registros de propsito general, R0-R7, para almacenar el operando de la instruccin. A cada uno
de estos registros se puede acceder mediante su nombre (direccionamiento por registro), o mediante su
direccin (direccionamiento directo).
Cuando una instruccin incluye un registro por su nombre, ste se codifica dentro de la propia
instruccin mediante 3 bits, lo que permite compactar el cdigo generado por la instruccin. Por el
contrario, cuando se accede al registro mediante su direccin, la instruccin debe contener la direccin
del registro, por lo que el tamao de la instruccin se incrementa en 1 byte, que corresponde con la
direccin dada para el registro. En consecuencia, es conveniente, en la medida de lo posible, utilizar
los registros por su nombre, debido a que se obtiene as un cdigo ms compacto y eficiente.
En el siguiente ejemplo las instrucciones de la familia MCS-51 transfieren el contenido del
acumulador al registro R0, y luego el contenido del registro R7 al acumulador. Mediante los bits RS0
y RS1 del registro PSW se selecciona, de forma previa, el banco 2 de registros, por lo que los registros
empleados, R0 y R7, se corresponden con las posiciones 10H y 17H de la memoria interna,
respectivamente.
Ejemplo:
MOV PSW,#10H
MOV R0, A
ADD A, R7

; Se selecciona el banco 2 de registros


; Transfiere el contenido del acumulador (A) al registro R0
;
R0 (A)
; Suma el contenido del registro R7 con el acumulador.
;
A (A) + (R7)

Cuando un registro o una direccin se encuentra entre parntesis se refiere al contenido. (A) es el contenido del
acumulador. (3B) es el contenido de la posicin de memoria 3BH. Las operaciones que se deben realizar se muestran a la
derecha de la flecha (), y a la izquierda se indica sobre qu elemento se deja el resultado.

Los autores, 2001; Edicions UPC, 2001.

68

Microcontroladores MCS-51 y MCS-251

En cuanto a los registros del rea de registros de funcin especfica (SFR), existen algunas
instrucciones que son propias de registros especficos, como es el caso del acumulador. Se puede
acceder al acumulador de forma directa o mediante su direccin en el SFR (posicin E0H), de manera
que las siguientes instrucciones son equivalentes:
MOV A, #10H
MOV 0E0H, #10H

; Almacena la constante 10H en el acumulador


; Almacena la constante 10H en la posicin E0H del SFR

La primera instruccin tiene un cdigo mquina de 2 bytes, 74H y 10H, mientras que la segunda tiene
un cdigo mquina de 3 bytes, 75H, E0H y 10H. En la primera instruccin la direccin del
acumulador est incluida en el cdigo de operacin, mientras que en la segunda instruccin para
acceder al acumulador se debe especificar su direccin, incrementando, por tanto, en un byte el
tamao de sta. Debe resaltarse que la familia de microcontroladores MCS-51 optimiza el tiempo de
ejecucin y el tamao de cdigo de las instrucciones que utilizan de forma inmediata el acumulador A,
el registro B y los registros del banco de registros seleccionado.
En las instrucciones de la familia MCS-251 que soportan direccionamiento por registro, el operando
puede estar ubicado en un registro tipo byte (del R0 al R15), en un registro tipo Word (WR0, WR2,,
WR30), o en un registro tipo Dword (DR0, DR4, , DR28, DR56, DR60).
Ejemplo:
MOV R4, R8
MOV WR4,WR6

; Transfiere el contenido del registro R8 al registro R4


;
R4 R8
; Transfiere el contenido del registro WR6 al registro WR4
;
WR4 WR6

4.2.4 Direccionamiento indirecto


En el direccionamiento indirecto la direccin del operando viene especificada por el contenido de un
registro del microcontrolador. La familia MCS-51 utiliza el direccionamiento indirecto mediante los
registros R0, R1, SP (puntero de la pila o Stack Pointer) y DPTR (puntero externo de datos o Data
Pointer de 16 bits). De esta manera, se puede acceder tanto a la memoria interna como a la memoria
externa de datos del microcontrolador. Debe notarse que como identificador de este tipo de
direccionamiento se emplea el smbolo @, que debe ir delante del registro.
A la memoria interna de datos (00H-FFH), se accede nicamente con los registros R0 y R1, aunque
tambin se puede acceder mediante el puntero de la pila SP o Stack Pointer. Para acceder a la
memoria externa de datos se pueden emplear los registros DPTR, R0 y R1.
Los microcontroladores de la familia MCS-251 soportan el mismo modo de direccionamiento
indirecto que el que se ha descrito para la familia MCS-51, pero, adems, tambin pueden emplear
registros de tipo Word y Dword. Mediante los registros del tipo Word (@WRj, j=0, 2, 4, , 30) se
puede acceder a las direcciones de memoria comprendidas en el margen (00:0000H-00:FFFFH).
Mediante los registros del tipo Dword (@DRk, k = 0, 4, 8, , 28, 56 y 60) se puede acceder a los
16Mbytes del espacio de memoria; para ello se debe cargar previamente en los 24 bits de menor peso
del registro la direccin a la que se desea acceder, teniendo a cero los 8 bits de mayor peso.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

69

Ejemplo:
MOV R0, #30H
ADD A, @R0

; Suma el contenido del acumulador (A) con el contenido de la posicin


; de memoria apuntada por el registro R0. Si (R0)=30H, la operacin es:
;
A (A) + 30H
MOV R1, #30H
; Pone 70H en la posicin de memoria interna 30H
MOV @R1, #70H
;
(30H) #70H
MOV DPTR, #1000H ; Transfiere el contenido de la posicin de memoria apuntada por DPTR
MOVX A, @DPTR
; al acumulador (A). Con MOVX se accede a la memoria externa de
; datos, activando un ciclo de lectura de dato en la memoria externa:
;
A (1000H)
MOV WR0, #2000H ;Carga en el registro R15 el contenido de la posicin de memoria
ADD R15, @WR0
; apuntada por el registro WR0. Si (WR0)=2000H, la operacin es:
;
R15 (2000H)
MOV DR4, #15000H ;Almacena el valor A0H en la posicin de memoria
MOV R4,#00H
;
FF:5000H #A0H
MOV @DR4, #A0H

4.2.5 Direccionamiento por desplazamiento o indexado


En el direccionamiento por desplazamiento o indexado el operando se obtiene mediante una direccin,
cuyo valor es el resultado de la suma de una direccin base con un valor relativo de desplazamiento
respecto de esta direccin base. El direccionamiento indexado est especialmente concebido para
facilitar la lectura y el movimiento de tablas de datos en un programa.
Para la familia MCS-51, en este direccionamiento se utilizan los registros DPTR y PC (contador de
programa) como punteros que apuntan a la direccin inicial o base de la tabla de datos a tratar. La
posicin concreta del dato dentro de la tabla, se obtiene mediante la suma del contenido del
acumulador con la direccin base de la tabla; de esta forma el acumulador contiene la posicin relativa
del dato dentro de la tabla. Se debe destacar que las nicas instrucciones que tienen este tipo de
direccionamiento son la instruccin MOVC y la instruccin JMP, por lo que su uso est limitado a
la lectura de tablas fijas en la memoria de cdigo de programas (MOVC) y a realizar saltos indexados
de ejecucin del programa.
Como ejemplo se plantea la lectura de una tabla de datos situada en la posicin 1000H de la memoria
de programas, que se utiliza para realizar la conversin de datos expresados en formato BCD al
formato siete segmentos, necesario para la posterior visualizacin en un dgito de siete segmentos.
Ejemplo:
MOV DPTR, #1000H
MOV A, #05H
MOVC A, @A+DPTR

; Pone en el DPTR la direccin de la tabla


; Pone en A el dato numrico 5, para realizar
; la conversin a siete segmentos

En este ejemplo el registro DPTR toma el valor 1000H y el acumulador el valor 05H, luego la
instruccin MOVC realiza una lectura de un byte en la posicin 1005H de la memoria de
programas, que resulta de sumar el DPTR con el acumulador (1000H + 05H). La tabla existente en la
memoria de programas tiene la siguiente forma:

Los autores, 2001; Edicions UPC, 2001.

70

Microcontroladores MCS-51 y MCS-251

Direccin
1001H
1000H
1002H
1003H
1004H
1005H
1006H
1007H
1008H
1009H

Memoria
C0H
F9H
A4H
B0H
99H
92H
82H
F8H
80H
90H

A=0
A=1
A=2
A=3
A=4
A=5
A=6
A=7
A=8
A=9

En la familia MCS-251 se utiliza este tipo de direccionamiento para realizar transferencias de datos
entre el rea de registros y la memoria. El desplazamiento puede ser un valor de 16 bits que, sumado al
contenido de un registro tipo Word (@WRj+dis16), dar como resultado la direccin de memoria a
que se debe acceder. De esta forma se puede acceder a los primeros 64kbytes del espacio de memoria.
El valor del desplazamiento puede ser positivo o negativo y se representa en complemento a 2 (-32768
< dis16 < 32767). Si el resultado de la suma excede los 16 bits slo se toman los 16 primeros para
determinar la direccin de acceso.
El desplazamiento puede ser tambin un valor de 24 bits (@DRk+dis24); en este caso el registro base
debe ser un registro Dword (DR0, DR4, DR8, , DR28, DR56 o DR60). Con este tipo de
desplazamiento es posible acceder de forma indirecta a los 16Mbytes del espacio de memoria de la
MCS-251.
Ejemplo:
MOV WR0, #3000H
ADD R4, @WR0+0030H
MOV DR8, #02000H
MOV R0, @DR8+0080H

; Carga en el registro R4 el contenido de la posicin de memoria


; apuntada por el registro WR0+30H. Si (WR0)=3000H, la
; operacin es:
R4 (3030H)
; Almacena en el registro R0 el contenido de la posicin de
; memoria apuntada por el registro DR8+80H. Si (DR8)=2000H,
; la operacin es:
R0 (2080H)

A modo de resumen, en las tablas 4.3 y 4.4 se presentan las distintas posibilidades de
direccionamiento inmediato, directo, por registro, indirecto e indexado de las familias MCS-51 y
MCS-251 respectivamente.

4.2.6 Direccionamiento de bit


Este tipo de direccionamiento se caracteriza por permitir direccionar bits individualmente. El
direccionamiento de bit tan slo se puede emplear en algunos registros del rea SFR o en las
posiciones de la memoria RAM interna a que puede accederse bit a bit. La tabla 4.5 muestra, para las
familias MCS-51 y MCS-251, las posiciones de la RAM interna y del rea del SFR a las que puede
accederse de esta manera.

Los autores, 2001; Edicions UPC, 2001.

71

4 Programacin de las familias MCS-51 y MCS-251


Tabla 4.3 Direccionamiento por registro, inmediato, directo e indirecto para la MCS-51

Direcciona- Rango de direcciones


miento
del operando
Registro
Inmediato
Directo

Indirecto

Notacin

Comentarios

00H - 1FH
R0-R7 (Banco seleccionado con PSW).
El operando est en la #dato=#00-#FFH
instruccin
00H - 7FH
dir8=00H-7FH
RAM interna.
SFRs
dir8=80H-FFH o nombre de un registro Direcciones del rea SFR.
del SFR.
00H - FFH
@R0, @R1
RAM interna o memoria de
datos externa (MOVX).
0000H - FFFFH
@DPTR, @A+DPTR
Acceso a la memoria externa
de datos (MOVX).
0000H - FFFFH
@A+DPTR, @A+PC
Acceso a la memoria de
programa (MOVC).

Tabla 4.4 Direccionamiento por registro, inmediato, directo, indirecto y por desplazamiento para la MCS-251

Modo de
direccionamiento
Registro

Inmediato 2 bits

Rango de
direcciones del
operando

Notacin

00:0000H-00:001FH R0-R15,WR0-WR30,
(R0-R7, WR0-WR3, DR0-DR28,
DR56-DR60
DR0,DR2) (1)
#short=1, 2 4

Comentarios
R0-R7, WR0-WR6, DR0 y DR6 estn
ubicados en el banco de registros
seleccionado por RS0 y RS1.
Se utiliza slo en instrucciones de
incremento y decremento.

Inmediato 8 bits
Inmediato 16 bits

#dato8=#00H-#FFH
#dato16=#0000H#FFFFH
Directo
00:0000H-00:007FH dir8=00:0000HRAM interna
00:007FH
direcciones de 8 bits SFRs
dir8=S:080H-S:1FFH Direcciones del rea SFRs.
o el nombre del
registro
Directo direcciones 00:0000H-00:FFFFH dir16=00:0000Hde 16 bits
00:FFFFH
Indirecto direcciones 00:0000H-00:FFFFH @WR0-@WR30
de 16 bits
Indirecto direcciones 00:0000H@DR0-@DR30,
Los 8 bits de mayor peso del registro
de 24 bits
FF:FFFFH
@DR56, @DR60
DRk deben ser 00H.
El desplazamiento se expresa en
Desplazamiento con 00:0000H-00:FFFFH @WRj+dis16 =
complemento a 2.
@WR0+0H hasta
direcciones de 16
@WR30+FFFFH
bits
El desplazamiento se expresa en
@DRk+dis24 =
Desplazamiento con 00:0000Hcomplemento a 2. Los 8 bits de mayor
@DR0+0H hasta
direcciones de 24 FF:FFFFH
peso del registro DRk debe ser 00H.
@DR56+FFFFH,
bits
@DR56+(0H-FFFFH),
@DR60+(0H-FFFFH)
(1) Estos registros estn implementados en el espacio de memoria

Los autores, 2001; Edicions UPC, 2001.

72

Microcontroladores MCS-51 y MCS-251

Tabla 4.5 reas de direccionamiento de bit

Arquitectura
MCS-51

RAM interna
20H-2FH

MCS-251

20H-7FH

Localizaciones de bit
SFR
Registros SFR cuya direccin acaba con 0 8:
80H, 88H, 90H, 98H, ,F8H.
Todos los registros SFR definidos.

Tal y como se observa en esta tabla, el rango de bits que se puede direccionar a nivel de bit en la
familia MCS-251 es mucho mayor que en la familia MCS-51.
Para la familia MCS-51 existen dos maneras de direccionar los bits de la memoria RAM interna:
i) Especificando la direccin donde est ubicado el bit junto con la posicin del bit dentro del
byte que lo soporta.
ii) Especificando la direccin propia del bit perteneciente al rango 00H-7FH.
La figura 4.1 muestra de forma grfica estas dos posibles formas. Por ejemplo, el bit nmero 3 de la
posicin de memoria 21H se puede referir como 21H.3, o bien como 0BH.

Memoria RAM interna

Memoria RAM interna

2FH 7

2FH

7FH 7EH 7DH 7CH 7BH 7AH 79H 78H

21H 7

21H

0FH 0EH D0H 0CH 0BH 0AH 09H 08H

20H 7

20H

07H 06H 05H 04H 03H 02H 01H 00H

Fig. 4.1 Direccionamiento de bits de la memoria RAM interna en la familia MCS-51

La familia MCS-51 dispone tambin de dos formas de direccionar, a nivel de bit, los bits del rea
SFR:
i) Especificando la direccin o nombre del registro donde est ubicado el bit junto con la
posicin del bit dentro del byte que lo soporta.
ii) Especificando la direccin propia del bit perteneciente al rango 80H-FFH.
Por ejemplo, la direccin del bit 3 del acumulador se puede escribir como ACC.3, E0H.3 o E3H. En la
familia MCS-251, la direccin de un bit se indica mediante la direccin donde est ubicado el bit y la
posicin que ocupa dentro del byte que lo contiene. Para el caso de bits ubicados en el rea SFR, en
lugar de la direccin se puede indicar, si se desea, el nombre del registro.

Los autores, 2001; Edicions UPC, 2001.

73

4 Programacin de las familias MCS-51 y MCS-251

Area SFR

Area SFR
F8H
F0H
E8H
E0H
D8H
D0H
C8H
C0H
B8H
B0H
A8H
A0H
98H
90H
88H
80H

B
ACC
PSW
T2CON
IP
P3
IE
P2
SCON
P1
TCON
P0

FFH
B
F7H
EFH
ACC E7H
DFH
PSW D7H
T2CON CFH
C7H
IP
BFH
P3
B7H
IE
AFH
P2
A7H
SCON 9FH
P1
97H
TCON 8FH
P0
87H

FEH
F6H
EEH
E6H
DEH
D6H
CEH
C6H
BEH
B6H
AEH
A6H
9EH
96H
8EH
86H

FDH
F5H
EDH
E5H
DDH
D5H
CDH
C5H
BDH
B5H
ADH
A5H
9DH
95H
8DH
85H

FCH
F4H
ECH
E4H
DCH
D4H
CCH
C4H
BCH
B4H
ACH
A4H
9CH
94H
8CH
84H

FBH
F3H
EBH
E3H
DBH
D3H
CBH
C3H
BBH
B3H
ABH
A3H
9BH
93H
8BH
83H

FAH
F2H
EAH
E2H
DAH
D2H
CAH
C2H
BAH
B2H
AAH
A2H
9AH
92H
8AH
82H

F9H
F1H
E9H
E1H
D9H
D1H
C9H
C1H
B9H
B1H
A9H
A1H
99H
91H
89H
81H

F8H
F0H
E8H
E0H
D8H
D0H
C8H
C0H
B8H
B0H
A8H
A0H
98H
90H
88H
80H

Fig. 4.2 Direccionamiento de bit en el rea SFR de la familia MCS-51

4.2.7 Direccionamiento relativo


El direccionamiento relativo est vinculado a las instrucciones de salto. En este tipo de
direccionamiento la instruccin incluye un valor que indica la magnitud del salto a realizar. El valor es
de 8 bits y est expresado en complemento a 2, de forma que la magnitud del salto es de -128
posiciones de memoria hacia atrs o de 127 posiciones de memoria hacia delante, empezando a contar
a partir de la direccin donde est ubicado el primer byte de la siguiente instruccin.
Ejemplo:
SJMP rel
JC rel

;Realiza un salto incondicional cuya magnitud se indica con el valor de 8 bits rel
;Realiza un salto condicional donde la condicin de salto es CY=1

4.3 Conjunto de instrucciones de la familia MCS-51 y MCS-251


Una de las caractersticas ms importantes de cualquier microcontrolador o microprocesador reside en
el conjunto de instrucciones que incorpora. El conjunto de instrucciones es el nico cdigo que la
CPU es capaz de interpretar, decodificar y ejecutar. El desarrollo de programas para un
microprocesador determinado requiere que el programador tenga un conocimiento completo de su
conjunto de instrucciones y del modelo de programacin que permite ste; adems de un conocimiento
detallado del tamao en cdigo mquina y del tiempo de ejecucin de cada una de las instrucciones,
puesto que este conocimiento es vital en la determinacin de los tiempos de ejecucin de las rutinas
generadas y para la reduccin, en la medida de lo posible, del tamao del cdigo generado por el
programador.
Mediante el conjunto de instrucciones de las familias MCS-51 y MCS-251 es posible realizar
operaciones aritmticas y lgicas, como suma, resta, multiplicacin, divisin, and, or, or-exclusiva y

Los autores, 2001; Edicions UPC, 2001.

74

Microcontroladores MCS-51 y MCS-251

negacin, con datos de 8 bits. Tambin se pueden ejecutar instrucciones de intercambio de bytes, de
salto, etc. Esta familia, adems, est concebida para poder operar a nivel de bit, por lo que puede
realizar operaciones lgicas y de movimiento con bits.
El conjunto de instrucciones de la familia de microcontroladores MCS-251 incorpora nuevas
instrucciones que aprovechan las ventajas de la arquitectura de este microcontrolador manteniendo la
compatibilidad con el conjunto de instrucciones de la familia MCS-51. Muchas de las nuevas
instrucciones pueden operar con datos de 8 bits, 16 bits o 32 bits. Esta capacidad incrementa la
eficiencia y facilidad de programacin de los microcontroladores de la familia MCS-251 en un
lenguaje de alto nivel como el C.
El conjunto de instrucciones que ejecutan las familias de microcontroladores MCS-51 y MCS-251 se
dividen en tres grupos: instrucciones que operan con datos de 8 bits y con datos de 16 y 32 bits (slo
para la familia MCS-251), instrucciones que operan con bits e instrucciones de control que permiten
realizar saltos en la ejecucin del programa.
Para poder comprender de forma correcta tanto el conjunto de instrucciones como los ejemplos
empleados a lo largo de este captulo, es preciso explicar previamente el formato de las instrucciones,
algunas directivas comunes del programa ensamblador y la definicin y uso de etiquetas dentro de un
programa.

4.3.1 Formato de una instruccin


En lenguaje ensamblador una instruccin puede esta formada por cuatro partes diferentes: una
etiqueta, un mnemnico o palabra clave que identifica el tipo de instruccin, un operando fuente, y un
operando destino. En las instrucciones las etiquetas son opcionales y son definidas por el
programador. Las etiquetas se utilizan para distinguir una instruccin dentro del programa realizado, y
para que la instruccin a la que se adjunta una etiqueta se pueda referenciar en cualquier instruccin de
salto del programa. Para ello, cuando el programa ensamblador detecta una etiqueta le asigna, de
manera automtica, la direccin de la instruccin a la que hace referencia. De esta forma, cualquier
instruccin que contenga una direccin de salto puede emplear cualquier etiqueta definida dentro del
programa.
A modo de ejemplo se proponen las siguientes instrucciones:
Etiqueta

Mnemnico

1er Operando

2 Operando

Retardo:

MOV

R0

#70H

Suma:

ADD

70H

MOV

20H

@R0

INC

DJNZ

R2

Bucle

SJMP

Salir

PUSH

Los autores, 2001; Edicions UPC, 2001.

75

4 Programacin de las familias MCS-51 y MCS-251

Por ejemplo, en el caso de una etiqueta, la instruccin DJNZ R2, Bucle decrementa en una unidad el
registro R2 y, si R2 es distinto de cero, realiza un salto a la direccin donde se halla la etiqueta
Bucle; es decir, si se cumple la condicin R2 [ 0, se coloca la direccin asignada a Bucle en el
contador de programa PC, de forma que la CPU pasa a ejecutar el programa por la direccin que
representa la etiqueta.
Las etiquetas tambin se emplean para referenciar el inicio de una subrutina. Las etiquetas pueden
definirse tan slo una vez dentro de un mismo programa, sin embargo, pueden usarse tantas veces
como sea necesario cuando se referencian por otra instruccin. El programador tiene libertad de
emplear cualquier conjunto de caracteres para definir una etiqueta, salvo las limitaciones propias del
programa ensamblador, por lo que se debe evitar la duplicacin de etiquetas con el mismo nombre
dentro de un mismo programa. Las etiquetas se deben colocar en el extremo izquierdo de cada lnea de
programa, y se debe guardar al menos un espacio entre la etiqueta y el resto de la instruccin. La
etiqueta debe terminarse con dos puntos o sin ninguna puntuacin, dependiendo del programa
ensamblador que se utilice. En este libro se emplean dos puntos al final de cada etiqueta a lo largo de
toda la obra.
El mnemnico de una instruccin es una palabra abreviada que indica la funcin que realiza la
instruccin, como MOV, ADD, INC, JMP, etc. La familia MCS-51 dispone de 111 instrucciones en
total y la familia MCS-251 de 213 instrucciones.
Los operandos pueden ser registros, constantes o posiciones de memoria accedidas mediante los
distintos tipos de direccionamientos que soporta el microcontrolador. Un operando tambin puede ser
una direccin de salto en el caso de instrucciones de salto condicional o incondicional. En el caso de
que una instruccin contenga dos operandos, se introduce una coma para hacer de separacin entre
ambos. Las instrucciones operan de varias maneras diferentes sobre los operandos. Existen
instrucciones con un nico operando donde ste constituye el origen y el destino de la operacin,
como INC A, que primero lee el contenido del acumulador, lo incrementa en una unidad y deja el
resultado en el mismo acumulador. Otras instrucciones operan con ambos operandos, dejando el
resultado de la operacin en el primer operando: por ejemplo, la instruccin ADD A, #70H suma el
contenido del acumulador con la constante 70H, dejando el resultado en el mismo acumulador.
Por ltimo, si el programador quiere poner comentarios en una instruccin, basta con que aada un
punto y coma al final de la instruccin, colocando el comentario a continuacin. Por ejemplo:
MOV R0, A

; Salva el contenido del acumulador en R0

4.3.2 Directivas de ensamblador


En la realizacin de un programa en lenguaje ensamblador, es habitual utilizar una serie de directivas
que no generan cdigo mquina y que ayudan al programa ensamblador a dirigir y controlar el proceso
de ensamblado. De todas las directivas existentes en lenguaje ensamblador se describirn slo las que
se suelen emplear con mayor frecuencia. Las directivas principales son: ORG, EQU, DB y END.

Los autores, 2001; Edicions UPC, 2001.

76

Microcontroladores MCS-51 y MCS-251

La directiva ORG es una abreviacin de la palabra inglesa origin y permite especificar el valor de la
direccin de memoria donde va a ser cargada la prxima instruccin o dato a ensamblar, o sea,
inicializa el contador de programa con el valor que acompaa a la directiva. La sintaxis de esta
directiva es la siguiente:
ORG

<direccin>

Esta directiva pone en el contador de programa, PC, la direccin indicada por <direccin>, de manera
que la primera instruccin en ejecutarse es la primera que aparece tras esta directiva.
La directiva ORG puede aparecer en cualquier parte del programa y el programador puede colocar
tantas como crea conveniente. Esta directiva se puede utilizar para asignar una direccin concreta a
una subrutina, para definir una posicin determinada de salto o para asignar una direccin a una tabla
de datos.
Ejemplo:
ORG 0100H
Inicio: MOV R0,#09H
ADD A, R0

;Determina la direccin 0100H


;Pone 09H en R0
;Suma el acumulador con el valor 09H

A la etiqueta Inicio, al ir precedida de la directiva ORG, el ensamblador le asignar el valor de


0100H, de forma que las dos instrucciones del programa irn almacenadas en memoria a partir de la
direccin 0100H. Si se desea asignar una direccin determinada a una subrutina basta con emplear la
directiva ORG al inicio de la misma. Por ejemplo, si se desea que la subrutina de conversin de
nmeros binarios a nmeros en formato ASCII comience en la direccin 2400H, se debe incluir la
siguiente directiva:
ORG 2400H
Bin_ASCII: MOV A, R0
........
RET

; Salva R0 en A
; Fin de la subrutina

La directiva EQU se utiliza para asignar a un smbolo alfanumrico un valor numrico o un string
(cadena de caracteres). Es importante resaltar que esta directiva no reserva espacio en memoria, por lo
que los valores que se definan mediante EQU los mantiene el ensamblador y los emplea en el proceso
de ensamblado. La sintaxis de la directiva EQU es la siguiente:
<smbolo>

EQU

<expresin>

Ejemplo:
num
rea
reg

EQU 20H
EQU num*num
EQU A

; Asigna el valor 20H al smbolo num


; rea de un cuadrado
; Asigna al smbolo reg el nombre de un registro

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

77

La directiva DB reserva espacios de memoria de 8 bits (1 byte) a partir de la ubicacin de dicha


directiva. El espacio reservado se llena con el valor, la lista de datos o la expresin que acompaa a la
directiva. Si el dato que acompaa a la directiva va entre comillas se interpreta como constantes
alfanumricas (caracteres), y el espacio reservado se carga con el cdigo ASCII asociado a dichas
constantes. Si el dato no va entrecomillado se interpreta como valor numrico. Los caracteres
numricos deben ir acompaados por comas. La sintaxis de esta directiva es:
DB [[<espacio de datos>]] <dato> [ [[<espacio reservado>]]<dato>]
Ejemplo:
DB Ensamblador ; Reserva e inicializa 11 bytes con los valores de cdigo ASCII
; correspondientes a los caracteres de la palabra ensamblador
DB 1,2
; Reserva 2 bytes. Al primer byte le asigna el nmero 1 y al segundo el 2
DB [10]1,[10]2
; Reserva 20 bytes. Los 10 primeros se ponen a 1 y los 10 restantes a 2
La directiva END indica el final del programa, por tanto, siempre es la ltima sentencia de un
programa. El ensamblador termina el proceso de ensamblado cuando se encuentra con esta directiva.

4.3.3 Los registros de estado PSW y PSW1


La funcin de los registros de estado en las familias de microcontroladores MCS-51 y MCS-251 es
diversa: incorporan bits o flags (banderas) que proporcionan informacin acerca del resultado de las
operaciones aritmticas y lgicas realizadas por el microcontrolador, incorporan los bits de seleccin
del banco de registros e incorporan bits cuya funcin es definible por el usuario.
Los microcontroladores de la familia MCS-51 disponen de un nico registro de estado: el Program
Status Word (PWS), mientras que los microcontroladores de la familia MCS-251 disponen de este
mismo registro ms otro registro de estado adicional: el PSW1.
Los registros PSW y PSW1 contienen cuatro tipos diferentes de bits:
- Los bits CY, AC, OV, N y Z, que son indicadores que se ponen a 1 lgico
automticamente como respuesta al resultado de una operacin.
- El bit P que indica la paridad del acumulador.
- Los bits RS0 y RS1, cuyo estado determina la seleccin del banco de registros activo
que ubica los registros R0-R7.
- Los bits F0 y UD, que son bits de propsito general definibles por el usuario.
En las tablas 4.6 y 4.7 estn representados el contenido de los bits de los registros de estado PSW y
PSW1. Hay que indicar que cinco bits del registro PSW estn repetidos en el registro PSW1. En estos
casos la funcin de estos bits es la misma.
En la tabla 4.8 se muestran las instrucciones cuya ejecucin afecta al valor de los bits CY, AC, OV, N
y Z.

Los autores, 2001; Edicions UPC, 2001.

78

Microcontroladores MCS-51 y MCS-251

Tabla 4.6 Registro PSW

Nmero
Mnemnico
Funcin
de bit
7
CY o C
Bit de acarreo. CY se pone a 1 lgico si en las instrucciones de suma o
resta se produce acarreo en el bit sptimo. CY tambin est afectado por las
instrucciones RRC, RLC, MUL, DA, JBC y CJNE.
6
AC
Bit de acarreo auxiliar. AC se activa si en las instrucciones de suma o resta
se produce acarreo en el bit tercero.
5
F0
Bit F0. Este bit es de propsito general y definible por el usuario.
4:3
RS1:0
Estos dos bits permiten seleccionar el banco de registros que soportan los
registros R0-R7.
RS1 RS0 Banco Direcciones
0
0
0
00H - 07H
0
1
1
08H - 0FH
1
0
2
10H - 17H
1
1
3
18H - 1FH
2
OV
Bit de rebasamiento o overflow. Este bit se pone a 1 lgico cuando se
produce un error de overflow en operaciones de suma o resta. OV tambin
se pone a 1 cuando el resultado de una multiplicacin es mayor de un byte,
o cuando se realiza una divisin por cero.
1
UD
Bit UD. Este bit es de propsito general y definible por el usuario.
0
P
Bit de paridad. Indica la paridad del acumulador. Se pone a 1 cuando el
nmero de unos de A es impar, y a 0 cuando es par.
Tabla 4.7 Registro PSW1

Nmero
Mnemnico
Funcin
de bit
7
CY o C
Bit de acarreo.
Su funcin es idntica a la del bit CY del PSW.
6
AC
Bit de acarreo auxiliar.
Funcin idntica a la del bit AC del PSW.
5
N
Bit negativo.
Este indicador se pone a 1 cuando el resultado de la ltima operacin
aritmtica o lgica es negativo, o sea, cuando el bit de mayor peso del
resultado est a 1. En caso contrario se pone a cero.
4:3
RS1:0
Tienen la misma funcin que en el registro PSW.
2
OV
Bit de rebasamiento.
Tiene la misma funcin que en el registro PSW.
1
Z
Bit de cero.
Se pone a 1 cuando el resultado de la ltima operacin aritmtica o lgica
es cero. En caso contrario, el bit Z se pone a cero.
0
Bit reservado.

Los autores, 2001; Edicions UPC, 2001.

79

4 Programacin de las familias MCS-51 y MCS-251


Tabla 4.8 Activacin de los bits de los registros PSW y PSW1

Tipo de
instruccin
Aritmtica

Lgica
Control de
programa

Instruccin
ADD, ADDC, SUB, SUBB, CMP
INC, DEC
MUL, DIV
DA
ANL, ORL, XRL, CLR A, CPL A, RL, RRL, SWAP
RLC, RRC, SRL, SLL, SRA
CJNE
DJNE

CY
X
0
X
X
X

Bits afectados
OV AC N
X
X
X
X
X
X
X
X
X
X
X

Z
X
X
X
X
X
X
X
X

4.3.4 Instrucciones aritmticas


Las instrucciones aritmticas de la familia MCS-51, se pueden diferenciar en tres tipos distintos: a)
instrucciones de suma y resta, b) instrucciones de incremento y decremento, y c) instrucciones de
multiplicacin y divisin. La familia MCS-251 tiene los mismo tipos de instrucciones aritmticas que
la MCS-51, y un tipo ms: la instruccin de comparacin. La tabla 4.9 muestra el conjunto de
instrucciones aritmticas que posee la familia MCS-51, donde se realiza una breve descripcin de cada
instruccin, mientras que la tabla 4.10 muestra las instrucciones aritmticas para la MCS-251. Se debe
tener en cuenta que todas las instrucciones de la MCS-51 tambin se pueden ejecutar en la familia
MCS-251, puesto que es compatible, en modo binario, con la MCS-51.
Tabla 4.9 Instrucciones aritmticas comunes a las familias MCS-51 y MCS-251

Mnemnico

<dest>,<src>

INC
MUL

A, Rn
A, dir8
A, @Ri
A, #dato
A, Rn
A, dir8
A, @Ri
A, #dato
A
Rn
dir8
@Ri
DPTR
AB

DIV

AB

DA

ADD

ADDC
SUBB

INC
DEC

Descripcin
A=A+ Rn
A=A+ (dir8)
A=A+ (@Ri )
A=A+ dato
A=A ] Rn
A=A ] (dir8) ] C
A=A ] (@Ri ) ] C
A=A ] dato ] C
A=A ] 1
Rn=Rn ] 1
(dir8) = (dir8) ] 1
(@Ri ) = (@Ri ) ] 1
DPTR = DPTR +1
Multiplica A por B.
Deja el byte alto del resultado en B y el byte bajo en A
Divide A por B
Deja el cociente en A y el resto en B
Ajuste decimal del acumulador

Los autores, 2001; Edicions UPC, 2001.

80

Microcontroladores MCS-51 y MCS-251

Tabla 4.10 Instrucciones aritmticas de la familia MCS-251

Mnemnico
ADD
SUB

CMP

INC
DEC
MUL
DIV

<dest>,<src>
Rmd,Rms
WRjd,WRjs
DRkd,DRks
Rm,#dato
WRj,#dato16
DRk,#0dato16
Rm,dir8
WRj,dir8
Rm,dir16
WRj,dir16
Rm,@WRj
Rm,@DRk
Rmd,Rms
WRjd,WRjs
DRkd,DRks
Rm,#dato
WRj,#dato16
DRk,#0dato16
DRk,#1dato16
Rm,dir8
WRj,dir8
Rm,dir16
WRj,dir16
Rm,@WRj
Rm,@DRk
Rm,#short
WRj,#short
DRj,#short
Rmd,Rms
WRjd,WRjs
Rmd,Rms
WRjd,WRjs

Descripcin
Rmd = Rmd Rms
WRjd = WRjd WRjs
DRkd = DRkd DRks
Rm = Rm dato
WRj = WRj dato16
DRk = DRk 0dato16
Rm = Rm (dir8)
WRj = WRj (dir8, dir8+1)
Rm = Rm (dir16)
WRj = WRj (dir16,dir16+1)
Rm = Rm (@WRj)
Rm = Rm (@DRk)
Rmd - Rms
WRjd - WRjs
DRkd - DRks
Rm - #dato
WRj - #dato16
DRk - #0dato16
DRk - #1dato16
Rm - (dir8)
WRj - (dir8, dir8+1)
Rm - (dir16)
WRj - (dir16,dir16+1)
Rm - (@WRj)
Rm - (@DRk)
Rn = Rn #short
WRj = Wrj #short
DRj = DRj #short
Multiplica Rmd y Rms
Multiplica WRjd y WRjs
Divide Rmd por Rms
Divide WRjd por WRjs

#short puede ser 1, 2 4.

4.3.4.1 Instrucciones de suma y de resta


En la familia MCS-51, para realizar la suma de dos bytes se pueden emplear dos instrucciones: ADD y
ADDC. La ejecucin de estas instrucciones afecta a los bits de acarreo (CY), de acarreo auxiliar (AC)
y de rebasamiento (OV), que son tiles para detectar determinadas situaciones.
Las instrucciones de suma ponen a 1 lgico el bit CY cuando el resultado de la suma es mayor que
FFH; en caso contrario permanece a 0. En cuanto al bit de acarreo auxiliar, AC, se pone a 1 si en la
suma se produce un acarreo entre el nibble bajo y el nibble alto, es decir, si se produce acarreo entre el
bit 3 y el bit 4.

Los autores, 2001; Edicions UPC, 2001.

81

4 Programacin de las familias MCS-51 y MCS-251

El bit de rebasamiento, OV, es un indicador til cuando se realiza la suma de dos nmeros enteros con
signo en formato de complemento a dos. En este caso, el bit OV se pone a 1 en los siguientes
supuestos:
a) Si la suma de dos nmeros positivos en complemento a dos genera un resultado
negativo. En este caso, el resultado de la suma debe estar comprendido entre 80H y
FFH, de forma que el bit de signo sea igual a 1.
b) Si la suma de dos nmeros negativos en complemento a dos genera un resultado
positivo. En este caso, el resultado de la suma debe estar comprendido entre 00H y 7FH,
de forma que el bit de signo sea igual a 0.
En ambos supuestos el resultado de la suma es errneo, de manera que el bit de OV se pone a 1 para
que el programador pueda considerar este error. En el siguiente ejemplo se suman dos nmeros
positivos y dos nmeros negativos, de manera que se cumplen los supuestos a) y b).
Bit de signo
59H
+ 3AH
93H

C
0

0 101 1001
0 011 1010
1 001 0011

- 59H
-3AH

1 010 0111 (A7H en compl. a 2)


1 100 0110 (C6H en compl. a 2)

C
1 0 110 1101
(6DH)

En este ejemplo se observa cmo en ambos casos el bit de signo del resultado no coincide con el bit de
signo de los operandos, y el bit OV se pone a 1. Esta situacin se da cuando en la suma se produce un
acarreo entre los bits 6 y 7 de los operandos, pero no se produce entre el bit 7 y el bit C. Lo mismo
ocurre cuando el acarreo se da entre el bit 7 y el bit C, pero no entre el bit 6 y el bit 7.
La instruccin ADDC es idntica a la instruccin ADD, salvo que, adems, suma el bit C al resultado.
Con esta instruccin se pueden sumar nmeros enteros con un tamao mayor que 1 byte (precisin
mltiple). Los ejemplos que utilizan esta instruccin se tratarn en el captulo siguiente.
La resta de dos nmeros se realiza mediante la instruccin SUBB. Esta instruccin incluye el bit C en
la resta. El bit de acarreo C se pone a 1 cuando se produce un desbordamiento, de manera que se
puede emplear para realizar la resta con precisin mltiple. El bit de acarreo auxiliar, AC, se pone a 1
al producirse un acarreo entre el nibble bajo y el nibble alto (entre el bit 3 y el bit 4). El bit OV realiza
la misma funcin que en las instrucciones de suma cuando se opera con nmeros en complemento a
dos, de manera que se pone a 1 en los supuestos mencionados anteriormente.
En la familia MCS-251 las instrucciones ADD y SUB permiten sumar y restar operandos de 8, 16 y 32
bits. El resultado de la suma se guarda en la ubicacin del operando destino. La instruccin ADDC es
idntica a la instruccin ADD, salvo que, adems, suma el bit C al resultado. La instruccin SUBB
resta los dos operandos que se especifican en la propia instruccin y, adems, resta el bit de acarreo C.
La ejecucin de las instrucciones de suma y resta afecta, de la misma forma que la indicada para la
familia MCS-51, a los bits del registro de estado CY, OV y AC; no obstante, tambin afecta a los bits
Z y N del registro PSW1.

Los autores, 2001; Edicions UPC, 2001.

82

Microcontroladores MCS-51 y MCS-251

Ejemplo:
ADD A,#3AH

; Suma del contenido del acumulador con el dato 34H

Si se supone que el contenido del acumulador es 59H el resultado de la suma ser:


59H
+ 3AH
93H

C
0

0 101
0 011

1001
1010

1 001

0011

En esta suma el bit de cero Z se pone a cero, puesto que el resultado es distinto de cero, mientras que
el bit de signo N se pone a uno, para indicar con ello que el bit de mayor peso del resultado es 1.

4.3.4.2 Instrucciones de multiplicacin y de divisin


Las instrucciones de multiplicacin (MUL) y divisin (DIV) permiten multiplicar y dividir dos
operandos sin signo. En la familia MCS-51 slo es posible multiplicar o dividir el contenido del
registro A por el contenido del registro B. La instruccin MUL AB realiza la multiplicacin sin signo
del contenido del acumulador con el contenido del registro B, depositando el byte alto del resultado en
el registro B y el byte bajo en el acumulador. El bit de acarreo C se pone siempre a 0 y el bit OV se
pone a 1 slo cuando el resultado es superior a FFH; se pone a 0 en caso contrario.
La instruccin DIV AB realiza la divisin sin signo entre el acumulador y el registro B. Tras la
ejecucin de la instruccin el acumulador contiene el cociente de la divisin y el registro B contiene el
resto de la divisin. El bit de acarreo C se pone siempre a 0. El bit de rebasamiento se activa cuando se
ha producido una divisin por cero. Tras una divisin por cero el valor del cociente y del resto de la
divisin resulta indeterminado.
Para la familia MCS-251 las instrucciones de multiplicacin y de divisin permiten multiplicar o
dividir cualquier par de registros tipo byte o Word. En multiplicaciones de registros de 8 bits el
resultado de 16 bits se guarda en el registro tipo Word que contiene al registro destino. Por ejemplo, el
producto de la instruccin MUL R3,R8 se guardara en el registro Word que contiene al registro R3, o
sea, se guardara en WR2. En el caso de productos entre datos de 16 bits el resultado de 32 bits se
guardara en el registro Dword que contiene al registro Word destino. Por ejemplo, el producto de la
instruccin MUL WR6,WR14 se guardara en el registro DR4 que contiene al registro WR6.
En divisiones de datos de 8 bits el resultado se guarda en el registro Word que contiene al registro
destino. El cociente se guarda en el byte bajo mientras que el resto se guarda en el byte alto. Por
ejemplo, el resultado de la instruccin DIV R5,R0 se guardara en el registro WR4. Concretamente
en R4 se guardara el resto y en R5 el cociente. En divisiones de 16 bits el resultado se guarda en el
registro Dword que contiene al registro Word destino. Por ejemplo, el resultado de la instruccin DIV
WR8,WR16 se guardara en el registro DR8 (en la parte alta el resto y en la parte baja el cociente).

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

83

4.3.4.3 Instrucciones de incremento y decremento


En la familia MCS-51 las instrucciones de incremento y de decremento son INC y DEC,
respectivamente. Estas instrucciones tienen como funcin incrementar o decrementar en una unidad el
operando indicado en la instruccin. Es importante observar cmo el registro DPTR se puede
incrementar directamente mediante la instruccin INC, mientras que no se puede decrementar de la
misma manera, puesto que la instruccin DEC no opera con este registro. La instruccin INC DPTR es
de gran utilidad para la lectura de tablas en memoria externa.
Las instrucciones de incremento y de decremento de la familia MCS-251 permiten, adems,
incrementar o decrementar el contenido de registros tipo byte, Word o Dword en 1, 2 o 4 unidades.
4.3.4.4 Instruccin de comparacin
La instruccin de comparacin CMP es exclusiva de la familia MCS-251 y calcula la diferencia entre
dos operandos. El resultado generado por esta diferencia no se almacena pero s que se activan los
flags CY, OV, AC, N y Z en los registros PSW y PSW1. La utilidad de la instruccin CMP est
relaciona con las instrucciones de salto condicional.

4.3.4.5 Instruccin de ajuste decimal


La instruccin de ajuste decimal, DA A, es til cuando se realizan sumas de nmeros en formato BCD
con el registro acumulador como destino. En el formato BCD cada nibble de un byte representa un
nmero decimal en base 10, por lo que su valor est comprendido entre 0 y 9. Cuando se desean sumar
dos nmeros en formato BCD mediante las instrucciones ADD y ADDC, la suma que realizan es
binaria, de manera que el resultado de sta puede no estar en formato BCD. Por tanto, en el caso de
sumar nmeros en formato BCD, se debe emplear la instruccin DA A, que convierte el resultado de
la suma al formato BCD. Por ejemplo, si se suman los nmeros BCD 19H y 22H mediante la
instruccin ADD, el resultado es 3BH, mientras que el resultado esperado en BCD es 41H.
La instruccin DA A realiza las siguientes operaciones:
- Si los 4 bits bajos del acumulador (nibble bajo) tienen un valor mayor que 9 o si el bit
AC est a 1, le suma el valor 6 a este nibble para hacer la conversin a BCD.
- Si los 4 bits altos del acumulador tienen un valor mayor que 9 o si el bit C est a 1, le
suma el valor 6 a estos bits para hacer la conversin a BCD.
Por tanto, en la suma de los nmeros 19H y 22H en BCD, la instruccin DA suma 06H al acumulador,
dando lugar al resultado de 41H en BCD. La suma de 85H y 25H en BCD, da como resultado el valor
AAH; para ajustar este valor la instruccin DA le suma 66H, por lo que el valor en el acumulador es
de 10H y el bit C est a 1; el resultado final es 110H.

4.3.5 Instrucciones lgicas


La tabla 4.11 muestra la lista de instrucciones lgicas de la familia MCS-51 y la tabla 4.12 muestra las
instrucciones lgicas de la familia MCS-251. Las operaciones lgicas que pueden realizar las familias
MCS-51 y MCS-251 son: AND, OR, XOR y NOT.

Los autores, 2001; Edicions UPC, 2001.

84

Microcontroladores MCS-51 y MCS-251

Tabla 4.11 Instrucciones lgicas comunes a las familias MCS-51 y MCS-251

Mnemnico
ANL
ORL
XRL

CLR
CPL
RL
RLC
RR
RRC
SWAP

<dest>,<src>
A,Rn
A,dir8
A,@Ri
A,#dato
dir8,A
dir8,#dato
A
A
A
A
A
A
A

Descripcin
A = A AND OR XOR Rn
A = A AND OR XOR (dir8)
A = A AND OR XOR (@Ri)
A = A AND OR XOR #dato
(dir8) = (dir8) AND OR XOR A
(dir8) = (dir8) AND OR XOR #dato
A=0
Complementa el acumulador.
Rotacin a la izquierda del acumulador.
Rotacin a la izquierda con acarreo del acumulador.
Rotacin a la derecha del acumulador.
Rotacin a la derecha con acarreo del acumulador.
Intercambia los nibbles del acumulador.

Tabla 4.12 Instrucciones lgicas de la familia MCS-251

Mnemnico
ANL
ORL
XRL

SLL
SRA
SRL

<dest>,<src>
Rmd,Rms
WRjd,WRjs
Rm,#dato
WRj,#dato16
Rm,dir8
WRj,dir8
Rm,dir16
WRj,dir16
Rm,@WRj
Rm,@DRk
Rm
WRj
Rm
WRj
Rm
WRj

Descripcin
Rmd = Rmd AND OR XOR Rms
WRjd = WRjd AND OR XOR WRjs
Rm = Rm AND OR XOR #dato
WRj = WRj AND OR XOR #dato16
Rm = Rm AND OR XOR (dir8)
WRj = WRj AND OR XOR (dir8, dir8+1)
Rm = Rm AND OR XOR (dir16)
WRj = WRj AND OR XOR (dir16, dir16+1)
Rm = Rm AND OR XOR (@WRj)
Rm = Rm AND OR XOR (@DRk)
Desplazamiento lgico a la izquierda de Rm.
Desplazamiento lgico a la izquierda de WRj.
Desplazamiento aritmtico a la derecha de Rm.
Desplazamiento aritmtico a la derecha de WRj.
Desplazamiento lgico a la derecha de Rm.
Desplazamiento lgico a la derecha de WRj.

4.3.5.1 Instrucciones ANL, ORL, XRL y CLP


Las instrucciones lgicas ANL y ORL se pueden utilizar para realizar mscaras, cambiando el estado
de bits especficos de algn registro. Por ejemplo, si se desea forzar a cero, de forma simultnea, los
bits de acarreo CY y de acarreo auxiliar AC del registro de estado PSW, se puede realizar de la
siguiente forma:
ANL A, #00111111b
As slo se afecta a los bits mencionados mientras que se respeta el estado de los restantes bits del
registro. En caso de querer forzar los mismos bits a 1 lgico se debe utilizar la instruccin ORL:
ORL A, #11000000b

Los autores, 2001; Edicions UPC, 2001.

85

4 Programacin de las familias MCS-51 y MCS-251

La instruccin XRL se puede emplear para realizar la comparacin de un registro con una constante
determinada. Por ejemplo, la siguiente instruccin:
XRL A, #19H
pone a cero el acumulador si ste es igual a 19H; en caso contrario el acumulador tendr un valor
distinto de cero. De esta forma es posible realizar comparaciones con constantes numricas, utilizando
el acumulador como indicador de la comparacin.
Por ltimo, la instruccin CPL realiza el complemento de cada uno de los bits del acumulador. Si el
acumulador tiene por valor 35H, la ejecucin de CPL A pone el acumulador al valor CAH.
Las instrucciones adicionales que posee la familia MCS-251 permiten realizar operaciones lgicas
entre cualquier par de registros tipo byte o Word, o bien entre el contenido de un registro tipo byte o
Word y un operando almacenado en la memoria.
4.3.5.2 Instrucciones de rotacin
Las instrucciones de rotacin RL, RR, RLC y RRC desplazan el acumulador 1 bit hacia la izquierda o
hacia la derecha. La instruccin RL A rota el acumulador un bit hacia la izquierda, por lo que el bit
ms significativo (MSB) queda en la posicin del bit menos significativo (LSB). La instruccin RR A
rota el acumulador un bit hacia la derecha; por tanto, el bit menos significativo (LSB) queda en la
posicin del bit ms significativo (MSB). Las instrucciones RLC A y RRC A, efectan el mismo tipo
de rotacin que el descrito, pero incluyendo el valor del bit de acarreo C. La figura 4.3 ilustra de
manera clara el efecto de las rotaciones.
a)

Carry

b)

bit 7

bit 5

bit 6

bit 5

Carry

Fig. 4.3

bit 3

bit 2

bit 1

bit 0

bit 4

bit 3

bit 2

bit 1

bit 0

bit 2

bit 1

bit 0

bit 2

bit 1

bit 0

Acumulador
bit 7

bit 6

bit 5

Carry

bit 4

Acumulador
bit 7

d)

bit 6

Carry

c)

Acumulador

bit 4

bit 3

Acumulador
bit 7

bit 6

bit 5

bit 4

bit 3

a) RL A, b) RR A, c) RLC A, d) RRC A

La familia MCS-251 incorpora, adems, tres instrucciones de desplazamiento que operan con registros
tipo byte y Word. La instruccin de desplazamiento lgico a la izquierda (SLL) desplaza un bit a la
izquierda el contenido del registro indicado en la instruccin reemplazando el bit de menor peso del
registro por un cero. La instruccin de desplazamiento lgico a la derecha (SRL) desplaza un bit a la
derecha el contenido del registro indicado en la instruccin reemplazando el bit de mayor peso del
registro por un cero. El desplazamiento aritmtico a la derecha es similar a la instruccin SRL con la
nica diferencia de que el bit de mayor peso no cambia de valor (figura 4.4).

Los autores, 2001; Edicions UPC, 2001.

86

Microcontroladores MCS-51 y MCS-251

Carry

a)

Rm

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

Carry

Rm

b)

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

bit 7

bit 6

Fig. 4.4

bit 5

bit 4

C
Carry

Rm

c)

bit 0

bit 3

bit 2

bit 1

bit 0

a) SLL Rm, b) SRL Rm, c) SRA Rm

4.3.5.3 Instrucciones SWAP y CLR


La instruccin SWAP A intercambia el valor de los nibbles alto y bajo del acumulador. Por ejemplo,
si el acumulador vale 35H, tras la ejecucin de SWAP A pasa a valer 53H. La instruccin CLR A
pone a cero el contenido del acumulador y ocupa un byte de cdigo.

4.3.6 Instrucciones de transferencia de datos


Las instrucciones de transferencia de datos tienen como funcin copiar un dato de un registro o
posicin de memoria a otro registro o posicin de memoria. Este conjunto de instrucciones incluye la
instruccin MOV, las instrucciones de intercambio y las instrucciones de carga y descarga de la pila.
Tabla 4.13 Instrucciones de transferencia de datos comunes a las familias MCS-51 y MCS-251
Mnemnico
MOV

<dest>,<src>
A,Rn
A,dir8
A,@Ri
A,#dato
Rn,A
Rn,dir8
Rn,#dato
dir8,A
dir8,Rn
dir8,dir8
dir8,@Ri
dir8,#dato
@Ri,A
@Ri,dir8
@Ri,#dato
DPTR,#dato16

Descripcin
A = Rn
A = (dir8)
A = (@Ri)
A = #dato
Rn = A
Rn = (dir8)
Rn = #dato
(dir8) = A
(dir8) = Rn
(dir8) = (dir8)
(dir8) = (@Ri)
(dir8) = #dato
(@Ri) = A
(@Ri) = (dir8)
(@Ri) = #dato
DPTR = #dato16

Los autores, 2001; Edicions UPC, 2001.

87

4 Programacin de las familias MCS-51 y MCS-251

4.3.6.1 La instruccin MOV


La instruccin MOV, Move, (tablas 4.13 y 4.14) es la instruccin ms verstil para realizar
transferencia de datos por los diferentes tipos de direccionamiento que soporta. En la familia MCS-51
las instrucciones MOV transfieren datos de tipo byte entre dos registros o bien entre un registro y una
posicin de memoria (tabla 4.17), mientras que la familia MCS-251 incorpora nuevas instrucciones
MOV que le permiten realizar transferencias de bytes, Words o Dwords entre registros o bien entre
posiciones de memoria y registros (tabla 4.18).
Tabla 4.14 Instrucciones de transferencia de datos de la familia MCS-251
Mnemnico
MOV

<dest>,<src>
Rmd,Rms
WRjd,WRjs
DRkd,DRks
Rm,#dato
WRj,#dato16
DRk,#0dato16
DRk,#1dato16
DRk,dir8
DRk,dir16
Rm,dir8
WRj,dir8
Rm,dir16
WRj,dir16
Rm,@WRj
Rm,@DRk
WRjd,@WRjs
WRj,@DRk
dir8,Rm
dir8,WRj
dir16,Rm
dir16,WRj
@WRj,Rm
@DRk,Rm
@WRjd,WRjs
@DRk,WRj
dir8,DRk
dir16,DRk
Rm,@WRj+dis16
WRj,@WRj+dis16
Rm,@DRk+dis24
WRj,@DRk+dis24
@WRj+dis16,Rm
@WRj+dis16,WRj
@DRk+dis24,Rm
@DRk+dis24,WRj

Descripcin
Rmd = Rms
WRjd = WRjs
DRkd = DRks
Rm = #dato
WRj = #dato16
DRk = #0dato16
DRk = #1dato16
DRk = (dir8, dir8+1, dir8+2, dir8+3)
DRk = (dir16, dir16+1, dir16+2, dir16+3)
Rm = dir8
Wrj = (dir8, dir8+1)
Rm = (dir16)
Wrj = (dir16, dir16+1)
Rm = (@WRj)
Rm = (@DRk)
WRjd = (@WRjs, @WRjs+1)
WRj = (@DRk, @DRk+1)
(dir8) = Rm
(dir8, dir8+1) = WRj
(dir16) = Rm
(dir16, dir16+1) = WRj
(@WRj) = Rm
(@DRk) = Rm
(@WRjd , @WRjd +1) = Wrjs
(@DRk, @Drk+1) = WRj
(dir8, dir8+1, dir8+2, dir8+3) = DRk
(dir16, dir16+1, dir16+2, dir16+3) = DRk
Rm = (@WRj+dis16)
WRj = (@WRj+dis16, @WRj+dis16+1)
Rm = (@DRk+dis24)
WRj = (@Drk+dis24, @DRk+dis24+1)
(@WRj+dis16) = Rm
(@WRj+dis16, @WRj+dis16+1) = Rm
(@DRk+dis24) = Rm
(@DRk+dis24, @DRk+dis24+1) = Rm

4.3.6.2 Instrucciones MOVH, MOVS y MOVZ


Las instrucciones MOVH, MOVS y MOVZ (tabla 4.15) son instrucciones propias de la familia MCS251. La instruccin MOVH, Move to High Word, carga en la parte alta del registro DRk, e indica en la
instruccin el valor de 16 bits que acompaa a la instruccin. La instruccin MOVS, Move with Sign

Los autores, 2001; Edicions UPC, 2001.

88

Microcontroladores MCS-51 y MCS-251

Extension, carga en la parte baja del registro Word destino el valor almacenado en el registro Rm
fuente, conservando el signo del valor transferido.
Tabla 4.15 Instrucciones de transferencia de datos de la familia MCS-251

Mnemnico

<dest>,<src>

Descripcin

MOVH

DRk(hi), #dato16

Carga el dato #dato16 en la parte alta de DRk.

MOVS

WRj,Rm

Carga el dato de Rm en WRj conservando el signo.

MOVZ

WRj,Rm

Carga el dato de Rm en WRj con signo positivo.

Ejemplo:
MOVS WR0, R3

; Con R3 = 49H

El valor 49H es positivo por ser cero su bit de mayor peso; por tanto, despus de ejecutarse la
instruccin queda WR0 = 0049H.
MOVS WR0, R5

; Con R5 = 95H

El valor 95H es negativo ya que su bit de mayor peso es uno. Para conservar en este caso el
signo del valor transferido se cargar en la parte alta de WR0 el valor FFH. Por tanto, al
ejecutarse la instruccin queda WR0 = FF95H.
La instruccin MOVZ, Move with Zero Extension, transfiere el contenido de un registro tipo byte a la
parte baja de un registro tipo Word, y se carga en la parte alta el valor 00H.
4.3.6.3 Instrucciones MOVX y MOVC
La familia MCS-51 dispone de instrucciones MOVX, Move External, y MOVC, Move Code,
especficas para direccionar la memoria de datos externa (tabla 4.16).
Tabla 4.16 Instrucciones de transferencia de datos comunes a las familias MCS-51 y MCS-251

Mnemnico
MOVX

MOVC

<dest>,<src>
A,@Ri
A,@DPTR
@Ri,A
@DPTR,A
A,@A+DPTR
A,@A+PC

Descripcin
A = (@Ri)
A = (@DPTR)
(@Ri) = A
(@DPTR) = A
A = (A + DPTR)
A = (A + PC)

En la instruccin MOVX siempre interviene el acumulador, ya sea como fuente o como destino. Con
esta instruccin slo puede usarse direccionamiento indirecto a travs del registro Ri (@Ri, con i = 0
1), o a travs del registro DPTR. Mediante el registro @Ri slo se puede acceder a direcciones de 8
bits, mientras que con el DPTR se puede acceder a cualquier posicin del espacio de memoria externa
de datos de la familia MCS-51.
En los microcontroladores de la familia MCS-251 la instruccin MOVX tambin direcciona la
memoria externa en la regin especificada por el registro DPXL, que se inicializa con el valor 01H
despus de hacer un reset del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

4 Programacin de las familias MCS-51 y MCS-251

89

La instruccin MOVC permite leer datos en la memoria de programa mediante el direccionamiento


indexado y el registro acumulador como destino del dato transferido. El registro DPTR o el registro
PC se emplean como direccin base de la instruccin, mientras que el acumulador se utiliza como
valor aadido, offset, para situarse en una determinada posicin respecto de la direccin base. La
utilidad principal de la instruccin MOVC es para leer el contenido de tablas almacenadas en la
memoria de programa de los microcontroladores de la familia MCS-51. En este caso los registros
DPTR y PC almacenan la direccin de inicio de las tablas.
Ejemplo:
MOV A, #03H
CALL TABLA;

; Pone en A el nmero 03H para leer el DATO_3 de la tabla

La subrutina tabla tendra el siguiente aspecto y estara situada en cualquier parte del programa:
TABLA: MOVC A, @A+PC
; Al ejecutarse pone en A el dato DATO_3
RET
; PC apunta a la direccin de la instruccin RET en memoria
DB DATO_1
; Este dato se obtiene para A = 1
DB DATO_2
; Este dato se obtiene para A = 2
DB DATO_3
; Este dato se obtiene para A = 3
DB DATO_4
; Este dato se obtiene para A = 4
........
........
DB DATO_n
; Este dato se obtienen para A = n+1
En este ejemplo, la base de la tabla es el contador de programa PC, pero al no ser ste accesible de
forma directa por el programador, se toma como base la instruccin de retorno de la subrutina, RET.
Luego, en el momento en que se ejecuta la instruccin MOVC, el PC contiene la direccin de la
siguiente instruccin a ejecutar, por lo que lee uno de los datos que estn por debajo de la instruccin
RET, dependiendo del valor del acumulador en el momento de ejecutar la instruccin MOVC. Este
tipo de tablas puede tener un mximo de 255 elementos (mxima capacidad del acumulador, puesto
que es un registro de 8 bits). En la instruccin MOVC el acumulador no puede ser igual a 0, ya que
durante la ejecucin de MOVC el PC contiene la direccin de la instruccin RET, por lo que se
devolvera el cdigo de la instruccin RET.
En la familia MCS-251 la instruccin MOVC permite leer posiciones de memoria de la regin FF:.

4.3.6.4 Instrucciones PUSH y POP


Las instrucciones PUSH y POP se utilizan para introducir y extraer datos de la pila. El control de la
pila se realiza a travs del registro SP, Stack Pointer, en la familia MCS-51 (tabla 4.17), y a travs del
registro SPX, Extended Stack Pointer, en la familia MCS-251 (tabla 4.18). La instruccin PUSH
incrementa el Stack Pointer en una unidad (SP=SP+1) y copia el byte indicado en la pila. La
instruccin POP realiza el proceso inverso, extrayendo, de la posicin apuntada por SP, un byte de la
pila, para luego decrementar en una unidad el Stack Pointer (SP=SP-1).

Los autores, 2001; Edicions UPC, 2001.

90

Microcontroladores MCS-51 y MCS-251

Tabla 4.17 Instrucciones de transferencia de datos en la pila comunes a las familias MCS-51 y MCS-251

Mnemnico
PUSH
POP

<dest>,<src>
dir8
dir8

Descripcin
Mete el dato (dir8) en la pila.
Mete en (dir8) un dato de la pila.

Tabla 4.18 Instrucciones de transferencia de datos en la pila de la familia MCS-251

Mnemnico
PUSH

POP

<dest>,<src>
#dato
#dato16
Rm
WRj
DRk
Rm
WRj
DRk

Descripcin
Mete el dato #dato en la pila.
Mete el dato #dato16 en la pila.
Mete el contenido de Rm en la pila.
Mete el contenido de WRj en la pila.
Mete el contenido de DRk en la pila.
Mete en Rm un dato de la pila.
Mete en WRj un Word de la pila.
Mete en DRk un Dword de la pila.

Con los microcontroladores de la familia MCS-51, que disponen de slo 128 posiciones de memoria
RAM interna, se debe procurar que el puntero SP no sobrepase los 128 bytes, puesto que los datos
introducidos por encima de esta posicin se perderan al no estar esta zona implementada fsicamente
en el microcontrolador. La ejecucin de la instruccin POP con el SP apuntando a una direccin de
memoria RAM interna no implementada, obtiene un valor indeterminado. Para las versiones de la
MCS-51 con 256 bytes de memoria RAM interna, el SP puede llegar hasta el valor FFH.
En todos los dispositivos de la familia MCS-51 la memoria reservada para la pila reside en la RAM
interna. En la familia MCS-251 la pila est ubicada en la regin 00.
4.3.6.5 Las instrucciones de intercambio XCH y XCHD
Las instrucciones de intercambio XCH, Exchange, producen un intercambio de datos entre el
acumulador y el contenido de un registro o posicin de memoria. La instruccin XCHD A, @Ri es
similar a la anterior, pero slo se intercambia el nibble bajo del acumulador con el de una posicin de
memoria. Estas instrucciones son de gran utilidad en el desplazamiento de dgitos en formato BCD. En
la tabla 4.19 estn indicadas las instrucciones de intercambio.
Tabla 4.19 Instrucciones de intercambio comunes a las familias MCS-51 y MCS-251

Mnemnico
XCH

XCHD

<dest>,<src>
A,Rn
A,dir8
A,@Ri
A, @Ri

Descripcin
Intercambia A y Rn.
Intercambia A y (dir8).
Intercambia A y (@Ri).
Intercambia el nibble bajo de A y (@Ri ).

4.3.7 Instrucciones booleanas


Las instrucciones booleanas procesan la informacin a nivel de bit. Los bits que pueden direccionar
estas instrucciones estn ubicados en la memoria RAM interna y en el rea SFR. Las familias MCS-51

Los autores, 2001; Edicions UPC, 2001.

91

4 Programacin de las familias MCS-51 y MCS-251

y MCS-251 comparten el mismo conjunto de instrucciones booleanas, con la nica diferencia de que
sus reas de direccionamiento a nivel de bit son diferentes. Las instrucciones booleanas (tabla 4.20) se
pueden agrupar dentro de cuatro categoras:
- Instrucciones que fuerzan un bit a 1 0 lgico.
- Instrucciones lgicas.
- Instrucciones de transferencia de bits.
- Instrucciones de salto condicional.
Tabla 4.20 Instrucciones booleanas

Mnemnico
CLR
SETB
CPL
ANL
ORL
MOV
JB
JNB
JBC

<dest>,<src>
CY
bit
CY
bit
CY
bit
CY, bit
CY, /bit
CY, bit
CY,/bit
CY, bit
bit, CY
bit, rel
bit, rel
bit, rel

Descripcin
Pone a cero el bit de acarreo.
Pone a cero el bit direccionado.
Pone a uno el bit de acarreo.
Pone a uno el bit direccionado.
Complementa el bit de acarreo.
Complementa el bit direccionado.
CY = CY AND (bit)
CY = CY AND (/bit)
CY = CY OR (bit)
CY = CY AND (/bit)
CY = bit
bit = CY
Salta si (bit) es 1.
Salta si (bit) no es 1.
Salta si (bit) es 1 y borra el bit.

Las instrucciones que fuerzan un bit a 1 o a 0 lgico son la instruccin SETB y la instruccin CLR. La
instruccin SETB, Set bit, pone a 1 lgico el bit direccionado, mientras que la instruccin CLR, Clear
bit, pone a cero el bit direccionado.
Las instrucciones lgicas estn formadas por las instrucciones ANL, ORL y CPL. La instruccin ANL
realiza la funcin and lgica, la instruccin ORL realiza la funcin or lgica y la instruccin CPL
realiza la funcin de negacin lgica. En las instrucciones ANL y ORL tambin es posible tomar el bit
direccionado de forma complementada, utilizando para ello la notacin /bit.
A nivel de transferencia de bits se utiliza la instruccin MOV. Esta instruccin se transfiere el valor de
cualquier bit (de las reas direccionables a nivel de bit) hacia el bit de acarreo o viceversa. Por
ejemplo, el estado del bit 20H.0 de la memoria interna se puede poner en la patilla 0 de puerto P1,
mediante las siguientes instrucciones:
MOV
MOV

CY, 20H.0
P1.0,CY

;20H.0 es el bit 0 de la direccin 20H


;Coloca el bit de acarreo en P1.0

En este ejemplo, el bit de acarreo realiza las funciones de acumulador, pues contiene uno de los
operandos que intervienen en la instruccin y guarda el resultado.

Los autores, 2001; Edicions UPC, 2001.

92

Microcontroladores MCS-51 y MCS-251

Las instrucciones de salto condicional ejecutan un salto de tipo relativo si el bit especificado en la
instruccin tiene un determinado estado. En la instruccin JB, Jump on bit, efecta el salto si el bit
direccionado vale uno, mientras que la instruccin JNB, Jump on not bit, realiza el salto si el bit
direccionado vale cero. Con la instruccin JBC, Jump on bit then clear it, se produce el salto si el bit
vale uno y, tras el salto, el bit direccionado se fuerza a cero.
Se debe destacar que las instrucciones lgicas no incluyen la operacin XRL (or exclusiva). Una
forma de realizar esta instruccin mediante software es la siguiente, donde se hace la funcin or
exclusiva entre los bits 1 y 5 del puerto P1:
MOV CY, P1.1
JNB P1.5, continua
CPL CY
continua: MOV

; Salta a continua si P1.5=0


; Continuacin del programa

4.3.8 Instrucciones de control


Las instrucciones de control permiten cambiar la secuencia de ejecucin de un programa y se pueden
agrupar en instrucciones de salto incondicional, instrucciones de salto condicional e instrucciones de
llamada y retorno de subrutina. Las instrucciones de control proporcionan al microcontrolador la
direccin de la siguiente instruccin a ejecutar. Esta direccin puede ser proporcionada de forma
explcita en la propia instruccin, o bien de forma implcita, como es el caso de la instruccin de
retorno de subrutina.

4.3.8.1 Instrucciones de salto incondicional


En la familia MCS-51 existen cinco tipos de salto incondicional: AJMP, LJMP, JMP @A+DPTR,
NOP y SJMP. La familia MCS-251 tiene estos cinco tipos de salto y, adems, incorpora un tipo ms:
EJMP. El conjunto de instrucciones de salto incondicional se muestra en la tabla 4.21, para la MCS51, y en la tabla 4.22, para la MCS-251.
Las instrucciones AJMP, LJMP, EJMP y JMP @A+DPTR realizan un salto a la direccin indicada en
la propia instruccin, mientras que en las instrucciones NOP y SJMP el salto que realizan es relativo al
valor del contador de programa.
Tabla 4.21 Instrucciones de salto incondicional comunes a las familias MCS-51 y MCS-251

Mnemnico
AJMP
LJMP
SJMP
JMP
NOP

<dest>,<src>
dir11
dir16
rel
@A+DPTR

Descripcin
Salto absoluto.
Salto largo.
Salto relativo.
Salto indirecto a la direccin A + DPTR.
Salto a la siguiente instruccin.

Los autores, 2001; Edicions UPC, 2001.

93

4 Programacin de las familias MCS-51 y MCS-251


Tabla 4.22 Instrucciones de salto incondicional de la familias MCS-251

Mnemnico
EJMP
LJMP

<dest>,<src>
addr24
@DRk
@WRj

Descripcin
Salto extendido.
Salto extendido indirecto.
Salto largo indirecto.

La instruccin AJMP, Absolute Jump, cambia los 11 bits de menor peso del contador de programa por
la direccin de 11 bits especificada en la instruccin (de forma directa o a travs de un registro). De
esta manera se puede saltar a cualquier direccin dentro del bloque de 2kbytes de memoria, donde est
ubicada la instruccin de salto.
La instruccin LJMP, Long Jump, para la familia MCS-51, cambia los 16 bits del contador de
programa por la direccin que acompaa a la instruccin, mientras que para la familia MCS-251,
cambia los 16 bits de menor peso del contador de programa por la direccin que acompaa a la
instruccin. El rango del salto en este caso abarca los 64kbytes de la regin donde est ubicada la
instruccin.
La instruccin EJMP, Extended Jump, cambia los 24 bits del contador de programa por la direccin
que acompaa a la instruccin. Esta instruccin permite saltar a cualquier direccin del espacio de
memoria de la familia MCS-251.
La instruccin JMP @A+DPTR realiza un salto a la direccin obtenida de la suma del contenido del
acumulador con el contenido del registro DPTR.
Ejemplo:
MOV DPTR, #TABLA ; Pone en DPTR la direccin de comienzo de una tabla de saltos
MOV A, INDICE
; Pone acumulador el valor del CASO al que se desea saltar
RL A
; Se multiplica por dos el contenido del Acc
JMP @A+DPTR
; Salta a la tabla de saltos
TABLA: AJMP CASO_0
; Si INDICE = 0 salta a CASO_0
AJMP CASO_1
; Si INDICE = 1 salta a CASO_1
AJMP CASO_2
; Si INDICE = 2 salta a CASO_2
AJMP CASO_3
; Si INDICE = 3 salta a CASO_3
AJMP CASO_4
; Si INDICE = 4 salta a CASO_4
4.3.8.2 Instrucciones de salto condicional
Todas las instrucciones de salto condicional son instrucciones de salto relativo. La tabla 4.23 muestra
el conjunto de instrucciones de salto condicional comunes a las familias MCS-51 y MCS-251,
mientras que la tabla 4.24 muestra las instrucciones de salto condicional que incorpora exclusivamente
la familia MCS-251.
En las instrucciones JC y JNC la condicin de salto hace referencia al valor del bit de acarreo, y en las
instrucciones JZ y JNZ la condicin de salto est relacionada con el contenido del acumulador.
La instruccin CJNE, Compare and jump if not equal, realiza la comparacin de los dos operandos
indicados en la instruccin y salta si no son iguales. El salto es de tipo relativo.

Los autores, 2001; Edicions UPC, 2001.

94

Microcontroladores MCS-51 y MCS-251

La instruccin DJNZ, Decrement and jump if not zero, decrementa el registro o posicin de memoria
indicado en la instruccin y salta si el resultado no es cero. La instruccin DJNZ es muy til en el
control de bucles. Para ejecutar un bucle N veces, se carga un contador con el valor N y se termina el
bucle con la instruccin DJNZ. El siguiente ejemplo ejecuta cuatro veces el bucle marcado con la
etiqueta INICIO.
Tabla 4.23 Instrucciones de salto condicional comunes a las familias MCS-51 y MCS-251

Mnemnico
JC
JNC
JZ
JNZ
CJNE

DJNZ

<dest>,<src>
rel
rel
rel
rel
A, dir8, rel
A, #dato, rel
Rn, #dato, rel
@Ri, #dato, rel
Rn,rel
dir8,rel

Descripcin
Salta si el bit de acarreo es 1.
Salta si el bit de acarreo es 0.
Salta si el acumulador es 0.
Salta si el acumulador es distinto de 0.
Compara A con el dato (dir8) y salta si no son iguales.
Compara A con #dato y salta si no son iguales.
Compara Rn con #dato y salta si no son iguales.
Compara (@Ri) con #dato y salta si no son iguales.
Decrementa Rn y salta si no es 0.
Decrementa (dir8) y salta si no es 0.

Tabla 4.24 Instrucciones de salto condicional para la familia MCS-251

Mnemnico
JE
JNE
JG
JLE
JSL
JSLE
JSG
JSGE

<dest>,<src>
rel
rel
rel
rel
rel
rel
rel
rel

Descripcin
Salta si es igual (si Z=1).
Salta si no es igual (si Z=0).
Salta si es mayor que (si CY=Z=0).
Salta si es menor o igual que (si Z=1 o CY=1).
Salta si es menor que (con signo). (si N[OV).
Salta si es menor o igual que (con signo). (si Z=1 si N[OV.
Salta si es mayor que (con signo). (si Z=0 y N=OV).
Salta si es mayor o igual que (con signo). (si N=OV).

Ejemplo:
MOV R4,#04H ; Registro que determina el nmero de veces que se va a ejecutar el bucle
INICIO: MOV
; Direccin de comienzo del bucle
........
; Instrucciones del bucle
DJNZ R4,INICIO
; Si R4[0 salta a INICIO
MOV
;Si R4=0 contina con la instruccin siguiente. El bucle se ejecuta 4 veces
Las condiciones de salto de las instrucciones JE, JNE, JG, JLE, JSL, JSLE, JSG y JSGE, son
exclusivas de la familia MCS-251, y estn relacionadas con el valor que toman los indicadores de los
registros de estado despus de ejecutar una instruccin de comparacin (CMP). Los bits de los
registros de estado que intervienen son el bit de acarreo, el bit de cero y el bit de signo.
Cuando se ejecuta una instruccin de comparacin CMP <des>,<src> de dos nmeros positivos se
puede obtener diversos resultados:
- Si <des> = <src> entonces el bit Z = 1
- Si <des> [ <src> entonces el bit Z = 0

Los autores, 2001; Edicions UPC, 2001.

95

4 Programacin de las familias MCS-51 y MCS-251

- Si <des> > <src> entonces Z = 0 y CY = 0


- Si <des> <src> entonces Z = 1 o CY = 1
Cuando los nmeros comparados tienen signo (son positivos o negativos) se deben analizar los bits de
estado Z, N y OV para determinar la relacin existente entre los operandos:
- Si <des> < <src> entonces el bit N [ OV
- Si <des> <src> entonces el bit Z = 1 o N [ OV
- Si <des> > <src> entonces Z = 0 y N = OV
- Si <des> <src> entonces N = OV
Existen instrucciones de salto condicional cuya condicin de salto se corresponde con el valor que
adquieren los bits del registro de estado en los casos anteriormente considerados. En la tabla 4.25 se
indica la relacin entre las instrucciones de salto condicional y el resultado de la comparacin de dos
operandos.
Tabla 4.25 Instrucciones de salto condicional

Tipo de
operando
Positivo
Con signo

=
JE

JNE

Relacin
>
<
JG
JL
JSG
JSL

JGE
JSGE

JLE
JSLE

4.3.8.3 Instrucciones de llamada y de retorno a subrutina


En la tabla 4.26 se muestran las instrucciones de salto y retorno de subrutinas para las familias MCS51 y MCS-251. Las instrucciones que son exclusivas de la familia MCS-251 se muestran en la tabla
4.27.
Tabla 4.26 Instrucciones de llamada y retorno de subrutina, comunes a las familias MCS-51 y MCS-251

Mnemnico
ACALL
LCALL
RET
RETI

<dest>,<src>
dir11
dir16

Descripcin
Llamada a subrutina de tipo absoluto.
Llamada a subrutina tipo long.
Retorno de subrutina.
Retorno de la rutina de servicio a la interrupcin.

Tabla 4.27 Instrucciones de llamada y retorno de subrutina de la familia MCS-251

Mnemnico
LCALL
ECALL
ERET

<dest>,<src>
@WRj
@DRk
dir24

Descripcin
Llamada a subrutina tipo long.
Llamada a subrutina tipo extendido.
Retorno extendido de subrutina.

La instruccin ACALL, Absolute call, utiliza 11 bits para indicar la direccin de comienzo de la
subrutina. Mediante ACALL la subrutina debe comenzar dentro del mismo bloque de memoria de
2kbytes donde est ubicada la instruccin de llamada.

Los autores, 2001; Edicions UPC, 2001.

96

Microcontroladores MCS-51 y MCS-251

La instruccin LCALL, Long call, hace una llamada a subrutina con una direccin de 16 bits: la
subrutina puede encontrarse en cualquier lugar dentro del espacio de 64kbytes de memoria de
programa en la familia MCS-51 y dentro de la misma regin de memoria para la familia MCS-251.
La instruccin ECALL, Extended Call, es exclusiva de la familia MCS-251 y permite realizar saltos a
subrutinas ubicadas en cualquier posicin del espacio de memoria.
Al ejecutarse una instruccin de llamada a subrutina se guarda, de forma automtica, en la pila la
denominada direccin de retorno, que es la direccin donde se encuentra ubicada la siguiente
instruccin del programa principal. El nombre de pila se le asigna a la zona de memoria donde el
microcontrolador almacenar la direccin de retorno. Para la MCS-51 la memoria de la pila es la zona
de memoria que est por encima del puntero de la pila SP. Por defecto el SP est inicializado a 07H,
por lo que, tras un reset, la zona de la pila es la zona de la memoria interna situada a partir de la
posicin 07H (de la 08H a la 7FH, o de la 08H a la FFH). Sin embargo, el valor de SP se puede
modificar en cualquier momento mediante una instruccin MOV, y se puede definir cul va a ser la
zona de la memoria interna que se utilizar como pila.
En el caso de las instrucciones ACALL y LCALL, para la familia MCS-51, la direccin de retorno es
de 2 bytes, correspondientes al registro PC, Program Counter; en el caso de la MCS-251, los dos
bytes que se guardan son los de menor peso del PC. Con la instruccin ECALL se guardan en la pila
los tres bytes del PC de la familia MCS-251.
Con las instrucciones ACALL y LCALL, para almacenar la direccin de retorno en la memoria de la
pila la CPU, se efecta el siguiente proceso:
1. Interpreta el cdigo de instruccin y se actualiza el valor de PC. PC=PC+3.
2. Incrementa el puntero de la pila, SP=SP+1, y se guarda el byte bajo de PC, PCLOW, en la
posicin de memoria interna apuntada por SP.
3. Incrementa el puntero de la pila, SP=SP+1, y se guarda el byte alto de PC, PCHIGH, en la
posicin de memoria interna apuntada por SP.
4. Pone en el contador de programa la direccin de salto de la subrutina. PC=Dir. subrutina.
Las subrutinas deben finalizar con la instruccin RET, Return, que recupera el valor de la direccin de
retorno guardada en la pila. Si el salto a la subrutina se ha realizado con la instruccin ECALL, ser
necesario acabar la subrutina con la instruccin ERET, que permite recuperar los tres bytes del
contador de programa almacenados en la pila. Con la instruccin RET la CPU efecta el siguiente
proceso:
1. Lee la posicin de memoria que es apuntada por SP y pone el dato ledo en el byte alto de
PC, PCHIGH.
2. Decrementa el puntero de la pila, SP=SP-1.
3. Lee la posicin de memoria que es apuntada por SP y pone el dato ledo en el byte bajo de
PC, PCLOW.
4. Salta a la direccin que apunta el contador de programa PC.
La instruccin RETI se utiliza para retornar desde una rutina de servicio de interrupcin. La nica
diferencia entre RET y RETI, consiste en que RETI comunica al sistema de control de interrupciones
que la interrupcin en curso ha finalizado. Por lo dems, RETI acta igual que la instruccin RET.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

97

5 El modelo de programacin
Bajo la definicin de modelo de programacin se agrupa el uso combinado de las instrucciones y del
conocimiento de la arquitectura interna del microcontrolador para formar rutinas de programa que den
solucin a problemas que son comunes en la mayor parte de los diseos, como son la transferencia de
bloques de datos en la memoria externa de datos, la realizacin y consulta de tablas de datos, la
conversin de datos entre distintos formatos, rutinas aritmticas, etc.
En este captulo se expondrn varias rutinas en lenguaje ensamblador que dan solucin a distintos
problemas; pero debido al tratamiento simultneo de las dos familias de microcontroladores que se
hace en esta obra, en primer lugar se expondrn las rutinas para la familia MCS-51, y en segundo
lugar se expondrn las rutinas derivadas para la MCS-251, considerando, para ello, los nuevos tipos
de direccionamiento y la flexibilidad en el acceso a los registros que tiene esta ltima familia.

5.1 Creacin y consulta a tablas


En la programacin de microcontroladores es frecuente utilizar tablas de datos en ciertos casos, como
en la conversin entre distintos formatos de datos, como de hexadecimal a ASCII, de binario a 7segmentos, etc. En estos casos se genera una tabla especfica, donde cada elemento de la tabla est
relacionado con el dato de entrada que se quiere convertir, de forma que el mismo dato de entrada se
emplea como ndice para obtener el resultado de la conversin.
Mediante tablas se puede tambin obtener nmeros primos segn un ndice o evitar el clculo de
funciones matemticas no lineales como las funciones trigonomtricas o de cualquier otro tipo.
Como ejemplo se muestra la rutina de conversin de hexadecimal (00H-0FH) al formato ASCII; para
ello la tabla 5.1 muestra la correspondencia entre ambos formatos.
Tabla 5.1 Correspondencia entre un nmero hexadecimal (de 00H a 0FH) y su formato en ASCII
Binario
ASCII

00H
30H

01H
31H

02H
32H

03H
33H

04H
34H

05H
35H

06H
36H

07H
37H

08H
38H

09H 0AH 0BH 0CH 0DH 0EH


39H 41H 42H 43H 44H 45H

;*******************************************************
;Subrutina Bin_ASCII
;Convierte un n hexadecimal en ASCII
;Entrada y salida:
A
;*******************************************************
Bin_ASCII: INC
A
MOVC A,@A+PC
RET
DB
30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H
DB
38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H

Los autores, 2001; Edicions UPC, 2001.

0FH
46H

Microcontroladores MCS-51 y MCS-251

98

El ncleo de esta subrutina es la instruccin MOVC A, @A+PC. Cuando se ejecuta esta instruccin el
contador de programa se actualiza para apuntar a la instruccin siguiente, RET, pues la tabla de datos
est situada a continuacin de la instruccin RET. El acumulador es un ndice que apunta al dato en
concreto dentro de la tabla. Si A vale 0H, la subrutina retornar el dato 30H, puesto que en primer
lugar se ha incrementado en una unidad (instruccin INC A) y, por tanto, la suma del puntero
indexado, A+PC, apunta al primer dato de la tabla; si A vale 01H la subrutina retorna 31H, si vale
02H retorna 32H, etc.

5.2 Transferencia de bloques de datos


Resulta frecuente tener que trasladar bloques de datos entre distintas zonas de la memoria. De estos
bloques se suele tener su direccin base y su tamao, aunque la direccin de destino puede ser fija o
variable, dependiendo del tipo de aplicacin.
La solucin a este problema es distinta segn sea la familia de que se trate, pues el nmero de
punteros disponibles es diferente para la MCS-51 y para la MCS-251. Para la MCS-51 la transferencia
del bloque de datos se realiza en la memoria externa de datos, y tiene un nico puntero de 16 bits que
consiste en el registro @DPTR. Con este puntero la solucin del problema resulta difcil, puesto que
para trasladar un bloque de datos se necesitan al menos dos punteros de 16 bits, uno de origen y otro
de destino. Para salvar este obstculo, se puede tratar de recurrir al uso de cualquiera de los dos
punteros restantes de 8 bits, @R0 y @R1, que se pueden emplear con la instruccin MOVX. Estos
punteros sitan su valor en el puerto P0, byte bajo del bus de direcciones, cuando se ejecutan las
instrucciones de lectura y de escritura en la memoria de datos, (MOVX A,@Ri y MOVX @Ri,A).
Mientras tanto, en el puerto P2, byte alto del bus de direcciones, se sita el contenido del registro P2
del rea de SFR. Por tanto, basta con colocar el byte alto de la direccin de destino del bloque de
memoria en el registro P2 para que salga por el puerto P2. A continuacin se muestra una rutina que
transfiere un bloque de 50 bytes desde la direccin origen 1200H a la direccin destino 3500H.
;*************************************************
;Rutina TRANS
(transferencia de datos)
;Punteros: DPTR, R0
;Tamao: R7
;Modifica: DPTR, R0, R7, P2, A
;************************************************
TRANS: MOV DPTR, #1200H
;Direccin inicio
MOV R0,#00H
;Direccin destino
MOV P2,#35H
MOV R7,#50
B_TR:
MOVX A,@DPTR
;Lee en origen
MOVX @R0,A
;Escribe en destino
INC
DPTR
;Incrementa punteros
INC
R0
DJNZ R7,B_TR
;Bucle R7 veces

La transferencia de datos, segn el ejemplo mostrado, est limitada a una misma pgina, es decir, a
todas aquellas direcciones de 16 bits que tienen el mismo valor del byte alto de direccin, pues en el
puerto P2 se mantiene este valor mientras se ejecuta la rutina. Si en esta rutina el primer byte a
transferir del origen tiene como byte bajo de direccin el valor 00H, entonces el tamao mximo de
datos que se pueden transferir es de 256 bytes; en caso contrario el tamao mximo que se puede
transferir vendr delimitado por el inicio de la pgina siguiente.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

99

A continuacin se muestra la misma rutina de transferencia solucionada con instrucciones de la


familia MCS-251. En este caso se ha utilizado un nico registro tipo Word que combinado con
instrucciones de direccionamiento indexado permite acceder a las direcciones origen y destino. Se
puede observar cmo esta rutina es ms compacta y funcional que la anterior.
;*****************************************************
;Rutina TRANS para la familia MCS-251
;Puntero: WR0
;Tamao: R7
;Modifica: WR0, R3 y R7
;*****************************************************
TRANS: MOV WR0,#1200H
;Direccin origen
MOV R7,#50
;Nmero de datos a transferir
B_TR:
MOV R3,@WR0
;Lee dato en origen
MOV @WR0+2300H,R3
;Escribe en destino
INC
WR0
;Incrementa el puntero
DJNZ R7,B_TR
;Bucle R7 veces
RET

5.3 Funciones booleanas


Los microcontroladores de las familias MCS-51 y MCS-251 estn capacitados para realizar funciones
booleanas, tanto a nivel de bit como a nivel de byte, y tienen en comn el mismo juego de
instrucciones booleanas. A nivel de bit, el microcontrolador puede realizar funciones lgicas y realizar
otras tareas como leer el estado de un teclado, activar un rel, etc.
A continuacin se expone un ejemplo de aplicacin de las instrucciones booleanas que consiste en la
evaluacin de las funciones lgicas Y0 e Y1 (figura 5.1), con tres variables de entrada cada una, X0,
X1 y X2. Las entradas se han conectado a los terminales P1.0, P1.1 y P1.2, y las funciones de salida
se han conectado a P1.3 y P1.4.
;***********************************
;Rutina F_BOL
;Entradas: P1.0, P1.1, P1.2
;Salidas:
P1.3, P1.4
;Modifica: C, B.0
;*********************************
X0 EQU P1.0
;entradas
X1 EQU P1.1
X2 EQU P1.2
Y0 EQU P1.3
;salidas
Y1 EQU P1.4
F_BOL: MOV C,/X0
ANL C,X1
ORL
C,X0;
MOV Y0,C
;obtiene Y0
MOV C,X0
ORL
C,X1
MOV B.0,C
MOV C,X0
ORL
C,X2
ANL C,B.0
MOV Y1,C
;obtiene Y1
SJMP F_BOL

x0
x1
x3
y0
y1

P1.0
P1.1
P1.2
P1.3
P1.4

Funciones lgicas
x0
x1
x3

y0

y1

Fig. 5.1 Funciones lgicas y conexionado con el


microcontrolador

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

100

5.4 Retardos de tiempo


La realizacin de retardos es una de las tareas ms comunes en el desarrollo de aplicaciones, puesto
que en muchos casos se deben activar dispositivos durante un tiempo determinado. Para realizar
retardos de manera precisa se pueden emplear recursos del hardware del microcontrolador, como los
temporizadores Timer0, Timer1 y Timer2, o el dispositivo PCA; en este caso se deben configurar y
utilizar interrupciones de manera adecuada. Por otro lado, tambin se pueden realizar retardos
mediante rutinas de software, para aquellos casos en los que no se requiere de precisin en los tiempos
generados; pueden entonces destinarse los temporizadores y la PCA a otras tareas ms relevantes. De
todas formas, se debe mencionar que el uso de retardos mediante software implica una explotacin
poco eficiente del microcontrolador, puesto que ste pasa una buena parte de su tiempo realizando el
retardo.
Un retardo por software se hace bsicamente a travs de uno o varios bucles anidados, donde el
nmero de anidamientos depende del tiempo de retardo requerido. Como ejemplo se propone una
rutina de retardo con dos anidamientos, donde el nmero de veces que se ejecuta cada bucle depende
de los registros R7 y R6. Este ejemplo es vlido tanto para la familia MCS-51 como para la MCS-251.
;*************************************************
;Subrutina RETARDO
;Registros afectados: R7, R6
;************************************************
RETARDO: MOV R7,#10
L1:
MOV R6,#100
L2:
DJNZ R6,L2
;Bucle interno
DJNZ R7,L1
;Bucle externo
RET

El bucle interno formado por el registro R6 est dentro del bucle externo formado por el registro R7;
luego a cada vuelta del bucle externo le corresponden 100 ejecuciones del bucle interno. De esta
manera, sabiendo que para la MCS-51 el tiempo de ejecucin de las instrucciones MOV y DJNZ es de
uno y dos ciclos mquina, respectivamente, y que un ciclo mquina equivale a 1s con una frecuencia
de reloj de 12MHz, se puede determinar el tiempo exacto que tardar en ejecutarse la subrutina de
retardo. La figura 5.2 muestra el diagrama de tiempos de la subrutina e indica tambin el cmputo del
tiempo resultante -eq. (5.1).
MOV (1 s)

MOV (1 s)

DJNZ (2 s)

R6
veces

R7
veces

t R 1 [1 2 R 6 2] R 7 2 2.033s

(5.1)

1
s R7
2 4.

(5.2)

tR

1
s
3

1
3 s

(R 7 1) s

DJNZ (2 s)

RET (2 s)

Fig. 5.2 Diagrama de tiempos de la rutina de retardo

Los autores, 2001; Edicions UPC, 2001.

(R 6 1) s
1
s
2

1 s 1.009,16 s

5 El modelo de programacin

101

Para la familia MCS-251 el clculo del tiempo realizado es diferente (eq. (5.2)), puesto que trabajando
en el modo fuente, la instruccin MOV Rn,#data tarda cuatro perodos de reloj en ejecutarse, la
instruccin DJNZ Rn,rel posee dos tiempos de ejecucin distintos: 12 perodos de reloj si se cumple
la condicin de salto y 6 perodos en caso contrario; y, por ltimo, el microcontrolador invierte 12
perodos de reloj en ejecutar la instruccin RET.
El tiempo mximo que se puede obtener con una rutina de dos bucles anidados es de 130.818s para
la MCS-51, que equivale a unos 0.13 segundos, y de 65.238,33s para la MCS-251, poniendo a FFH
los registros R6 y R7. Si se desean obtener tiempos mayores es necesario realizar ms anidamientos.
Una alternativa a la rutina anterior consiste en la siguiente rutina:
;************************************************
;Subrutina RETARDO2
;Registros afectados: R7, R6
;************************************************
RETARDO2: MOV R7,#0
MOV R6,#0
L1:
DJNZ R6,L1
;Bucle interno
DJNZ R7,L1
;Bucle externo
RET

A primera vista da la impresin de que los bucles de esta rutina dan cero vueltas, pues R6 y R7 valen
cero. Pero si se observa en detalle la ejecucin de la instruccin DJNZ, resulta que esta instruccin
primero decrementa el registro indicado, y luego examina la condicin de salto. Por tanto, si el
registro vale cero, al decrementarse pasa a valer FFH, (00H-01H=FFH), y se ejecuta el bucle FFH+1 o
256 veces. Realizando el diagrama de tiempos para esta rutina, el tiempo que se obtiene es de
13.1588s para la MCS-51 y de 65.665,16s para la MCS-251, para una frecuencia de reloj de
12MHz.

5.5 Suma y resta de datos


La suma y resta de datos es sencilla de hacer mediante las instrucciones ADD, ADDC y SUBB,
cuando los datos que intervienen son de 1 byte, pero resulta ms complicada cuando el tamao de los
datos es mayor de 1 byte, es decir, cuando se tienen que sumar datos de 2, 3 4 bytes de tamao.
;************************************************
;Subrutina SUMA_N
(Suma de nmeros de N bytes)
;Entrada:
Punteros: R0 a X, R1 a Y. R7: Tamao
;Salida:
El resultado sustituye al operando X
;Modifica: A, R0, R1, R7, C
;************************************************
SUMA_N: CLR
C
;Borra acarreo
BUC_SUM: MOV A,@R0 ;Lee operando X
ADDC A,@R1 ;Suma X con Y
MOV @R0,A ;Resultado sustituye a X
INC
R0
;Incrementa punteros
INC
R1
DJNZ R7,BUC_SUM ;Repite 7 veces
RET

3 Suma

3DH
+ 5EH
0 9BH
Carry

2 Suma

ABH
+ 2CH
0 D8H
Carry

1 Suma

99H
+ 69H
1 02H
Carry

Fig. 5.3 Suma de dos datos de 3 bytes de tamao

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

102

Para resolver este problema se realiza una subrutina que es capaz de sumar datos de cualquier tamao
en bytes, aunque, para este caso, ser suficiente con que sume datos de 3 bytes de tamao. Los datos
que se debern sumar son X=2DAB99H y Y=5E2C69H en formato hexadecimal y estn almacenados
a partir de las posiciones de la memoria interna 60H y 70H, respectivamente; es decir, el byte de
menor peso del dato X (99H) estar ubicado en la direccin 60H, su byte intermedio (ABH) en la 61H
y su byte ms significativo (2DH) en la 62H; lo mismo se hace con el dato Y a partir de la direccin
70H de la memoria interna.
Para ejecutar esta subrutina se tienen primero que poner las direcciones 60H y 70H en los registros R0
y R1; ello se debe efectuar antes de llamar a la subrutina, por ejemplo
MOV
MOV
MOV
LCALL

R0,#60H
R1,#70H
R7,#3
SUMA_N

;Pone direccin de X en R0
;Pone direccin de Y en R1
;Pone tamao del dato en R7
;Llama a la subrutina

La manera de operar de la subrutina se muestra claramente en la figura 5.3. La subrutina hace tres
sumas consecutivas y obtiene los datos en cada una de ellas a travs de los punteros @R0 y @R1, que
se actualizan con la instruccin INC. Esta subrutina es capaz de sumar datos de 4, 8 16 bytes, con la
condicin previa de situar los datos en la memoria interna y poner en R0, R1 y R7 los valores
adecuados.
La razn de que el resultado generado en las operaciones sustituya a uno de los operandos, estriba en
que para la MCS-51 tan slo se dispone de los punteros @R0 y @R1; se carece de un tercer puntero
necesario para dejar el resultado en otras direcciones. El resto de los registros no pueden ser
empleados como punteros, pero s como variables intermedias, pasando su contenido a R0 o R1, y
conseguir, as, que hagan de punteros por medio de estos registros. Cabe resaltar que para la MCS-251
este tipo de problemas no existe, pues cualquiera de sus registros puede hacer de puntero.
Las instrucciones de la familia MCS-251 permiten ejecutar la rutina de suma con un mayor rango de
direcciones y guardar el resultado en direcciones distintas a las de ubicacin de los operandos. El
ejemplo anterior de suma de dos datos de 3 bytes se puede resolver empleando las instrucciones de la
familia MCS-251 que pueden sumar datos de hasta 4 bytes:
;*****************************************************************
;Rutina SUM_4
(Suma de datos de 4 bytes para la familia MCS-251)
;Puntero: WR8
;Datos: DR0 y DR4
;*****************************************************************
SUM_4: MOV WR0,@WR8
;Carga el dato en el registro DR0
MOV WR2,@WR8+2H
B_TR:
MOV WR4,@WR8+10d
;Carga el otro dato en el registro DR4
MOV WR6,@WR8+12d
ADC DR0,DR4
;Suma los dos datos
MOV @WR8+20d,WR0
;Carga el resultado en memoria
MOV @WR8+22d,WR2
RET

El anterior programa suma dos datos de 4 bytes almacenados en las direcciones 60H y 70H a las que
se accede con el registro WR8 utilizando el direccionamiento indexado. El mismo registro permitir

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

103

guardar el resultado de la suma a partir de la direccin 80H. Para ejecutar esta subrutina previamente
se debe colocar la direccin inicial del dato en WR8.
MOV WR8,#0060H
LCALL SUM_4bytes

;Carga el puntero con la direccin inicial del dato


;Llamada a la subrutina de suma de 4 bytes

Si el formato de los nmeros que se quiere sumar es BCD, basta con aadir la instruccin de ajuste
decimal, DA A, tras la instruccin de suma ADDC, para obtener el resultado tambin en formato
BCD, lo que se muestra en la siguiente subrutina. En este caso, si X=1969H y Y=1050H dar por
resultado Z=0919H.
;************************************************
;Subrutina SUMA_N
(Para datos en formato BCD)
;Entrada:
Punteros: R0 a X, R1 a Y. R7: Tamao
;Salida:
El resultado sustituye al operando X
;Modifica: A, R0, R1, R7, C
;************************************************
SUMA_N: CLR
C
;Borra Carry
BUC_SN: MOV A,@R0
;Lee dato X
ADDC A,@R1
;Suma X con Y
DA
A
MOV @R0,A
;Resultado sustituye a X
INC
R0
;Incrementa punteros
INC
R1
DJNZ R7,BUC_SN
;Repite R7 veces
RET

En cuanto a la resta de datos de longitud mayor que un byte, se puede realizar una subrutina con este
propsito simplemente reemplazando la instruccin de suma por la instruccin de resta, SUBB, en las
subrutinas anteriores.

5.6 Contador en BCD


Es habitual en muchas aplicaciones realizar rutinas que hagan la funcin de contador en formato
binario o BCD. Estas rutinas tienen por objetivo contabilizar objetos, eventos, pulsos de una seal
cuadrada, etc. Los contadores en formato binario son sencillos de realizar, ya que hay instrucciones
especficas para ello como INC, DEC, ADD, ADDC y SUBB; por el contrario, los contadores en
formato BCD no son tan evidentes de hacer, pues la ALU del microcontrolador contiene un sumador
binario, pero no un sumador en base decimal. Por otro lado, debe tenerse en cuenta que en aquellas
aplicaciones donde el resultado de la cuenta se muestra a un operario, ste debe aparecer en formato
decimal, para que se pueda interpretar de manera conveniente.
El siguiente ejemplo muestra una subrutina para realizar un contador en BCD de cuatro cifras, es
decir, que el mximo valor que puede alcanzar es 999. Cada cifra del contador est contenida en un
registro: las unidades estn en el registro R0, las decenas en R1 y las centenas en R2. De esta forma,
para visualizar posteriormente el valor del contador, slo se ha de volcar cada uno de los registros en
1

el visualizador numrico correspondiente, ya sea de tipo LED o LCD.

Un visualizador numrico suele estar formado por varios dgitos tipo LED de 7 segmentos o de 16 segmentos, o por una
pantalla de cristal de cuarzo (LCD).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

104
;************************************************
;Subrutina CONTA
;Registros afectados: R0, R1, R2
;************************************************
CONTA: CJNE R0,#9,UNIDAD ;Compara unidad
CJNE R1,#9,DECENA ;Compara decena
CJNE R2,#9,CENTENA ;Compara centena
MOV R0,#0
;Al ser 999 pone a 000
MOV R1,#0
MOV R2,#0
RET
UNIDAD: INC
R0
;Incrementa unidades
RET
DECENA:MOV R0,#0
;Pone a 0 las unidades
INC
R1
;Incrementa decenas
RET
CENTENA: MOV R0,#0
;Pone a 0 unidades y decenas
MOV R1,#0
INC R2
;Incrementa centenas
RET

CONTA

R0=9

SI

NO

R1=9

SI

SI

NO

NO

R0=0
R1=0
R2=R2+1

R0=0
R1=R1+1

R0=R0+1

R2=9

R0=0
R1=0
R2=0
RET

Fig. 5.4 Flujograma de la subrutina CONTA

El flujograma de la subrutina CONTA (figura 5.4), se observa cmo primero se comprueba si las
unidades han llegado a 9; de no ser as se incrementa R0. En caso afirmativo, se incrementan las
decenas y las unidades se ponen a cero. Procediendo de esta manera con el resto de dgitos, se
completa la subrutina del contador, que se puede extender fcilmente a un mayor nmero de dgitos.
A la hora de hacer una subrutina para descontar, el proceso es idntico al mostrado en la figura 5.4,
pero cambiando la condicin existente por la de comprobar si las unidades, decenas y centenas son
iguales a cero; los registros, en lugar de ponerse a cero, se ponen a 9, tal y como se indica en la figura
5.5. A continuacin se muestra la subrutina para descontar:
;************************************************
;Subrutina DECRE
;Registros afectados: R0, R1, R2
;************************************************
DECRE: CJNE R0,#0,D_UNI ;Compara unidad
CJNE R1,#0,D_DECE ;Compara decena
CJNE R2,#0,D_CENT ;Compara centena
MOV R0,#9;
;Al ser 000 pone a 999
MOV R1,#9
MOV R2,#9
RET
D_UNI: DEC
R0
;Decrementa unidad
RET
D_DECE: MOV R0,#9
;Pone a 9 unidad
DEC
R1
;Decrementa decena
RET
D_CENT: MOV R0,#9
;Pone a 9 unidad
MOV R1,#9
;Pone a 9 decena
DEC
R2
;Decrementa centena
RET

DECRE

R0=0

SI

NO

R0=R0-1

R1=0
NO

R0=9
R1=R1-1

SI

R2=0

SI

NO

R0=9
R1=9
R2=R2-1
R0=9
R1=9
R2=9

RET

Fig. 5.5 Flujograma de la subrutina DECRE

En el caso de producirse un rebasamiento de los valores mximo y mnimo en las subrutinas CONTA
y DECRE, respectivamente, se ha optado por actualizar el valor de todos los registros al valor inicial
000 y 999, respectivamente.
Otra manera de realizar un contador en formato BCD, consiste en emplear de manera hbil la

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

105

instruccin de ajuste decimal DA A. Para ello, supngase que se desea realizar un contador de cuatro
cifras en formato BCD, y que las posiciones de memoria interna 40H y 41H harn de contador; los
cuatro bits bajos de 40H sern las unidades y sus cuatro bits altos, las decenas, los cuatro bits bajos de
41H sern las centenas y sus cuatro bits altos la unidad de millar del contador. Con un contador de
cuatro cifras en las posiciones 40H y 41H, se puede llegar hasta un valor de 9999, es decir, ambas
posiciones contienen el valor 99H. A continuacin se muestra la rutina CONTA que hace esta
funcin:
;********************************************************
;Subrutina CONTA
;Registros afectados: A, R0, R7, C, (40H), (41H)
;********************************************************
CONTA:
MOV R7,#2
;R7 controla el bucle
MOV R0,#40H
;Pone direccin en puntero
SETB C
;Pone C=1
BUC_CT: MOV A,@R0
;Lee
ADDC A,#0
;Suma con acarreo
DA
A
;Ajuste decimal
MOV @R0,A
;Guarda
INC
R0
;Incrementa puntero
DJNZ R7,BUC_CT
;Repite R7 veces
RET

Esta rutina incrementa en una unidad el valor de las posiciones 40H y 41H. La rutina, al principio,
incrementa 40H de 00H a 01H, de 01H a 02H, y as sucesivamente hasta llegar a 09H, pues la
2

instruccin de ajuste decimal no modifica el valor del acumulador tras la instruccin de suma. En el
siguiente incremento el valor de 40H pasa de 09H a 0AH, por lo que la instruccin DA A transforma
este dato en 10H, al ser el nibble bajo mayor que 9. En los siguientes incrementos la instruccin DA A
no modificar el acumulador, al menos hasta que llegue al valor de 1AH, momento en el cual lo
transformar en 20H. As, la instruccin de ajuste decimal acta en los instantes en que el acumulador
vale 1AH, 2AH, 3AH, , 9AH; este ltimo caso lo transforma en 00H y pone el bit de acarreo a uno,
C=1, de manera que incrementa en una unidad el contenido de la posicin de 41H, pasando el
contador a valer 0100H.
La rutina CONTA basada en la instruccin de ajuste decimal tiene un menor tamao que la anterior y,
adems, permite extender el mximo valor del contador a cualquier tamao; basta, para ello, con
aumentar el nmero de bytes del contador, aumentado el nmero de posiciones de memoria que
ocupa. Por el contrario, no es posible realizar del mismo modo una rutina que decremente el valor del
contador, debido a que la instruccin de ajuste decimal no puede ir asociada a la instruccin SUBB de
resta.

5.7 Multiplicacin y divisin de datos de 16 bits


Para llevar a cabo la multiplicacin de dos nmeros de 16 bits se deben realizar primero dos
multiplicaciones de un nmero de 8 bits por otro de 16 bits (XL por YH-YL, y XH por YHYL)(figura 5.6a), que proporcionan dos resultados intermedios de 24 bits, ZN2-ZN0 al multiplicar XL

Consultar la instruccin de ajuste decimal en el apartado 4.3.4.5.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

106

por YH-YL y ZM2-ZM0 al multiplicar XH por YH-YL. Estos resultados intermedios se suman para
obtener un resultado final de 32 bits (ZS3-ZS0)(figura 5.6b). En consecuencia, la multiplicacin de
dos nmeros de 16 bits estar basada en una subrutina, MUL8_16, que multiplica un nmero de 8 bits
con un nmero de 16 bits.
La subrutina MUL8_16 tiene un primer operando XL de 8 bits almacenado en R1 y un segundo
operando de 16 bits; el byte alto est almacenado en R2 y el byte bajo en R3. La subrutina genera un
resultado de 24 bits que se sita en los registros R5, R6 y R7, donde se almacenan los resultados ZT2,
ZT1 y ZT0, respectivamente.
;**********************************************
;Subrutina MUL8_16
(8bits x 16 bits, XL x YH-YL)
;Entrada:
R1=XL, R2=YH, R3=YL.
;Salida:
24 bits. R7=ZT0, R6=ZT1 y R5=ZT2.
;Modifica: A, B, C
;**********************************************
MUL8_16: MOV A,R1 ;Lee XL
MOV A,R3 ;Lee YL
MUL AB
;(XL x YL)
MOV R7,A ;Salva ZT0
MOV R6,B ;Salva ZN1
MOV A,R1 ;Lee XL
MOV B,R2 ;Lee YH
MUL AB
;(XL x YH)
ADD A,R6 ;(ZM0+ZN1)
MOV R6,A ;Salva ZT1
CLR
A
;Borra A
ADDC A,B
;(ZM1+acarreo)
MOV R5,A ;Salva ZT2
RET

a)
(x)
(+) ZM1
ZT2

b)

YH YL
XL
ZN1 ZN0
ZM0
ZT1

ZT0

YH YL
(x) XH XL
ZN2 ZN1 ZN0
(+) ZM2 ZM1 ZM0
ZS3

ZS2

ZS1

ZS0

Fig. 5.6 a) Multiplicacin de un dato de 8 bits (XL)


por otro de 16 bits (YH-YL). b) Multiplicacin de dos
datos de 16bits (XH-XL y YH-YL)

La subrutina MUL16 multiplica dos datos de 16 bits cada uno. El primer y el segundo operando
deben estar ubicados en los registros R0, R1, R2 y R3, donde se sitan XH, XL, YH e YL,
respectivamente. La subrutina genera un resultado de 32 bits, ZS0, ZS1, ZS2 y ZS3, que se coloca en
los registros R7, R6 , R5 y R4, respectivamente.
;************************************************
;Subrutina MUL16
(16bits x 16 bit, YH-YL x XH-XL)
;Entrada:
R0=XH, R1=XL, R2=YH, R3=YL
;Salida:
32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3
;Modifica: A, B, Registros R7 a R1 del banco 1
;************************************************
MUL16: LCALL MUL8_16
;(XL x YH-YL)
SETB
RS0
;Cambia al banco 1
MOV
R1,00H
;Lee XH
MOV
R2,02H
;Lee YH
MOV
R3,03H
;Lee YL
LCALL MUL8_16
;(XH x YH-YL)
CLR
C
;Borra acarreo
CLR
RS0
;Cambia a banco 0
MOV
A,R6
;Lee ZN1
ADD
A,0FH
;(ZN1+ZM0)
MOV
R6,A
;Salva ZS1
MOV
A,R5
;Lee ZN2
ADDC
A,0EH
;(ZN2+ZM1+C)
MOV
R5,A
;Salva ZS2
CLR
A
;Borra A
ADDC
A,0DH
;(ZM2+C)
MOV
R4,A
;Salva ZS3
RET

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

107

La subrutina MUL16 utiliza el banco 0 y el banco 1 de registros para almacenar los resultados
intermedios de la subrutina MUL8_16. La primera multiplicacin, XL x YH-YL, utiliza el banco 0 de
registros y la segunda multiplicacin, XH x YH-YL, utiliza el banco 1 de registros. Se cambia de
banco de registros con el bit RS0 del registro de estado PSW. Al final de la subrutina MUL16 se
trabaja con los registros del banco 0 y se accede a los registros del banco 1 mediante direccionamiento
directo.
Para usar la subrutina MUL16 se debe inicializar el puntero de la pila, SP, al menos con una direccin
superior a la direccin ms alta del banco 1 de registros, ya que las instrucciones CALL, PUSH y POP
escriben en las posiciones apuntadas por este puntero. Se trata de evitar, en consecuencia, que las
instrucciones mencionadas escriban accidentalmente sobre el banco 1. El valor del SP se puede
modificar fcilmente con la siguiente instruccin: MOV SP,#0FH.
La familia MCS-251 dispone de instrucciones de multiplicacin de datos de 2 bytes, de forma que la
subrutina MUL16 queda reducida, en la MCS-251, a una simple instruccin:
MUL

WR0,WR2

Esta instruccin multiplica el contenido de los registros R1 y R0 por el contenido de los registros R3 y
R2, y guarda el resultado de 32 bits en los registros R3, R2, R1 y R0.
De la misma forma que la expuesta, se pueden realizar subrutinas de multiplicacin de 24x16 bits,
24x24 bits, 32x16 bits y 32x32 bits, dependiendo de las necesidades de la aplicacin que se quiera
realizar.
La divisin de datos numricos sin signo de 16 bits de longitud se puede efectuar mediante un proceso
iterativo en el cual de debe multiplicar el dividendo por 2-i, donde i est comprendido entre 0 y 15, y
se debe restar el resultado del divisor (figura 5.7). La primera multiplicacin se realiza para i=15, por
lo que desplazan XH y XL 16 bits hacia la derecha, -inicialmente XH est en R0 y XL en R1; luego se
copia XH en R2 y XL en R3, y se pone R0 y R1 a cero, con lo que el dividendo pasa a estar formado
por los registros R0, R1, R2 y R3, 32 bit en total, o sea, es una multiplicacin por 2-16 -, y se rota el
dividendo obtenido una posicin hacia la izquierda, consiguiendo que la multiplicacin sea por 2-15.
Posteriormente, se restan los 16 bits altos del dividendo, R0 y R1, con el divisor, es decir:

(dividendo x 2 -i )16 bits altos divisor


Esta operacin se efecta para comprobar si los 16 bits altos del dividendo son mayores, menores o
iguales que los 16 bits del divisor, hecho que se refleja en el valor del bit de acarreo, pues en la resta
se pueden dar dos casos:
1. El bit C se pone a 1, lo que implica:

(dividendo x 2 -i )16 bits altos divisor

2. El bit C de pone a 0, lo que implica:

(dividendo x 2 -i )16 bits altos divisor

En el primer caso se complementa el bit de acarreo y se introduce en el cociente, CH y CL, mediante


una rotacin con acarreo hacia la izquierda. En el segundo caso se sustituye XH y XL por el resultado
de la resta, en ZH y ZL, se complementa el bit de acarreo y se introduce ste en los registros del
cociente.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

108

Este proceso se itera 16 veces hasta que i=0, entonces el resto de la divisin, que se halla situado en
los mismos registros XH y XL, se coloca en los registros R2 y R3, respectivamente, y el cociente de la
divisin (registros CH y CL), se coloca en los registros R0 y R1, respectivamente.
;******************************************************
;Subrutina DIV16
Divisin de 16 bits (XH-XL)/(YH-YL)
;Entrada: Dividendo: XH=R0 y XL =R1. Divisor: YH=R4 y YL=R5.
;Salida: Cociente: CH=R0 y CL=R1. Resto: ZH=R2 y ZL=R3
;Modifica: A, R0, R1, R2, R3, R7. Direcc. 08H, 09H, 0AH y 0BH.
;******************************************************
;Variables temporales:
XL EQU 01H
;XL en R1 (dir. directo)
XH EQU 00H
;XH en R0
YL EQU 05H
;YL en R5
YH EQU 04H
;YH en R4
CL EQU 09H
CH EQU 08H
ZL EQU 0BH
ZH EQU 0AH
DIV16:
MOV A,YL
;Lee dividendo
ORL A,YH
;Comprueba si ste es cero
JNZ DIV_ON
;Si es cero retorna
SETB OV
;Pone ante bit OV a 1
RET
DIV_ON: MOV R3,XL
; -(XH-XL) x 2-16 MOV R2,XH
MOV XL,#0
;XH=XL=00H
MOV XH,#0
MOV CL,#0
;Cociente
MOV CH,#0
;CH=CL=00H
MOV ZL,#0
;Resto
MOV ZH,#0
;ZH=ZL=00H
MOV R7,#16
;Itera 16 veces
BUC_DIV: CLR C
LCALL ROTA
;Rota 1 pos. izquierda (2-i )
LCALL SUB16
;(dividendo x 2-i)16 bits - divisor
JC XmenorqY
;si (dividendo x 2-i)16 bits < divisor
MOV XL,ZL
;En caso contrario
MOV XH,ZH
;XH=ZH, XL=ZL
XmenorqY: LCALL ROTAC
DJNZ R7,BUC_DIV ;Hasta 16 veces
MOV R3,XL
;Divisin finalizada
MOV R2,XH
;Pone Resto en R2 y R3.
MOV R0,CH
;Pone cociente en R0 y R1.
MOV R1,CL
CLR OV
RET
;******************************************************
; ROTAC
;******************************************************
ROTAC:
CPL C
;Complementa acarreo
MOV A,CL
;Rota cociente 1 bit
RLC A
;hacia la izquierda
MOV CL,A
MOV A,CH
RLC A
MOV CH,A
RET

DIV16

SI

divisor=0

OV=1
RET

NO
(dividendo x 2-16)
R7=16

C=0. Rota dividendo 1


posicin izquierda

(dividendo x 2-i )16 bits altos


<divisor

NO

XH=ZH
XL=ZL

SI
Rota Cociente
1 pos. izquierda

R7=0

NO

R7=R7-1

SI
RET

Fig. 5.7 Flujograma de la subrutina DIV16

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

109
;******************************************************************
;SUB16
-Resta de 16 bits (XH-XL)-(YH-YL)
;Entrada: XH=R0, XL=R1, YH=R2, YL=R3.
;Salida: ZH en 0AH y ZL en 0BH
;******************************************************************
SUB16: CLR C
;Subrutina de resta
MOV A,XL
;(XH-XL) - (YH-YL)
SUBB A,YL
;Resultado en ZH y ZL
MOV ZL,A
MOV A,XH
SUBB A,YH
MOV ZH,A
RET
;******************************************************
; ROTA
;******************************************************
ROTA: MOV A,R3
;Subrutina de rotacin del
RLC A
;dividendo 1 bit hacia la derecha
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,XL
RLC A
MOV XL,A
MOV A,XH
RLC A
MOV XH,A
RET

La familia MCS-251 puede realizar una divisin de 16 bits tan slo con una instruccin: DIV
WR0,WR4. Esta instruccin divide el contenido de WR0 por el contenido de WR4, poniendo el
cociente resultante en WR2 y el resto en WR0.

5.8 Suma y resta de datos con signo


La suma y resta de nmeros con signo se realiza de forma similar a la suma y resta de nmeros sin
signo. La nica diferencia estriba en que el bit de overflow, OV, se pone a 1 cuando el resultado de las
3

operaciones est fuera de rango. En la suma y resta de datos de 16 bits el bit OV se pone a 1 si la
operacin con los bytes altos de los operandos el resultado est fuera de rango. En consecuencia, las
rutinas realizadas de suma y resta de nmeros sin signo se pueden emplear para el caso de nmeros
con signo, con la salvedad que tras la operacin hecha se ha de comprobar el estado del bit de
overflow, por si el resultado est fuera de rango.

5.9 Multiplicacin y divisin de 16 bits con signo


La multiplicacin y divisin de datos con signo resulta ms fcil de llevar a cabo si los datos estn en
un formato de valor absoluto y signo, de manera que la operacin se pueda realizar utilizando los
algoritmos del apartado 5.7, obteniendo el signo del resultado a partir del signo de los operandos.

Vase el apartado 4.3.4.1, instrucciones de suma y resta.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

110

Luego, si el formato de los datos est en complemento a dos, stos se deben pasar al formato mdulosigno, se debe realizar la multiplicacin o divisin de los operandos y pasar el resultado a
complemento a dos.
Al considerar el bit de signo de los operandos se observa que el resultado binario de la multiplicacin
coincide con la funcin booleana XOR (figura 5.8). La funcin XOR a nivel de bit no existe en las
familias MCS-51 y MCS-251; no obstante, esta funcin se puede realizar sencillamente teniendo en
cuenta que si a las entradas de la funcin XOR se las denomina a y b, y z a su salida, z es igual a b,
z=b, si a es cero y z es igual a b negado, z=/b, si a vale 1 lgico.
Multiplicacin de signos

Multiplicacin binaria de signos

++ = +
+- = -+ = -- = +

00 = 0
01 = 1
10 = 1
11 = 0
Fig. 5.8 Multiplicacin binaria de signos

A continuacin se muestra la subrutina MUL16S que realiza la multiplicacin de dos nmeros de 16


bits con signo. Esta subrutina utiliza la subrutina anterior MUL16 para multiplicar en valor absoluto
los dos operandos, por lo que MUL16S tendr los mismo registros de entrada y de salida que MUL16.
Para determinar el bit de signo resultante de la multiplicacin se utilizan los bits de propsito general
F0 y UD del registro de estado PSW, es decir, los bits PSW.5 y PSW.1, que son definibles por el
usuario.
;*****************************************************
;Subrutina MUL16S
;Multiplica 16bitsx16bits con signo, (YH-YL)x(XH-XL)
;Entrada:
R0=XH, R1=XL, R2=YH, R3=YL.
;Salida:
32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3.
;Modifica: A, B, Registros R7 a R1 del banco 1.
;*****************************************************
MUL16S: MOV A,R0
;Lee XH
RLC
A
;Rota
MOV PSW.5,C
;Guarda bit de signo de X
MOV A,R2
;Lee YH
RLC
A
;Rota
MOV PSW.1,C
;Guarda bit de signo de Y
JNB
PSW.5,MOD_Y ;X es negativo?
CLR
C
;Borra acarreo
CLR
A
;Borra A
SUBB A,R1
;Complemento a 2 XL
MOV R1,A
;Guarda XL
CLR
A
;Borra A
SUBB A,R0
;Complemento a 2 XH
MOV R0,A
;Guarda XH
MOD_Y: JNB
PSW.1,M_ABS
;Y es negativo?
CLR
C
;Borra acarreo
CLR
A
;Borra A
SUBB A,R3
;Compl. a 2 de YL
MOV R3,A
;Guarda YL
CLR
A
;Borra A
SUBB A,R2
;Compl. a 2 de YH
MOV R2,A
;Guarda YH

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

111
M_ABS: LCALL
MOV
JNB
CPL
ES_0:
JC
RET
CPL4:
MOV
SETB
MOV
LCALL
CLR
RET

MUL16
C,PSW.5
PSW.1,ES_0
C
CPL4

;Multiplica en valor absoluto


;Funcin XOR de los signos

;Resultado negativo

08H,#07
RS0
R7,#4
COMPL2_N
RS0

;Carga direcc. ZS0


;Cambia a banco 1
;N de bytes de ZS
;Compl. a 2 de ZS
;Cambia a banco 0

La subrutina MUL16S hace uso adems de la subrutina COMPL2_N que realiza el complemento a
dos del resultado ZS de 4 bytes, generado por la multiplicacin. Esta subrutina es genrica y utiliza la
direccin del operando (puntero @R0) y el tamao del operando (R7) como datos de entrada.
;**********************************************
;Subrutina COMPL2_N
;Realiza el complemento a 2 de un nmero de N bytes
;Entrada:
R0 (Puntero a X), R7 (Tamao)
;Salida:
Resultado sustituye al operando X
;Modifica: C, A, R0, R7
;**********************************************
COMPL2_N: CLR
C
BUC_CP:
CLR
A
SUBB A,@R0
MOV @R0,A
DEC
R0
DJNZ R7,BUC_CP
RET

Para la familia MCS-251 la subrutina MUL16S puede ser ms compacta. En este caso, los operandos
se sitan dentro de la zona accesible bit a bit, de la 20H a la 2FH de la memoria RAM interna, para
poder as acceder fcilmente a los bits de signo de los operandos.
;********************************************************************************
;Subrutina MUL16S para la familia MCS-251
;Entrada: XH en 20H, XL en 21H.YH en 22H, YL en 23H.
;Salida: 32 bits. R7=ZS0, R6=ZS1, R5=ZS2, R4=ZS3. Modifica: A, B, Reg. R7 a R1 del banco 1.
;*********************************************************************************
MUL16S: JNB 20H.7,SAL1
SUB WR0,20H
JMP SIGUE0
SAL1:
MOV WR0,20H
SIGUE0: JNB 22H.7,SAL2
SUB WR2,22H
CPL 20H.7
SAL2:
JMP SIGUE1
MOV WR2,22H
SIGUE1: MUL WR0,WR2
JNB 20H.7,SIGUE2
SUB DR4,DR0
RET
SIGUE2: MOV DR4,DR0
RET

La subrutina siguiente DIV16s realiza divisin con signo de dos nmeros de 16 bits, utilizando para
ello la subrutina DIV16; por tanto, tiene los mismos parmetros de entrada y de salida que esta
subrutina. En cuanto al resultado, en el caso que el dividendo sea positivo y el divisor sea negativo, y

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

112

viceversa, el cociente deber ser negativo; si ambos, dividendo y divisor, son positivos o negativos,
entonces el cociente debe ser positivo. En cualquier caso, el resto se deja siempre positivo.
;**************************************************************
;Subrutina DIV16S
Divisin de 16 bits con signo (XH-XL)/(YH-YL)
;Entrada: Dividendo: XH=R0 y XL =R1. Divisor: YH=R4 y YL=R5
;Salida: Cociente: CH=R0 y CL=R1. Resto: ZH=R2 y ZL=R3
;Modifica: A, R0, R1, R2, R3, R7. Direcc. 08H, 09H, 0AH, 0BH, 20H y 21H
;**************************************************************
DIV16S: MOV 20H,R0
;Pone XH en 20H
MOV 21H,R4
;Pone YH en 21H
JNB
20H.7,MOD_Y
;X es negativo?
SETB RS0
;Cambio a banco 1
MOV R0,#01H
;Carga dir. XL en puntero R0
MOV R7,#2
;N de bytes
LCALL COMPL2_N
;Complementa a 2
MOD_Y: JNB
21H.7,M_ABS
;Y es negativo?
MOV R0,#03H
;Carga dir. YL en puntero R0
MOV R7,#2
;N de bytes
CLR
RS0
;Cambio a banco 0
M_ABS: LCALL DIV16
;Divisin en valor absoluto
JB
OV,SALIR
JB
20H.7,DIVDN
;Si dato X es negativo
JB
21H.7,CPLDIV
;Si dato Y es negativo
SALIR: RET
;Dato X y dato Y son positivos
DIVDN: JNB
21H.7,CPLDIV
;Si dato Y es positivo
RET
;Dato X y dato Y son negativos
CPLDIV: SETB RS0
;Cambio a banco 1
MOV R0,#01H
;Carga dir. cociente
MOV R7,#2
;N de bytes
LCALL COMPL2_N
;Complementa a 2
CLR
RS0
;Cambio a banco 0
RET

La subrutina DIV16S para la familia MCS-251 es la siguiente:


;*******************************************************************
;Subrutina DIV16S
Para la familia MCS-251
;Entrada: Dividendo: XH en 20H y XL en 21H. Divisor: YH en 22H y YL en 23H
;Salida: Cociente en WR6 y resto en WR4
;*******************************************************************
DIV16S: JNB
20H.7,SAL1
SUB
WR0,20H
JMP
SIGUE
SAL1:
MOV
WR0,20H
SIGUE: JNB
22H.7,SAL2
SUB
WR2,22H
CPL
20H.7
SAL2:
JMP
SIGUE1
MOV
WR2,22H
SIGUE1: DIV
WR0,WR2
JNB
20H.7,SIGUE2
SUB
WR6,WR2
MOV
WR4,WR0
RET
SIGUE2: MOV
DR4,DR0
RET

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

113

5.10 Ejemplos de aplicacin


A continuacin se describen una serie de ejemplos resueltos donde se aplican parte de las rutinas
expuestas en este captulo. Los ejemplos descritos se pueden realizar, de forma ms efectiva y con una
mejor explotacin de los recursos del microcontrolador, utilizando interrupciones, por lo que para
algunos de los ejemplos se propondr su solucin alternativa en captulos posteriores, teniendo ya un
mejor conocimiento del proceso de interrupciones y de los recursos internos de los microcontroladores
de las familias MCS-51 y MCS-251.
La estructura del programa, realizada en los ejemplos, en general ser parecida a lo largo de este libro.
El programa tendr una rutina inicial, rutina Inicio, en la cual se configuran los recursos internos del
microcontrolador y el modo de operar de ste. De esta rutina se pasa a una rutina Principal, que se
encarga de llevar a cabo las funciones requeridas por la aplicacin. La rutina principal ser una rutina
que forme un bucle infinito, pues las aplicaciones a resolver necesitan que el microcontrolador est
constantemente pendiente de las tareas que debe efectuar. La rutina Inicio en algunos ejemplos no
aparecer, pues, las soluciones adoptadas son sencillas, y no ser necesario poner un valor inicial a las
variables empleadas.

5.10.1 Generacin de una seal cuadrada


En un sistema es frecuente tener que generar una seal peridica de frecuencia determinada y lo ms
simtrica posible. En este ejemplo, se propone la creacin de una seal cuadrada de 5kHz de
frecuencia, que se extraer por la patilla P1.0 de un microcontrolador 8031 (figura 5.9).
Para generar una frecuencia de 5kHz se precisa de un periodo de 200 s y, por tanto, cambiar el
estado de la patilla P1.0 cada 100s. Para cambiar el estado de P1.0 se utilizar la instruccin CPL de
complemento de un bit, y para generar un retardo de 100 s se utilizar una rutina de retardo como la
descrita en el apartado 5.4.
;***************************************************
; Programa de generacin de una seal cuadrada
;***************************************************
ORG 0H
LJMP Principal
;***************************************************
; Rutina Principal
;***************************************************
ORG 0100H
Principal: CPL P1.0
;Complementa el estado lgico de P1.0
CALL Retardo ;Llama a la rutina de retardo
SJMP Principal ;Bucle infinito a principal
Retardo: MOV R7, #46 ;Pone 46 en R7
L1:
DJNZ R7, L1
;Bucle sobre L1
RET
;Retorno de subrutina

8031

P1.0

T/2

T (200S)
Fig. 5.9 Generacin de una seal cuadrada
con el microcontrolador

Para que la instruccin CPL se ejecute cada 100 s, se debe determinar de forma precisa el valor de
carga del registro R7 de la subrutina de retardo. Para ello, si se considera que la frecuencia de reloj del
microcontrolador es de 12MHz y que, entonces, un ciclo mquina tarda en efectuarse 1 s, y que la

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

114

instruccin CPL se ejecuta en 1 ciclo mquina, indicado como CM, la instruccin CALL se ejecuta en
2 CM, SJMP en 2 CM, MOV R7, #46 en 1CM, DJNZ en 2CM y RET en 2 CM. El tiempo de
ejecucin de la rutina de retardo viene dado por:
t Re t 1 2 R 7 2 CM

Y el tiempo total en que se ejecuta la instruccin CPL a cada vuelta del bucle principal es:
t CPL 1 2 2 t Re t 100CM 100s
Se deduce que tRet debe valer 95 s, y que el registro R7 debe valer 46.
El programa realizado se puede modificar para efectuar el parpadeo de un diodo led conectado por
medio de un transistor al microcontrolador (fig 5.10). La resistencia R1 debe calcularse para limitar la
corriente del diodo led a unos 20mA, valor ms que suficiente para mantener al diodo encendido de
manera adecuada.
Vcc
R1

80C31
VTH

LED

R2
P1.0

VCE

Fig. 5.10 Circuito de conexin de un diodo led al microcontrolador

La resistencia R2 se debe determinar para que el transistor entre en saturacin cuando la salida de P1.0
est a 1 lgico. La rutina modificada se muestra a continuacin:
;*****************************************
; Programa de parpadeo de un diodo led
;*****************************************
ORG 0H
LJMP Principal
;*****************************************
; Rutina Principal
;*****************************************
ORG 0100H
Principal: CPL P1.0
MOV R6, #0
MOV R7, #0
Retardo: DJNZ R6, Retardo
DJNZ R7, Retardo
SJMP Principal

El tiempo que tarda en ejecutarse la rutina de retardo, bucle formado por L1, deber ser suficiente para
que el parpadeo del led sea perceptible. Este tiempo es:
t L1 [2 (255 1) 2] (255 1) 131584s 0,13s
La frecuencia de la seal cuadrada ser en este caso de 3,8Hz, aproximadamente.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

115

5.10.2 Conexin de teclas al microcontrolador


Las teclas o pulsadores son elementos que aparecen en la mayor parte de los sistemas basados en un
microcontrolador, por lo que en este ejemplo se propone la conexin de teclas a cada uno de los
puertos del microcontrolador, tal y como indica la figura 5.11.
Vcc

87C31
T1
T2
T3
T4
T5

P1.0
P1.1

T6

P0.0

74LS05/06

P2.0
P2.1

P1.2

P3.0

P1.3
P1.4

Vcc
R

LED

Vcc

i
VTH

P1.5

LED
R

P1.6
P1.7

VCE

Colector
abierto

Fig. 5.11 Conexin de 4 teclas al microcontrolador

En la figura 5.11 se emplea el circuito integrado 74LS05, o el 74LS06, que contiene hasta 6 puertas
inversoras en colector abierto. El terminal de salida de la puerta inversora es el colector de un
transistor interno, cuyo emisor est conectado a masa, tal y como se ve en el detalle de esta figura. La
puerta inversora puede soportar una corriente mxima de 25mA, para el 74LS05, y de 30mA a 40mA,
para el 74LS06, valores ms que suficientes para encender de manera adecuada el diodo led que tiene
conectado.
La resistencia R se debe calcular de forma adecuada para que, considerando el valor de Vcc, de la
tensin umbral del diodo led, VTH, y de la tensin colector-emisor del transistor en saturacin, VCE, la
corriente i est limitada a unos 20mA, valor ms que suficiente para iluminar adecuadamente el diodo
led. El valor de la resistencia R se puede determinar a partir de la siguiente ecuacin:
R

VCC VTH VCE


i

(5.1)

Los puertos P1, P2 y P3 (figura 3.4 del captulo 3) tienen una resistencia interna de pull-up conectada
a cada una de las salidas, por lo que una tecla se puede conectar directamente a la patilla de uno de
estos puertos. Debido a la resistencia de pull-up, el estado de una tecla no pulsada ser de 1 lgico y el
estado de una tecla pulsada ser de 0 lgico (conexin directa a masa -fig. 5.12-), por lo que basta con
leer el estado lgico del terminal del puerto para saber si la tecla est siendo pulsada o no.
El puerto P0 de la MCS-51 no tiene resistencia interna de pull-up y en su lugar hay un transistor
NMOS, debido a que este puerto debe tener la caracterstica de triestado. Por ello, para conectar una

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

116

tecla se debe poner una resistencia externa de pull-up, que proporcione un estado 1 lgico, cuando no
se pulsa la tecla, y un estado 0 lgico, cuando se pulsa la tecla.

Puertos P1,
P2 y P3

Vcc

Vcc

VDD
R

Pull-up

Puerto P0

Fig. 5.12 Conexin de una tecla al terminal de los puertos de la MCS-51

El programa deber leer el estado de las teclas y encender un diodo led asociado a la tecla, en el caso
de que se pulse. El diodo led se mantendr encendido mientras la tecla permanezca pulsada.
Las instrucciones CLR que se utilizan para borrar los leds pueden sustituirse por una nica instruccin
que escriba en todo el puerto P1. Para ello, se debe tener en cuenta que hay dos teclas conectadas a
P1.0 y P1.1, respectivamente; deben ponerse estos terminales a 1 lgico, de forma que sea posible leer
si la tecla ha sido pulsada o no.
;******************************************************************
; Programa para la lectura de la teclas del circuito de la figura 5.11
;******************************************************************
ORG 0H
MOV P1, #0000 0011b
;Leds apagados. P1.0 y P1.1 como entradas
LJMP Principal
;******************************************************************
; Rutina Principal (Testeo de teclas y encendido/ apagado de leds)
;******************************************************************
ORG 0100H
Principal: JNB P1.0, Tecla_T1
;Comprueba si se ha pulsado T1
JNB P1.1, Tecla_T2
;Comprueba si se ha pulsado T2
JNB P2.0, Tecla_T3
;Comprueba si se ha pulsado T3
JNB P2.1, Tecla_T4
;Comprueba si se ha pulsado T4
JNB P3.0, Tecla_T5
;Comprueba si se ha pulsado T5
JNB P0.0, Tecla_T6
;Comprueba si se ha pulsado T6
CLR P1.2
;Apaga led conectado a P1.2
CLR P1.3
;Apaga led conectado a P1.3
CLR P1.4
;Apaga led conectado a P1.4
CLR P1.5
;Apaga led conectado a P1.5
CLR P1.6
;Apaga led conectado a P1.6
CLR P1.7
;Apaga led conectado a P1.7
SJMP Principal
Tecla_T1: MOV P1, #0000 0111b
;Enciende led de P1.2 y apaga el resto
SJMP Principal
;Regresa a Principal
Tecla_T2: MOV P1, #0000 1011b
;Enciende led de P1.3 y apaga el resto
SJMP Principal
;Regresa a Principal
Tecla_T3: MOV P1, #0001 0011b
;Enciende led de P1.4 y apaga el resto
SJMP Principal
;Regresa a Principal
Tecla_T4: MOV P1, #0010 0011b
;Enciende led de P1.5 y apaga el resto
SJMP Principal
;Regresa a Principal
Tecla_T5: MOV P1, #0100 0011b
;Enciende led de P1.6 y apaga el resto
SJMP Principal
;Regresa a Principal

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

117

Tecla_T6: MOV P1, #1000 0011b


SJMP Principal

;Enciende led de P1.7 y apaga el resto


;Regresa a Principal

Se puede escribir sobre todo el puerto P1, sustituyendo a las instrucciones CLR P1.X, con la siguiente
instruccin MOV:
MOV P1, #0000 0011b

;Bits P1.0 y P1.1 a 1 lgico

La rutina principal lee el estado de cada tecla y apaga los leds conectados al puerto P1. Si se pulsa una
tecla, se enciende el diodo led asociado y se salta a la etiqueta Principal, de forma que el led se
mantiene encendido mientras se pulse la tecla. Al dejar de pulsar la tecla el programa apaga todos los
leds.
5.10.3 Conexin de un dgito de 7 segmentos
Los dgitos de visualizacin se usan de manera frecuente para indicar al usuario una determinada
informacin. Los dgitos suelen estar formados por 7 segmentos o por 16 segmentos (hexadecimales),
aunque existen en el mercado una gran variedad y gama de dgitos a disposicin del diseador. Los
dgitos de 7 segmentos son adecuados para visualizar nmeros y algunas letras y smbolos, estos
ltimos con poca definicin (figura 5.13). Los dgitos hexadecimales estn formados por 16 diodos
led, por lo que tienen una mejor definicin para nmeros, letras y smbolos.
7 segmentos

16 segmentos

Ctodo comn

nodo comn

a
f

b
g

c
d DP

DP

DP

Fig. 5.13 Dgitos de 7 y de 16 segmentos

En este ejemplo se conectan tres teclas y un dgito de 7 segmentos al microcontrolador (figura 5.14).
El programa debera leer el estado de las teclas y poner en el dgito la letra A si se pulsa la tecla T1,
la letra b si se pulsa la tecla T2, y la letra C si se pulsa la tecla T3.
87C31
T1
T2
T3

P1.0

P2.0

P1.1

P2.1

74LS05/06
a
b

Dgito 7 segmentos
nodo comn
a
f

P1.2

Vcc

Vcc

i
VTH

c
LED

g
e
P2.7

c
R

DP

d DP
VCE Colector
abierto

Fig. 5.14 Conexin de un dgito de 7 segmentos al microcontrolador

En la conexin se utiliza, del mismo modo que el ejemplo anterior, un par de circuitos integrados
74LS05 74LS06 que contienen hasta 6 puertas inversoras en colector abierto. El dgito utilizado es

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

118

de nodo comn, el nodo est conectado a la tensin de alimentacin, Vcc, y cada diodo a una
resistencia y a un colector del circuito integrado. La resistencia se debe calcular para que limite la
corriente a un valor mximo de 20mA. El programa de este ejemplo se muestra a continuacin:
;********************************************************
; Programa para la conexin de un dgito de 7-segmentos
;********************************************************
ORG 0H
MOV P2, #0
;Apaga todos los leds del dgito
LJMP Principal
;*******************************************************
; Rutina Principal
;*******************************************************
ORG 0100H
Principal: JNB P1.0, Tecla_T1
;Comprueba si se ha pulsado T1
JNB P1.1, Tecla_T2
;Comprueba si se ha pulsado T2
JNB P2.0, Tecla_T3
;Comprueba si se ha pulsado T3
MOV P2, #0
;Borra el dgito
SJMP Principal
Tecla_T1: MOV P2, #0111 0111b
;Pone letra A en el dgito
SJMP Principal
;Regresa a Principal
Tecla_T2: MOV P2, #0111 1100b
;Pone la letra b en el dgito
SJMP Principal
;Regresa a Principal
Tecla_T3: MOV P2, #0011 1001b
;Pone la letra C en el dgito
SJMP Principal
;Regresa a Principal

5.10.4 Conexin de un teclado matricial de 4 x 4 teclas


Los teclados son un elemento imprescindible en un sistema debido a que posibilitan la relacin entre
ste y el usuario al permitir la introduccin de datos y la seleccin de diferentes modos de operacin
del programa, cuando la aplicacin es compleja.
La figura 5.15 muestra la conexin de un teclado matricial de 4x4 teclas al puerto P1 de un 87C31.
Existe una enorme variedad y diferentes tipos de teclados en el mercado; no obstante la disposicin de
las teclas en stos suele ser matricial, disposicin del tipo fila/columna, de manera que una serie de
teclas comparten una misma columna y otra serie de teclas comparte la misma fila (figura 5.15).
87C31

74LS05/06

P1.0
P1.1

P2.0

nodo
comn
a

R
a
f

P1.2

Vcc
b

P1.3

P2.7

R
DP

P1.4
P1.5
P1.6
P1.7

Fig. 5.15 Conexin de un teclado matricial al microcontrolador

Los autores, 2001; Edicions UPC, 2001.

c
d

DP

5 El modelo de programacin

119

La conexin del teclado con el microcontrolador resulta sencilla, pues utiliza los cuatro bits bajos de
P1 como salidas conectadas a las columnas del teclado, y los cuatro bits altos como entradas
conectadas a las filas del teclado. En este ejemplo se conecta un dgito de 7 segmentos para que se
muestre un carcter determinado, correspondiente a la tecla pulsada.
El programa deber efectuar la lectura del teclado matricial de manera continua. Cuando se pulse una
tecla, se mostrar el carcter que tiene asociado la tecla en el dgito de 7 segmentos. En el dgito
siempre se mostrar el cdigo de la ltima tecla pulsada.
La deteccin de una tecla pulsada en el teclado matricial se realizar columna a columna, de forma
secuencial, es decir, se pondr un dato en las columnas del teclado (patillas P1.0, P1.1, P1.2 y P1.3),
que habilite slo una de las columnas, y se leer a continuacin el estado lgico de las filas del teclado
(patillas P1.4, P1.5, P1.6 y P1.7), de manera que si se ha pulsado una tecla se detectar mediante el
dato ledo en la filas. Tras haberse comprobado la columna, sta se inhabilitar y se proceder a
habilitar la siguiente columna; este proceso se repetir hasta que se hayan testeado todas las columnas
del teclado. Este procedimiento se debe repetir de forma continuada, comprobando cada una de las
columnas del teclado matricial.
Tal y como se ha conectado el teclado matricial al microcontrolador, la habilitacin de una columna se
hace poniendo un 0 lgico en una de las patillas de salida de P1, o sea, P1.0, P1.1, P1.2 P1.3, y se
inhabilita poniendo un 1 lgico. Luego, una columna estar habilitada, mientras el resto no. Si se
pulsa una tecla de la columna habilitada, el estado lgico de la columna, 0 lgico, pasar a una de las
filas, dependiendo de cul haya sido la tecla pulsada. En cambio, si no se pulsa ninguna tecla, el
estado lgico que se lee es un 1 lgico, puesto que los terminales P1.4, P1.5, P1.6 y P1.7 estn
configurados como entradas, es decir, su transistor NMOS (figura 3.4 del captulo 3) est en corte y el
estado lgico que se lee corresponde al que proporciona la resistencia interna de pull-up. Sin embargo,
en esta situacin, si se pulsa una tecla correspondiente de una columna inhabilitada, en la fila
correspondiente se lee un 1 lgico, debido a que el estado de la columna es 1 lgico por estar
inhabilitada.
En definitiva, para habilitar la primera columna (teclas 1, 4, 7 y A) y inhabilitar el resto de columnas,
se debe escribir en el puerto el dato 1111 1110b y configurar, adems, las patillas conectadas a las
filas como entradas (estado 1 lgico, transistor NMOS en corte). Para habilitar la segunda columna,
(teclas 2, 5, 8 y 0) e inhabilitar el resto, se debe poner 1111 1101b en P1. Para habilitar la tercera
columna (teclas 3, 6, 9 y B) e inhabilitar el resto, se debe poner 1111 1011b en P1. Y, por ltimo, para
habilitar la cuarta columna (teclas C, D, E y F) e inhabilitar el resto, se debe poner 1111 0111b en P1.
El programa deber llevar a cabo la secuencia descrita de testeo por medio de un bucle infinito.
Adems, tambin se utilizar una tabla para hacer la conversin a 7 segmentos del carcter que se
quiere visualizar.
;******************************************************************
; Programa de lectura de teclado matricial
;******************************************************************
ORG 0H
MOV P2, #0
;Apaga todos los leds del dgito
MOV B, #0
;Borra registro B
LJMP Principal

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

120

;******************************************************************
; Rutina Principal
;******************************************************************
ORG 0100H
Principal: MOV P1, #1111 1110b
;Habilita la primera columna
CALL Det_tecla
;Subrutina de deteccin de tecla pulsada
JNZ A, Colum_1
;A 0 si se pulsa tecla
MOV P1, #1111 1101b
;Habilita la segunda columna
CALL Det_tecla
JNZ A, Colum_2
; A 0 si se pulsa tecla
MOV P1, #1111 1011b
;Habilita la tercera columna
CALL Det_tecla
JNZ A, Colum_3
; A 0 si se pulsa tecla
MOV P1, #1111 0111b
;Habilita la cuarta columna
CALL Det_tecla
JNZ A, Colum_4
; A 0 si se pulsa tecla
Prin2:
CALL Display
MOV B, #0
;Borra el registro B
SJMP Principal
;Bucle infinito
Colum_1: JNB P1.4, Tecla_1
;Se ha pulsado la tecla 1?
JNB P1.5, Tecla_4
;Se ha pulsado la tecla 4?
JNB P1.6, Tecla_7
;Se ha pulsado la tecla 7?
SJMP Tecla_A
;Si no es ninguna de la anteriores, es la tecla A
Colum_2: JNB P1.4, Tecla_2
;Se ha pulsado la tecla 2?
JNB P1.5, Tecla_5
;Se ha pulsado la tecla 5?
JNB P1.6, Tecla_8
;Se ha pulsado la tecla 8?
SJMP Tecla_0
;Si no es ninguna de la anteriores, es la tecla 0
Colum_3: JNB P1.4, Tecla_3
;Se ha pulsado la tecla 3?
JNB P1.5, Tecla_6
;Se ha pulsado la tecla 6?
JNB P1.6, Tecla_9
;Se ha pulsado la tecla 9?
SJMP Tecla_B
;Si no es ninguna de la anteriores, es la tecla B
Colum_4: JNB P1.4, Tecla_C
;Se ha pulsado la tecla C?
JNB P1.5, Tecla_D
;Se ha pulsado la tecla D?
JNB P1.6, Tecla_E
;Se ha pulsado la tecla E?
SJMP Tecla_F
;Si no es ninguna de la anteriores, es la tecla F
Tecla_0:
MOV B, #1
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_1:
MOV B, #2
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_2:
MOV B, #3
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_3:
MOV B, #4
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_4:
MOV B, #5
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_5:
MOV B, #6
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_6:
MOV B, #7
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_7:
MOV B, #8
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_8:
MOV B, #9
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_9:
MOV B, #10
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_A:
MOV B, #11
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_B:
MOV B, #12
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_C:
MOV B, #13
;Pone en B cdigo para la lectura de tabla
LJMP Prin2

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

121

Tecla_D:

MOV B, #14
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_E:
MOV B, #15
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
Tecla_F:
MOV B, #16
;Pone en B cdigo para la lectura de tabla
LJMP Prin2
;**********************************************************************
; Subrutina para la detecccin de una tecla pulsada
; Lee el puerto P1 y retorna A=0 si no se pulsa una tecla y A 0 si se pulsa
;**********************************************************************
Det_tecla: MOV A, P1
;Lee puerto P1 (filas)
ORL A, #0FH
;Fuerza 4 bits bajos a 1 lgico
CPL A
;Complementa acumulador
RET
;Si no se pulsan teclas A=0, A=1 en caso contrario
;**********************************************************************
; Subrutina de visualizacin de un caracter en el dgito de 7-segmentos
;**********************************************************************
Display:
MOV A, B
;Lee registro B
CALL Vis_7seg
;Llama a la subrutina que pone el carcter de 7 segmentos
MOV P2, A
;Pone el en P2, visualiza
RET
Vis_7seg: INC A
;Incrementa acumulador
MOVC A, @A+PC
;Lectura de tabla de conversin
RET
DB 0000 0000b
;(A=1) dgito apagado.
DB 0011 1111b
;(A=2) leds a, b, c, d, e y f encendidos, caracter 0
DB 0000 0110b
;(A=3) leds a y b encendidos, caracter 1.
DB 0101 1011b
;(A=4) leds a, b, d, e y g encendidos, caracter 2.
DB 0100 1111b
;(A=5) leds a, b, c, d y g encendidos, caracter 3 (A=0).
DB 0110 0110b
;(A=6) leds b, c, f y g encendidos, caracter 4.
DB 0110 1101b
;(A=7) leds a, c, d, f, y g encendidos, caracter 5.
DB 0111 1101b
;(A=8) leds a, c, d, e, f y g encendidos, caracter 6.
DB 0000 0111b
;(A=9) leds a, b y c encendidos, caracter 7.
DB 0111 1111b
;(A=10) leds a, b, c, d, e, f, y g encendidos, caracter 8.
DB 0110 0111b
;(A=11) leds a, b, c, f y g encendidos, caracter 9.
DB 0111 0111b
;(A=12) leds a, b, c, e, f y g encendidos, caracter A.
DB 0111 1100b
;(A=13) leds c, d, e, f y g encendidos, caracter b.
DB 0011 1001b
;(A=14) leds a, d, e y f encendidos, caracter C
DB 0101 1110b
;(A=15) leds b, c, d, e y g encendidos, caracter d
DB 0111 1001b
;(A=16) leds a, d, e, f y g encendidos, caracter E
DB 0111 0001b
;(A=17) leds a, e, f y g encendidos, caracter F.

5.10.5 Conexin de varios dgitos de 7 segmentos, aplicacin de Su turno


La figura 5.16 muestra la forma de conectar varios dgitos de 7 segmentos a un 87C51 para una
aplicacin donde se desea controlar el turno de atencin a un cliente, que es tan comn en tiendas y
locales comerciales. Debido al tipo de aplicacin donde se ha de visualizar el nmero de orden del
cliente, los dgitos se pueden controlar mediante el circuito integrado 4511, que es un conversor de
formato BCD a 7 segmentos, de forma que colocando el nmero en BCD a la entrada del 4511, A0A3, ste activa los leds necesarios (salidas a, b, c, d, e, f, g y dp) para que el nmero aparezca en el
dgito.
El 4511 es capaz de suministrar hasta 25mA de corriente, valor ms que suficiente para tener un diodo
led encendido de forma adecuada. Este circuito integrado tiene un latch interno que le permite
almacenar el valor del ltimo nmero almacenado. El latch est gobernado por la entrada /EL, de
manera que cuando /EL est a 0 lgico habilita el 4511 y activa los leds correspondientes al nmero

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

122

de entrada (A0-A3), y cuando en /EL se produce un flanco positivo (paso de 0 a 1 lgico), el latch
almacena el ltimo dato presente en la entrada y mantiene encendidos los leds correspondientes.
4511
Vcc
(BCD-7seg)

87C51
P1.0

Cuenta
T1

P2.0

A0

P1.1

A1

P1.2

A2

P1.3

A3

Ctodo comn
Centenas

/EL

dp

Decenas

Unidades

R
dp

Rb
P1.4

Tr1

Tr2

Tr3

Rb

Reset

P1.5
T2

Rb

P2.1

P1.6

Fig. 5.16 Conexin de varios dgitos de 7 segmentos al microcontrolador

El 4511 dispone de dos entradas de control adicionales, /ILT y /IB. La entrada /ILT enciende todos los
leds del dgito conectado, para hacer as un chequeo del estado de los leds. La entrada /IB borra todos
los leds del dgito conectado.
En esta aplicacin se usar un microcontrolador 8751, el 4511, tres dgitos de 7 segmentos y tres
transistores para controlar el encendido de cada uno de los dgitos. Por sencillez, las entradas /ILT y
/IB del 4511 no se usarn, y la entrada /EL se conectar directamente a tierra, de forma que est
siempre habilitado.
El circuito formado por el 4511, un dgito conectado a ste (centenas) y el transistor de control de
encendido del dgito, Tr1, se muestran en la figura 5.17. El 4511 tiene un transistor bipolar de salida,
Tr0, conectado a la tensin de alimentacin Vcc. El 4511 enciende un diodo led, por ejemplo el led
a de la figura 5.17, cuando el transistor bipolar Tr0 est en saturacin, de forma que la corriente
circula a travs de la resistencia R, del diodo led a y del transistor Tr1. El diodo se encender
siempre y cuando el transistor Tr1 est en saturacin.
Vcc
4511
(BCD-7seg)
A0

Tr0

ia

A1

Centenas

R
A2

a
A3

/EL

dp

ib
dp

Rb
P1.4

ia
Tr1

Tr1

Fig. 5.17 Detalle del circuito para la activacin del diodo led a

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

123

Las salidas del 4511 estn conectadas a los diodos de cada segmento, es decir, la salida que activa el
diodo led a del dgito de las centenas, tambin est conectada al led a del dgito de las decenas y
del dgito de las unidades. De esta forma, se simplifica el circuito y se reduce el nmero de terminales
necesarios para los tres dgitos.
En cuanto al consumo, debe considerarse que un dgito puede llegar a consumir hasta 160mA (8
diodos led y 20mA por diodo), por tanto, con tres dgitos se puede llegar a un consumo de 480mA, y
si el nmero de dgitos es mayor el consumo de corriente se dispara considerablemente.
Para evitar el consumo excesivo por parte de los dgitos y para utilizar el circuito realizado, los dgitos
se deben encender de manera secuenciada, es decir, primero se enciende el dgito de las centenas,
luego el dgito de las decenas y, por ltimo, el dgito de las unidades. Esta secuencia se puede llevar a
cabo por medio de la activacin de los transistores conectados al ctodo comn de cada dgito
(transistores Tr1, Tr2 y Tr3, respectivamente -fig. 5.18-). Esta secuencia se debe repetir con una
frecuencia de 25Hz, como mnimo, para que el parpadeo no sea perceptible por una persona y que la
imagen se visualice de manera correcta.
Dgito 1

P1.4

Dgito 2

T/3

T/3
Dgito 2

Dgito 2

P1.5

T/3

P1.6

T/3
Dgito 3

Dgito 3

T/3

T/3

Fig. 5.18 Secuencia de encendido de los dgitos del circuito de la figura 5.16

Los transistores TR1, Tr2 y Tr3 pueden ser cualquier tipo de transistor capaz de soportar como
mnimo 200mA. Para el caso de un nmero elevado de dgitos se pueden emplear arrays de
transistores drlintongs como los disponibles en los circuitos integrados de las series ULN2800A y
ULN2980A, capaces de soportar corrientes de 350mA y 500mA.
Las funciones bsicas que deber realizar el programa son:
1.
2.

Controlar hasta un mximo de 199 peticiones. Cuando la cuenta exceda esta cantidad se
deber poner a 000.
Se tienen 2 pulsadores, uno de cuenta y otro de reset (de puesta a cero). El pulsador de cuenta
siempre incrementar en uno el turno actual. El pulsador de reset pondr a 000 el valor de la
cuenta.

La manera ms sencilla de hacer este programa consiste en realizar una rutina de cuenta en formato
BCD, como la rutina CONTA descrita en el apartado 5.6. En esta rutina intervienen los registros R0,
R1 y R2. El registro R0 se emplea para las unidades, R1 para las decenas y R2 para las centenas. El
flujograma del programa se muestra en la figura 5.19.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

124

;*********************************************
; Programa para la gestin del turno de espera
;*********************************************
ORG 0H
MOV P1, #0
;Pone a cero la entrada del 4511
SUTURNO
MOV R0, #0
;Pone en corte Tr1, Tr2 y Tr3
MOV R1, #0
MOV R2, #0
Inicializacin
;**********************************************
; Rutina Principal
;**********************************************
Principal: JNB P2.0, Cuenta
Rutina
SI
JNB P2.1, PaCero
P2.0=0
contador
Prin2:
CALL Display
SJMP Principal
NO
Cuenta: CALL CONTA
SJMP Prin2
SI
PaCero: MOV R0, #0
Rutina
P2.1=0
MOV R1, #0
puesta a cero
MOV R2, #0
NO
SJMP Prin2
;************************************************
;Subrutina CONTA
Refresca
;Registros afectados: R0, R1, R2
dgitos
;************************************************
Fig. 5.19
CONTA: CJNE R0, #9, UNIDAD
;Compara unidad
CJNE R1, #9, DECENA
;Compara decena
CJNE R2, #1, CENTENA
;Compara centena
MOV R0, #0
;Al ser 199 pone a 000
;***********************************
MOV R1, #0
;Subrutina de retardo RETA
MOV R2, #0
;(Retardo de 2+(2*256+2)*12+2= 6172 s)
RET
;***********************************
UNIDAD: INC R0
;Incrementa unidades
RETA:
MOV R7, #12
RET
Buc2:
MOV R6, #0
DECENA: MOV R0, #0
;Pone a 0 las unidades
Buc1:
DJNZ R6, Buc1
INC R1
;Incrementa decenas
DJNZ R7, Buc2
RET
RET
CENTENA: MOV R0, #0
;Pone a 0 unidades y decenas
MOV R1, #0
INC R2
;Incrementa centenas
RET
;**************************************************************************
;Subrutina Display (Muestra en los dgitos el valor de la cuenta
;Registros afectados: R0, R1, R2
;**************************************************************************
Display: MOV P1, R2
;Pone centenas en P1 (4 bits altos de R2 son cero)
SETB P1.4
;Enciende dgito centenas. Tr1 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.4
;Apaga dgito centenas. Tr1 en corte
MOV P1, R1
;Pone decenas en P1 (4 bits altos de R1 son cero)
SETB P1.5
;Enciende dgito decenas. Tr2 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.5
;Apaga dgito decenas. Tr2 en corte
MOV P1, R0
;Pone unidades en P1 (4 bits altos de R0 son cero)
SETB P1.6
;Enciende dgito unidades. Tr3 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.6
;Apaga dgito unidades. Tr3 en corte
RET

Cada uno de los dgitos se enciende durante un tiempo de 6172s, aproximadamente (suponiendo un
reloj de 12MHz). Por tanto, el nmero se muestra cada 6172*3s, lo que supone una frecuencia de

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

125

refresco del nmero visualizado de 54Hz, aproximadamente. Esta frecuencia puede ser superior,
puesto que se tiene una limitacin de frecuencia mnima, pero no en cuanto a frecuencia mxima.
Luego, la frecuencia de refresco de todos los dgitos puede ser de 100Hz o de 1kHz, con la nica
limitacin del ancho de banda de los transistores Tr1, Tr2 o Tr3 y del 4511.
5.10.6 Contador de piezas
Con una pequea modificacin del circuito y del programa anterior se puede realizar un contador de
piezas para una mquina en un proceso industrial (figura 5.20). En esta aplicacin se dispone de dos
sensores que se simbolizan por una caja con un conmutador. Un sensor indica cundo se ha producido
una pieza y el otro indica cundo el proceso posterior de control de calidad descarta una pieza
defectuosa. Por tanto, el contador muestra siempre el nmero neto de piezas fabricadas.
Vcc

Sensor
Cuenta

P1.0
P2.0

Vcc

4511
Vcc
(BCD-7seg)

87C51

Sensor
Descuenta

A0

P1.1

A1

P1.2

A2

P1.3

A3

P2.1

/EL

dp

Centenas

Tr1

Tr2

Decenas

Unidades

R
dp

Rb
P1.4

Reset

Ctodo comn
Millares

Tr3

Tr4

Rb
P2.2

P1.5
P1.6

Alarma
P2.4

P1.7

Rb
Rb

Fig. 5.20 Circuito del ejemplo del contador de piezas

Al circuito anterior se le ha aadido un dgito ms, por lo que la cuenta puede llegar hasta 9999
piezas. Si el nmero de piezas llega a su mximo valor y se rebasa ste, por un pulso ms recibido, el
contador debe mostrar el nmero mximo de 9999 y activar la seal de alarma conectada a la patilla
P2.4 del microcontrolador. Si el contador est a 0000 y recibe un pulso del sensor de descuenta, se
activar tambin la seal de alarma conectada a P2.4, para indicar un mal funcionamiento del sensor o
al error en el proceso de control de calidad.
;**********************************************************************
; Programa para el contador de piezas
;**********************************************************************
ORG 0H
MOV P1, #0
;Pone a cero la entrada del 4511. Pone en corte Tr1, Tr2, Tr3 y Tr4
MOV R0, #0
;Pone a cero los registros de cada dgito
MOV R1, #0
MOV R2, #0
MOV R3, #0
CLR P2.4
;Pone P2.4 a cero, para no activar la alarma
;**********************************************************************
; Rutina Principal
;**********************************************************************
Principal: JNB P2.0, Cuenta
JNB P2.1, Descuenta
JNB P2.2, PaCero
Prin2:
CALL Display
SJMP Principal

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

126
Cuenta:

CALL CONTA
SJMP Prin2
Descuenta: CALL DECRE
SJMP Prin2
;***********************************************************
;Rutina PaCero
;***********************************************************
MOV R0, #0
;Borra unidades
MOV R1, #0
;Borra decenas
MOV R2, #0
;Borra centenas
MOV R3, #0
;Borra millares
CLR P2.4
;Borra alarma
SJMP Prin2
;***********************************************************
;Rutina CONTA
;Registros afectados: R0, R1, R2, R3
;***********************************************************
CONTA:
CJNE R0, #9, Unidad
;Compara unidad
CJNE R1, #9, Decena
;Compara decena
CJNE R2, #9, Centena
;Compara centena
CJNE R3, #9, Millar
;Compara millar
SETB P2.4
;Activa la alarma
RET
Unidad:
INC R0
;Incrementa unidades
RET
Decena:
MOV R0, #0
;Pone a 0 las unidades
INC R1
;Incrementa decenas
RET
Centena:
MOV R0, #0
;Pone a 0 unidades y decenas
MOV R1, #0
INC R2
;Incrementa centenas
RET
Millar:
MOV R0, #0
;Pone a 0 unidades, decenas y centenas
MOV R1, #0
MOV R2, #0
INC R3
;Incrementa millares
RET
;**********************************************************
;Rutina DECRE
;Registros afectados: R0, R1, R2 y R3
;**********************************************************
DECRE:
CJNE R0, #0, D_uni
;Compara unidad
CJNE R1, #0, D_dece
;Compara decena
CJNE R2, #0, D_cent
;Compara centena
CJNE R3, #0, D_mill
;Compara millar
SETB P2.4
;Activa la alarma
RET
D_uni:
DEC R0
;Decrementa unidad
RET
D_dece:
MOV R0, #9
;Pone a 9 unidad
DEC R1
;Decrementa decena
RET
D_cent:
MOV R0, #9
;Pone a 9 unidad
MOV R1,#9
;Pone a 9 decena
DEC R2
;Decrementa centena
RET
D_mill:
MOV R0, #9
;Pone a 9 unidad
MOV R1,#9
;Pone a 9 decena
MOV R2,#9
;Pone a 9 centena
DEC R3
;Decrementa millar
RET

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

127

;*******************************************************************
;Subrutina Display (Muestra en los dgitos el valor de la cuenta
;Registros afectados: R0, R1, R2 y R3
;*******************************************************************
Display:
MOV P1, R3
;Pone millares en P1 (4 bits altos de R3 son cero)
SETB P1.4
;Enciende dgito millares. Tr1 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.4
;Apaga dgito millares. Tr1 en corte
MOV P1, R2
;Pone centenas en P1 (4 bits altos de R2 son cero)
SETB P1.5
;Enciende dgito centenas. Tr2 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.5
;Apaga dgito centenas. Tr2 en corte
MOV P1, R1
;Pone decenas en P1 (4 bits altos de R1 son cero)
SETB P1.6
;Enciende dgito decenas. Tr3 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.6
;Apaga dgito decenas. Tr3 en corte
MOV P1, R0
;Pone unidades en P1 (4 bits altos de R0 son cero)
SETB P1.7
;Enciende dgito unidades. Tr4 en conduccin
CALL RETA
;Realiza un retardo (tiempo de encendido de dgito)
CLR P1.7
;Apaga dgito unidades. Tr4 en corte
RET
;*************************************************************
;Subrutina de retardo RETA
(Retardo de 1+2*123+2= 251 s)
;*************************************************************
RETA:
MOV R7,#125
Buc1:
DJNZ R7, Buc1
RET

En este caso cada dgito se enciende durante 251s, aproximadamente, lo que supone una frecuencia
de refresco del nmero visualizado de 996Hz. Las rutinas Conta y Decre son una modificacin de
las subrutinas iniciales explicadas en este captulo.

5.10.7 Control de un ascensor


Esta aplicacin consiste en el diseo del sistema de control, basado en el C 8XC251, de un ascensor
de carga de una mina de carbn. La tarea del ascensor consiste en elevar hasta la superficie las
vagonetas cargadas de carbn. El ascensor se pone en funcionamiento cuando se coloca en su interior
una vagoneta, a continuacin asciende hasta que llega a la superficie, donde descarga de forma
automtica la vagoneta, y baja otra vez al interior de la mina con la vagoneta vaca (figura 5.21).
8XC251
S2

P1.2
P0.0
P0.1
P1.3 P1.1

M1

Motor

M0

Ascensor

S1

S3

Fig. 5.21 Diagrama del sistema de control de un ascensor

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

128

Una vez que el ascensor llega abajo se detiene y los operarios sacan la vagoneta del ascensor, la llenan
de carbn y la vuelven a colocar dentro del ascensor; se repite de nuevo la secuencia.
El sistema de control del ascensor incorpora tres sensores, S1, S2 y S3, activos a nivel alto, cuyo
funcionamiento se describe a continuacin:
S1: Este sensor est colocado dentro del ascensor y detecta la presencia de la vagoneta, en
cuyo caso se pone a 1 lgico. Si no hay vagoneta, el sensor se pone a 0 lgico.
S2: Este sensor est colocado en la exterior de la mina y detecta que el ascensor ha llegado
hasta la superficie.
S3: Este sensor est colocado en el interior de la mina y detecta que el ascensor ha llegado al
fondo de la mina.
Por otra parte, el sistema dispone de un motor que permite elevar o descender el ascensor. El motor
est controlado mediante dos seales binarias, M1 y M0, que funcionan tal y como se indica en la
tabla 5.2. En la figura 5.21 se detalla la conexin entre los sensores, los actuadores y el
microcontrolador 8XC251.
INICIO
SE INHIBEN
LAS SALIDAS
SE INICIALIZAN LAS
ENTRADAS A 1 LOGICO

;************************************************************
;
Control del ascensor
;************************************************************
ORG FF:0000H

NO

VAGONETA
EN EL ASCENSOR?

; El programa est almacenado a partir de la


; direccin FF:0000H de la memoria

SI

;Inicializacin de los puertos

EL ASCENSOR SUBE

SETB P0.0
SETB P0.1
MOV P1,#FFH

; Se inicializan P0.0 y P0.1 del puerto a 1


; con lo que el motor estar detenido
; Los pines que trabajan como entrada, deben
; inicializarse a 1 lgico
; Programa de control
SIGUE: JNB P1.1,SIGUE
; Detecta si coloca la vagoneta en el ascensor
CLR P0.1
; El ascensor sube
SIGUE1: JNB P1.2,SIGUE2
; Detecta si el ascensor llega a la superficie
SETB P0.1
; El ascensor baja
CLR P0.0
;
SIGUE2: JNB P1.3,SIGUE3
; Se detecta que el ascensor llega abajo
SETB P0.0
; El ascensor se detiene
SIGUE4: JB P1.1,SIGUE4
; Detecta si sacan la vagoneta del ascensor
JMP SIGUE
; El programa vuelve al inicio

EL ASCENSOR LLEGA
A LA SUPERFICIE?

NO

SI
SI
EL ASCENSOR BAJA

NO
EL ASCENSOR
LLEGA ABAJO?
SI

NO

SI

EL ASCENSOR SE PARA

NO

NO
SI
VAGONETA
EN EL ASCENSOR?

SI

Fig. 5.22 Diagrama de flujo del


programa de control del ascensor

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

129

Tabla 5.2 Condiciones de funcionamiento del motor

M1 M0
0
0
1
1

0
1
0
1

Funcionamiento del motor


El motor est parado.
El motor gira a la derecha y el ascensor sube.
El motor gira a la izquierda y el ascensor baja.
El motor est parado.

El programa que controla la secuencia de funcionamiento del ascensor debe detectar, mediante
instrucciones de salto condicional, que se coloca una vagoneta en el interior del ascensor para, a
continuacin, activar el motor con el fin de subir el ascensor. Mientras el ascensor sube, el programa
debe detectar cundo llega a la superficie, testeando para ello el valor lgico de la entrada conectada al
sensor S2. Cuando S2 se activa, se debe colocar en las salidas M0 y M1 el valor lgico 0 y 1,
respectivamente, para que el ascensor baje. A continuacin, se debe detectar que el ascensor ha
llegado abajo, testeando el sensor S3 con una instruccin de salto condicional. Por ltimo se detecta
que se saca la vagoneta del ascensor, para seguidamente retornar al inicio del programa.
En la figura 5.22 se muestra el diagrama de flujo del programa de control y el listado del programa.

5.10.8 Control de un calefactor


Esta aplicacin trata del diseo de un sistema de control de un calefactor, basado en el
microcontrolador 8XC251. Para controlar el calefactor se disponen de 3 sensores de
temperatura activos a nivel alto: T1, T2 y T3; de un selector de temperatura ambiente S y de un
actuador M que enciende o apaga el calefactor. El funcionamiento de los sensores de temperatura se
describe a continuacin:
T1: se activa a 1 lgico cuando la temperatura es igual o mayor que 20C.
T2: se activa a 1 lgico cuando la temperatura es igual o mayor que 25C.
T3: se activa a 1 lgico cuando la temperatura es igual o mayor que 30C.
El selector de temperatura S es una entrada binaria que permite seleccionar entre dos rangos de
temperatura ambiente: cuando S es igual a 0 lgico, la temperatura debe mantenerse entre 20 y 25C.
Cuando S es igual a 1 lgico, la temperatura debe mantenerse entre 25 y 30C.
El microcontrolador 8XC251 encender el calefactor y pondr la salida M a 1 lgico, cuando la
temperatura sea inferior al valor mnimo del rango seleccionado con S. El calefactor debe permanecer
encendido hasta que la temperatura supere el valor mximo del rango seleccionado, en cuyo caso, se
debe apagar hasta que la temperatura sea de nuevo inferior al valor mnimo del rango seleccionado.
En la figura 5.23 se detalla la conexin de los sensores y actuadores al microcontrolador 8XC251.
8XC251
P1.0
P1.1
P1.2

T1
T2
T3
CALEFACTOR

P1.3
P1.4

S
M

Fig. 5.23 Esquema conexin de los sensores/actuadores al microcontrolador 8XC251

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

130

El programa de control del calefactor debe detectar, en primer lugar, qu rango de temperatura est
seleccionado. Esto se realiza testeando el valor lgico del pin P3.1. Si este bit est a 0 lgico, se salta a
la rutina que mantiene la temperatura entre 20 y 25C, y si vale 1 lgico se ejecuta a la rutina que
mantiene la temperatura entre 25 y 30C.
INICIO

SI
RANGO = 25/30C ?

SI
RANGO = 20/25C ?

NO
SE ENCIENDE
EL CALEFACTOR

NO
SE ENCIENDE
EL CALEFACTOR

SI
RANGO = 25/30C ?

SI

NO

RANGO = 20/25C ?

TEMPERATURA
> 25 C ?

NO

NO
TEMPERATURA
> 30 C ?

SI
SE APAGA
EL CALEFACTOR

NO

SI
SE APAGA
EL CALEFACTOR

SI
RANGO = 25/30C ?

NO

SI
RANGO = 20/25C ?

TEMPERATURA
< 20 C ?

NO

NO

SI
SI

TEMPERATURA
< 25 C ?
SI
SI

NO

Fig. 5.24 Diagrama de flujo del programa de control del calefactor

Comprobando el valor lgico de los distintos sensores de temperatura y teniendo en cuenta el rango de
temperatura seleccionado se decide si el calefactor debe estar activo o no. En la figura 5.24 se presenta
el flujograma de esta aplicacin; a continuacin se presenta el listado del programa.
;***********************************************************************
; Control del calefactor
;***********************************************************************
ORG FF:0000H
; El programa est almacenado en memoria a partir de la
; direccin FF:0000H
MOV C,P1.3
; En primer lugar se lee el valor del selector S para conocer en
; que rango de temperatura debe mantenerse la habitacin
JC T25_30
; Si S es igual a 1 lgico se salta a la direccin T25_30

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

131

En el caso de que S sea igual a 0 lgico, se enciende el calefactor hasta que se activa el sensor T2, lo
cual quiere decir que la temperatura ha superado los 25C, en cuyo caso se desactiva el calefactor. El
calefactor permanece apagado hasta que se desactiva T1; entonces se vuelve a encender. En todo
momento se comprueba la entrada S para saltar a la direccin T25_30 en el caso que valga 1 lgico.
;************************************************************************
;
Rutina del rango 20-25C
;************************************************************************
T20_25: SETB P1.4
; Se activa el calefactor
SIGUE1: JB P1.3,T25_30
; Se comprueba si est seleccionado el rango 20/25C
JNB P1.1,SIGUE1
; Si la temperatura es menor que 25C, el calefactor
; seguir encendido
CLR P1.4
; Se apaga el calefactor
SIGUE2: JB P1.3,T25_30
; Se comprueba si est seleccionado el rango 20/25C
JB P1.0,SIGUE2
; Si la temperatura es mayor que 20C, el calefactor
; seguir apagado
JMP T20_25
; Se vuelve al comienzo de la rutina

Cuando S es igual a 1 lgico, la temperatura de la habitacin debe mantenerse entre 25 y 30C. En


este caso se debe encender el calefactor, y apagarse cuando se active el sensor T3. El calefactor
permanecer apagado hasta que se desactive T2, repitindose nuevamente la secuencia. Como en el
caso anterior, en todo momento se sensa la variable S para saltar a la rutina T20_25 en el caso que
valga 0 lgico.
;*****************************************************************************
;
Rutina del rango 25-30C
;*****************************************************************************
T25_30: SETB P1.4
; Se activa el calefactor
SIGUE3: JNB P1.3,T20_25
; Se comprueba si est seleccionado el rango 25/30C
JNB P1.2,SIGUE3
; Si la temperatura es menor que 30C, el calefactor
; seguir encendido
CLR P1.4
; Se apaga el calefactor
SIGUE4: JNB P1.3,T20_25
; Se comprueba si est seleccionado el rango 25/30C.
JB P1.1,T25_30
; Si la temperatura es mayor que 20C, el calefactor
; seguir apagado
JMP T25_30
; Se vuelve al comienzo de la rutina

5.10.9 Control de una cinta elevadora


En esta aplicacin se debe disear un sistema de control de un elevador de una cinta transportadora
basado en el microcontrolador 8XC251. La tarea del elevador es la llevar una caja de un determinado
producto, que llega por la cinta A, hasta la cinta B o C. El sistema incorpora los siguientes detectores
(figura 5.25):
D1: Este detector est colocado junto a la cinta A. Cuando llega una caja a la plataforma
elevadora, este sensor decide si hay que llevarla a la cinta B o a la cinta C. Si D1 es igual a 0
lgico, hay que llevar el producto a la cinta B, fig. 5.26, y si D1 es igual a 1 lgico, a la cinta
C (figura 5.27).
D2: Este sensor se activa (1 lgico) cuando la plataforma est a la altura de la cinta A.
D3: Este sensor se activa (1 lgico) cuando llega un producto a la plataforma elevadora.
D4: Este sensor se activa (1 lgico) cuando la plataforma elevadora ha llegado a la cinta B.
D5: Este sensor se activa (1 lgico) cuando la plataforma elevadora ha llegado a la cinta C.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

132
D4

Cinta B

CAJA
Cinta A
D1

P1.4

8XC251

D2

D3

P1.1
P1.2
P1.3
P1.5

Cinta C

D5

P3.0

M0

P3.1

M1

Motor

Fig. 5.25 Diagrama del sistema de control


CAJA
Cinta B

Cinta B

Cinta A

Cinta A

D1=1

D1=0

CAJA
Cinta C

Cinta C

Motor
Fig. 5.26 Elevacin de la caja a la cinta B, D1 igual a 0
lgico

Motor

Fig. 5.27 Descenso de la caja a la cinta C, D1 igual


a 1 lgico

Por otra parte, el sistema dispone de un motor que permite ascender o descender la plataforma
elevadora. El motor est controlado mediante dos seales binarias, M1 y M0, que funcionan tal y
como se indica en la tabla 5.3.
Tabla 5.3 Condiciones de funcionamiento del motor.

M1 M0
0
0
1
1

0
1
0
1

Funcionamiento del motor


El motor est parado.
El motor gira a la derecha y la plataforma sube.
El motor gira a la izquierda y la plataforma baja.
El motor est parado.

El programa que controla el funcionamiento de la plataforma elevadora debe cumplir las siguientes
indicaciones: cuando llegue un producto a la plataforma elevadora (D3 igual a 1 lgico) la plataforma
deber subir hasta la cinta B o bajar hasta la cinta C, dependiendo del valor que adquiera el detector
D1. Una vez que la plataforma ha llegado a la cinta B o C, debe volver a la posicin original, junto a
la cinta A, para esperar a que llegue un nuevo producto; entonces se vuelve a repetir el proceso.
Inicialmente la plataforma elevadora se encuentra a la altura de la cinta A.

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

133

En una primera parte del programa se deben inicializar los puertos con el valor lgico adecuado. Los
pines de los puertos que actan como entradas de datos, han de estar inicializados a 1 lgico y los
pines que trabajan como salida han de inicializarse por defecto con el nivel inactivo. En la figura 5.28
se presenta el diagrama de flujo del programa de control de la plataforma elevadora y a continuacin
se detalla el listado.
INICIO
SE INHIBEN
LAS SALIDAS
SE INICIALIZAN LAS
ENTRADAS A 1 LOGICO

PRODUCTO
NO
EN LA PLATAFORMA?

SI

LA PLATAFORMA BAJA

SI
D1 = 1?

NO

PLATAFORMA
EN CINTA C?

LA PLATAFORMA SUBE

NO

SI
SI
PLATAFORMA
EN CINTA B?

NO

LA PLATAFORMA SUBE

SI
SI
LA PLATAFORMA BAJA

PLATAFORMA
EN CINTA A?

PLATAFORMA
EN CINTA A?

NO

SI

NO

EL MOTOR SE PARA

SI
EL MOTOR SE PARA

Fig. 5.28 Diagrama de flujo del programa de control de la plataforma elevadora


;***********************************************************************************
;
Control de la plataforma elevadora
;***********************************************************************************
ORG FF:0000H
; El programa comienza a partir de la direccin FF:0000H de memoria
; Inicializacin de las entradas y salidas
CLR P3.0
; Los pines de salida se inicializan a cero lgico que es el
CLR P3.1
; nivel inactivo en este caso
SETB P1.1
; Los pines correspondientes a los puertos de entrada, como
SETB P1.2
; son los que estn conectados a los sensores, se inicializan
SETB P1.3
; con un uno lgico, para evitar que no se dae el transistor de
SETB P1.4
; salida
SETB P1.5
;
; Programa de control
SAL1: JNB P1.3,SAL1
; Se espera a que llegue un producto a la plataforma
JB P1.1,SAL2
; Si D1=1 la plataforma baja, en caso contrario sube
SETB P3.0
; La plataforma sube
CLR P3.1
;

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

134
SAL3: JNB P1.4,SAL3
CLR P3.0
SETB P3.1
SAL4: JNB P1.2,SAL4
CLR P3.1
SAL2: CLR P3.0
SETB P3.1
SAL5: JNB P1.5,SAL5
CLR P3.1
SETB P3.0
SAL6: JNB P1.1,SAL6
CLR P3.0
JMP SAL1

; Se espera a que la plataforma llegue arriba


; La plataforma baja
;
; Se espera a que la plataforma llegue a la cinta A
; Paramos el motor
; La plataforma baja
;
; Se espera a que la plataforma baje hasta la altura de la cinta C
; La plataforma sube
;
; Se espera a que la plataforma llegue a la cinta A
; Se para el motor
; Vuelta al inicio

5.10.10 Control de la temperatura de un horno de coccin


Se plantea, en este caso, una aplicacin donde se controla la temperatura de un horno de coccin,
mediante un microcontrolador 8XC251Sx. Para poder controlar la temperatura del horno de coccin,
el microcontrolador debe recibir la informacin del estado del sistema que le llega a travs de los
puertos, procesar esa informacin mediante el algoritmo de control correspondiente y actuar sobre el
sistema, tambin a travs de los puertos, para que el comportamiento del horno se mantenga dentro de
los lmites fijados. En concreto, la accin de control a la que se somete el horno, tiene como objetivo
mantener su temperatura dentro del margen comprendido entre los 275C y los 300C. El horno de
coccin, cuyo esquema est representado en la figura 5.29, contiene los siguientes elementos:
Un tanque de fuel-oil, que almacena el combustible que alimenta el quemador.
Una bomba P, que impulsa el fuel-oil hacia el quemador B1 instalado en el horno, o bien hacia
el tanque.
Dos electrovlvulas V1 y V2. La electrovlvula V1 se encarga de controlar el paso del fuel-oil
al quemador B1. La electrovlvula V2 se encarga de controlar el retorno del fuel-oil al tanque.
Un horno de coccin, calentado por el quemador B1, que incorpora dos sensores de
temperatura.
V2

Tanque
Horno
V1
P

Sensores de
temperatura
T2

B1

T1

Fig. 5.29 Esquema del horno de coccin

Para realizar el control del sistema se dispone de una serie de sensores y actuadores electromecnicos
que permiten obtener informacin sobre el estado del sistema y actuar convenientemente sobre l.
Todos los sensores y actuadores son activos a 1 lgico y presentan el siguiente funcionamiento:

Los autores, 2001; Edicions UPC, 2001.

5 El modelo de programacin

1.

135

Sensores
T1: Detector de temperatura del horno que se activa cuando la temperatura del horno
aumenta por encima de 275C.
T2: Detector de temperatura del horno que se activa cuando la temperatura del horno
aumenta por encima de 300C.
NL: Detector de nivel del tanque, que se activa cuando el nivel del tanque disminuye por
debajo de un valor determinado.

2.

Actuadores
PP: Accionador de la bomba P. Cuando se activa este actuador, la bomba P se pone en
funcionamiento.
XV1, XV2: Son los actuadores que abren o cierran las electrovlvulas V1 y V2,
respectivamente. Cuando se activan, la vlvula correspondiente se abre y permite el paso del
fuel-oil al quemador o al tanque.
LR: Adems de los detectores y activadores antes descritos, el sistema dispone de un
indicador rojo cuya activacin, a 1 lgico, indica que el horno se halla fuera de servicio.

La estrategia de control, que debe implementar el sistema de control del horno, se puede resumir en
tres puntos:
1.

2.

3.

Si el nivel del tanque disminuye por debajo del nivel indicado por el sensor NL, se debe parar
la bomba, abrir la electrovlvula V2, cerrar V1 y sealizar que el sistema est fuera de
servicio activando el indicador rojo.
Si la temperatura del horno desciende por debajo de 275C, debe alimentarse el quemador
con combustible abrindose la electrovlvula V1, cerrndose la electrovlvula V2, y
activndose la bomba.
Si la temperatura del horno supera el valor de 300C, se debe suspender la alimentacin del
quemador cerrndose la electrovlvula V1, abrindose la electrovlvula V2 y activndose la
bomba.

En la figura 5.30 est representado el esquema elctrico de la conexin del microcontrolador


8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin.

8XC251Sx
P1.3

LR

T1

P0.0

P1.2

PP

T2

P0.1

P1.1

XV2

NL

P0.2

P1.0

XV1

Fig. 5.30 Conexin de los sensores y actuadores con el microcontrolador 8XC251Sx

En la figura 5.31 est representado el diagrama de flujo de esta aplicacin. Estn reflejadas las tres
opciones posibles, planteadas por la estrategia de control y la actuacin que se debe llevar a cabo en
cada caso.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

136
INICIO

NL = 1?

SI

Cerrar V1
Abrir V2
Parar la bomba
Activar luz roja

NO

T1 = 0?

SI

Abrir V1
Cerrar V2
Encender la bomba

NO

T2 = 1?

SI

Cerrar V1
Abrir V2
Encender la bomba

NO

Fig. 5.31 Organigrama del control del horno

Las primeras instrucciones del programa de control deben colocar, por motivos de seguridad, todos los
pines de salida a su nivel inactivo, ya que las salidas slo se deben activar despus de procesar los
datos de entrada, mediante el programa de control correspondiente. De igual modo, todos los pines de
entrada debern ponerse a 1 lgico para evitar la destruccin del driver de salida correspondiente. A
continuacin se detalla el listado del programa resultante.
;******************************************************************
;
Control del horno
;******************************************************************
ORG FF:0000H ; Direccin de inicio del programa
MOV P1,#00H
; Se inicializan todas las salidas a su nivel inactivo
SETB P0.0
; Se inicializan todos los pines de entrada a 1 lgico
SETB P0.1
;
SETB P0.2
;
INICIO: JNB P0.2,SALT1 ; Si el nivel del depsito est por debajo del valor
CLR P1.2
; permitido se para la bomba,
CLR P1.0
; se cierra la electrovlvula V1,
SETB P1.1
; se abre la electrovlvula V2,
SETB P1.3
; y se enciende la luz roja
JMP INICIO
; Salto al INICIO
SALT1: JB P0.0,SALT2
; Si el sensor T1 est inactivo:
SETB P1.0
; se abre la electrovlvula V1,
SETB P1.2
; se activa la bomba,
CLR P1.1
; se cierra la electrovlvula V2,
CLR P1.3
; y se apaga la luz roja
JMP INICIO
; Salto al INICIO
SALT2: JNB P0.1,INICIO ; Si el sensor T2 est activo:
CLR P1.0
; Se cierra la electrovlvula V1,
SETB P1.2
; se activa la bomba,
SETB P1.1
; se abre la electrovlvula V2,
CLR P1.3
; y se apaga la luz roja
JMP INICIO
; Salto al INICIO

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

137

6 Las interrupciones
6.1 Introduccin
Las interrupciones juegan un papel de suma importancia dentro de cualquier sistema basado en
microprocesador o microcontrolador, pues estos deben habitualmente gestionar y controlar distintos
perifricos asociados que, de forma continua, requieren la dedicacin de la CPU para llevar a buen
trmino las tareas que tienen asignadas.
1

Una interrupcin la realiza de forma asncrona un perifrico o un dispositivo conectado fsicamente al


microcontrolador (figura 6.1), cuando requiere a la CPU el desvo del flujo de ejecucin del programa
para gestionar y controlar los diversos sucesos que no se encuentran bajo su supervisin directa. De
esta manera se mejora la eficiencia de la CPU, ya que sta no tiene que estar continuamente pendiente
de si acontece o no un suceso en un instante de tiempo determinado, y puede realizar otras tareas de
mayor inters, atendiendo a los sucesos tan slo cuando stos se producen. Los sucesos acontecidos
pueden ser externos al sistema, como la activacin de un nivel lgico o un flanco en un terminal del
microcontrolador, por parte de un perifrico, o bien internos, como el desbordamiento de un
temporizador interno del microcontrolador al llegar ste a su mxima capacidad de cuenta.
Sensores y actuadores

Mdems

Terminal de vdeo

Teclado y visualizador

Discos magnticos

Impresora

Fig. 6.1 Diagrama de bloques del microcontrolador con distintos perifricos

Cuando se produce una interrupcin el microcontrolador ejecuta un proceso de atencin a la


interrupcin (figura 6.2). En este proceso la CPU deja de ejecutar la secuencia de instrucciones en la
que se encuentra y pasa a ejecutar la rutina de servicio a la interrupcin (RSI), que se encarga de
efectuar la gestin del perifrico. Una vez terminada esta rutina, la CPU regresa a la secuencia donde
se produjo la interrupcin, y sigue con el rumbo que tena. En el proceso de atencin a la interrupcin

Un perifrico es un dispositivo conectado al microcontrolador con una funcin especfica. Un perifrico puede ser una
impresora, un mdem, un teclado alfanumrico, un terminal de vdeo, un sensor, un actuador, etc.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

138

se realizan los siguientes pasos:


1. Termina de ejecutar la instruccin en curso.
2. Salva el valor del contador de programa, PC, en la pila, de manera que la CPU, al
terminar el proceso, pueda seguir ejecutando el programa a partir de la instruccin
siguiente a la ltima ejecutada.
3. La CPU salta a la direccin donde est almacenada la rutina de servicio de interrupcin
(RSI) y ejecuta esta rutina, que tiene como finalidad atender al perifrico o dispositivo
que ha generado la interrupcin.
4. La rutina RSI debe terminar con una instruccin de retorno de interrupcin, RETI. La
CPU al ejecutar esta instruccin lee la direccin almacenada en la pila y la asigna al
contador de programa, de manera que la CPU reanuda la ejecucin del programa a partir
de la instruccin siguiente a la instruccin donde se produjo la interrupcin.
Programa
principal
RSI

Interrupcin

- Terminar instruccin en curso


- Salvar el PC en la pila
- Saltar a RSI

RETI

- Recuperar PC de pila
Programa
principal

- Saltar a direccin del PC

Fig. 6.2 Proceso de atencin a una interrupcin


2

A la direccin de salto a partir de la cual se almacena la rutina de RSI se la denomina vector de


interrupcin. Segn el tipo de microcontrolador o microprocesador, las direcciones del vector de
interrupcin pueden ser fijas, es decir, especificadas por el fabricante, o bien pueden ser definidas por
el programador. Los vectores de interrupcin de las familias MCS-51 y MCS-251 son fijos y su valor
viene predeterminado por el fabricante.
Otro factor importante que se debe considerar en el proceso de interrupciones consiste en la
habilitacin de mscaras y en el establecimiento de prioridades. Una mscara no es ms que un
3

indicador de tipo bit que gobierna el estado de una puerta de transmisin conectada entre la entrada
en interrupcin y la CPU. Al bit que realiza la funcin de mscara se le denomina bit de habilitacin

Se debe considerar que el microcontrolador puede tener varias fuentes de interrupcin, por lo que a cada fuente de
interrupcin le corresponde una rutina especifica de RSI.
3

Una puerta de transmisin se realiza con puertas lgicas o bien con transistores bipolares o MOS. Tiene una entrada, una
salida y una lnea de control. La activacin de la lnea de control deja pasar el estado lgico presente en su entrada a su
salida; su desactivacin hace que la puerta est desconectada para evitar que el estado lgico de la entrada pase a la salida.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

139

de interrupcin. La activacin de un bit de habilitacin de interrupcin permite que la interrupcin


pase de la lnea de entrada hacia la CPU, mientras que la desactivacin de este bit hace que la
interrupcin no pueda pasar hacia la CPU, e inhiba la interrupcin; es decir, la interrupcin no es
atendida a menos que su bit de habilitacin correspondiente est activado. Los bits de habilitacin de
interrupciones permiten, pues, que el programador pueda activar o desactivar ciertas interrupciones, en
las circunstancias que sean de su consideracin.
Generalmente todas las entradas de interrupcin suelen tener un bit de habilitacin de interrupcin
asociado; no obstante, puede haber alguna entrada de interrupcin que adolezca de este bit, lo que se
denomina interrupcin no mascarable, en cuyo caso el programador no tiene control sobre la
interrupcin y la CPU est obligada siempre a atenderla. Las interrupciones no mascarables se
reservan para aquellos perifricos o sucesos de suma importancia, como, por ejemplo, la cada de
tensin de la red elctrica, en que la CPU dispone de los pocos milisegundos en los que los
condensadores de la fuente de alimentacin son capaces de sostener la tensin de alimentacin para
salvar los registros que se consideren imprescindibles en una memoria estable, como una memoria
E2PROM o una memoria RAM con una batera externa.
El establecimiento de prioridades dentro del proceso de interrupcin se considera cuando existe la
posibilidad de que varias interrupciones se produzcan de manera simultnea, por lo que es necesario
estipular un orden de atencin a las interrupciones producidas. Para ello, las entradas de interrupcin
suelen tener uno o varios bits asociados con los que el programador puede establecer un orden de
prioridad en la atencin de las interrupciones.

6.2 Las interrupciones en la familia MCS-51


La familia MCS-51 puede llegar a tener hasta siete fuentes de interrupcin distintas (figura 6.3), todas
ellas con un bit de habilitacin de interrupcin situado en el registro IE, Interrupt Enable -direccin
A8H del SFR-, de forma que el programador puede habilitarlas o deshabilitarlas cuando sea necesario.
Respecto a las prioridades, todos los componentes de la familia tienen dos niveles de prioridad que se
determinan con un nico bit, para cada entrada de interrupcin, situado en el registro IP, Interrupt
Priority -direccin B8H del SFR-, con excepcin de las versiones 8XC51Fx y 8XX52/54/58, que
tienen hasta cuatro niveles de prioridad; incorporan, para ello, un segundo registro de prioridad
denominado IPH, Interrupt Priority High -direccin B7H del SFR-. En este ltimo caso, el nivel de
prioridad de una entrada de interrupcin se determina mediante sus bits correspondientes de los
registros IP y IPH.
Tres de las seis fuentes de interrupcin son externas al microcontrolador: /INT0, /INT1 y el puerto
serie, RI y TI; las fuentes de interrupcin restantes son internas y corresponden a los tres
temporizadores, Timer 0, Timer 1 y Timer 2, y al array de contadores programable PCA de la familia
MCS-51. La interrupcin de los temporizadores se produce por un desbordamiento en su valor
mximo; entonces se activan los bits de desbordamiento correspondientes: TF0, TF1 o TF2. La
interrupcin de la PCA se genera mediante cualquiera de los bits EF, CCF0, CCF1, CCF2, CCF3,
CCF4 y CCF5 del registro CCON, PCA Counter Control Register; cada uno de estos bits de

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

140

interrupcin tiene asociado un bit de habilitacin de interrupcin, bits ECF y ECCFn de los registros
CMOD, PCA Counter Mode Register y CCAPMn, PCA Compare/Capture Modules.
El Timer 2 tiene un bit adicional de interrupcin, EXF2, que realiza una peticin de interrupcin si se
detecta un flanco de bajada en el terminal T2 del microcontrolador.
Tal y como muestra la figura 6.3, las interrupciones externas /INT0 y /INT1 se pueden activar tanto
por nivel lgico (cero lgico), como por flanco descendente, mediante la programacin de los bits IT0
y IT1 del registro TCON, Timer Control (tabla 6.2), respectivamente. Poner uno de estos bits a cero
lgico hace que la interrupcin se active por nivel lgico, mientras que a uno lgico se activa por
flanco descendente.
Registro IE
EX0

0
INT0

IE0

IT0
1

ET0
TF0

EX1

0
INT1

IE1

IT1
1

ET1
TF1
0
CF

ECF
1

()

EC

0
CCFn

ECCFn
1

ES

RI
TI
TF2
EXF2

(*)

ET2

EA
Inhibicin global
* En las versiones con 3 temporizadores

En las versiones con PCA

Fig. 6.3 Fuentes de interrupcin de la familia MCS-51

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

141

Al producirse una interrupcin en una de las entradas externas de interrupcin, /INT0 o /INT1, ya sea
por nivel lgico o por flanco descendente, el bit correspondiente, IE0 o IE1 del registro TCON, se
activa a uno lgico, indicando de esta manera que se ha realizado una peticin de interrupcin, y la
CPU pone en marcha el proceso de atencin a la interrupcin, siempre y cuando la interrupcin est
habilitada de antemano. En este proceso, los bits IE0 e IE1 se ponen a cero lgico de forma automtica
cuando la interrupcin se ha activado por flanco descendente. Sin embargo, si la interrupcin se ha
activado por nivel lgico, los bits IE0 y IE1 se deben borrar por software dentro de la rutina de RSI.
El estado de las interrupciones externas /INT0 e /INT1 se comprueba una vez cada ciclo mquina, de
forma que la entrada de interrupcin, para el caso de que est activada por flanco descendente, se debe
sostener a nivel lgico alto al menos un ciclo mquina, y sostener a nivel lgico bajo al menos otro
ciclo mquina ms, para que el flanco descendente sea detectado y se active el bit IE0 o IE1,
correspondiente. En el caso de que la interrupcin est activada por nivel lgico, la entrada de
interrupcin se debe sostener a nivel lgico bajo al menos durante 1 ciclo mquina, para que la
interrupcin sea detectada por la CPU.
En las interrupciones internas producidas por los temporizadores Timer 0 o Timer 1, se activan los bits
TF0 o TF1, segn corresponda, del registro TCON a uno lgico, al realizar la peticin de interrupcin.
Estos bits se mantienen en este estado hasta que la CPU atiende la peticin, momento en el cual los
pone a cero lgico de forma automtica.
El temporizador Timer 2 puede producir una interrupcin a travs de la activacin a uno lgico de los
bits TF2 o EXF2. Estos bits no se ponen a cero lgico de manera automtica, sino que los debe poner
el programador por software.
Las interrupciones producidas por el puerto serie activan a uno lgico los bits TI o RI del registro
SCON, cuando el microcontrolador transmite un dato o cuando recibe un dato, respectivamente. Estos
bits los debe poner a cero lgico el programador mediante software.
La tabla 6.1 muestra los bits de peticin de interrupcin asociados a cada una de las fuentes de
interrupcin.
Tabla 6.1 Fuentes de interrupcin, bits activados y tabla de vectores de salto para la MCS-51
Fuente de
interrupcin
/INT0
Timer 0
/INT1
Timer 1
Puerto serie
Timer 2
PCA

Bit que activa

Borrado por hardware

Registro

Vector de
salto

IE0
TF0
IE1
TF1
RI, TI
TF2, EXF2
CF, CCFn

No, por nivel. Si, por flanco.


Si.
No, por nivel. Si, por flanco.
Si.
No.
No.
No.

n=0, 1, 2, 3, 4.

TCON
TCON
TCON
TCON
SCON
T2CON
CCON

0003H
000BH
0013H
001BH
0023H
002BH
0033H

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

142
Tabla 6.2 Registro TCON para la familia MCS-51
Registro TCON

(MSB)
TF1

TR1

TF0

TR0

IE1

(LSB)
IT1

IE0

IT0

Bit

Comentario

TF1

Bit de rebasamiento del Timer 1. Se pone a 1 por hardware en el rebasamiento. La CPU lo pone a 0 cuando
procesa la interrupcin y salta a la rutina de RSI.
Bit de marcha/paro del Timer 1. Se pone a 1 0 por software para poner en marcha o parar el Timer 1
Bit de rebasamiento del Timer 0. Se pone a 1 por hardware en el rebasamiento. La CPU lo pone a 0 cuando
procesa la interrupcin y salta a la rutina de RSI.
Bit de marcha/paro del Timer 1. Se pone a 1 0 por software para poner en marcha o parar el Timer 1
Bit de interrupcin del terminal /INT1. Se pone a 1 en una peticin de interrupcin, se pone a 0 por
hardware si /INT1 est activada por flanco descendente.
Bit de seleccin de interrupcin por nivel o por flanco descendente de /INT1. A 0 la interrupcin se activa
por nivel, a 1 se activa por flanco descendente.
Bit de interrupcin del terminal /INT0. Se pone a 1 en una peticin de interrupcin, se pone a 0 por
hardware si /INT0 est activada por flanco descendente.
Bit de seleccin de interrupcin por nivel o por flanco descendente de /INT0. A 0 la interrupcin se activa
por nivel, a 1 se activa por flanco descendente.

TR1
TF0
TR0
IE1
IT1
IE0
IT0

6.2.1 Vectorizacin de interrupciones en la MCS-51


Cuando se produce una interrupcin la CPU desva el flujo de ejecucin de instrucciones hacia las
rutinas de atencin de interrupciones, RSI, definidas por el programador. En la MCS-51 las
direcciones de salto hacia las rutinas de RSI son fijas y estn predefinidas por el fabricante en lo que
se denomina tabla de vectores de salto (tabla 6.1). En esta tabla, se observa cmo la interrupcin
/INT0 provoca un salto a la direccin 03H de la memoria de programas, la TIMER0 a la 0BH, la
/INT1 a la 013H, etc. A partir de estas direcciones debe situarse la rutina de RSI que corresponda.
En la tabla 6.1 tambin se observa que el espacio existente entre los vectores de interrupcin es de tan
slo 8 bytes. Este espacio suele ser insuficiente para albergar una rutina de RSI, por lo que, en estas
posiciones, se suele insertar una instruccin de salto, LJMP, AJMP o SJMP, hacia la rutina de RSI que
atienda a la interrupcin; as, se puede situar esta rutina en cualquier zona del espacio de memoria
disponible por el microcontrolador.
El retorno de una rutina de RSI se debe realizar con la instruccin RETI, para que la CPU diferencie
este retorno, del retorno de subrutina (instruccin RET).
;**************************************************************
;Vectorizacin de interrupciones
;**************************************************************
ORG 03H
;Posiciona la instruccin siguiente en 03H
LJMP RSI_INT0
;Salto a la rutina de RSI
ORG 0BH
;Posiciona instruccin siguiente en 0BH
LJMP RSI_TIMER0
;Salto a la rutina de RSI
ORG 013H
;Posiciona instruccin siguiente en 013H
LJMP RSI_INT1
;Salto a la rutina de RSI
RSI_INT0:
MOV .....
;Rutina de RSI para /INT0
:
RETI
RSI_TIMER0: MOV .....
;Rutina de RSI para TIMER0
:
RETI

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

143
RSI_INT1:

MOV .....
:
RETI

;Rutina de RSI para INT1

La estructura del programa cuando se utilizan interrupciones estar formada por una rutina de
vectorizacin, como la mostrada en este apartado. El registro PC se inicializa a 0000H tras un reset o
la puesta en marcha del microcontrolador, por lo que la primera instruccin que se ejecuta es la
contenida en la direccin 0000H. La estructura de un programa, tambin, en general contempla una
rutina Inicio, donde se determinan los valores de las variables que se van a utilizar y el modo de
operar del microcontrolador, y una rutina Principal, donde se llevan a cabo la mayor parte de las
tareas que debe gestionar la CPU, aunque, parte de estas tareas puedan solventarse mediante
interrupciones. En conclusin, la rutina de vectorizacin anterior debe, adems, incluir en la direccin
0000H una instruccin de salto hacia la rutina Inicio, tal y como se muestra en la rutina siguiente:
;****************************************************
;Vectorizacin de interrupciones
;****************************************************
ORG 0H
LJMP Inicio
;Salto a la rutina Inicio
ORG 03H
LJMP RSI_INT0
ORG 0BH
LJMP RSI_TIMER0
ORG 013H
LJMP RSI_INT1

6.2.2 Habilitacin de interrupciones y establecimiento de prioridades en la MCS-51


Cada una de las fuentes de interrupcin de la MCS-51 dispone de un bit de
habilitacin/deshabilitacin en el registro IE, Interrupt Enable, del rea de SFR (tabla 6.3). En el
registro IE el bit de mayor peso, IE.7 o tambin EA, es el bit de inhibicin global y afecta de forma
directa a todos los bits de habilitacin de interrupciones establecidos dentro del mismo registro IE.
Poniendo el bit EA a cero lgico se inhabilitan todas las interrupciones del microcontrolador, aunque
existan bits de habilitacin de interrupcin activados; por contra, poniendo el bit EA a uno lgico, se
habilitan slo las interrupciones que tienen su bit de habilitacin activado.
La mayor parte de los componentes de la MCS-51 tienen dos niveles de prioridad, con excepcin de
las versiones 8XC51Fx y 8XC52/54/58, que tienen hasta cuatro niveles de prioridad. El nivel de
prioridad se determina con el registro de prioridades IP, Interrupt Priority, del rea de SFR (tabla 6.4).
Poniendo un bit de este registro a uno lgico se fija la prioridad a nivel alto y a cero lgico se fija a
nivel bajo.
Para el caso de que dos o ms interrupciones tengan el mismo nivel de prioridad y se produzca una
peticin simultnea de interrupcin, el fabricante asigna un nivel de prioridad por defecto a cada una
de las fuentes de interrupcin del microcontrolador (tabla 6.5), de forma que en una peticin
simultnea de interrupcin, la CPU atienda primero a la interrupcin con mayor prioridad segn la
tabla 6.5.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

144
Tabla 6.3 Registro IE de habilitacin de interrupciones para la MCS-51
Registro IE

(MSB)
EA

EC

ET2* ES

ET1

(LSB)
EX1

ET0

EX0

BIT

COMENTARIO

EX0
ET0
EX1
ET1
ES

EX0 = 1 habilita la interrupcin en INT0.


EX0 = 0 la inhabilita
ET0 = 1 habilita la interrupcin del Timer 0. ET0 = 0 la inhabilita.
EX1 = 1 habilita la interrupcin en INT1.
EX1 = 0 la inhabilita.
ET1 = 1 habilita la interrupcin del Timer 1. ET1 = 0 la inhabilita.
ES = 1 habilita la interrupcin del puerto serie.
ES = 0 la
inhabilita.
ET2 = 1 habilita la interrupcin del Timer 2. ET2 = 0 la inhabilita.
EC =1 habilita la interrupcin de la PCA.
EC = 0 la inhabilita.
EA = 1 permite todas las habilitaciones o inhabilitaciones anteriores.
EA = 0 no reconoce ninguna interrupcin.

ET2*
EC
EA

* En las versiones con 3 temporizadores

En las versiones con PCA

Tabla 6.4 Registro de prioridades IP


Registro IP

(MSB)

PPC PT2* PS

BIT
PX0
PT0
PX1
PT1
PS
PT2*
PPC
-

PT1

(LSB)
PX1

PT0

PX0

COMENTARIO
Bit de prioridad de /INT0.
Bit de prioridad del Timer 0.
Bit de prioridad de /INT1.
Bit de prioridad del Timer 1
Bit de prioridad del puerto serie.
Bit de prioridad del Timer 2.
Bit de prioridad de la PCA.
Bit reservado.
* En las versiones con 3 temporizadores

En las versiones con PCA

Tabla 6.5 Nivel de prioridad asignado por defecto en la MCS-51


Prioridad
(ms alta).......1
2
3
4
5
6
(ms baja).......7

Fuente
/INT0
Timer 0
/INT1
Timer 1
PCA
Puerto Serie
Timer 2*
* En las versiones con 3 temporizadores

En las versiones con PCA

Las versiones 8XC51Fx y 8XC52/54/58 tienen cuatro niveles de prioridad que se determinan por
medio de los registros IP y IPH (tabla 6.6). En la tabla 6.7 se indica el nivel de prioridad segn el
estado de los bits correspondientes a cada una de las fuentes de interrupcin.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

145

Tabla 6.6 Registro de prioridades IPH para las versiones 8XX52/54/58 y 8XC51Fx de la MCS-51
Registro IPH

(MSB)
PPCH PT2H*

BIT
PX0H
PT0H
PX1H
PT1H
PSH
PT2H
PPCH
-

PSH

(LSB)

PT1H PX1H PT0H PX0H

COMENTARIO
Bit alto de prioridad de /INT0.
Bit alto de prioridad del Timer 0.
Bit alto de prioridad de /INT1.
Bit alto de prioridad del Timer 1.
Bit alto de prioridad del puerto serie.
Bit alto de prioridad del Timer 2.
Bit alto de prioridad de la PCA.
Bit reservado.

Slo en las versiones 8XC51Fx.

Tabla 6.7 Niveles de prioridad para las versiones 8XX52/54/58 y 8XC51Fx de la MCS-51
Bits de prioridad
IPH.x
IP.x
0
0
0
1
1
0
1
1

Nivel de prioridad
Nivel 0
Nivel 1
Nivel 2
Nivel 3

(Menor)

(Mayor)

6.2.3 Tiempos de respuesta del proceso de interrupcin


Las fuentes de interrupcin en la MCS-51 se comprueban en la fase 2 del estado 5 de cada ciclo
mquina, denominado S5P2 (figura 6.4), y se evala su estado en el siguiente ciclo mquina del
microcontrolador. En consecuencia, si la CPU encuentra que una de las fuentes est activa, entonces
genera un salto automtico hacia la rutina de RSI correspondiente. Aunque, este salto puede ser
abortado por cualquiera de las condiciones siguientes:
1.
2.

3.

Se halla en proceso una interrupcin de mayor o igual prioridad.


El ciclo mquina en el que se ha producido la interrupcin no es el ltimo de la
instruccin en curso de ejecucin por parte de la CPU, por lo que debe esperar a que se
termine de ejecutar la instruccin.
La instruccin actual en curso es una instruccin RETI o cualquier otra que escriba en
los registros IE o IP.

La lectura de las peticiones de interrupcin realizadas por el microcontrolador carece de memoria, por
lo que si una peticin de interrupcin resulta abortada por una de las condiciones anteriores, en un
ciclo mquina determinado, y esta peticin no se sostiene por parte del perifrico de manera que
vuelva a detectarse en el ciclo maquina siguiente, entonces la interrupcin no es atendida; es decir, en
caso de rechazo de la interrupcin, sta debe ser sostenida por el perifrico el tiempo necesario hasta
que la CPU la atienda.
La CPU reconoce la peticin de una interrupcin cuando vectoriza la interrupcin, es decir, cuando
salta a la rutina de RSI correspondiente. Segn el tipo de interrupcin, la CPU, adems, borra el bit

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

146

activado en la peticin de interrupcin (tabla 6.1), como es el caso de los bits TF0 y TF1, o de los bits
IE0 e IE1, slo cuando la interrupcin ha sido activada por flanco descendente. En otros casos el bit
activado por la interrupcin se debe borrar por software.
Ciclo C1

S5P2

Ciclo C2

Ciclo C3

Ciclo C5

Ciclo C4

S6

Comprobacin de
interrupciones

Consulta de
interrupciones
activas

Salto a la
rutina de RSI

Rutina de
RSI

Fig. 6.4 Diagrama de tiempos del salto a la rutina de RSI en el proceso de interrupciones

La CPU guarda en la memoria interna de la pila el contenido del registro PC (dos bytes) y, luego, salta
a la rutina RSI correspondiente. La CPU ejecuta la rutina de RSI hasta que encuentra una instruccin
RETI, que le indica que se ha llegado al final del proceso de interrupcin; recupera entonces los dos
bytes almacenados en la pila y los asigna al registro PC, por lo que la ejecucin del programa regresa
al punto de partida donde se inici la interrupcin.
El tiempo transcurrido (figura 6.4), desde que se produce la interrupcin (S5P2 del ciclo C1), hasta
que la CPU comienza a ejecutar la rutina de RSI (ciclo C5), es de como mnimo tres ciclos mquina.
El tiempo de respuesta es mayor si el salto resulta abortado por una de las condiciones mencionadas.
En el primer caso, si una interrupcin de mayor o igual prioridad est en proceso, el tiempo de espera
depender de la rutina de RSI en ejecucin. En el segundo caso, cuando la CPU debe esperar a que se
4

finalice la ejecucin de la instruccin actual, el tiempo de espera, en el peor caso , no puede ser
superior a tres ciclos mquina. En el tercer caso, si una instruccin RETI, o la escritura del registro IE
o IP, est en progreso, el tiempo adicional de espera no puede ser superior a cinco ciclos mquina. En
definitiva, el tiempo de respuesta de una interrupcin estar comprendido entre tres y nueve ciclos
mquina.
Ejemplo 6.1 Conexin de teclas al microcontrolador
Se conectan cuatro teclas al puerto P1 de un microcontrolador 80C31 (figura 6.5). Las entradas
del puerto P1 tienen una resistencia interna de pull-up (figura 3.4), por lo que un terminal del
puerto, por ejemplo P1.0, estar en el estado 1 lgico (Vcc) cuando no se pulsa la tecla T1, y a
0 lgico (masa) cuando se pulsa T1. Luego, la deteccin de si una tecla ha sido pulsada o no,
consiste en leer el estado lgico del puerto P1, y ver si hay algn cero en una de sus patillas. En
la figura 6.5 cada una de las teclas est conectada a una puerta AND, de manera que la
pulsacin de cualquiera de las cuatro teclas causar un 0 lgico en la entrada de interrupcin
/INT0, y provocar una interrupcin en el caso de que est habilitada.

El peor caso corresponde a las instrucciones MUL y DIV que tardan en ejecutarse cuatro ciclos mquina.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

147
T1
T2
T3
T4

P1.0
P1.1
P1.2
P1.3

80C31
/INT0

Fig. 6.5 Conexin de cuatro teclas a un microcontrolador en el ejemplo 6.1

En este ejemplo se debe habilitar la interrupcin /INT0 y crear una rutina RSI capaz de detectar
la tecla que ha sido pulsada. Para ello, se utilizar el registro B como registro indicador de la
pulsacin de una tecla, y se le asignar el valor 00H cuando no se haya pulsado ninguna tecla, y
los valores 01H, 02H, 03H y 04H, cuando se pulsen las teclas T1, T2, T3 y T4,
respectivamente. La interrupcin /INT0, en este ejemplo, se establecer por nivel lgico (bit
IT0 del registro TCON a 0 lgico). Se debe tener en cuenta que todos los bits accesibles de los
registros TCON, IE y IP quedan a 0 lgico tras un reset del microcontrolador.
;**********************************************************************
; Rutina de vectorizacin (ejemplo 6.1)
;**********************************************************************
ORG 0H
LJMP Inicio
ORG 03H
LJMP RSI_INT0
;**********************************************************************
; Rutina de Inicio. (Se habilita las interrupciones y /INT0 por flanco descendente)
;**********************************************************************
Inicio: SETB PX0
;Prioridad alta para la interrupcin /INT0 (Registro IP)
SETB EX0
;Activa el bit de habilitacin de /INT0 (Registro IE)
SETB EA
;Activa el bit de habilitacin general (Registro IE)
LJMP Principal
;**********************************************************************
; Programa Principal
;**********************************************************************
ORG 0300H
Principal: SJMP Principal
;Bucle infinito sin propsito definido
;**********************************************************************
; Rutina de RSI de /INT0
;**********************************************************************
RSI_INT0: JNB P1.0, Tecla_1
;Es la tecla T1?
JNB P1.1, Tecla_2
;Es la tecla T2?
JNB P1.2, Tecla_3
;Es la tecla T3?
SJMP Tecla_4
;Si no es ninguna de las anteriores, es la tecla T4
Tecla_1:
MOV B, #01H
;Pone 01H en el registro B
SJMP Salir
;Ir a Salir
Tecla_2:
MOV B, #02H
;Pone 02H en el registro B
SJMP Salir
;Ir a Salir
Tecla_3:
MOV B, #03H
;Pone 03H en el registro B
SJMP Salir
;Ir a Salir
Tecla_4:
MOV B, #04H ;Pone 04H en el registro B
Salir:
CLR IE0
;Se pone a cero para que /INT0 pueda interrumpir de nuevo.
RETI
;Final de interrupcin

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

148

La ejecucin de las instrucciones del programa empieza por la direccin 0H, pues, en la puesta
en marcha del microcontrolador, se ejecuta un reset interno que sita el registro PC a 00H. La
primera instruccin, entonces, es una instruccin de salto a la rutina Inicio, donde se
configura la forma de operar de la interrupcin /INT0, mediante los registros TCON, IE y IP.
De esta rutina, la CPU pasa a ejecutar la rutina Principal, que slo consiste en un bucle
infinito, sin ningn objetivo especfico. Esto es as, por el funcionamiento casi exclusivo del
programa mediante interrupciones, de manera que la CPU est siempre ejecutando
instrucciones de la rutina Principal, a la espera de que las interrupciones se produzcan, lo que
causa el salto automtico hacia las rutinas de RSI.
En el momento que se pulsa una tecla, se provoca la interrupcin /INT0 y se ejecuta la rutina
RSI_INT0. Esta rutina comprueba de forma secuencial, mediante la instruccin JNB, cul ha
sido la tecla pulsada, colocando en el registro B el valor adecuado, segn los objetivos
marcados en este ejemplo. Al final de la rutina, el bit IE0, debido a que la interrupcin /INT0
se ha habilitado por nivel lgico, se borrar por software para que se produzca una nueva
interrupcin en /INT0.
La lectura de las teclas, en el programa realizado, se hace de manera secuencial, por lo que el
programa es incapaz de detectar una pulsacin simultnea de varias teclas, y da por vlida la
tecla que lee primero; es decir, en el caso de pulsarse las teclas conectadas T1 y T2, en el
registro B se colocara el cdigo correspondiente a la tecla T1. Este problema se solventa en el
siguiente ejemplo que consiste en una modificacin del actual.

Ejemplo 6.2 Conexin de teclas y de un dgito de siete segmentos


Este ejemplo se basa en el anterior, con las siguientes modificaciones:
-

Se incorporan un dgito de siete segmentos conectado al puerto P2 y una tecla


adicional, T5, conectada a la entrada de interrupcin /INT1 (figura 6.6).
El microcontrolador empleado es el 87C51 y utiliza exclusivamente su memoria de
programa interna.
El programa debe ser capaz de detectar la pulsacin de varias teclas al mismo tiempo,
e indica esta situacin a travs del encendido de todos los leds del dgito conectado.
La pulsacin de una tecla, T1, T2, T3 o T4, se indicar poniendo el nmero 1, 2, 3 o 4,
en el dgito, respectivamente. En el dgito siempre se mostrar la ltima tecla pulsada.
La pulsacin de T5 apagar todos los leds del dgito T5.

En la figura 6.6 se emplea el circuito integrado 7405 que contiene hasta 6 puertas inversoras en
colector abierto. La puerta inversora est formada por un nico transistor, del cual se dispone
de su colector, tal y como se ve en el detalle de la figura. La puerta inversora puede soportar
una corriente mxima de 25mA, valor ms que suficiente para encender de manera adecuada el
diodo LED que tiene asociado.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

149

87C51
T1
T2
T3

P1.0

P2.0

P1.1

P2.1

T4

P1.3

74LS05/06
a
b

nodo comn
a
f

P1.2

Vcc

b
g

e
P2.7

DP

d DP
/INT0
T5

/INT1

Fig. 6.6 Circuito del ejemplo 6.2

La resistencia R se debe calcular de forma que, considerando el valor de Vcc, de la tensin


umbral del diodo LED, VTH, y la tensin colector-emisor del transistor en saturacin, VCE, la
corriente est limitada a unos 20mA. Su valor se puede determinar a partir de la siguiente
ecuacin:
R]

VCC [ VTH [ VCE


i

La interrupcin /INT1 se habilita por flanco descendente, mientras que la interrupcin /INT0 se
habilita por nivel lgico, de manera que en la rutina RSI de /INT0 se debe borrar el bit IE0. Sin
embargo, en la rutina RSI de /INT1 el bit IE1 se borra de forma automtica.
;************************************************************************
;Rutina de vectorizacin (ejemplo 6.2)
;************************************************************************
ORG 0H
LJMP Inicio
ORG 03H
LJMP RSI_INT0
ORG 013H
LJMP RSI_INT1
;************************************************************************
; Rutina de Inicio
; Se habilita las interrupciones y /INT0 por flanco descendente
;************************************************************************
Inicio:
SETB IT1
;Interrupcin /INT1 activa por flanco descendente
SETB PX1
;Prioridad alta para /INT1
SETB EX0
;Activa el bit de habilitacin de /INT0
SETB EX1
;Activa el bit de habilitacin /INT1
SETB EA
;Activa el bit de habilitacin general
;************************************************************************
; Programa Principal
;************************************************************************
Principal: MOV A, B
;Lee el registro B
CALL Siete_seg
;Codifica en 7 segmentos para mostrar en dgito
MOV P2, A
;Carga en dgito
SJMP Principal
;Bucle infinito a Principal

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

150
Siete_seg:

INC A
MOVC A, @A+PC
RET
DB 0000 0000b
;Todos los leds apagados
DB 0000 0110b
;leds b y c encendidos, caracter 1, tecla T1
DB 0101 1011b
;leds a, b, d, e y g encendidos, caracter 2, tecla T2
DB 0100 1111b
;leds a, b, c, d y g encendidos, caracter 3, tecla T3
DB 0110 0110b
;leds b, c, f y g encendidos, caracter 4, tecla T4
DB 1111 1111b
;Todos los leds encendidos, varias teclas pulsadas
;************************************************************************
; Rutina de RSI de /INT0
;************************************************************************
RSI_INT0: MOV A,P1
;Lee el puerto P1
ORL A,#F0H
;Mscara, fuerza los 4 bits altos de P1 a 1 lgico
CJNE A, #11111110b, Dif_1 ;Es tecla T1?
MOV B, #01H
;Pone 01H en el registro B
SJMP Salir
;Ir a Salir
Dif_1:
CJNE A, #11111101b, Dif_2
MOV B, #02H
;Pone 02H en el registro B
SJMP Salir
;Ir a Salir
Dif_2:
CJNE A, #11111011b, Dif_3
MOV B, #03H
;Pone 03H en el registro B
SJMP Salir
;Ir a Salir
Dif_3:
CJNE A, #11110111b, Varias_tec
MOV B, #04H
;Pone 04H en el registro B
SJMP Salir
;Ir a Salir
Varias_tec: MOV B, #05H
;Pone 05H en el registro B
Salir:
CLR IE0
;Se pone a cero para que /INT0 pueda interrumpir de nuevo.
RETI
;Final de interrupcin
;************************************************************************
; Rutina de RSI de /INT1
;************************************************************************
RSI_INT1: MOV B, #0
;Borra el registro B
RETI
;No es necesario borrar el bit IE1, ya que es por flanco

La rutina Principal de este ejemplo se encarga de leer el contenido del registro B y de poner
en el dgito el carcter correspondiente segn sea el valor de B. El registro B puede valer 00H
al principio, si no se ha pulsado ninguna tecla, o tras pulsar la tecla T5; puede valer 01H, 02H,
03H o 04H, al pulsar las teclas T1, T2, T3 o T4, respectivamente; y puede valer 05H en el caso
de que se pulsen varias teclas al mismo tiempo. Con el valor del registro B se lee la tabla
Siete_seg, que proporciona el cdigo en siete segmentos, correspondiente al carcter que se
quiere mostrar en el dgito del ejemplo. De todas formas, la tabla Siete_seg se puede suprimir
colocando en el registro B, directamente, el cdigo del carcter que deber mostrar en el dgito,
segn sea el caso.

Ejemplo 6.3 Conexin de teclas al microcontrolador mediante el 74LS148


El 74LS148 es un circuito integrado codificador con prioridad que se puede emplear para
conectar varios perifricos a una misma lnea de interrupcin, o bien, como en este caso, a la
conexin de hasta 8 teclas al microcontrolador, empleando para ello el sistema de
interrupciones.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

151

Segn el circuito de la figura 6.7, el codificador con prioridad codifica en binario la tecla
pulsada, sacando el cdigo por las tres lneas de salida: A1, A2 y A3. Con el 74LS148, si se
pulsan varias teclas a la vez, aparece a su salida el cdigo correspondiente a la entrada con
mayor prioridad (la entrada 7 es la de mayor prioridad, y la entrada 0 la de menor prioridad).
Cuando se pulsa una tecla la lnea de salida /GS del codificador se pone a cero lgico, de
manera que puede generar una interrupcin conectndola a la entrada /INT0 del
microcontrolador. La entrada /EI del 74LS148 es de habilitacin del circuito integrado.
/EI se conecta directamente a masa para que el codificador est siempre habilitado. La tabla de
verdad del codificador se puede ver en la tabla 6.15.
T1
T2
T3
T4
T5
T6
T7
T8

87C51

74LS148
0

A1

P1.0

A2

P1.1

A3

P1.2

P2.0
P2.1

7405
a
b

f
e

P1.4

nodo comn
a

Vcc

b
g

T9

P2.7

DP

d DP

6
/GS

/INT0

/EI

Fig. 6.7 Circuito del ejemplo 6.3

El programa que se debe realizar en este ejemplo ha de mostrar el nmero de la ltima tecla
pulsada en el dgito de siete segmentos, mientras que la pulsacin de la tecla T9 debe borrar el
dgito. La interrupcin /INT0 se debe activar por nivel lgico.
;************************************************************************
;Rutina de vectorizacin (ejemplo 6.3)
;************************************************************************
ORG 0H
LJMP Inicio
ORG 03H
LJMP RSI_INT0
;************************************************************************
; Rutina de Inicio
(Habilitacin de interrup., /INT0 por nivel)
;************************************************************************
ORG 0200H
Inicio: SETB PX0
;Prioridad alta para /INT0
SETB EX0
;Activa el bit de habilitacin de /INT0
SETB EA
;Activa el bit de habilitacin general
LJMP Principal
;************************************************************************
; Programa Principal
;************************************************************************
ORG 0300H
Principal: JB P1.4, Rut_ok
;Salta a Rut_ok si no se pulsa T9
MOV B,#0
;Borra B (por tanto dgito) si se pulsa T9
Rut_ok: MOV A, B
;Lee el registro B
MOV P2, A
;Carga en dgito
SJMP Principal
;Bucle infinito a Principal

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

152

;************************************************************************
; Rutina de RSI de /INT0
;************************************************************************
ORG 0400H
RSI_INT0: MOV A,P1
;Lee el puerto P1
ANL A,#07H
;Mscara, fuerza P1 a 0, excepto P1.0, P1.1 y P1.2
CALL Tecla_in
;Ejecuta subrutina Tecla_in
MOV B,A
;Guarda cdigo en B
CLR A
;Borra A
CLR IE0
;Borra bit IE0, para una posterior interrupcin
RETI
;Retorno de interrupcin
Tecla_in:
INC A
MOVC A,@A+PC
RET
DB 0111 1111b
;leds a, b, c, d, e, f y g encendidos, caracter 8, tecla T8
DB 0000 0111b
;leds a, b y c encendidos, caracter 7, tecla T7
DB 0111 1101b
;leds a, c, d, e, f y g encendidos, caracter 6, tecla T6
DB 0110 1101b
;leds a, c, d, f, y g encendidos, caracter 5, tecla T5
DB 0110 0110b
;leds b, c, f y g encendidos, caracter 4, tecla T4
DB 0100 1111b
;leds a, b, c, d y g encendidos, caracter 3, tecla T3
DB 0101 1011b
;leds a, b, d, e y g encendidos, caracter 2, tecla T2
DB 0000 0110b
;leds b y c encendidos, caracter 1, tecla T1

La rutina de RSI de /INT0 lee directamente el valor del puerto P1, aplica una mscara al valor
ledo, puesto que slo interesa el valor de las patillas P1.0, P1.1 y P1.2 del puerto, y pone el
cdigo del carcter en siete segmentos, correspondiente a la tecla pulsada, en el registro B. La
rutina Principal comprueba el estado de la tecla T9 con la instruccin JB P1.4, Rut_ok, y
sita el valor del registro B, procedente de la rutina RSI_INT0, en el puerto P2, para su
visualizacin. El registro B se pone a cero cuando se pulsa la tecla T9.

6.3 El sistema de interrupciones en la familia MCS-251


Los microcontroladores de la familia MCS-251, como otros microcontroladores y microprocesadores
de propsito general, incorporan un circuito gestionador de interrupciones. Este circuito puede recibir
peticiones de interrupcin de ocho fuentes: siete fuentes que pueden ser habilitadas o inhibidas
mediante programa, y que por ese motivo se denominan mascarables, y la instruccin TRAP, que
permanece siempre habilitada. Las interrupciones mascarables estn formadas por dos interrupciones
externas (/INT0 y /INT1), tres interrupciones correspondientes a los temporizadores (Timer 0, Timer 1
y Timer 2), una interrupcin del array de contadores programables (PCA) y una interrupcin del
puerto de comunicacin serie. En la figura 6.8 estn representadas las distintas fuentes de interrupcin.
Las interrupciones pueden ocurrir como resultado de la actividad interna del C (por ejemplo el
rebasamiento de un Timer) o por la activacin de seales elctricas externas al C, como, por ejemplo,
la recepcin de un dato por el puerto de comunicacin serie. Las interrupciones pueden ser habilitadas
o inhibidas individualmente, excepto la instruccin TRAP, y pueden programarse en uno de cuatro
niveles de prioridad.
Cada fuente de interrupcin (excepto la instruccin TRAP) dispone de uno o varios flags, o banderas
de peticin de interrupcin, que pueden ser activados por programa o por hardware; su nivel activo es
uno lgico.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

153
INT0

INT1

8XC251Sx

Timer 0

Timer 1
Controlador de
interrupciones

CPU

Timer 2
Instruccin
TRAP

Puerto
serie

PCA

Fig. 6.8 Fuentes de interrupcin del microcontrolador 8XC251Sx

Una fuente de interrupcin activa su flag de interrupcin cuando desea realizar una peticin de
interrupcin a la CPU. En la tabla 6.8 se muestran los flags de interrupcin asociados a cada una de las
fuentes de interrupcin, y su ubicacin. Para algunas interrupciones el flag se borra por hardware
cuando la CPU atiende a la interrupcin. Los flags de interrupcin tambin pueden ser borrados por
programa, mediante una instruccin, por ejemplo, del tipo CLR bit.
Tabla 6.8 Flags de peticin de interrupcin

Fuente de interrupcin

Flag que activa

/INT0
Timer 0
/INT1
Timer 1
Puerto Serie
Timer 2
PCA

IE0
TF0
IE1
TF1
RI, TI
TF2, EXF2
CF, CFX

Ubicacin de los flags


bit 1 TCON
bit 5 TCON
bit 3 TCON
bit 7 TCON
bits 0 y 1 SCON
bit 7 y 6 T2CON
bit 7, 0,.., 4 CCON

X=0,.., 4

En lneas generales, el proceso de interrupcin de los microcontroladores de la familia MCS-251 sigue


las pautas comentadas en el apartado de introduccin. Este proceso comienza cuando el circuito
gestionador de interrupciones recibe una peticin de interrupcin. La CPU termina de ejecutar la
instruccin en curso y almacena en la pila el contador de programa (PC) para, a continuacin, realizar
un salto a la RSI de la interrupcin activa (figura 6.9).
Tiempo de respuesta
Oscilador
Estados
Peticin
interrupcin
externa

Finalizacin de la instruccin en curso

Push PC

Fig. 6.9 Proceso de atencin a una interrupcin externa

Los autores, 2001; Edicions UPC, 2001.

Call ISR

RSI

Microcontroladores MCS-51 y MCS-251

154

Existen dos causas que pueden bloquear el salto a la RSI:


1. Se est ejecutando una interrupcin de igual o mayor nivel de prioridad. En este caso el sistema de
interrupcin deber esperar a que finalice la ejecucin de la RSI de la interrupcin ms prioritaria.
2. La instruccin que se est ejecutando en ese momento es la instruccin RETI o se est escribiendo
en los registros IE0, IPH0 o IPL0. En este caso se deber ejecutar, al menos, una instruccin ms
antes de que el sistema salte a la RSI.
El nmero de bytes almacenados en la pila depende del valor del bit INTR ubicado en el byte de
configuracin, CONFIG1. Si este bit est a uno lgico, se guardarn en la pila cuatro bytes, los tres
bytes del contador de programa y el registro de estado PSW1. Si el bit INTR est a cero, se guardan en
la pila, nicamente, los dos bytes de menor peso del contador de programa.
Cada una de las fuentes de interrupcin de la familia MCS-251 tiene asociada una direccin diferente
de comienzo de la RSI, denominada vector de interrupcin. En la tabla 6.9 estn indicados los
vectores de interrupcin para cada una de las fuentes de interrupcin.
Tabla 6.9 Vectores de interrupcin

Direcciones de comienzo de la RSI


Fuente
/INT0
Timer 0
/INT1
Timer 1
Puerto serie
Timer 2
PCA
TRAP

Direccin
FF:0003H
FF:000BH
FF:0013H
FF:001BH
FF:0023H
FF:002BH
FF:0033H
FF:007BH

La rutina de servicio a la interrupcin finaliza con la instruccin RETI. La funcin de esta instruccin
es la de indicar a la CPU que ha sido completada la ejecucin de la RSI y extraer de la pila la
direccin de retorno y colocarla en el PC.
Cabe destacar, segn la tabla 6.8, que entre la direccin de comienzo de la RSI de una fuente de
interrupcin y la siguiente hay tan slo ocho posiciones de memoria, que en la mayora de los casos es
insuficiente para albergar la RSI. Por este motivo, si se utilizan interrupciones consecutivas, por
ejemplo /INT0 y Timer 0, la RSI deber comenzar con un salto incondicional hacia una direccin de
memoria situada en una zona del espacio de memoria disponible para almacenar las instrucciones de la
RSI. A continuacin se presenta, a modo de ejemplo, un listado de instrucciones cuya funcin es
reubicar la localizacin de las RSI de las fuentes de interrupcin del Timer 0, Timer 1 y PCA.
;******************************************************************************************
; REUBICACION DE LAS RSI DE LAS FUENTES DE INTERRUPCION Timer 0, Timer 1 y PCA
;******************************************************************************************
RSI _TIMER0 EQU 2000H
; Direccin de comienzo de la RSI del Timer 0
RSI _TIMER1 EQU 2200H
; Direccin de comienzo de la RSI del Timer 1
RSI _PCA
EQU 2400H
; Direccin de comienzo de la RSI del PCA
ORG FF:000BH
; Vector de interrupcin del Timer 0
JMP RSI_TIMER0

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

155
ORG FF:001BH
JMP RSI_TIMER1
ORG FF:0033H
JMP RSI_PCA

RSI_TIMER0:

; Vector de interrupcin del Timer 1


; Vector de interrupcin del PCA
; Cdigo de la RSI del Timer 0

.....
RETI
RSI_TIMER1:

; Cdigo de la RSI del Timer 1


.....
RETI

RSI_PCA:

; Cdigo de la RSI del PCA


.....
RETI

6.3.1 Habilitacin de las interrupciones


Cada una de las fuentes de interrupcin de los microcontroladores de la familia MCS-251, con
excepcin de la instruccin TRAP, puede ser individualmente habilitada o inhibida poniendo a uno o a
cero lgico el bit correspondiente del registro de habilitacin de interrupciones IE0. Este registro est
ubicado en el rea de registros de funcin especfica, SFR, en la direccin S:0A8H. En la tabla 6.10
aparecen los bits que componen el registro IE0. Cabe destacar que este registro contiene un bit de
habilitacin global de interrupciones: EA. Si EA est a uno lgico, las interrupciones pueden ser
habilitadas o inhibidas individualmente por los bits del registro IE0. Si EA est a cero lgico, todas las
interrupciones, excepto la TRAP, estarn inhibidas.
Tabla 6.10 Registro habilitador de interrupciones IE0

IE0
b7
EA
Nmero
de bit

Direccin: S:0A8H
b6
b5
EC
ET2
Nombre
del bit

EA

EC

ET2

ES

ET1

EX1

ET0

EX0

b4
ES

Valor de reset: 0000 0000b


b3
b2
b1
ET1
EX1
ET0

b0
EX0

Funcin
Bit de habilitacin general de interrupciones:
poniendo a uno lgico este bit se habilitan todas las interrupciones que estn
individualmente habilitadas por los bits 0-6. Poniendo a cero este bit se inhiben
todas las interrupciones excepto la interrupcin TRAP, que no puede inhibirse.
Bit de habilitacin de la interrupcin del PCA:
poniendo a uno lgico este bit se habilita la interrupcin del PCA.
Bit de habilitacin de la interrupcin del Timer 2:
poniendo a uno lgico este bit se habilita la interrupcin del Timer 2.
Bit de habilitacin de la interrupcin del puerto serie :
poniendo a uno lgico este bit se habilita la interrupcin del puerto serie.
Bit de habilitacin de la interrupcin del Timer 1:
poniendo a uno lgico este bit se habilita la interrupcin del Timer 1.
Bit de habilitacin de la interrupcin externa 1:
poniendo a uno lgico este bit se habilita la interrupcin externa 1.
Bit de habilitacin de la interrupcin del Timer 0:
poniendo a uno lgico este bit se habilita la interrupcin del Timer 0.
Bit de habilitacin de la interrupcin externa 0:
poniendo a uno lgico este bit se habilita la interrupcin externa 0.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

156

6.3.2 Niveles de prioridad de las interrupciones


Cada una de las siete fuentes de interrupcin de la familia MCS-251 puede programarse
individualmente en uno de cuatro niveles de prioridad. La programacin de los niveles de prioridad
permite establecer el orden en que se deben atender las interrupciones en caso de una activacin
simultnea.
El establecimiento de las prioridades se consigue poniendo a uno o cero lgico el bit correspondiente
en dos registros de prioridad de interrupciones: Interrupt Priority High Register, IPH0, e Interrupt
Priority Low Register, IPL0 (tablas 6.11 y 6.12 respectivamente). Por tanto, cada fuente de
interrupcin tiene asociados dos bits de programacin de prioridad, un bit en el registro IPH0 y otro en
el registro IPL0. El bit ubicado en el registro IPH0 es el bit ms significativo (MSB), mientras que el
bit ubicado en el registro IPL0 es el bit menos significativo (LSB). El valor de estos dos bits define el
nivel de prioridad de la fuente de interrupcin. Los niveles posibles son cuatro: nivel 0, 1, 2 o 3: el
nivel 0 es el de menor prioridad y el nivel 3 el de mayor prioridad (tabla 6.13).
Tabla 6.11 Interrupt Priority High Register (IPH0)

IPH0
b7
----

Direccin: S:0B7H
b6
b5
IPH0.6
IPH0.5

Nmero
de bit

Nombre
del bit

7
6
5
4
3
2
1
0

--IPH.6
IPH.5
IPH.4
IPH.3
IPH.2
IPH.1
IPH.0

b4
IPH0.4

Valor de reset: 0000 0000b


b3
b2
b1
IPH0.3
IPH0.2
IPH0.1

b0
IPH0.0

Funcin
Reservado.
Bit alto de prioridad de interrupcin del PCA.
Bit alto de prioridad de interrupcin del Timer 2.
Bit alto de prioridad de interrupcin del puerto serie.
Bit alto de prioridad de interrupcin del Timer 1.
Bit alto de prioridad de la interrupcin externa 1, /INT1.
Bit alto de prioridad de interrupcin del Timer 0.
Bit alto de prioridad de la interrupcin externa 0, /INT0.

Tabla 6.12 Interrupt Priority Low Register (IPL0)

IPL0
b7
----

Direccin: S:0B8H
b6
b5
IPL0.6
IPL0.5

Nmero
de bit

Nombre
del bit

7
6
5
4
3
2
1
0

--IPL.6
IPL.5
IPL.4
IPL.3
IPL.2
IPL.1
IPL.0

b4
IPL0.4

Valor de reset: 0000 0000b


b3
b2
b1
IPL0.3
IPL0.2
IPL0.1
Funcin

Reservado.
Bit bajo de prioridad de interrupcin del PCA.
Bit bajo de prioridad de interrupcin del Timer 2.
Bit bajo de prioridad de interrupcin del Puerto Serie.
Bit bajo de prioridad de interrupcin del Timer 1.
Bit bajo de prioridad de la interrupcin externa 1, /INT1.
Bit bajo de prioridad de interrupcin del Timer 0.
Bit bajo de prioridad de la interrupcin externa 0, /INT0.

Los autores, 2001; Edicions UPC, 2001.

b0
IPL0.0

6 Las interrupciones

157

Tabla 6.13 Niveles de prioridad de las interrupciones

IPH0.X (MSB)

IPL0.X (LSB)

0
0
1
1

0
1
0
1

Nivel de prioridad
0 Menor prioridad
1
2
3 Mayor prioridad

El funcionamiento del mecanismo de niveles de prioridad est sujeto a unas reglas muy sencillas:
1.

2.
3.

4.

Una interrupcin programada en un nivel bajo puede ser interrumpida por una
interrupcin programada en un nivel de prioridad mayor, pero no por una interrupcin de
nivel igual o menor.
Si una interrupcin est programada en el nivel tres no podr ser interrumpida por
ninguna fuente de interrupcin.
Si dos o ms interrupciones se activan al mismo tiempo la CPU atender en primer lugar a
la interrupcin de mayor nivel de prioridad. Una vez ejecutada la rutina de la interrupcin
ms prioritaria, la CPU atender al resto de fuentes de interrupcin siguiendo un orden
decreciente de prioridades.
Si se reciben peticiones de interrupcin simultneas correspondientes a fuentes
programadas en un mismo nivel de prioridad, el orden de respuesta seguir una secuencia
preestablecida indicada en la tabla 6.14.

Tabla 6.14 Prioridades dentro del mismo nivel

Prioridad

Fuente de interrupcin

1 (Prioridad mayor)
2
3
4
5
6
7 (Prioridad menor)

/INT0
Timer 0
/INT1
Timer 1
Puerto serie
Timer 2
PCA

Ejemplo 6.4 Atencin a mltiples interrupciones


Seguidamente se plantea un caso prctico de programacin de varias fuentes de interrupcin en
distintos niveles de prioridad. En concreto se consideran cuatro fuentes de interrupcin
programadas en los siguientes niveles: Timer 0 en nivel 3, /INT1 en nivel 2, puerto serie en
nivel 2 y PCA en nivel 1.
Para realizar esta asignacin de niveles de prioridad se deben programar los registros de
prioridad de interrupcin con los siguientes valores: IPH0 = 16H (0001 0110), IPL0 = 42H
(0100 0010).
Si en estas condiciones se produce en primer lugar una peticin de interrupcin del PCA, la
CPU pasar a ejecutar la RSI del PCA. Si mientras se ejecuta la RSI del PCA, ocurre una
peticin simultnea de interrupcin de las fuentes /INT1 y puerto serie, la CPU dejar de

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

158

ejecutar la RSI del PCA para ejecutar las RSI de las interrupciones que se han activado, dado
que poseen un nivel de prioridad mayor.
Las interrupciones /INT1 y puerto serie poseen el mismo nivel de prioridad pero, teniendo en
cuenta el orden establecido en la tabla 6.14, se ejecutar primero la RSI de la interrupcin
/INT1 y, a continuacin, la RSI del puerto serie.
Si, por ejemplo, se activa la interrupcin Timer 0 mientras se est ejecutando la RSI del puerto
serie, la CPU pasa a ejecutar la RSI del Timer 0, porque posee un nivel de prioridad mayor que
el puerto serie. Una vez ejecutada la RSI del Timer 0, la CPU finalizar la ejecucin de la RSI
del puerto serie y, a continuacin, acabar de ejecutar la RSI del PCA para, finalmente,
continuar ejecutando el programa Principal. En la figura 6.10 se representa, de forma
esquemtica, la secuencia que sigue la CPU en la atencin a las distintas fuentes de
interrupcin de este ejemplo.
PROGRAMA
PRINCIPAL

RSI_/INT1

RSI_PCA

Int. PCA

RETI

Int. /INT1
y PS

RETI

RSI_PUERTO_ SERIE

RSI_T0

RETI

RETI

Int. T0

Fig. 6.10 Esquema de la secuencia de atencin a las interrupciones del ejemplo 6.4

6.3.3 Interrupciones externas /INT0 e /INT1


Las interrupciones /INT0 e /INT1 posibilitan el control de perifricos externos mediante el mecanismo
de interrupciones. En la figura 6.11 est representada, a modo de ejemplo, la conexin de dos
perifricos externos a las entradas de interrupcin /INT0 e /INT1.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

159

El perifrico externo interrumpe al C y activa la entrada de interrupcin. El C responder saltando a


la direccin de comienzo de la RSI asociada a la interrupcin activada.
Las interrupciones externas /INT0 e /INT1 se pueden programar para ser activas por flanco
descendente o por nivel bajo, dependiendo del valor de los bits IT0 e IT1 del registro TCON. Con el
bit IT0 a cero lgico, la interrupcin /INT0 se activa por nivel, mientras que con IT0 a uno lgico, la
interrupcin /INT0 se activa por flanco descendente. La misma relacin se produce entre el bit IT1 y
la interrupcin /INT1.
Cuando se genera una interrupcin externa del tipo /INT0 o /INT1, se activa el correspondiente flag
de peticin de interrupcin, bits IE0 o IE1, del registro TCON (tabla 6.15). Si la interrupcin se ha
activado por flanco descendente, los flags de peticin de interrupcin se borran por hardware cuando
la CPU salta a la rutina de atencin a la interrupcin para proceder a su ejecucin. Si la interrupcin se
activa por nivel, el flag de interrupcin se deber borrar mediante una instruccin dentro de la RSI.
Para este caso, la causa que ha generado la interrupcin externa /INT0 o /INT1 debe desactivarse
antes de que acabe la RSI o se generar una nueva peticin de interrupcin.

8XC251
Perifrico 1
INT0
(P3.2)

INT

Perifrico 2
INT1
(P3.3)

INT

Fig. 6.11 Conexin de perifricos externos a las entradas de interrupcin del C 8XC251Sx

Para detectar la peticin de interrupcin, la CPU lee el estado de los pines asociados a las
interrupciones externas /INT0 e /INT1 una vez cada ocho perodos de reloj. Tanto si la interrupcin
externa est programada por nivel como por flanco, ser necesario mantener un nivel bajo durante al
menos diez perodos para garantizar la deteccin de la interrupcin.
Tabla 6.15 Interrupciones externas

Fuente de interrupcin Flag Bit de configuracin por flanco o nivel Vector de interrupcin
/INT0
/INT1

IE0
IE1

IT0
IT1

FF:0003H
FF:0013H

Si la aplicacin diseada requiere el control de ms de dos perifricos externos, se deber incluir en el


diseo algn sistema, hardware y/o software, que permita determinar qu perifrico o perifricos han
interrumpido, y en el caso que haya interrumpido ms de uno, en qu orden se deben atender.
El establecimiento del orden de prioridad se puede hacer externamente, utilizando un controlador de
prioridad de interrupciones (PIC), o bien, mediante software, programando en la RSI el orden de
atencin a los distintos perifricos.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

160

Ejemplo 6.5 Control de mltiples perifricos externos mediante un codificador de prioridad


A continuacin se presenta un ejemplo de sistema de gestin de mltiples fuentes de
interrupcin externas mediante un codificador de prioridad 74LS148 (figura 6.12), cuyo
funcionamiento se detalla en la tabla 6.16. En este ejemplo, se han considerado 8 perifricos
cuyas salidas de interrupcin estn conectadas a las entradas del codificador de prioridad. Las
salidas de datos A2, A1 y A0 del codificador de prioridad estn a su vez conectadas a las tres
lneas de menor peso del puerto P1 del microcontrolador 8XC251Sx.
Perifrico 7

INT

Perifrico 6

INT

Perifrico 5

INT

Perifrico 4

INT

74LS148
6
5
4
3

Perifrico 3

INT

Perifrico 2

INT

Perifrico 1

INT

Perifrico 0

INT

8XC251

A1
A2
A3

P1.0

GS

INT0

P1.1
P1.2

2
1

EO

0
E1

Fig. 6.12 Establecimiento de prioridades mediante el codificador de prioridad 74LS148


Tabla 6.16 Tabla de verdad del codificador de prioridad 74LS148
EI

H
L
L
L
L
L
L
L
L
L

X
H
X
X
X
X
X
X
X
L

X
H
X
X
X
X
X
X
L
H

ENTRADAS
2
3
4

A2

A1

X
H
X
X
X
L
H
H
H
H

X
H
X
X
L
H
H
H
H
H

X
H
X
L
H
H
H
H
H
H

X
H
L
H
H
H
H
H
H
H

H
H
L
L
L
L
H
H
H
H

H
H
L
L
H
H
L
L
H
H

X
H
X
X
X
X
X
L
H
H

X
H
X
X
X
X
L
H
H
H

SALIDAS
A0
/GS
H
H
L
H
L
H
L
H
L
H

H
H
L
L
L
L
L
L
L
L

/EO
H
L
H
H
H
H
H
H
H
H

Si uno o varios perifricos activan las entradas del codificador 74LS148, ste pondr a cero su
salida /GS, y se realizar una peticin de interrupcin al C 8XC251Sx a travs de la entrada
/INT0. Al mismo tiempo, en las salidas de datos A2, A1 y A0, aparece la combinacin binaria
correspondiente a la entrada activa de mayor peso. Por tanto, la prioridad en la atencin a los
perifricos se establece mediante el orden en que se conectan stos a las entradas del
codificador, de forma que el perifrico que est conectado a la entrada siete es el de mayor
prioridad, y el que est conectado a la entrada cero el de menor prioridad.
En la rutina de servicio a la interrupcin /INT0, se deber determinar cul de los perifricos ha
interrumpido, mediante la lectura del puerto P1, y saltar a la rutina especfica que lo atiende.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

161

Por otro lado, se debe establecer una tabla de vectores de salto, donde se adjudique una
direccin de comienzo de la RSI de cada uno de los perifricos (tabla 6.17). Lgicamente, las
rutinas de atencin a los perifricos se deben colocar en zonas de memoria que no se utilicen
para otro fin.
Tabla 6.17 Direcciones de comienzo de las rutinas de atencin a los perifricos

Perifrico

Valor de P1

Direccin inicio RSI

7
6
5
4
3
2
1
0

00 H
01 H
02 H
03H
04H
05H
06 H
07H

FF:1100 H
FF:1180 H
FF:1200 H
FF:1280 H
FF:1300 H
FF:1380 H
FF:1400 H
FF:1480 H

;***********************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT0
;***********************************************************************************
ORG FF:0003H
JMP SRI_INT0
; La RSI comienza en la direccin FF:1000H para tener ms espacio de memoria.
ORG FF:1000H
SRI_INT0: MOV A,P1
; Se lee la combinacin binaria que proporciona el codificador.
ANL A,#07H
; Unicamente se toman los 3 bits significativos de P1.
RL A
; Se multiplica por dos.
MOV DPTR,#JMP_TBL ; En funcin de la combinacin leda se salta a la rutina
JMP @A+DPTR
; que atiende al perifrico que ha interrumpido.
JMP_TBL: AJMP RUT7
; Salto a la rutina que atiende al perifrico siete.
AJMP RUT6
; Salto a la rutina que atiende al perifrico seis.
AJMP RUT5
; Salto a la rutina que atiende al perifrico cinco.
AJMP RUT4
; Salto a la rutina que atiende al perifrico cuatro.
AJMP RUT3
; Salto a la rutina que atiende al perifrico tres.
AJMP RUT2
; Salto a la rutina que atiende al perifrico dos.
AJMP RUT1
; Salto a la rutina que atiende al perifrico uno.
AJMP RUT0
; Salto a la rutina que atiende al perifrico cero.
ORG FF:1100H
RUT7:
; Instrucciones de la rutina que atiende al perifrico siete.
........
RETI
ORG FF:1180H
RUT6:
; Instrucciones de la rutina que atiende al perifrico seis.
........
RETI
ORG FF:1200H
RUT5:
; Instrucciones de la rutina que atiende al perifrico cinco.
........
RETI
ORG FF:1280H
RUT4:
; Instrucciones de la rutina que atiende al perifrico cuatro.
........
RETI
ORG FF:1300H
RUT3:
; Instrucciones de la rutina que atiende al perifrico tres.
........
RETI

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

162
ORG FF:1380H
RUT2:
........
RETI
ORG FF:1400H
RUT1:
........
RETI
ORG FF:1480H
RUT0:
........
RETI

; Instrucciones de la rutina que atiende al perifrico dos.

; Instrucciones de la rutina que atiende al perifrico uno.

; Instrucciones de la rutina que atiende al perifrico cero.

Ejemplo 6.6 Control de mltiples perifricos externos mediante chequeo


En este ejemplo se utiliza una secuencia de chequeo para determinar la prioridad de atencin a
ocho perifricos externos conectados a la entrada de interrupcin /INT0 (figura 6.13). Las
salidas de interrupcin de cada perifrico se han conectado a la entrada /INT0 a travs de un
driver de salida en colector abierto. Basta que un perifrico active su salida de interrupcin
para que la entrada de interrupcin /INT0 pase a cero lgico. El perifrico que interrumpe
activa al mismo tiempo un bit del puerto P1.
Cuando ocurre una interrupcin, la RSI se encarga de leer el puerto P1 y averiguar por chequeo
qu perifrico o perifricos han interrumpido y atenderlos siguiendo un orden establecido en la
propia RSI.
En la figura 6.14 est representado el flujograma correspondiente a este ejemplo. La prioridad
de cada perifrico se establece con el orden de chequeo de los bits del puerto P1. En este
ejemplo, se verifica en primer lugar el bit P1.7, de forma que es el perifrico 7 el ms
prioritario. El perifrico 0 es el menos prioritario porque se verifica en ltimo lugar.
Perifrico 7

INT

Perifrico 6

INT

Perifrico 5

INT

Perifrico 4

INT

Perifrico 3

INT

Perifrico 2

INT

Perifrico 1

INT

Perifrico 0

INT

8XC251
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0

Colector
Abierto
INT0

+5V
Fig. 6.13 Conexin de ocho perifricos a la entrada de interrupcin /INT0

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

163

;*****************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT0
;*****************************************************************
ORG FF:0003H
JMP SRI_INT0
; La rutina comienza en la direccin FF:1000H
ORG FF:1000H
; para tener ms espacio de memoria
SRI_INT0: JB P1.7,SIG6
; Si P1.7 (bit MSB) es cero salta a la
CALL SRI_7
; rutina de atencin del perifrico 7
SIG6:
JB P1.6,SIG5
; Si P1.6 es cero salta a la rutina
CALL SRI_6
; de atencin del perifrico 6
SIG5:
JB P1.5,SIG4
; Si P1.5 es cero salta a la rutina
CALL SRI_5
; de atencin del perifrico 5
SIG4:
JB P1.4,SIG3
; Si P1.4 es cero salta a la rutina
CALL SRI_4
; de atencin del perifrico 4
SIG3:
JB P1.3,SIG2
; Si P1.3 es cero salta a la rutina
CALL SRI_3
; de atencin del perifrico 3
SIG2:
JB P1.2,SIG1
; Si P1.2 es cero salta a la rutinala rutina
CALL SRI_2
; de atencin del perifrico 2
SIG1:
JB P1.1,SIG0
; Si P1.1 es cero salta a la rutina
CALL SRI_1
; de atencin del perifrico 1
SIG0:
JB P1.0,FIN
; Si P1.0 es cero salta a la rutina
CALL SRI_0
; de atencin del perifrico 0
FIN:
RETI
SRI_7:
; Instrucciones de la rutina de atencin del perifrico 7
.......
RET
SRI_6:
; Instrucciones de la rutina de atencin del perifrico 6
.......
RET
SRI_5:
; Instrucciones de la rutina de atencin del perifrico 5
.......
RET
SRI_4:
; Instrucciones de la rutina de atencin del perifrico 4
.......
RET
SRI_3:
; Instrucciones de la rutina de atencin del perifrico 3
.......
RET
SRI_2:
; Instrucciones de la rutina de atencin del perifrico 2
.......
RET
SRI_1:
; Instrucciones de la rutina de atencin del perifrico 1
.......
RET
SRI_0:
; Instrucciones de la rutina de atencin del perifrico 0
.......
RET

RSI /INT0
LEER EL
PUERTO P1

P1.7 = 0?

SI

RUTINA DEL
PERIFRICO 7

SI

RUTINA DEL
PERIFRICO 6

SI

RUTINA DEL
PERIFRICO 5

SI

RUTINA DEL
PERIFRICO 4

SI

RUTINA DEL
PERIFRICO 3

SI

RUTINA DEL
PERIFRICO 2

SI

RUTINA DEL
PERIFRICO 1

SI

RUTINA DEL
PERIFRICO 0

NO

P1.6 = 0?
NO

P1.5 = 0?
NO

P1.4 = 0?
NO

P1.3 = 0?
NO

P1.2 = 0?
NO

P1.1 = 0?
NO

P1.0 = 0?
NO

RETI

Fig. 6.14 Flujograma de la RSI del


ejemplo 6.6

6.3.4 Interrupcin de los Timers


Los flags de peticin de interrupcin de los Timers 0 y 1, TF0 y TF1, se activan por rebasamiento del
Timer correspondiente, excepto cuando el Timer 0 est programado en modo 3, en cuyo caso se
activan exclusivamente por rebasamiento de los registros TH0 y TL0 del Timer 0. Cuando el Timer 0
1 genera una interrupcin, el flag de peticin de interrupcin se borra automticamente cuando la
CPU ejecuta la rutina de servicio a la interrupcin.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

164

El Timer 2 posee dos flags de interrupcin, TF2 y EXF2, ubicados en el registro T2CON (tabla 6.7).
La activacin de cualquiera de estos bits genera una peticin de interrupcin a la CPU y su borrado
debe realizarse por software. Por tanto, la rutina de servicio a la interrupcin deber determinar cul
de los dos bits ha generado la interrupcin y borrarlo.
A continuacuin se presenta el flujograma (figura 6.15) y el listado de un ejemplo de RSI del Timer 2.
Este programa incorpora las instrucciones que permiten detectar cul de los dos flags de interrupcin
del Timer 2 se ha activado, y actuar en consecuencia, de forma que si el flag activo es TF2, se ejecuta
la rutina RUTINA_TF2, y si el flag activo es EXF2, se ejecuta la rutina RUTINA_EXF2.
;****************************************************************
; RUTINA DE SERVICIO A LA INTERRUPCION TIMER 2
;****************************************************************
ORG FF:002BH ; Direccin de comienzo de la RSI del Timer 2 como origen del
programa
JMP FF:0300H ;Salto a la direccin FF:0300H donde comienza la rutina del Timer 2
ORG FF:0300H
; Programa de inicio de la RSI del Timer 2
JBC TF2, RUTINA_TF2 ;Si el flag activo es TF2 se pone a 0 lgico y se salta a
;la rutina que debe ejecutarse en caso de activacin del flag TF2
CLR EXF2
; Si el flag TF2 no esta activo se borra el flag EXF2 y se
; ejecuta la rutina RUTINA_EXF2
;Instrucciones de la rutina RUTINA_EXF2
......
RETI
;Instrucciones de la rutina RUTINA_TF2
RUTINA_TF2: . . . . . . .
RETI

RSI Timer 2

SI
TF2=1?

TF2=0
RUTINA_TF2

NO
EXF2=0
RUTINA_EXF2

RETI

Fig. 6.15 Flujograma de la RSI


del Timer 2

6.3.5 Interrupcin del array de contadores programables (PCA)


El array de contadores programables tiene asociados seis flags de interrupcin: el flag de
rebasamiento del Timer del PCA, CF, y cinco flags pertenecientes a los cinco mdulos de
comparacin y captura de que dispone el PCA, CCF0, CCF1, CCF2, CCF3 y CCF4. La activacin de
cualquiera de estos flags genera una peticin de interrupcin a la CPU por parte del PCA. Los flags no
se borran automticamente cuando la CPU ejecuta la rutina de servicio a la interrupcin del PCA, por
lo que, normalmente, la rutina deber resolver cul, o cules de los seis flags se han activado, y
borrarlos.
En la figura 6.16 se representa el flujograma y, a continuacin, el listado de la RSI del PCA. En esta
rutina se comprueban de forma secuencial todos los flags de interrupcin asociados al PCA. Si se
detecta un flag activo se borra y se ejecuta una rutina especfica asociada a ese flag. Mediante el orden
de comprobacin de los flags de interrupcin se puede establecer el orden de prioridad de atencin a
los distintos mdulos que componen el PCA.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

165

;*************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION DEL PCA
;*************************************************************
PCA EQU FF:0400H
;Etiqueta a la direccin de la RSI del PCA
ORG FF:0033H
;Direccin vector de interrupcin del PCA
JMP PCA
;Salto a la rutina de la RSI del PCA
ORG FF:0400H
;Programa de RSI del PCA
JBC CF, RUTINA_CF
;Salta si CF=1 y borra el flag.
POL_CCF0: JBC CCF0,RUTINA_CCF0 ;Salta si CCF0=1 y borra el flag
POL_CCF1: JBC CCF1,RUTINA_CCF1 ;Salta si CCF1=1 y borra el flag
POL_CCF2: JBC CCF2,RUTINA_CCF2 ;Salta si CCF2=1 y borra el flag
POL_CCF3: JBC CCF3,RUTINA_CCF3 ;Salta si CCF3=1 y borra el flag
POL_CCF4: JBC CCF4,RUTINA_CCF4 ;Salta si CCF4=1 y borra el flag
;
;Instrucciones de la RUTINA_CF
......
JMP POL_CCF0
; Cuando termina la ejecucin de RUTINA_CF
; salto a comprobar el siguiente bit
; Instrucciones de la RUTINA_CCF0
.......
JMP POL_CCF1
;Cuando termina la ejecucin de RUTINA_CCF0
; salto a comprobar el siguiente bit
.......
; Instrucciones de la RUTINA_CCF4
.......
RETI
; Cuando termina la ejecucin de RUTINA_CCF4
; termina la ejecucin de la RSI.

RSI PCA

CF=1?

SI

RUTINA_CF

SI

RUTINA_CCF0

SI

RUTINA_CCF1

SI

RUTINA_CCF2

SI

RUTINA_CCF3

SI

RUTINA_CCF4

NO

CCF0=1?
NO

CCF1=1?
NO

CCF2=1?
NO

CCF3=1?
NO

CCF4=1?
NO

RETI

Fig. 6.16 Flujograma de la RSI del PCA

6.3.6 Interrupcin del puerto serie


El puerto serie tiene asociado dos flags de interrupcin: el flag de interrupcin para recepcin, RI, y el
flag de interrupcin para transmisin, TI. Ambos flags estn ubicados en el registro SCON (tabla 6.7).
La activacin de cualquiera de estos dos flags genera una peticin de interrupcin a la CPU por parte
del puerto serie. Tal y como ocurre con la interrupcin del Timer 2 y del PCA, el borrado de los flags
TI y RI debe realizarse por programa. Por tanto, en la RSI del puerto serie se deben incluir
instrucciones que determinen cul de estos flags se ha activado, y lo borren.
A continuacin se representa el flujograma (figura 6.17) y el listado de un ejemplo de RSI del puerto
serie. Este programa incorpora las instrucciones que permiten detectar el flag de interrupcin que se ha
activado y actuar en consecuencia, de forma que si el flag activo es TI, se ejecuta la rutina RUT_TI, y
si el flag activo es RI, se ejecuta la rutina RUT_RI.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

166
;******************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION TIMER 2
;******************************************************************
ORG FF:0023H
; Direccin de comienzo de la RSI del puerto serie
JMP FF:0400H
; Salto a la direccin de la rutina del puerto serie
ORG FF:0400H
; Programa de inicio de la RSI del Timer 2
JBC TF2, RUT_TI
; Si el flag activo es TI se pone a 0 lgico y
; salta a la rutina correspondiente
CLR RI
; Si el flag TI no est activo se borra el flag RI y
; se ejecuta la rutina RUT_RI
;Instrucciones de la RUT_RI
......
RETI

RSI puerto serie

SI
TI = 1?
NO
RI = 0
RUT_RI

;Instrucciones de la RUT_TI
RUT_TI:

.......
RETI

TI = 0
RUT_TI

RETI

Fig. 6.17 Flujograma de la RSI del


puerto serie

Ejemplo 6.7 Control del ndice de acidez (pH) del agua de un depsito
Se plantea a continuacin, como ejemplo ilustrativo de la utilizacin del sistema de
interrupciones del microcontrolador 8XC251Sx, un caso prctico de control de una planta de
tratamiento de aguas residuales. El objetivo de este ejemplo es mostrar el funcionamiento de las
interrupciones por lo que respecta a la habilitacin, los niveles de prioridad, el manejo de los
flags de interrupcin, etc.
La planta que se debe controlar dispone de un sistema que neutraliza la acidez de las aguas
residuales provenientes de una planta de fabricacin de papel (figura 6.18). El sistema posee un
depsito donde se mezcla el agua residual con la cantidad adecuada del componente
neutralizador, cuya funcin es disminuir la acidez del agua, de forma que el agua de salida del
depsito posea un pH superior a 5.5.
El sistema de control incorpora dos sensores activos a nivel alto:
Un detector de rebosamiento, S1, que se activa cuando el agua contenida en el
depsito supera la altura mxima permitida.
Un detector de pH, M, que se activa cuando el pH del agua es inferior a 5.5.
El sistema de control dispone adems de dos actuadores V1 y V2, activos a nivel alto, cuya
funcin es realizar la apertura de dos vlvulas. Cuando se activa el actuador V1 se abre la
vlvula que permite la entrada de las aguas residuales al depsito. Cuando se activa el actuador
V2 se abre la vlvula que permite el vertido de neutralizador en el depsito. Por ltimo, existen
dos indicadores luminosos, A1 y A2, activos a nivel alto, cuya funcin es la de monitorizar la
apertura de las vlvulas V1 y V2.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

167

A1

Neutralizador

Entrada
de aguas
residuales

V1

Sistema
de control

A2

V2
S1
M
Medidor
pH
Descarga

Fig. 6.18 Esquema de la planta que se desea controlar

En la figura 6.19 est representado el esquema elctrico donde se detalla la conexin del C
8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin. Cabe
destacar que los sensores S1 y M estn conectados a las entradas de interrupcin /INT0 e /INT1
a travs de sendas puertas inversoras, debido a que las interrupciones externas se activan a
nivel bajo, mientras que estos sensores son activos a nivel alto.
8XC251
P1.2
P1.3

A1
A2

S1

INT0

P1.0

V1

INT1

P1.1

V2

Fig. 6.19 Conexin de sensores y actuadores con el C 8XC251Sx

La estrategia que debe llevar a cabo el sistema de control para gestionar el funcionamiento de
la planta de tratamiento de aguas residuales se puede resumir en dos puntos:

La vlvula V1 debe permanecer abierta hasta que el sensor S1 se active; entonces se


cerrar durante treinta segundos. Si una vez pasado este tiempo el sensor S1 sigue activo,
se repetir la operacin de cierre de la vlvula V1. Mientras V1 est abierta, el indicador
A1 permanecer encendido; en caso contrario el indicador parpadear.
La vlvula V2 debe estar cerrada hasta que se active el sensor M y entonces abrirse durante
cinco segundos. Una vez transcurrido ese tiempo, si el sensor M continua activo, se
repetir la operacin de apertura de la vlvula V2. El indicador A2 se activa cuando la
vlvula V2 est abierta y parpadea cuando est cerrada.

Los recursos utilizados para resolver esta aplicacin son cuatro:


La interrupcin externa /INT0, que se encarga de detectar la activacin del sensor S1. La
interrupcin se activa por nivel para que pueda ser atendida por la CPU mientras el
sensor S1 se encuentre a uno lgico.
La interrupcin externa /INT1, cuya funcin es detectar la activacin del medidor de pH.
Esta interrupcin tambin se programa por nivel por el mismo motivo que la /INT0.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

168

El Timer 0, que se encarga de temporizar el intervalo de 30 s, tiempo que debe


permanecer abierta la vlvula V1 cuando se active S1.
El Timer 1, que se encarga de temporizar los 5 s de apertura de la vlvula V2.
El programa esta compuesto de una rutina principal y de cuatro rutinas de atencin a la
interrupcin, una por cada fuente de interrupcin utilizada en la aplicacin.
La funcin del programa principal ser bsicamente la de habilitar y programar los niveles de
prioridad de las diversas fuentes de interrupcin utilizadas, as como la de ejecutar la secuencia
de parpadeo de los indicadores luminosos A1 y A2.
Para habilitar las cuatro fuentes de interrupcin se ponen a uno lgico los bits correspondientes
del registro habilitador de interrupciones IE0: EX0, ET0, EX1 y ET1. Esto se consigue
cargando en el registro IE0 el valor 8FH (10001111b).
Por otra parte, se deben poner a uno lgico los bits IT0 e IT1 del registro TCON, con el
objetivo de que las interrupciones externas /INT0 e /INT1 se activen por nivel. Esto se
consigue almacenando en el registro TCON el valor 0AH (0000 1010b).
A continuacin se debe establecer la prioridad de las interrupciones. En principio se adjudica a
las interrupciones /INT0 y Timer 0 una prioridad mayor que a las interrupciones /INT1 y Timer
1, dado que la situacin de rebasamiento requiere una actuacin ms urgente que la superacin
del nivel de pH. Las fuentes /INT0 y Timer 0 se programan con nivel de prioridad tres,
mientras que las fuentes de interrupcin /INT1 y Timer 1 se programan con un nivel de
prioridad menor, por ejemplo con nivel cero. Por tanto, los registros de nivel de prioridad IPH0
e IPL0 quedan: IPH0 = 03H y IPL0 = 03H.
Por ltimo, se debe poner el bit INTR del byte de configuracin CONFIG1 a uno lgico. De
esta forma, cuando la CPU ejecute una interrupcin, se cargarn en la pila, automticamente,
los tres bytes del contador de programa, PC, y el registro de estado, PSW1.
En cuanto a la rutina de retardo, que se utiliza para temporizar el parpadeo de los indicadores
luminosos, estar compuesta de dos bucles anidados, basados en decrementar los registros R0 y
R1. Modificando el valor de los registros R0 y R1 se puede variar el tiempo de ejecucin de la
rutina y, por tanto, la frecuencia de parpadeo. Para calcular el tiempo de retardo hay que
determinar el nmero de veces que se ejecuta cada instruccin, as como el tiempo que tarda en
ejecutarse cada una de ellas.
En la figura 6.20 se muestran los flujogramas correspondientes al programa principal y a la
rutina de retardo. En la figura 6.21 se muestran los flujogramas de las rutinas de atencin a las
interrupciones /INT0 y Timer 0. Las tareas que debe realizar la rutina de atencin a la
interrupcin /INT0 son:
Cerrar la vlvula V1.
Inicializar el Timer 0 para que temporice 30 s.
Inhibir la interrupcin /INT0 para impedir que se ejecute de forma repetida la RSI de la
/INT0 mientras el sensor S1 se encuentra activo y no ha finalizado la temporizacin de 30s.

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

169

Si consideramos que la frecuencia de reloj es de 1.2 MHz, se puede determinar, mediante un


clculo sencillo, que el Timer 0 debe rebasar varias veces para temporizar 30 s.
En la RSI del Timer 0 se debe contar el nmero de rebasamientos que sufre este temporizador.
Cuando el Timer 0 rebasa un nmero de veces equivalente a 30 s se abre la vlvula V1, se
detiene el funcionamiento del Timer 0 y se habilita de nuevo la interrupcin /INT0, de forma
que si el sensor S1 contina activo se repite de nuevo la secuencia de cierre de V1.
PRINCIPAL

RETARDO

INICIALIZAR:
IE0 = 8FH
TCON = 0AH
IPH0 = 03H
IPL0 = 03H

R0 = 10H

P1.2 = 1
P1.3 = 1

DECREMENTA R1

RETARDO

R1 = 0?

R1 = FFH

NO

SI

P1.2 = 0
P1.3 = 0

DECREMENTA R0

RETARDO

R0 = 0?

NO

SI

RET

Fig. 6.20 Flujograma del programa principal y de la rutina de retardo


INT0

T0

CERRAR VLVULA V1

INICIALIZAR T0

T = 30s?

NO

SI
PARAR T0

ACTIVACIN T0
ABRIR VLVULA V2
INHIBIR INT0
BORRAR IE0
RETI
HABILITAR INT0

RETI

Fig. 6.21 Flujogramas de las rutinas de servicio a las interrupciones /INT0 y Timer 0

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

170

Las rutinas de atencin a las interrupciones /INT1 y Timer 1 tienen funciones similares a las
interrupciones /INT0 y Timer 0. En la figura 6.22 se presentan los flujogramas
correspondientes a ambas rutinas.
INT1

T1

ABRIR VLVULA V2

INICIALIZAR T1

T = 5s?

NO

SI
PARAR T1

ACTIVACIN T1
CERRAR VLVULA V2
INHIBIR INT1
BORRAR IE1
RETI
HABILITAR INT1

RETI

Fig. 6.22 Flujogramas de las rutinas de servicio a las interrupciones /INT1 y Timer1

A continuacin se presentan el listado del programa principal y de la rutina de retardo.


;****************************************************************************
;
VECTORIZACION INTERRUPCIONES
;****************************************************************************
ORG FF:0003H
; Vector de interrupcin de /INT0
JMP RSI_INT0
ORG FF:000BH
; Vector de interrupcin del Timer 0
JMP RSI_T0
ORG FF:0013H
; Vector de interrupcin de /INT1
JMP RSI_INT1
ORG FF:001BH
; Vector de interrupcin del Timer 1
JMP RSI_T1
;******************************************************************************
;
PROGRAMA PRINCIPAL
;******************************************************************************
ORG FF:0000H
JMP PRINCIP
ORG FF:0100H
; Programacin del nivel de prioridad de las interrupciones externas 0 y 1
PRINCIP: MOV IE0,#8FH
; Habilitacin de las interrupciones
MOV TCON,#0AH
; Se programa /INT0 e /INT1 por nivel
MOV IPL0,#03H
; Programacin de los niveles de prioridad
MOV IPH0,#03H
SETB INTR
; Cuando la CPU vectorice una interrupcin cargar en la pila
; los 3 bytes del PC y el registro de estado PSW1
;Secuencia de parpadeo de los indicadores luminosos A1 y A2
SALTO0: SETB P1.2
SETB P1.3
CALL RETARDO
CLR P1.2
CLR P1.3
CALL RETARDO
JMP SALTO0

Los autores, 2001; Edicions UPC, 2001.

6 Las interrupciones

171

;************************************************************************
;
RUTINA DE RETARDO
;*************************************************************************
ORG FF:0200H
RETARDO: MOV R0,#10H
; R0 = 10H
SALT2:
MOV R1,#FFH
; R1 = FFH
SALT1:
DJNZ R1,SALT1
; Decrementa R1 y si es distinto de 0 salta a SALT1
DJNZ R0,SALT2
; Decrementa R2 y si es distinto de 0 salta a SALT2
RET
;************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT0
;*************************************************************************
ORG FF:0300H
RSI_INT0: CLR P1.0
; Se cierra la vlvula V1
SETB TMOD.0
; Se programa el Timer 0 en modo 1
MOV TH0,#3CH
; Se inicializa el Timer 0 para temporizar 0.5 s
MOV TL0,#AFH
;
MOV R3,#00H
; El registro R3 contar los rebasamientos del Timer 0
SETB TR0
; Puesta en marcha del Timer 0
CLR EX0
; Se inhibe la interrupcin /INT0
RETI

Clculo del valor inicial del Timer 0


Para temporizar los treinta segundos se inicia el Timer 0 para que tarde 0.5 s en rebasar (de
forma que se deben contabilizar 60 rebasamientos en la RSI del Timer 0 para abrir de nuevo la
vlvula V1). Para temporizar 0.5 s, con una frecuencia de reloj de 1.2 MHz, el Timer 0 debe
incrementarse 50.000 veces (C350H); luego se ha de cargar dicho Timer con la combinacin
resultante de restar a FFFFH el valor C350H:
FFFFH - C350H = 3CAFH
;**************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION TIMER 0
;***************************************************************************
ORG FF:0400H
RSI_T0:
INC R3
; Se incrementa el contador de rebasamientos
CMP R3,59d
; Se compara el nmero de rebasamientos con 59
JNC SIGUE
; Si el nmero de rebasamientos es menor o igual que 59 continua temporizando
CLR TR0
; En caso contrario se detiene el Timer 0 y
CLR P1.0
; se abre la vlvula V1
SETB EX0
; Se habilita de nuevo la interrupcin /INT0
CLR IE0
; Se borra el flag de la interrupcin /INT0
SIGUE:
RETI
; Retorno al programa principal
;****************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT1
;*****************************************************************************
ORG FF:0500H
RSI_INT1: SETB P1.1
; Se abre la vlvula V2.
SETB TMOD.4
; Se programa el Timer 1 en modo 1
MOV TH1,#3CH
; Se inicializa el Timer 1 para temporizar 0.5 s
MOV TL1,#AFH
;
MOV R4,#00H
; El registro R4 contar los rebasamientos del Timer 1
SETB TR1
; Puesta en marcha del Timer 1
CLR EX1
; Se inhibe la interrupcin /INT1
RETI

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

172

;**************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1
;**************************************************************************
ORG FF:0600H
RSI_T1: INC R4
; Se incrementa el contador de rebasamientos
CMP R4,09d
; Se compara el nmero de rebasamientos con 9
JNC SIGUE1
; Si el nmero de rebasamientos es menor o igual que 9 continua temporizando.
CLR TR1
; Se detiene el Timer 1
SETB P1.1
; Se abre la vlvula V2
SETB EX1
; Se habilita la interrupcin /INT1
CLR IE1
; Se borra el flag de la interrupcin /INT1
SIGUE1: RETI
; Retorno al programa principal

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

173

7 Temporizadores/contadores internos y watchdog


7.1 Introduccin
Los microcontroladores de las familias MCS-51 y MCS-251 disponen de hasta tres contadores
internos de 16 bits, denominados Timer 0, Timer 1 y Timer 2, que pueden ser configurados de forma
individual para operar en diversos modos de trabajo. Estos contadores, en general, se incrementan en
una unidad cada vez que les entra un pulso de reloj, el cual puede provenir de la frecuencia de reloj del
microcontrolador o bien de un terminal externo, por lo que, en el primer caso, al Timer se le denomina
temporizador y, en el segundo caso, se le denomina contador.
Por otra parte hay microcontroladores que incorporan un contador adicional, cuya misin consiste en
hacer de dispositivo de watchdog (perro guardin). Este contador se emplea para reiniciar la CPU
cuando sta, por problemas de interferencia electromagntica, o por algn fallo interno, pierde el
rumbo habitual de ejecucin de las instrucciones, fenmeno que resulta fcil de distinguir por la
gestin catica que hace la CPU de sus perifricos. El Timer de watchdog es un contador que se
incrementa con cada pulso del reloj de la CPU; genera entonces un reset interno que inicializa el
microcontrolador cuando llega a desbordamiento.
Con el Timer de watchdog, para que se active este reset interno, deben pasar unos pocos milisegundos,
que es el tiempo necesario para que el contador de watchdog llegue al desbordamiento. De manera
que, cuando el watchdog est activado, el programador debe insertar instrucciones de refresco o de
inicializacin del Timer cada cierto intervalo de instrucciones. Se trata, pues, de que el watchdog no
llegue desbordarse, mientras el flujo de ejecucin de instrucciones por parte de la CPU sea correcto. Si
la CPU pierde el control del sistema, las instrucciones se ejecutan de forma catica, por lo que la serie
de instrucciones de refresco del watchdog no se ejecutan con la regularidad prevista, lo que causa el
desbordamiento del Timer y un auto-reset de la CPU para inicializar el sistema.
El Timer de watchdog est presente en los microcontroladores de la familia MCS-251 y slo en la
versin 87C51GB de la familia MCS-51, versin que no se explica en este libro, pues se explica tan
slo para la familia MCS-251.
Se debe tener en cuenta que la homologacin de muchos productos basados en microcontroladores se
somete a pruebas con intensas interferencias electrostticas y electromagnticas, con el propsito de
que la CPU pierda el rumbo habitual de ejecucin. En este caso, el sistema debe inicializarse.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

174

7.2 Temporizadores/contadores para la MCS-51


7.2.1 Timer 0 y Timer 1
El Timer 0 y el Timer 1 son contadores de 16 bits que estn presentes en todos los microcontroladores
de la MCS-51. El valor de estos contadores se refleja en los registros TH0 y TL0, para el Timer 0, y en
los registros TH1 y TL1, para el Timer 1. El registro THx constituye el byte alto del contador y el
registro TLx el byte bajo.
El Timer 0 y el Timer 1 pueden funcionar con cuatro modos de trabajo distintos, seleccionables
mediante el registro TMOD, Timer Mode. Los modos de trabajo son: modo 0, temporizador/contador
de 13 bits; modo 1, temporizador/contador de 16 bits; modo 2, temporizador/contador de 8 bits con
autorrecarga; y modo 3, varios contadores.
La figura 7.1 muestra el esquema funcional del Timer 0 y del Timer 1, para los modos 0 y 1 de
funcionamiento, con temporizador de 13 y 16 bits, respectivamente. En esta figura se resaltan, con un
cuadro de puntos, dos bloques: el bloque de seleccin de temporizador/contador y el bloque de la
lgica de control. Estos bloques son comunes al Timer 0 y al Timer 1 y a los modos de funcionamiento
0, 1 y 2 de los Timers.
Temporizador/contador
XTAL1

Puerta de transmisin

12
Interrupcin
0

Tx

1
C/T
TRx

TLx

THx

(8 5* bits)

(8 bits)

* Modo

GATE
INTx

TFx

0: Temporizador/contador de 13 bits
Modo 1: Temporizador/contador de 16 bits
x=01

Lgica de control

Fig. 7.1 Esquema funcional para los Timers 0 y 1 en los modos 0 y 1 de funcionamiento

El bloque de seleccin de temporizador/contador, mediante el bit C / T del registro TMOD, Timer


Mode, selecciona la fuente de entrada de pulsos del Timer, que puede provenir directamente de la
seal de reloj del microcontrolador dividida por 12, para C / T a 0 lgico, o de una entrada de pulsos
externa a travs del terminal Tx del microcontrolador, para C / T a 1 lgico.
El bloque de lgica de control utiliza una puerta de transmisin para dejar pasar, o no, los pulsos de
reloj hacia el contador (figura 7.1). En este bloque intervienen el bit TRx, Timer Run, del registro
TCON, el bit GATE del registro TMOD y el terminal de entrada /INTx, con el propsito de controlar
el paso de pulsos de reloj hacia el contador, lo que a partir de este momento se definir como puesta
en marcha o parada del contador. Con los bits TRx y GATE se puede poner en marcha o parar el
Timer de forma directa, por software, o bien, por medio del estado lgico del terminal /INTx, por
hardware.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

175

Observando el circuito de la lgica de control, se deduce que si el bit GATE se pone a 0 lgico, en la
entrada de la puerta OR (figura 7.1), habr un 1 lgico y, por tanto, un 0 lgico en la entrada de la
puerta AND; en esta situacin queda claro que la puerta est gobernada por el estado lgico del bit
TRx. Entonces, si TRx vale 0 lgico, la puerta queda abierta y el Timer parado, y si TRx vale 1 lgico,
la puerta queda cerrada y el Timer en marcha, y se incrementa a cada pulso de entrada. En esta
situacin, con el bit GATE a 0 lgico, la puesta en marcha o la parada del Timer depende del estado
del bit TRx, y queda, en consecuencia, gobernado por software.
Si GATE se pone a 1 lgico, a la entrada de la puerta OR, tras la puerta inversora (figura 7.1), habr
un 0 lgico; luego, el estado lgico de la puerta OR depender directamente del estado lgico del
terminal /INTx. Si al mismo tiempo, el bit TRx se pone a 1 lgico, queda claro que el gobierno de la
puerta de transmisin depender del terminal /INTx, que pondr en marcha el Timer cuando /INTx
est a 1 lgico, y parar el Timer cuando /INTx est a 0 lgico, lo que se mencionar, a partir de
ahora, como puesta en marcha o parada del contador por hardware, es decir, por el estado lgico de
/INTx.
La determinacin del modo de funcionamiento del Timer 0 y del Timer 1 se realiza con los bits M0 y
M1 del registro TMOD: existen, en efecto, en este registro un par de bits para cada Timer (tabla 7.1).
El contenido del registro TCON se muestra en la tabla 6.2.
Tabla 7.1 Registro TMOD
Registro TMOD

(MSB)
GATE C/T

M1

(LSB)

M0 GATE C/T

Timer 1

M1

M0

Timer 0

Bit

Comentario

GATE

GATE a 0 lgico hace que el Timer se gobierne mediante TRx, con TRx a 1
lgico se pone en macha el Timerx y con TRx a 0 lgico se detiene (x=0 1).
GATE a 1 lgico, junto con TRx a 1, hace que el Timer se gobierne por
hardware, mediante el estado lgico de la entrada /INTx.
Selecciona entre pulsos de la seal de reloj o pulsos del terminal Tx. Si C/T est a
0 se toman los pulsos de la seal de reloj y si C/T est a 1 se toman de Tx.
Seleccin del modo de trabajo
Modo 0. Temporizador/contador de 13 bits.
Modo 1. Temporizador/contador de 16 bits.
Modo 2. Temporizador/contador de 8 bits con autorrecarga.
Modo 3. Varios contadores.

C/T
M1 M0
0
0
0
1
1
0
1
1

7.2.1.1 Modo 0. Temporizador/contador de 13 bits


En el modo 0, el Timer 0 y el Timer 1 operan como temporizadores/contadores de 13 bits (figura 7.1),
empleando, en realidad, el registro TLx como un divisor previo de 5 bits, que puede dividir la
frecuencia de la seal de entrada de los Timers hasta por 32; y el registro THx como un contador de 8
bits conectado a la salida de TLx. Los tres bits altos de TLx estn en un estado indeterminado, que
debe ser ignorado.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

176

El sentido del contador es siempre ascendente y se incrementa con cada pulso de entrada. El
rebasamiento del Timer se produce cuando pasa de tener todos los bits de uno lgico a cero lgico;
entonces se activa el bit correspondiente de rebasamiento, TFx, y se genera una interrupcin a la CPU.

7.2.1.2 Modo 1. Temporizador/contador de 16 bits


En el modo 1 el Timer 0 y el Timer 1 operan como un temporizador/contador de 16 bits (figura 7.1).
En este modo los registros TLx y THx son dos contadores de 8 bits que estn conectados en cascada
para formar el contador de 16 bits.
Al igual que en el modo 0, en el modo1 el sentido del contador es ascendente, y el rebasamiento se
produce al pasar el contenido de los registros TLx y THx de todos los bits de uno lgico a cero lgico.
El rebasamiento entonces activa el bit TFx y genera una interrupcin a la CPU.

7.2.1.3 Modo 2. Temporizador/contador de 8 bits con autorrecarga


En el modo 2 el Timer 0 y el Timer 1 funcionan como un temporizador/contador de 8 bits con
autorrecarga (figura 7.2). El contador est formado por el registro TLx, mientras que el registro THx
hace la funcin de registro de recarga. En este modo de trabajo, cuando se produce un desbordamiento
en el contador, el bit TFx se activa de manera automtica, causa una interrupcin a la CPU y hace, al
mismo tiempo, que el contenido de THx se cargue en el registro TLx, por lo que el contador comienza
a contar pulsos a partir del valor cargado. Este proceso de recarga no modifica el valor del registro
THx, mediante el cual se pueden generar perodos de tiempo precisos a partir del valor situado en
THx.
XTAL1

12

Interrupcin
0
TFx

TLx

Tx

1
C/T
TRx
THx
x=01

GATE
INTx

Fig. 7.2 Esquema funcional para los Timers 0 y 1 en el modo 2 de funcionamiento

Ejemplo 7.1 Generacin de una seal peridica


Es habitual en un sistema tener que generar seales peridicas: en el caso de la MCS-51 se
pueden llevar a cabo empleando uno o varios de sus temporizadores. En este ejemplo se usa el
Timer 0 en el modo 2 de 8 bits con autorrecarga, para generar una seal binaria de 5kHz de
frecuencia. Para determinar el perodo de la seal se emplear el registro TH0 del Timer 0. La
seal generada se extraer a travs de la patilla P1.0 del microcontrolador (figura 7.3).

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog


;***************************************************************
; Generacin de una seal peridica
; Rutina de Vectorizacin
;***************************************************************
ORG 0H
LJMP Inicio
ORG 0BH
LJMP RSI_Timer0
;***************************************************************
; Rutina de Inicio
;***************************************************************
Inicio: SETB PT0
;Asigna prioridad alta al Timer 0
SETB ET0
;Habilita interrupcin del Timer 0
SETB EA
;Habilita bit de interrupcin general
MOV TMOD,#02H ;M1=1 y M0=0 (Modo 2),
; GATE=0 y C/T=0 del Timer 0
MOV TL0, #156
;Pone valor 156 en TL0 (256-100)
MOV TH0, #156
;Pone valor de recarga en TH0 (256-100)
SETB TR0
;Pone marcha el contador
;***************************************************************
; Rutina de Principal
;***************************************************************
Principal: SJMP Principal
;Bucle infinito sin una tarea concreta
;***************************************************************
; Rutina de servicio del Timer0
;***************************************************************
RSI_Timer0:CPL P1.0 ;Complementa P1.0. Pasa de 1 a 0, y de 0 a 1
RETI
;Fin de rutina. El bit TF0 se borra automticamente

177

MCS-51

P1.0

Fig. 7.3 Generacin de seal en el


ejemplo 7.1

En el programa realizado se habilita la interrupcin del Timer 0 (ET0=1, EA=1), se le da


prioridad alta a la interrupcin del Timer 0 (PT0=1), y se configura el Timer 0 en el modo 2 de
8 bits con autorrecarga (M1=1 y M0=0, registro TMOD). La puesta en marcha del Timer 0 es
por software (GATE=0, registro TMOD), el Timer 0 cuenta pulsos procedentes del reloj del
microcontrolador (C/T=0, registro TMOD), y, al final de la rutina Inicio, se pone en marcha el
Timer (TR0=1).
El Timer 0 est gestionado completamente por interrupciones, de manera que cada vez que
llega a desbordamiento se activa el bit TF0, TF0=1, se produce una interrupcin a la CPU y se
recarga el valor del registro TH0 en el registro TL0. En la rutina de atencin a la interrupcin
del Timer 0, RSI_Timer0, basta con complementar el estado lgico de la patilla P1.0, para
generar la frecuencia requerida. Con esta instruccin el microcontrolador lee el estado de la
patilla, lo complementa (pasa de 0 lgico a 1 lgico, y viceversa) y escribe el nuevo estado en
la patilla.
El bit de rebasamiento se activa con la peticin de interrupcin y se borra, de forma automtica,
cuando la CPU atiende a la interrupcin ejecutando la rutina RSI_Timer0.
Para determinar el valor de recarga del registro TH0, se debe considerar que el perodo
necesario para generar frecuencia de 5 kHz es de 200 [s, por lo que la patilla P1.0 se debe
complementar cada 100 [s, es decir, la mitad del perodo. Adems, desde que se produce la
interrupcin (estado S5P2 del ciclo mquina), hasta que se vectoriza la interrupcin del Timer
0, transcurren tres ciclos mquina en el mejor de los casos, y la instruccin CPL P1.0 se ejecuta

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

178

en un ciclo mquina. Por tanto, el estado lgico de la patilla P1.0 cambiar, al menos, cuatro
ciclos mquina despus de que se halla activado el bit TF0.
El valor de recarga de TH0 debe ser de 156, es decir, el valor de la diferencia entre 256 (valor
de rebasamiento) y el tiempo deseado, 100 [s. Se debe tener en cuenta que para un reloj de
12MHz, el Timer 0 se incrementa cada microsegundo y que un ciclo mquina tiene la duracin
de 1 [s.
Ejemplo 7.2 Generacin de diversas frecuencias
En este ejemplo se generarn distintas frecuencias por la patillas P1.6 y P1.7 del
microcontrolador, en funcin del estado de las teclas T1, T2, T3, T4, T5 y T6. Las cuatro
primeras teclas estn conectadas a la entrada de interrupcin /INT0 mediante puertas AND
lgico, de forma que su pulsacin causar una interrupcin a la CPU.
T1
T2
T3
T4

P1.0
P1.1

P1.4
P1.5

T5
T6

P1.2
P1.3

80C31
P1.6
/INT0

P1.7

f1
f2

Fig. 7.4 Generacin de diversas frecuencias del ejemplo 7.2

En este ejemplo el microcontrolador debe generar en la patilla P1.6 una frecuencia de 4kHz,
5kHz, 10kHz y 20kHz, si se pulsan las teclas T1, T2, T3 o T4, respectivamente. Las teclas T5 y
T6 afectarn a la frecuencia de la patilla P1.7. Al pulsar T5 se generar en P1.7 una frecuencia
de 25kHz; al pulsar T6 la frecuencia ser de 50kHz. Inicialmente, por defecto, en P1.6 y en
P1.7 se generar una frecuencia de 2kHz. Cuando se pulse una tecla se generar la frecuencia
correspondiente, y cuando no se pulse ninguna se volver a generar la frecuencia inicial de
2kHz.
;********************************************************************
; Generacin de una seal peridica
;********************************************************************
ORG 0H
; Vectorizacin de interrupciones
LJMP Inicio
ORG 03H
LJMP RSI_Int0
ORG 0BH
LJMP RSI_Timer0
ORG 01BH
LJMP RSI_Timer1
;********************************************************************
; Rutina de Inicio
;********************************************************************
Inicio: SETB IT0
;Interrupcin /INT0 activa por flanco descendente
SETB PT0
;Asigna prioridad alta al Timer 0

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

179

SETB PT1
;Asigna prioridad alta al Timer 1
SETB EX0
;Habilita interrupcin de /INT0
SETB ET0
;Habilita interrupcin del Timer 0
SETB ET1
;Habilita interrupcin del Timer 1
SETB EA
;Habilita bit de interrupcin general
MOV TMOD, #22H ;Timer 0 y 1 en Modo 2, con GATE=0 y C/T=0
MOV TL0, #6
;(256-250) carga valor inicial para frec. de 2kHz
MOV TH0, #6
;carga valor inicial para frec. de 2kHz
MOV TL1, #6
;carga valor inicial para frec. de 2kHz
MOV TH1, #6
;carga valor inicial para frec. de 2kHz
SETB TR0
;Pone marcha el Timer 0
SETB TR1
;Pone marcha el Timer 1
LJMP Principal
;Ir hacia rutina principal
;********************************************************************
; Rutina de servicio de /INT0
;********************************************************************
RSI_Int0: JNB P1.0, Tecla_T1
;Ha pulsado la tecla T1?
JNB P1.1, Tecla_T2
;Ha pulsado la tecla T2?
JNB P1.1, Tecla_T3
;Ha pulsado la tecla T3?
SJMP Tecla_T4
;Tiene que ser la tecla T4
Tecla_T1: MOV TH0, #131
;(256-125) valor de recarga para 4kHz
RETI
Tecla_T2: MOV TH0, #156
;(256-100) valor de recarga para 5kHz
RETI
Tecla_T3: MOV TH0, #206
;(256-50) valor de recarga para 10kHz
RETI
Tecla_T4: MOV TH0, #231
;(256-25) valor de recarga para 20kHz
RETI
;********************************************************************
; Rutina de servicio del Timer0
;********************************************************************
RSI_Timer0:CPL P1.6 ;Complementa P1.6
RETI
;Fin de subrutina. El bit TF0 se borra automticamente
;********************************************************************
; Rutina de servicio del Timer1
;********************************************************************
RSI_Timer1:CPL P1.7 ;Complementa P1.7
RETI
;Fin de subrutina. El bit TF0 se borra automticamente
;********************************************************************
; Rutina de Principal
;********************************************************************
Principal: JNB P1.4, Tecla_T5
JNB P1.5, Tecla_T6
MOV TH0, #6
;frecuencia por defecto de 2kHz en Timer 0
MOV TH1, #6
;frecuencia por defecto de 2kHz en Timer 1
SJMP Principal
;Bucle infinito
Tecla_T5: MOV TH1, #236
;(256-20) valor de recarga para 25kHz
SJMP Principal
Tecla_T6: MOV TH1, #246
;(256-10) valor de recarga para 50kHz
SJMP Principal

En la rutina de inicio se ha activado la interrupcin /INT0 por flanco descendente, por lo que la
interrupcin slo se producir una vez, cuando se pulse una tecla, al detectar la CPU un flanco de
bajada. En la rutina de inicio se le asigna prioridad alta al Timer 0 y al Timer 1, por ser el ncleo de
este ejemplo. El Timer 0 y el Timer 1 se configuran en el modo 2 de autorrecarga contando pulsos del
reloj.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

180

Para determinar el valor de los registros TH0 y TH1, de acuerdo con la frecuencia especificada, se
debe tener en cuenta que la frecuencia se genera a travs de la instruccin CPL en la rutina de RSI de
cada Timer. La instruccin CPL complementa el valor del terminal del puerto cada vez que un
temporizador llega a rebasamiento, por lo que para generar una frecuencia se debe emplear la mitad
del perodo de sta. Con una frecuencia de reloj de 12 MHz, el perodo de cada pulso de reloj es de 1
[s, los temporizadores, pues, se incrementan cada microsegundo. Luego, para generar una frecuencia
determinada en el Timer 0 1, el valor del registro TH0 o TH1 debe ser:
TH 0,1 ] Valor de rebasamiento -

Perodo reloj
2

En este ejemplo, para generar una frecuencia de 2 kHz el valor de TH0 es de 236, para 4 kHz el valor
es de 131, etc. El Timer 0 llega a rebasamiento cuando TL0 pasa de FFH a 00H, por lo que el valor de
rebasamiento, es decir, el valor mximo del Timer, es de 256 o FFH+1.
La pulsacin de las teclas T5 y T6 se detecta mediante software en la rutina principal, donde
continuamente se lee el estado de estas teclas, y se asigna al registro TH1 el valor de 236 para generar
una frecuencia de 25 kHz, o el valor 246 para generar una frecuencia de 50 kHz.

7.2.1.4 Modo 3. Varios contadores


En el modo 3 los registros TL0 y TH0 del Timer 0 trabajan como dos contadores independientes de 8
bits cada uno (figura 7.5); de manera que se emplear en aquellas aplicaciones que requieren de un
temporizador o contador de 8 bits adicional.
En el modo 3 el contador formado por TL0 utiliza todos los bits de control propios del Timer 0, para
llevar a cabo el mismo tipo de funcionamiento que el descrito para los otros modos; o sea, usa los bits
C/T, GATE, TR0 y /INT0. No obstante, para el contador formado por el registro TH0 slo se dispone
del bit de control TR1, por lo que este contador tiene su funcionamiento restringido: slo puede
ponerse en marcha y pararse mediante el bit TR1. El contador TH0, adems, slo puede contar pulsos
procedentes del reloj del microcontrolador.
A nivel de desbordamiento, el contador formado por TL0 afecta al bit TF0, mientras que el contador
formado por TH0 afecta al bit TF1, que en los otros modos pertenece al Timer 1.
En cuanto al Timer 1, para el modo 3, es obvio que no puede utilizar los bits TR1 y TF1 en su
funcionamiento usual, lo que significa que, cuando el Timer 1 se desborde, no se activar el bit TF1, y
que tampoco se podr usar el bit TR1 para activar o para parar el Timer. La forma de arrancar y parar
el Timer 1 consiste en entrar y salir de su propio modo 3; es decir, entrando en el modo 3 se pone en
marcha el Timer 1, y saliendo del modo 3 se detiene el Timer 1. De todos modos, el Timer 1 puede ser
utilizado por el puerto serie como base para la generacin de la velocidad de transmisin en baudios o
en cualquier otra aplicacin en donde no se necesite producir una interrupcin.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

1/12 Fosc

12

XTAL1

181

Interrupcin
TF0

TL0

T0

1
C/T
TR0

GATE

Interrupcin
1/12 Fosc

INT0

TF1

TH0
TR1

Fig. 7.5 Esquema funcional en el modo 2 de funcionamiento

7.2.2 Timer 2
El Timer 2 es un contador de 16 bits que est formado a partir de los registros TL2 y TH2, de 8 bits
cada uno, conectados en cascada. Este Timer est presente en todas las versiones de la MCS-51 con
tres temporizadores internos, y puede trabajar hasta con cuatro modos distintos de funcionamiento:
modo autorrecarga, modo captura, modo Baud Rate y modo Clock-out. La forma de trabajar con el
Timer 2 se determina a partir de los registros T2MOD y T2CON, (tablas 7.2 y 7.3, respectivamente).
Estos registros permiten determinar el modo de funcionamiento del Timer 2, controlar su puesta en
marcha, programar su modo de operacin (contador o temporizador) y detectar el desbordamiento.
En la tabla 7.4 se indican los cuatro modos de operacin en los que puede funcionar el Timer 2,
dependiendo del estado de los bits RCLK, TCLK, CP/RL2 y T2OE.

Tabla 7.2 Registro T2MOD para el control del Timer 2


(MSB)
--

Registro T2MOD
--

--

--

--

(LSB)
--

T2OE DCEN

Bit

Comentario

-T2OE

Bit reservado.
Bit de habilitacin del Timer 2.
En el modo Clock-out, T2OE conecta la salida de desbordamiento con el terminal T2.
Bit de sentido de cuenta.
DECEN=0 hace que el sentido de la cuenta sea ascendente. DCEN=1 hace que el
sentido pueda ser ascendente o descendente.

DCEN

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

182
Tabla 7.3 Registro T2CON para el control del Timer 2
Registro T2CON

(MSB)
TF2

EXF2 RCLK TCLK EXEN2 TR2

(LSB)
C/T2 CP/RL2

Bit

Comentario

TF2

Bit de desbordamiento. TF2=1 al producirse un desbordamiento. Este bit no se


activa si RCLK=1 o TCLK=1. Debe borrarse por software.
Bit de entrada externa. EXF2 se pone a 1 lgico al producirse un flanco
descendente en el terminal T2EX, siempre y cuando EXEN2 est habilitado.
Bit de reloj en recepcin. RCLK se pone a 1 lgico cuando se produce un
desbordamiento en el Timer 0.
Bit de reloj en transmisin
Bit de habilitacin de entrada externa. En general, si EXEN2=1 permite la
activacin de EXF2 con un flanco de descendente en T2EX. Tambin realiza
funciones especficas en todos los modos de funcionamiento del Timer.
Bit de puesta en marcha y parada. TR2=1 pone en marcha el Timer 2. TR2=0
detiene el Timer 2.
Bit de seleccin de temporizador/contador. Con C/T2=0 el Timer cuenta pulsos
de reloj (12). Con C/T2=1 el Timer cuenta pulsos de la entrada T2.
Bit de captura/recarga. Con CP/RL2=1 se produce una captura al aplicar un
flanco negativo en T2EX, si EXEN2=1. Con CP/RL2=0 se produce una recarga al
aplicar un flanco negativo en T2EX, si EXEN2=1.
Si RCLK=1 o TCLK=1 se ignora CP/RL2 y se fuerza la recarga del Timer 2 al
producirse un desbordamiento en su valor.

EXF2
RCLK
TCLK
EXEN2

TR2
C/T2
CP/RL2

Tabla 7.4 Modos de trabajo del Timer 2

Modo
Modo autorrecarga
Modo captura
Modo Baud Rate
Modo Clock-out

RCLK o TCLK
0
0
1
X

CP/RL2
0
1
X
0

T2OE
0
0
X
1

X= Estado indeterminado

7.2.2.1 Modo captura


El Timer 2 en el modo captura funciona como un temporizador o contador de 16 bits (figura 7.6).
Cuando se produce un desbordamiento, al pasar todos los bits de TL2 y TH2 de uno a cero lgico, se
activa el bit de rebasamiento TF2 del registro T2CON y se genera una interrupcin automtica.
En este modo, si el bit EXEN2 del registro T2CON se pone a 1 lgico y se produce un flanco de
bajada en el terminal T2EX del microcontrolador, el valor actual de los registros TH2 y TL2 se copia
en los registros RCAP2H y RCAP2L del rea de SFR, hecho al que se le denomina captura. Al mismo
tiempo, el flanco de bajada producido hace que el bit EXF2 del registro T2CON se ponga a 1 lgico y
se genera una interrupcin automtica. As pues, en este modo las fuentes de interrupcin hacia la
CPU pueden ser por medio del bit de rebasamiento TF2, o bien por medio del bit EXF2. En este
ltimo caso, se puede considerar al terminal T2EX como una nueva fuente de interrupcin externa, al
igual que /INT0 y /INT1. En el caso de que produzca una interrupcin, la rutina de RSI que se ejecuta

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

183

es la misma, tanto para el bit TF2, como para el bit EXF2, de forma que la rutina de RSI debe
comprobar cul de las dos posibles interrupciones se ha activado.
La puesta en marcha y la parada del Timer 2 se realiza con el bit TR2 del registro T2CON. Con TR2 a
1 lgico se pone en marcha el Timer, que queda habilitado para contar pulsos; con TR2 a 0 lgico se
detiene el Timer.
XTAL1

12
0
TL2

T2

TH2

TF2

1
C/T2

TR2
Interrupcin

RCAP2H RCAP2L
EXF2

T2EX
EXEN2

Fig. 7.6 Modo captura del Timer 2

7.2.2.2 Modo autorrecarga


El modo autorrecarga configura al Timer 2 como un temporizador o contador de 16 bits, con recarga
automtica del valor contenido en los registros RCAP2L y RACP2H hacia los registros TL2 y TH2,
respectivamente (figuras 7.7 y 7.8). En este modo de funcionamiento, el Timer 2 puede operar de dos
formas diferentes: como un contador ascendente, o bien como un contador ascendente descendente,
segn sea el valor del bit DCEN, Down counter enable bit del registro T2MOD. Para este ltimo caso,
si DCEN est a 0 lgico el sentido de la cuenta es ascendente, y si DCEN est a 1 lgico el sentido de
la cuenta es descendente. Se debe tener en cuenta que el bit DCEN por defecto, tras un reset o al
iniciar el microcontrolador, se pone a 0 lgico.

a) Contador ascendente (DCEN=0)


Cuando DCEN se pone a 0 lgico, el Timer 2 opera como un contador ascendente de 16 bits (figura
7.7). En este caso, la recarga del Timer 2, es decir, la copia de los registros RCAP2H y RCAP2L en
los registros TH2 y TL2, respectivamente, se puede hacer por el desbordamiento del Timer, al
activarse el bit TF2, o bien, al producirse un flanco de bajada en el terminal T2EX, siempre y cuando
el estado del bit EXEN2 lo permita. En este ltimo caso, el flanco de bajada tambin puede causar la
activacin del bit EXF2 y provocar una interrupcin.
El bit DCEN, tras un reset del microcontrolador, se pone a 0 lgico, as que, por defecto el Timer 2 en
el modo autorrecarga funciona como un contador ascendente de 16 bits.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

184

XTAL1

12
0
TH2

TL2

TF2

1
T2

TR2
C/T2

RCAP2H RCAP2L

Interrupcin

T2EX

EXF2
EXEN2

Fig. 7.7 Modo autorrecarga del Timer 2 con DCEN=0

b) Contador ascendente/descendente (DCEN=1)


Cuando DCEN se pone a 1 lgico, el Timer 2 opera como un contador ascendente/descendente (figura
7.8), donde el sentido de la cuenta se determina mediante el estado lgico aplicado del terminal T2EX
del microcontrolador.
Cuando T2EX est a 1 lgico, el Timer 2 cuenta de forma ascendente, en cuyo caso, el Timer puede
llegar a desbordamiento; se activa entonces el bit TF2, se produce una recarga del valor de los
registros RCAP2H y RCAP2L hacia TH2 y TL2, respectivamente, y se genera una interrupcin
automtica siempre y cuando se haya habilitado de forma previa.
Cuando T2EX est a 0 lgico, el Timer 2 cuenta en sentido descendente, es decir, se decrementa su
valor con cada pulso de entrada. En este sentido de la cuenta, el Timer 2 tambin puede llegar a un
rebasamiento, que se produce cuando el contenido de los registros TH2 y TL2 llega a ser igual al valor
almacenado en los registros RCAP2H y RCAP2L, respectivamente. En este caso, se activa el bit TF2,
y se produce una peticin de interrupcin y una recarga del valor FFH en cada uno de los registros,
TH2 y TL2.
Al mismo tiempo, cuando se produce cualquiera de los dos tipos de desbordamiento mencionados, el
bit EXF2 complementa su valor; es decir, si EXF2 est a 1 lgico, cambia su valor a 0 lgico, y
viceversa. El bit EXF2 no genera peticin de interrupcin al microcontrolador, y se puede utilizar
como el bit 17 del contador, es decir, se contempla el contador como un Timer de 17 bits (donde
EXF2 es el bit 17).

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

185
Valor de recarga para la
cuenta hacia abajo
FFH

FFH
Complemento
EXF2

XTAL1

12
0

Interrupcin
TH2

TL2

TF2

1
T2

TR2
C/T2
RCAP2H RCAP2L

Sentido de la cuenta
1 = ascendente
T2EX 0 = descendente

Valor de recarga para la


cuenta hacia arriba

Fig. 7.8 Modo autorrecarga del Timer 2 con DCEN=0

7.2.2.3 Modo generador de baudios para el puerto serie (Baud Rate Generator Mode)
En este modo, el Timer 2 queda configurado como generador de baudios para fijar la velocidad de
transmisin del puerto de comunicacin serie del microcontrolador. Este modo se selecciona al activar
los bits RCLK y/o TCLK de registro T2CON (tabla 7.4).

7.2.2.4 Modo Clock-out


En el modo Clock-out el Timer 2 genera una seal de reloj por el terminal T2 del microcontrolador de
frecuencia variable y simtrica (figura 7.9). El Timer 2 se incrementa con una frecuencia de valor
FOSC/2 (la mitad de la frecuencia de reloj del microcontrolador), hasta que sufre un desbordamiento, y
causa la recarga automtica de los registros TH2 y TL2 con el valor contenido en los registros
RCAP2H y RCAP2L, respectivamente.
En este modo el desbordamiento del Timer no genera peticin de interrupcin, como ocurre con los
otros modos. La interrupcin, sin embargo, s que se genera al detectar un flanco de bajada en la
entrada T2EX, siempre y cuando el bit EXEN2 est activado (figura 7.9).
La frecuencia de la seal de reloj generada se establece modificando el valor de los registros RCAP2H
y RCAP2L, segn la siguiente ecuacin:
Frec _ reloj ]

FOSC
4(65535RCAP 2H,RCAP 2L

El rango de frecuencias que se puede generar est comprendido entre los 61Hz y los 4MHz, para una
frecuencia de reloj de 16MHz.
A modo de resumen, para que el Timer 2 trabaje en modo Clock-out, el bit T2OE del registro T2MOD
se debe poner a 1 lgico, el bit C/T2 del registro T2CON se debe poner a 0 lgico, y el bit TR2 debe
estar a 1 lgico.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

186

El Timer 2 se puede usar como generador de baudios para el puerto serie y, tambin de forma
simultnea, como generador de reloj, aunque las frecuencias generadas no se pueden determinar de
forma independiente, pues comparten los mismos registros de recarga.
XTAL1

12
0
TH2

TL2

1
TR2
C/T2
T2

RCAP2H RCAP2L

2
T2OE
T2EX

EXF2
Interrupcin
EXEN2

Fig. 7.9 Modo Clock-out para el Timer 2

7.2.3 Timer 0, 1 y 2 como contador


Los Timers 0, 1 y 2 pueden contar pulsos procedentes de los terminales T0, T1 y T2, respectivamente.
Para ello los bits C / T del registro TMOD, en el caso de los Timers 0 y 1, y el bit C / T 2 para el
Timer 2, deben estar a 1 lgico. Los registros de los Timers se incrementan cada vez que se detecta, en
los terminales T0, T1 y T2, una transicin de 1 a 0 lgico.
El estado lgico de cada uno de estos terminales de entrada se comprueba en la fase 2 del estado 5,
S5P2, de cada ciclo mquina. El valor de los registros de los Timers se incrementa cuando en un ciclo
mquina se detecta un 1 lgico y un 0 lgico en el siguiente ciclo. El nuevo valor de los registros se
muestra en el estado S3P1 del ciclo mquina siguiente al que se ha detectado la transicin.
La mxima frecuencia del terminal de entrada es fclok/24, puesto que se tarda dos ciclos mquina en
reconocer una transicin de 1 a 0 lgico. Para una frecuencia de reloj de 12MHz la mxima frecuencia
de terminal T0, T1 o T2 es de 500kHz.
Ejemplo 7.3 Refresco de cuatro dgitos de siete segmentos y teclado matricial
En el captulo 5 se explicaba un ejemplo en el que se efectuaba la lectura de un teclado
matricial (apartado 5.10.4), y tambin un ejemplo de un contador de piezas para una mquina
de un proceso industrial (apartado 5.10.6). Estos dos ejemplos se pueden combinar en uno solo:
es decir, un contador de piezas con un teclado matricial que da capacidad de configuracin al
usuario. La figura 7.10 muestra el circuito, en el cual se adjunta al contador de piezas un
teclado matricial de 8 teclas, formado por dos filas con cuatro teclas cada una.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog


Vcc

7405

P2.0

R
nodo comn

87C51

P2.7

dp

Vcc

Sensor
Cuenta

P0.0

187
4511
(BCD-7seg)
A0
a

P0.1

A1

P0.2

A2

P0.3

A3

Vcc

dp

Unidades

R
dp

P0.4
P1.2

Ctodo comn
Centenas
Decenas

/EL

Millares

Tr1

Tr2

Tr3

Tr4

P0.5
P0.6

Vcc

P0.7

Sensor
Descuenta
P1.3
Reset

Up

Right

Enter

F1

Down

Left

Clear

F2

P1.0
/INT0
/INT1

P1.1

Fig. 7.10 Circuito del contador de piezas con teclado matricial del ejemplo 7.3

Los cuatro dgitos de la figura 7.10 se deben encender de manera secuenciada para que el
nmero se distinga correctamente, tal y como se explicaba en el apartado 5.10.6. Al mismo
tiempo, la lectura del teclado matricial tambin precisa de una secuencia de escrutinio, en la
cual se comprueba, columna a columna, si se han pulsado las teclas asociadas. En
consecuencia, en el circuito de la figura 7.10, se desea utilizar la secuencia de refresco de los
cuatro dgitos de siete segmentos, para efectuar, a la vez, la secuencia de escrutinio de las
columnas del teclado matricial. Esta secuencia se llevar a cabo automticamente mediante las
interrupciones del Timer 2.
Las filas del teclado matricial pueden activar la entrada de interrupcin /INT1 mediante la
puerta AND de la figura 7.10. La secuencia situar un 0 lgico en la patilla P0.7, mientras las
patillas P0.4, P0.5 y P0.6 permanecen a 1 lgico, pondr el transistor Tr4 en saturacin y
encender el dgito correspondiente a las unidades. Si en este momento se pulsan las teclas F1 o
F2, se provocar una interrupcin en /INT1. Transcurrido un tiempo determinado, el 0 lgico
se sita en el terminal P0.5, mientras los otros terminales estn a 1 lgico; se pone, as, el
transistor Tr3 en saturacin y se enciende el dgito de las decenas. De esta manera se procede
hasta que se pone un 0 lgico en la patilla P0.7 y se enciende el dgito correspondiente a los
millares. En este caso, la secuencia se repetir con una frecuencia de 1 kHz, que establecern
las interrupciones del Timer 2.
Cada vez que llega un pulso de cuenta se debe incrementar el valor del contador, y cuando se
activa el sensor de descuenta se debe decrementar el contador. Si el valor del contador
sobrepasa el valor 9999, ste no se incrementar, y si llega un pulso de descuenta cuando el
valor es de 0000, el contador no se decrementar. La tecla reset activa la interrupcin /INT0
y pone a cero el valor del contador.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

188

Cuando se detecte que una tecla ha sido pulsada se mostrar un carcter determinado que
indique, en el dgito conectado al puerto P2, la tecla pulsada. Para la tecla Up se mostrar el
carcter U, para la tecla Rigth se mostrar el carcter r, para Enter el carcter E, para
F1 el carcter 1., para Down el carcter d, para Left el carcter L, para Clear el
carcter C y para F2 el carcter 2.. El dgito conectado al puerto P2 mostrar siempre el
carcter correspondiente a la ltima tecla pulsada.
;**********************************************************************
; Refresco de 4 dgito de siete segmentos y de teclado matricial
;**********************************************************************
ORG 0H
; Vectorizacin de interrupciones
LJMP Inicio
ORG 03H
LJMP RSI_Int0
ORG 013H
LJMP RSI_Int1
ORG 02BH
LJMP RSI_Timer2
;**********************************************************************
; Rutina de Inicio
;**********************************************************************
Inicio: MOV P2, #0
;Apaga el dgito conectado a P2
SETB IT0
;Interrupcin /INT0 activa por flanco descendente
SETB IT1
;Interrupcin /INT1 activa por flanco descendente
SETB PX1
;Asigna prioridad alta a /INT1
SETB EX0
;Habilita interrupcin de /INT0
SETB EX1
;Habilita interrupcin de /INT1
SETB ET2
;Habilita interrupcin del Timer 2
MOV T2CON, #0
;Timer 2 funcionando en 16 bits con autorrecarga
MOV T2MOD, #0
;Timer 2 (DCEN=0)
MOV RCAP2L, #05H
;Carga recarga para interrumpir cada 250 [s
MOV RCAP2H, #0FFH
; en RCAP2L y RCAP2H
MOV TL2, #05H
MOV TH2, #0FFH
SETB EA
;Habilita bit de interrupcin general
SETB TR2
;Pone en marcha el Timer 2
;**********************************************************************
; Rutina Principal
;**********************************************************************
Principal: JNB P1.2, Conta
;Comprueba si se ha pulsado Cuenta
JNB P1.3, Decre
;Comprueba si se ha pulsado Descuenta
MOV P2, B
;Carga B en P2, para mostrar en dgito
SJMP Principal
;Bucle infinito
;**********************************************************************
; Rutina de servicio de /INT0
;**********************************************************************
RSI_Int0: MOV R0, #0
;Borra unidades
MOV R1, #0
;Borra decenas
MOV R2, #0
;Borra centena.
MOV R3, #0
;Borra millares
MOV P2, #0
;Apaga dgito conectado a P2
MOV B, #0
;Borra registro B
RETI
;**********************************************************************
; Rutina de servicio de /INT1
;**********************************************************************
RSI_Int1: JNB P1.0, Fila_0
;Ha pulsado una tecla de la fila 0?
SJMP Fila_1
;Si no, debe ser la fila 1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog


Fila_0:

JNB P0.4, Tec_Up


JNB P0.5, Tec_Rigth
JNB P0.6, Tec_Enter
SJMP Tec_F1
Fila_1:
JNB P0.4, Tec_Down
JNB P0.5, Tec_Left
JNB P0.6, Tec_Clear
SJMP Tec_F2
Tec_Up:
MOV B, #0011 1110b ;Leds b, c, d, e y f encendidos, carcter U
RETI
Tec_Rigth: MOV B, #0101 0000b ;Leds e y g encendidos, carcter r
RETI
Tec_Enter: MOV B,#0111 1001b
;Leds a, d, e, f y g encendidos, carcter E
RETI
Tec_F1:
MOV B, #1000 0110b ;Leds b, c y dp encendidos, carcter 1.
RETI
Tec_Down: MOV B, #0101 1110b ;Leds b, c, d, e y g encendidos, carcter d
RETI
Tec_Left: MOV B, #0011 1000b ;Leds d, e y f encendidos, carcter L
RETI
Tec_Clear: MOV B, #0011 1001b ;Leds b, c, d, e y f encendidos, carcter U
RETI
Tec_F2:
MOV B, #1101 1011b ;Leds a, b, d, e, g y dp encendidos, carcter 2.
RETI
;**********************************************************************
; Rutina de servicio del Timer 2
;**********************************************************************
RSI_Timer2:ORL P0, #0F0H
;Apaga todos los dgitos
T_Uni:
CJNE R5, #0, T_Dece
INC R5
SJMP T2_Uni
T_Dece:
CJNE R5, #1, T_Cent
INC R5
SJMP T2_Dec
T_Cent:
CJNE R5, #2, T_Millar
INC R5
SJMP T2_Cent
T_Millar: MOV R5, #0
SJMP T2_Millar
T2_Uni:
MOV A, R0
;Carga en A
ORL A, #0F0H
;Fuerza los 4 bits altos a 1 lgico
MOV P0, A
;Pone unidades en P0 (4 bits altos de R0 son cero)
CLR P0.7
;Enciende dgito unidades. Tr4 en saturacin
SJMP T2_Salir
T2_Dec:
MOV A, R1
;Carga en A
ORL A, #0F0H
;Fuerza los 4 bits altos a 1 lgico
MOV P0, A
;Pone decenas en P0 (4 bits altos de R0 son cero)
CLR P0.6
;Enciende dgito decenas. Tr3 en saturacin
SJMP T2_Salir
T2_Cent: MOV A, R2
;Carga en A
ORL A, #0F0H
;Fuerza los 4 bits altos a 1 lgico
MOV P0, A
;Pone centenas en P0 (4 bits altos de R0 son cero)
CLR P0.5
;Enciende dgito centenas. Tr2 en saturacin
SJMP T2_Salir
T2_Millar: MOV A, R3
;Carga en A
ORL A, #0F0H
;Fuerza los 4 bits altos a 1 lgico
MOV P0, A
;Pone millares en P0 (4 bits altos de R0 son cero)
CLR P0.4
;Enciende dgito millares. Tr1 en saturacin
T2_Salir:
CLR TF2
;Borra TF2
RETI

Los autores, 2001; Edicions UPC, 2001.

189

Microcontroladores MCS-51 y MCS-251

190

;**********************************************************************
;Rutina Conta
;**********************************************************************
Conta:
CJNE R0, #9, Unidad
;Compara unidad
CJNE R1, #9, Decena
;Compara decena
CJNE R2, #9, Centena ;Compara centena
CJNE R3, #9, Millar
;Compara millar
SJMP Principal
Unidad: INC R0
;Incrementa unidades
SJMP Principal
Decena: MOV R0, #0
;Pone a 0 las unidades
INC R1
;Incrementa decenas
SJMP Principal
Centena: MOV R0, #0
;Pone a 0 unidades y decenas
MOV R1, #0
INC R2
;Incrementa centenas
SJMP Principal
Millar:
MOV R0, #0
;Pone a 0 unidades, decenas y centenas
MOV R1, #0
MOV R2, #0
INC R3
;Incrementa millares
SJMP Principal
;**********************************************************************
;Rutina Decre
;**********************************************************************
Decre:
CJNE R0, #0, D_uni
;Compara unidad
CJNE R1, #0, D_dece
;Compara decena
CJNE R2, #0, D_cent
;Compara centena
CJNE R3, #0, D_mill
;Compara millar
LJMP Principal
D_uni:
DEC R0
;Decrementa unidad
LJMP Principal
D_dece: MOV R0, #9
;Pone a 9 unidad
DEC R1
;Decrementa decena
LJMP Principal
D_cent: MOV R0, #9
;Pone a 9 unidad
MOV R1, #9
;Pone a 9 decena
DEC R2
;Decrementa centena
LJMP Principal
D_mill: MOV R0, #9
;Pone a 9 unidad
MOV R1, #9
;Pone a 9 decena
MOV R2, #9
;Pone a 9 centena
DEC R3
;Decrementa millar
LJMP Principal

En la rutina de Inicio el puerto P2 se pone a cero, debido a que inicialmente est a FFH (o
sea, todos sus terminales a 1 lgico); por tanto, debe ponerse a cero para que ninguno de los
leds del dgito est encendido. En la rutina, las entradas /INT0 y /INT1 se configuran activas
por flanco descendente y se habilitan las interrupciones de /INT0, de /INT1 y del Timer 2. El
Timer 2 se configura para que funcione como un temporizador de 16 bits con autorrecarga;
para ello se colocan los bits RCLK, TCLK y CP/RL2, del registro T2CON, a 0 lgico. El Timer
cuenta pulsos internos del reloj del microcontrolador, por lo que el bit C/T2 del registro
T2CON se pone a 0 lgico. En el Timer 2 es necesario inhibir las interrupciones procedentes
del terminal T2EX (figura 7.7); por tanto, el bit EXEN2 tambin se pone a 0 lgico. Por ltimo,
para que el temporizador funcione slo en sentido ascendente, el bit DCEN del registro
T2MOD se pone a 0 lgico.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

191

Para que la secuencia de refresco de los dgitos sea de 1kHz, el valor de recarga del Timer ha
de ser de FF05H, pues el perodo de la secuencia es de 1ms y, al haber cuatro dgitos, el tiempo
que debe permanecer encendido cada dgito es de 0.250 ms. FF05H es el resultado de restar
250 (o FAH) de 64k (o FFFFH).
El puerto P0 inicialmente tambin tiene todos sus terminales en estado 1 lgico, lo que no
supone ningn inconveniente, pues las puertas inversoras conectadas a los transistores Tr1, Tr2,
Tr3 y Tr4, aseguran que los transistores estn en corte y los dgitos permanezcan apagados.
La rutina de RSI del Timer 2 utiliza el registro R5 como contador en base 3, y determina el
dgito que se va a encender, segn sea el valor de R5. Si vale cero se enciende el dgito
correspondiente a las unidades, si vale 1 se enciende el dgito de las decenas, si vale 2 se
enciende el dgito de las centenas y si vale 3 se enciende el dgito de los millares. El valor de
R5 se actualiza con la instruccin INC, de forma que cada vez que la rutina de RSI se ejecuta,
el registro se incrementa en una unidad, excepto cuando vale 3, que se pone a cero. El
contenido de los registros R0, R1, R2 o R3 se carga en el acumulador y se fuerzan sus cuatro
bits altos a 1 lgico mediante una instruccin ORL, de manera que todos los dgitos estn
apagados y se encienda el dgito que corresponda con la instruccin CLR.
La rutina principal est formada por un bucle infinito en el cual se comprueba el estado de los
sensores cuenta y descuenta, y donde se pone, en el dgito conectado a P2, el carcter de la
tecla pulsada en el teclado matricial.

7.3 Temporizadores para la MCS-251


Los microcontroladores de la familia MCS-251 disponen de 3 temporizadores/contadores de 16 bits,
denominados Timer 0, Timer 1 y Timer 2. Estos perifricos pueden ser configurados de forma
individual para operar en diversos modos de trabajo, bien como temporizadores o bien como
contadores.
Cuando operan como temporizadores, cada Timer se incrementa una vez cada cierto intervalo de
tiempo; cuando funcionan como contadores se incrementan cada vez que ocurre una transicin
negativa en un pin concreto del microcontrolador.
Por otra parte, el microcontrolador incorpora un temporizador watchdog que permite generar un reset
por software, si se produce alguna anomala en la ejecucin del programa.
Cada Timer est compuesto por dos registros de 8 bits ubicados en el rea de registros de funcin
especfica, SFR. En concreto, el Timer 0 est formado por los registros TH0 y TL0, el Timer 1 por los
registros TH1 y TL1 y el Timer 2 por los registros TH2 y TL2 (tabla 7.1).
Tambin se dispone de cuatro registros ubicados en el rea SFR que permiten controlar y programar
adecuadamente las prestaciones de funcionamiento de los Timers. Los registros de programacin
asociados al Timer 0 y al Timer 1 son: TMOD, registro de control de modo del temporizador/contador,
y TCON, registro de control del temporizador/contador.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

192

Los registros de programacin para el Timer 2 son: T2MOD, registro de control de modo del Timer 2,
y T2CON, registro de control del Timer 2.
Tabla 7.5 Registros asociados a los Timers 0, 1 y 2 y al timer watchdog de la familia MCS-251

Mnemnico

Descripcin

Direccin

TL0
TH0
TL1
TH1
TL2
TH2
TCON
TMOD
T2CON
T2MOD
RCAP2L
RCAP2H
WDTRST

Registros del Timer 0

S:08AH
S:08CH
S:08BH
S:08DH
S:0CCH
S:0CDH
S:088H
S:089H
S:0C8H
S:0C9H
S:0CAH
S:0CBH
S:0A6H

Registros del Timer 1


Registros del Timer 2
Registro de control de los Timers 0 y 1
Registro de control de modo de los Timers 0 y 1
Registro de control del Timer 2
Registro de control de modo del Timer 2
Registros de recarga y captura del Timer 2
Registro de Timer watchdog

7.4 Funcionamiento de los Timers


En la figura 7.11 est representado el esquema funcional bsico de los Timers 0, 1 y 2. La parte central
del Timer est constituida por dos registros de 8 bits: THx y TLx (x = 0, 1 y 2), conectados en cascada
para formar un temporizador de 16 bits.
XTAL1

12
Desbordamiento
0

THx
(8 bits)

TLx
(8 bits)

Peticin de
interrupcin

TFx

Tx
x = 0, 1 2

C/Tx
TRx

Fig. 7.11 Estructura bsica de los Timers 0, 1 y 2

Los Timers pueden ser programados para que trabajen como temporizador o como contador, mediante
el bit C/Tx, con x = 0, 1 2, dependiendo del Timer de que se trate. En la tabla 7.6 se indica la
ubicacin de cada uno de estos bits.
Tabla 7.6 Ubicacin de los bits C/Tx

Bit

Ubicacin

C/T0
C/T1
C/T2

TMOD.2
TMOD.6
T2CON.1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

193

7.4.1 Funcionamiento como temporizador


Cuando se pone el bit C/Tx a cero, el Timer correspondiente trabaja como temporizador. En este caso,
el Timer se incrementa en una unidad cada doce perodos de seal de reloj o, lo que es lo mismo, cada
6 estados. Las nicas excepciones a este comportamiento estn en dos modos de funcionamiento del
Timer 2, Baud Rate y Clock-out, donde el incremento es cada dos perodos de reloj. Este modo de
operacin se utiliza bsicamente para medir intervalos temporales de forma relativamente fcil.
Ejemplo 7.4 Diseo de una rutina de retardo con el Timer 0
Se desea disear una rutina de retardo de 1 ms de duracin utilizando el Timer 0, con una
frecuencia de reloj de 12MHz.
En este caso el Timer se incrementa en una unidad cada microsegundo, luego, para temporizar
1ms, el Timer 0 se deber incrementar 1.000 veces. De esta forma, controlando el nmero de
incrementos que sufre el Timer se obtiene la rutina de retardo deseada.
;****************************************************************************
;
RUTINA DE RETARDO
;****************************************************************************
ORG FF:0000H
;
...
CALL RETARDO
;
ORG FF:0100H
; La rutina de retardo empieza en la direccin FF:1000H
RETARDO: MOV R0,TH0
; Se carga el valor del Timer en el registro WR0
MOV R1,TL0
;
MOV WR2,#1000D ; Se carga en el registro WR2 el valor 1.000 decimal
CMP WR2,WR0
; Se compara el contenido del Timer 0 con 1.000
JG RETARDO
; Si el contenido del Timer 0 es menor o igual a 1.000
; continuamos en la rutina de retardo
RET
; En el momento que el contenido del Timer 0 sea mayor a 1.000 se termina la rutina de retardo

7.4.2 Funcionamiento como contador


Para que un Timer funcione como contador se debe programar su bit C/Tx a 1 lgico. En este caso, el
Timer se incrementa en una unidad cada vez que se aplica un flanco de bajada en un pin determinado.
En la tabla 7.7 se especifica el pin asociado a cada Timer.
Tabla 7.7 Entradas externas de cuenta de los Timers 0, 1 y 2

Pin

Tipo

T0
T1
T2

I
I
I/O

Descripcin
Entrada externa de reloj del Timer 0.
Entrada externa de reloj del Timer 1.
Entrada/salida externa de reloj del Timer 2.

Ubicacin
P3.4
P3.5
P1.0
1

La CPU comprueba el estado de las entradas externas de los Timers en cada ciclo de perifrico , en
concreto en el segundo perodo del estado 5. Cuando la CPU detecta un 1 lgico en un ciclo y un cero
lgico en el siguiente ciclo, el Timer correspondiente se incrementa en una unidad (figura 7.12). El
1

Un ciclo de perifrico equivale a 12 perodos de reloj agrupados en 6 estados, cada uno de ellos compuesto por dos
perodos.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

194

valor del Timer se actualiza en el primer perodo del estado 3 del ciclo de perifrico que viene despus
de detectar el flanco de bajada.
Ciclo de perifrico

Ciclo de perifrico

S5P5

S5P5

1
T2, T1, T0
0

Fig. 7.12 Proceso de incremento de un Timer programado como contador

Teniendo en cuenta que un ciclo de perifrico tiene una duracin de 12 perodos de reloj, se necesitan,
como mnimo, 24 perodos de reloj para reconocer un flanco de bajada, por lo que la mxima
velocidad de cuenta es de fclock/24.

7.5 Timer 0 y Timer 1


Para controlar el funcionamiento de los Timers 0 y 1 se utilizan los registros TMOD y TCON (tablas
7.8 y 7.9). Los cuatro bits de menor peso del registro TMOD estn asociados al Timer 0 y los cuatro
bits de mayor peso controlan el funcionamiento del Timer 1. Por otra parte, los bits 4 y 5 del registro
TCON estn relacionados con el Timer 0, y los bits 6 y 7 con el Timer 1. Estos bits permiten
programar el modo de funcionamiento de los Timers, controlar su puesta en marcha, programar su
modo de operacin, como contador o como temporizador, y detectar su desbordamiento.
7.5.1 Habilitacin de los Timers 0 y 1
Para habilitar el funcionamiento de los Timers 0 o 1, se debe poner a 1 lgico el bit TR0 o el bit TR1,
respectivamente (tabla 7.9). Para que el Timers 0 o el Timer 1 funcionen se debe cumplir, adems, una
segunda condicin. En el caso del Timer 0 se debe cumplir que el bit GATE0 (tabla 7.8) est a 0
lgico, o bien, que la entrada de interrupcin externa cero /INT0, que est ubicada en el pin P3.2, est
a 1 lgico. Por otra parte, el Timer 1 funciona cuando el bit GATE1 (tabla 7.8) est a 0 lgico, o se ha
puesto a 1 lgico el pin correspondiente a la entrada de interrupcin externa uno /INT1, que est
ubicada en el pin P3.3. Esta segunda condicin permite controlar el funcionamiento del Timer
mediante dos estrategias diferentes:
) Control por software: programando el valor lgico del bit GATEx (con x = 0 1).
) Control por hardware: aplicando un nivel de tensin adecuando al pin /INTx (con x = 0 1).

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

195

Tabla 7.8 Registro de control de modo, TMOD, de los Timers 0 y 1

TMOD
b7
GATE1

Direccin: S:089H
b6
b5
C/T1
M11

Nmero
de bit

Nombre
del bit

GATE1

6
5, 4

2
1, 0

b4
M01

Valor de reset: 0000 0000b


b3
b2
b1
GATE0
C/T0
M10

b0
M00

Funcin

Bit GATE del Timer 1. Con GATE1 = 0, el Timer 1 se pone en marcha si TR1=1. Si
GATE1 = 1 y TR1 = 1, el Timer 1 se pone en marcha colocando un 1 lgico en el pin
/INT1 (P3.3).
C/T1
Seleccin de temporizador/contador del Timer 1. C/T1 = 0: el Timer 1 funciona como
temporizador. C/T1 = 1: el Timer 1 funciona como contador.
M11, M01 Selector de modo del Timer 0.
M11 M01
0
0
Modo 0: El Timer 0 funciona como un Timer de 13 bits.
0
1
Modo 1: El Timer 0 funciona como un Timer de 16 bits.
1
0
Modo 2: El Timer 0 funciona como un Timer de 8 bits (TL0) y se
recarga con el valor que hay en TH0 cuando sufre desbordamiento.
1
1
Modo 3: El Timer se para.
GATE0
Bit GATE del Timer 0
Cuando GATE0 = 0, el Timer 1 se pone en marcha con TR0=1. Si GATE0 = 1 y TR0
= 1, el Timer 0 se pone en marcha colocando un 1 lgico en el pin /INT0 (P3.2).
C/T0
Seleccin de temporizador/contador del Timer 0. C/T0 = 0: el Timer 0 funciona como
temporizador. C/T0 = 0: el Timer 0 funciona como contador.
M10, M00 Selector de modo del Timer 0.
M10 M00
0
0
Modo 0: El Timer 0 funciona como un Timer de 13 bits.
0
1
Modo 1: El Timer 0 funciona como un Timer de 16 bits.
1
0
Modo 2: El Timer 0 funciona como un Timer de 8 bits (TL0) y se
recarga con el valor que hay en TH0 cuando sufre desbordamiento.
1
1
Modo 3: El Timer 0 funciona como dos Timers de 8 bits: TL0 y TH0.

Tabla 7.9 Registro de control, TCON, de los Timers 0 y 1

TCON
b7
TF1

Direccin: S:088H
b6
b5
TR1
TF0

Nmero Nombre
de bit
del bit
7

TF1

TR1

TF0

TR0

b4
TR0

Valor de reset: 0000 0000b


b3
b2
b1
IE1
IT1
IE0

b0
IT0

Funcin
Flag de desbordamiento del Timer 1.
Se pone a 1 cuando el Timer 1 sufre desbordamiento, o sea cuando pasa de la
combinacin todo unos a la combinacin todo ceros.
Flag de puesta en marcha del Timer 1. Cuando est a 1 lgico el Timer 1 est habilitado
para funcionar, en caso contrario esta parado.
Flag de desbordamiento del Timer 0. Se pone a 1 cuando el Timer 0 sufre
desbordamiento, o sea cuando pasa de la combinacin todo unos a la combinacin todo
ceros.
Flag de puesta en marcha del Timer 0. Cuando est a 1 lgico el Timer 0 est habilitado
para funcionar; en caso contrario esta parado.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

196

Dependiendo de las caractersticas de la aplicacin que se quiera desarrollar, se debe realizar un


control del Timer por software, o bien por hardware.
Ejemplo 7.5 Control por hardware del Timer 0
En este ejemplo se trata de realizar con el microcontrolador 8XC251Sx una de las pruebas del
control de calidad de una produccin de bateras de plomo-cido para coches. Esta prueba
consiste en someter a la batera a una descarga de alta intensidad, al mismo tiempo que se mide
el tiempo durante el cual la batera es capaz de suministrar ms de 400A manteniendo una
tensin superior a 12 voltios. Si este tiempo est entre los 20ms y los 30ms, la batera se
considera en buen estado; en caso contrario, se considera defectuosa.
Este tiempo se puede medir utilizando uno de los Timers del microcontrolador, por ejemplo el
Timer 0. Para realizar esta medida se monta el dispositivo mostrado en la figura 7.13 que
incorpora un sensor de corriente, un sensor de tensin y una puerta AND cuya salida se ha
conectado al pin P3.2, /INT0, para poder controlar mediante hardware el Timer 0. El sensor de
corriente se activa cuando la corriente es mayor o igual a 400A. Por otra parte, el sensor de
tensin se activa para una tensin mayor o igual a 12V. El nivel activo de ambos sensores es 1
lgico, de forma que, cuando los dos estn activos, la salida de la puerta AND es 1 lgico.
La prueba del control de calidad exige medir el tiempo en que ambos detectores estn activos
en una situacin de descarga brusca. Esta aplicacin requiere un control por hardware del
Timer 0, de forma que se incremente durante todo el tiempo que los dos sensores permanezcan
simultneamente activos, o sea, durante todo el tiempo que la entrada P3.2 est a 1 lgico.

Detector de
tensin
Detector de
corriente

8XC251

P3.2

P3.2, INT0

+
12V

Fig. 7.13 Dispositivo de control de calidad de la batera

Cuando alguno de los dos sensores pase a cero lgico, la salida de la puerta AND pasar a cero
y el Timer 0 detendr su funcionamiento. A partir del nmero de incrementos que ha sufrido el
Timer 0 durante el tiempo que ha estado funcionando, se puede determinar si la batera es
vlida, o si, por el contrario, est defectuosa.
En concreto, el intervalo temporal que se desea medir est comprendido entre 20ms y 30ms. Si,
por ejemplo, la frecuencia de la seal de reloj es de 12MHz, el temporizador se incrementa una
vez cada 1s. Por tanto, 20ms se corresponden con 20.000 incrementos y 30ms se
corresponden con 30.000 incrementos. La batera pasar de forma positiva el control de calidad
siempre que el nmero de incrementos que haya sufrido el Timer 0, durante el tiempo en que
los dos sensores estn activos, est comprendido entre 20.000 y 30.000.
En la figura 7.14 est representado el diagrama de flujo del programa que controla el

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

197

funcionamiento de esta aplicacin. Bsicamente, el programa comienza con instrucciones que


inicializan a cero los registros del Timer 0, TH0 y TL0. A continuacin se programan
adecuadamente los registros TMOD y TCON para que el Timer 0 trabaje en modo 1, como
temporizador, y controlado por hardware (figura 7.15).
El programa contina con un par de instrucciones de salto condicional que tienen como
objetivo detectar el intervalo de activacin simultnea de los dos sensores. Una vez que ha
finalizado la prueba, se compara el contenido de los registros del Timer 0, TH0 y TL0, con los
valores 20.000 y 30.000, para determinar si el estado de la batera es correcto.
INICIO

TMOD
TIMER 0
TEMPORIZADOR
CONTROL HARDWARE

P3.2=0?

GATE1 C/T1
0

M11

M10 GATE0 C/T0


0

M10

M00

Habilitacin del funcionamiento del


Timer 0 por hardware

SI

Timer 0 programado como temporizador


NO
Timer 0 programado en modo 1
P3.2=1?

SI

TCON

NO
SI
TIMER 0<20.000?

TF1

TR1

TF0

IE1

IT1

IE0

IT0

Habilitacin del funcionamiento del Timer 0

NO
SI
TIMER 0>30.000?

TR0

BATERA
DEFECTUOSA

Puesta a cero del flag de interrupcin del Timer 0

Fig. 7.15 Programacin y habilitacin del Timer 0

NO
BATERA
CORRECTA

Fig. 7.14 Diagrama de flujo de la aplicacin


;*******************************************************************************
;
PROGRAMA DE CONTROL CALIDAD DE BATERAS
;*******************************************************************************
ORG FF:0000H
; El programa comienza en la direccin FF:0000H
MOV TH0,#00H
; Se inicializa los registros del Timer 0 a cero .
MOV TL0,#00H
;
MOV TMOD,#0AH
; Se programa el Timer 0 en modo 1 como temporizador y
MOV TCON,#10H
; controlado por hardware.
SALT1: JNB P3.2, SALT1
; Se espera la activacin de la salida de la puerta AND.
SALT2: JB P3.2, SALT2
; Se espera durante el tiempo que est activa la salida de la puerta AND.
MOV R0,TH0
;
MOV R1,TL0
;
CMP WR0,#20000D
; Se compara el contenido del Timer 0 con 20.000.
JC DEFEC
; Salta si es menor que 20.000.
CMP WR0,#30000D
; Salta si el contenido del Timer es mayor que 30.000.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

198
JLE CORRECTA
DEFEC: SETB P0.0
CORRECTA: NOP

; Salta si es menor o igual que 30.000.


; Si la batera est defectuosa se pone a 1 el pin P0.0.

Por otra parte, un ejemplo clsico de control del Timer mediante programa es la realizacin de rutinas
de retardo como la explicada en el apartado 7.4.1.
7.5.2 Desbordamiento de los Timers 0 y 1
Los Timers 0 y 1 se incrementan desde el valor inicial que se ha cargado en sus registros, THx y TLx,
hasta que se produce un desbordamiento de los mismos. El desbordamiento tiene lugar cuando el
contenido de los registros THx y TLx llega al valor mximo posible, combinacin todo unos, y se
incrementa una vez ms. El desbordamiento de un Timer se detecta fcilmente mediante los flags de
desbordamiento del registro TCON, TF0 para el Timer 0 y TF1 para el Timer 1 (tabla 7.9).
Detectar el desbordamiento de los Timers es muy importante para que la aplicacin funcione
correctamente.
Ejemplo 7.6 Temporizacin de 0.1s mediante el Timer 1
En este ejemplo se debe temporizar 0.1s utilizando el Timer 1 de un microcontrolador
8XC251Sx que funciona con un reloj de 12MHz. Con esta frecuencia de reloj el Timer 1 se
incrementa en una unidad cada microsegundo. Por tanto, para temporizar 0.1s el Timer 1 debe
incrementarse 100.000 veces. Si el Timer se programa en modo 1 y se ha cargado con el valor
inicial cero, sufre desbordamiento cuando se incrementa 216 = 65.536 veces. Una vez sufrido
desbordamiento, el Timer 1 se debe incrementar 34.464 veces ms para llegar a contabilizar los
100.000 incrementos necesarios.
En la figura 7.16 est representado el diagrama de flujo del programa que controla esta
temporizacin. El programa comienza con instrucciones que inicializan a cero los registros del
Timer 1, TH1 y TL1. A continuacin se programa adecuadamente el registro TMOD para que
el Timer 1 trabaje en modo 1, como temporizador y controlado por software (figura 7.17).
Tambin se programa el registro TCON para poner a cero el flag de desbordamiento del Timer
1, TF1, y para habilitar su funcionamiento.
Una vez puesto en marcha el Timer, se debe detectar el momento en el que ste sufre
desbordamiento. Esto se consigue fcilmente mediante una instruccin de salto condicional: la
condicin de salto debe ser el valor del flag de desbordamiento TF1. Mientras este flag est a
cero el programa ejecuta el salto de forma continuada. Cuando el Timer 1 rebasa, el flag se
pone a 1, la condicin de salto ya no se cumple y por lo tanto no se efecta dicho salto.
Llegados a este punto el Timer 1 deber incrementarse 34.464 veces ms para contabilizar los
100.000 incrementos correspondientes a un intervalo de 0.1s.
Las siguientes instrucciones del programa colocan a cero el flag de desbordamiento, detienen el
funcionamiento del Timer 1 e inicializan su contenido con el valor adecuado para que al
incrementarse 34.464 veces llegue a desbordamiento. Este valor es 216 34.464 =31.072d =
7960H.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

199

TMOD

INICIO

GATE1 C/T1

M11

M10 GATE0 C/T0

M10

M00

TIMER 1
TEMPORIZADOR
CONTROL SOFTWARE

Timer 1 programado en modo 1

TF1=0?

Timer 1 programado como temporizador

SI

Habilitacin del funcionamiento del


Timer 1 por software

NO
INICIALIZAR EL
TIMER 1 CON 31.072d

TCON
TF1=0?

TF1

SI

TR1

TF0

TR0

IE1

IT1

IE0

IT0

NO

Habilitacin del funcionamiento del Timer 1


DETENER
EL TIMER 1

Puesta a cero del flag de interrupcin del Timer 1

Fig. 7.16 Diagrama de flujo de la aplicacin

Fig. 7.17 Programacin y configuracin del Timer 1

;******************************************************************************
;
PROGRAMA DE TEMPORIZACIN DE 0.1s
;******************************************************************************
ORG FF:0000H
; El programa comienza en la direccin FF:0000H
MOV TH1,#00H
; Se inicializa los registros del Timer 1 a cero.
MOV TL1,#00H
;
MOV TMOD,#10H
; Se programa el Timer 1 en modo 1 como temporizador y
MOV TCON,#40H
; controlado por hardware.
SALT1: JNB TF1, SALT1
; Se espera la activacin del flag de desbordamiento TF1.
CLR TF1
; Se pone a cero el flag TF1.
MOV TH0,#79H
; Se inicializan los registros del Timer 1 con el valor
MOV TL0,#60H
; adecuado para que rebase al incrementarse 34.464 veces.
SALT1: JNB TF1, SALT1 ; Se espera la activacin del flag de desbordamiento TF1.
NOP
; Ha finalizado la temporizacin de 0.1s.

7.5.3 Modos de funcionamiento de los Timers 0 y 1


Los Timers 0 y 1 pueden funcionar en cuatro modos de trabajo distintos, que se seleccionan
programando adecuadamente los bits M00 y M10 para el Timer 0, y los bits M01 y M11 para el Timer
1 del registro TCON (tabla 7.8).
a) Modo 0: Temporizador/contador de 13 bits
En este modo de trabajo los Timers 0 y 1 funcionan como un contador de 13 bits, implementado
mediante los 8 bits del registro THx y los 5 bits de menor peso del registro TLx. En este modo de
trabajo se ignoran los tres bits de mayor peso del registro TLx.
En la figura 7.18 se presenta el esquema de funcionamiento de los Timers 0 y 1 para los modos de
funcionamiento 0 y 1.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

200
XTAL1

12
Desbordamiento
0
1

THx
(8 bits)

TLx
(8 bits)

Peticin de
interrupcin

TFx

Tx
C/Tx
TRx

Modo 0: Temporizador/contador de 13 bits


Modo 1: Temporizador/contador de 16 bits
x=01

GATEx
INTx

Fig. 7.18 Modos 0 y 1 para los Timers 0 y 1

Ejemplo 7.7 Generacin de una seal cuadrada


En este ejemplo se trata de generar una seal cuadrada utilizando el Timer 0 programado en
modo cero, con una frecuencia de la seal de reloj de 12MHz. La funcin del Timer, en esta
aplicacin, ser la de controlar la duracin del perodo de la onda cuadrada. La idea es
inicializar el Timer con el valor cero, ponerlo en funcionamiento y, cada vez que rebase,
complementar el valor lgico del pin P0.0, de forma que, con los sucesivos desbordamientos
del Timer 0, se genere la onda cuadrada en el pin P0.0 (figura 7.19).
8XC251

P0.0

Fig. 7.19 Esquema del generador de onda cuadrada

Si la frecuencia de reloj es de 12MHz, el Timer 0 se incrementa una vez cada microsegundo,


por lo que tarda en rebasar 213s, o sea, 8.192ms. Esto significa que cada semiperiodo de la
onda cuadrada tiene una duracin aproximada de 8.2ms.
En la figura 7.20 est representado el diagrama de flujo del programa que controla la
generacin de la onda cuadrada. El programa comienza con instrucciones que inicializan a cero
los registros del Timer 0, TH0 y TL0. Seguidamente se programa adecuadamente el registro
TMOD para que el Timer 0 trabaje en modo 0, como temporizador y controlado por software.
Tambin se programa el registro TCON para poner a cero el flag de desbordamiento del Timer
0, TF0, y para habilitar el funcionamiento del Timer 0.
Una vez puesto en marcha el Timer, se debe detectar el momento en el que sufre
desbordamiento. Esto se consigue fcilmente mediante una instruccin de salto condicional,
donde la condicin de salto es el valor del flag de desbordamiento TF0. Mientras este flag est
a cero, el programa ejecuta el salto de forma continuada. Cuando el Timer 0 rebasa, el flag se
pone a 1, la condicin de salto ya no se cumple y, por tanto, el programa contina su ejecucin
por la siguiente instruccin.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

201
INICIO

TIMER 0
TEMPORIZADOR
CONTROL SOFTWARE

TF0=0?

SI

NO
COMPLEMENTAR
P0.0

PONER A CERO TF0

Fig. 7.20 Diagrama de flujo de la aplicacin

A continuacin se debe complementar el pin P0.0, poner a cero el flag de desbordamiento y


saltar de nuevo al inicio para repetir la secuencia de forma indefinida.
;******************************************************************************
;
PROGRAMA DE TEMPORIZACIN DE GENERACIN DE ONDA CUADRADA
;******************************************************************************
ORG FF:0000H
; El programa comienza en la direccin FF:0000H
MOV TH0,#00H
; Se inicializa los registros del Timer 0 a cero .
MOV TL0,#00H
;
MOV TMOD,#00H
; Se programa el Timer 0 en modo 0 como temporizador y
MOV TCON,#10H
; controlado por software.
SALT1: JNB TF0, SALT1 ; Se espera la activacin del flag de desbordamiento TF0.
CPL P0.0
; Se complementa el pin P0.0
CLR TF0
; Se pone a cero el flag TF0.
JMP SALT1
; Se salta al inicio para repetir la secuencia.

b) Modo 1: Temporizador/contador de 16 bits


Cuando los Timers 0 o 1 estn programados en modo 1, actan como un Timer de 16 bits
implementado por los registros THx y TLx.
Ejemplo 7.8 Generador de onda cuadrada con el Timer 1 controlado por interrupciones
En el ejemplo 7.7 se utiliza el Timer 0 controlado mediante la tcnica de testeo para temporizar
el perodo de la onda generada. En este ejemplo se va a desarrollar la misma aplicacin pero
con el Timer 1 controlado mediante interrupciones, para poder comparar qu diferencias, a
nivel de diseo del programa, supone el control de perifricos por interrupciones con respecto
al control por testeo. El programa deber constar de dos partes:
) Un programa principal que incluya las instrucciones necesarias para habilitar las fuentes
de interrupcin utilizadas en la aplicacin, as como las instrucciones de programacin
e inicializacin de los perifricos.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

202

) Una rutina de servicio a la interrupcin del Timer 1 que deber incluir las instrucciones
necesarias para atender a este Timer 1 cuando interrumpa.
El programa principal deber incluir una instruccin que habilite la fuente de interrupcin del
Timer 1, poniendo a 1 lgico los bits adecuados del registro IE0 (figura 7.21). Asimismo, se
incluirnyen instrucciones para programar el Timer 1 como temporizador en modo 1, para
inicializar los registros TH1 y TL1 a cero, y para habilitar su funcionamiento (figura 7.22).
IE0
EA
1

EC
0

ET2
0

Habilita las interrupciones


que estn a 1

ES
0

ET1 EX1 ET0 EX0


1
0
0
0

Habilita la interrupcin del Timer 1

Fig. 7.21 Habilitacin de la interrupcin del Timer 1


TMOD
GATE1

C/T1

M11

M10 GATE0

C/T0

M10

M00

TCON
TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

Timer 1 programado en modo 1

Timer 1 programado como temporizador


Habilitacin del funcionamiento del
Timer 1 por programa

Habilitacin del funcionamiento del Timer 1


Puesta a cero del flag de interrupcin del Timer 1

Fig. 7.22 Programacin y habilitacin del Timer 1

A continuacin se presenta el flujograma (figura 7.23) y el listado del programa principal.


PROGRAMA
PRINCIPAL

;************************************************************************
;
PROGRAMA PRINCIPAL
;************************************************************************
ORG FF:0000H
; El programa principal se ubica a partir de
JMP PRINCIP
; la direccin FF:0100H.
ORG FF:0100H
PRINCIP: MOV IE0,#88H
; Habilitacin de la fuente de interrupcin Timer 1.
MOV TMOD,#20H
; Configuracin del Timer 1 en modo 1 como
; temporizador.
MOV TH1,#00H
; Inicializacin del Timer 1 a cero lgico.
MOV TL1,#00H
MOV TCON,#40H
; Habilitacin del funcionamiento del Timer 1 y
; borrado del flag de interrupcin.

HABILITACIN
INTERRUPCIN
TIMER 1

PROGRAMACIN
Y PUESTA EN
MARCHA DEL
TIMER 1

Fig. 7.23 Flujograma del


programa principal

Una vez habilitado el Timer 1, ste se incrementa automticamente cada 12 perodos de reloj.
Cuando el Timer sufre rebasamiento, se activa el flag de interrupcin TF1 y el
microcontrolador salta a ejecutar la rutina de servicio de la interrupcin que est ubicada a
partir de la direccin FF:001BH. En la rutina se debe incluir una instruccin que complemente
el pin P0.0. Seguidamente se presenta el listado de la RSI del Timer 1.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

203

;*******************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1
;*******************************************************************************
ORG FF:001BH
CPL P0.0
; Se complementa el pin P0.0.
RETI
; Retorno de RSI.

Para mejorar el diseo del ejemplo 7.8 se puede aadir un pulsador externo que controle el
funcionamiento del generador, de forma que cuando se active el pulsador, el microcontrolador
detenga la generacin de la onda cuadrada, inhiba la interrupcin del Timer 1 y ponga a cero el
pin P0.0. Si se aprieta de nuevo el pulsador, el microcontrolador vuelve a generar la onda
cuadrada. Si el pulsador se conecta a la entrada de interrupcin /INT0, permite controlar su
activacin mediante el mecanismo de interrupcin (figura 7.24).
Tp

8XC251
+5V

P0.0

10 k
1k

INT0
4.[F

Fig. 7.24 Esquema elctrico de la conexin del pulsador al microcontrolador 8XC251

Para poder llevar a cabo esta mejora del diseo es necesario modificar algunas instrucciones
del programa principal y disear una rutina de atencin a la interrupcin /INT0.
En concreto, se debe modificar el contenido del registro IE0 para habilitar la fuente de
interrupcin /INT0, y el registro TCON para programar la interrupcin /INT0 por flanco de
bajada (figura 7.25).
TCON

IE0
EA
1

EC
0

ET2
0

ES
0

ET1
1

EX1
0

ET0 EX0
0
1

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

Programacin de /INT0 por flanco de bajada


Habilita las interrupciones
que estn a 1

Habilita la interrupcin /INT0


Habilita la interrupcin del Timer 1

b7
b6
b5
b4
b3
b2
b1
b0

Habilitacin del funcionamiento del Timer 1


Puesta a cero del flag de interrupcin del Timer 1

IPH0

IPL0

---

---

Bits de prioridad de la interrupcin PCA

Bits de prioridad de la interrupcin Timer 2

Bits de prioridad de la interrupcin puerto serie

Bits de prioridad de la interrupcin Timer 1

Bits de prioridad de la interrupcin INT1

Bits de prioridad de la interrupcin Timer 0

Bits de prioridad de la interrupcin INT0

Fig. 7.25 Habilitacin de /INT0 y programacin de los niveles de prioridad

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

204

Por otra parte, se puede considerar que la fuente de interrupcin /INT0 es ms prioritaria que la
interrupcin Timer 1, puesto que su activacin habilita o inhibe la interrupcin del Timer 1. Por
este motivo, se programa la interrupcin /INT0 con un nivel de prioridad mayor que la
interrupcin Timer 1. Por ejemplo, se puede programar la interrupcin /INT0 con el nivel 1 y la
interrupcin Timer 1 con el nivel 0.
Teniendo en cuenta estas modificaciones, el listado del programa principal quedar de la
siguiente manera:
;*******************************************************************************
;
PROGRAMA PRINCIPAL
;*******************************************************************************
ORG FF:0000H
JMP PRINCIP
ORG FF:0100H
; El programa principal se ubica a partir de la direccin FF:0100H.
PRINCIP: MOV IE0,#89H
; Habilitacin de las fuentes de interrupcin Timer 1 y /INT0.
MOV TMOD,#20H ; Programacin del Timer 1 en modo 1 como temporizador.
MOV TH0,#00H
; Inicializacin del Timer 1 a cero lgico.
MOV TL0,#00H
MOV TCON,#41H ; Habilitacin del Timer 1 y borrado del flag de interrupcin
; Programacin de la interrupcin /INT0 activa por flanco de bajada.
MOV IPH0,#00H
; Se programa la interrupcin /INT0 con nivel 1 y la
MOV IPL0,#01H
; interrupcin Timer 1 con nivel 0.

Por otra parte, la RSI de la interrupcin /INT0 debe incluir instrucciones que controlen la
habilitacin de la interrupcin del Timer 1 y pongan a cero el pin P0.0 si es necesario. En la
figura 7.26 est representado el flujograma de la RSI de la interrupcin /INT0.
RSI /INT0

;********************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT0
;********************************************************
ORG FF:0003H
JNB ET1,HAB ; Si la int. del Timer 1 est inhibida se habilita.
CLR ET1
; Si la int. del Timer 1 est activa se inhibe.
CLR P0.0
; Se pone a cero el pin P0.0.
RETI
; Retorno de RSI.
HAB: SETB ET1
; Se habilita la interrupcin Timer 1.
RETI
; Retorno de RSI.

INTERRUPCIN
TIMER 1 ACTIVA?

NO

SE HABILITA INT.
TIMER 1

SI
SE INHIBE INT.
TIMER 1

SE PONE A CERO
P0.0

RETI

Fig. 7.26 Flujograma de la RSI de la


interrupcin /INT0

Ejemplo 7.9 Control del ndice de acidez (pH) del agua de un depsito
Se plantea a continuacin, como ejemplo ilustrativo de la utilizacin del sistema de
interrupciones del microcontrolador 8XC251Sx, un caso prctico de control de una planta de
tratamiento de aguas residuales. El objetivo de este ejemplo es mostrar el funcionamiento de las
interrupciones en lo que respecta a la habilitacin, los niveles de prioridad, el manejo de los
flags de interrupcin, etc.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

205

La planta que se debe controlar dispone de un sistema que neutraliza la acidez de las aguas
residuales provenientes de una planta de fabricacin de papel (figura 7.27). El sistema posee un
depsito donde se mezcla el agua residual con la cantidad adecuada del componente
neutralizador, cuya funcin es disminuir la acidez del agua, de forma que el agua de salida del
depsito posea un pH superior a 5.5.
El sistema de control incorpora dos sensores activos a nivel alto:
) Un detector de rebosamiento, S1, que se activa cuando el agua contenida en el depsito
supera la altura mxima permitida.
) Un detector de pH, M, que se activa cuando el pH del agua es inferior a 5.5.
El sistema de control dispone adems de dos actuadores, V1 y V2, activos a nivel alto, cuya
funcin es realizar la apertura de dos vlvulas. Cuando se activa el actuador V1 se abre la
vlvula que permite la entrada de las aguas residuales al depsito. Cuando se activa el actuador
V2 se abre la vlvula que permite el vertido de neutralizador en el depsito. Por ltimo, existen
dos indicadores luminosos, A1 y A2, activos a nivel alto, cuya funcin es la de monitorizar la
apertura de las vlvulas V1 y V2.

A1

Neutralizador

Entrada
de aguas
residuales

V1

Sistema
de control

A2

V2
S1
M
Medidor
pH
Descarga

Fig. 7.27 Esquema de la planta

En la figura 7.28 est representado el esquema elctrico en que se detalla la conexin del C
8XC251Sx con los diferentes sensores y actuadores que intervienen en esta aplicacin. Cabe
destacar que los sensores S1 y M estn conectados a las entradas de interrupcin /INT0 e
/INT1 a travs de sendas puertas inversoras, debido a que las interrupciones externas se
activan a nivel bajo, mientras que estos sensores son activos a nivel alto.
8XC251
P1.2
P1.3

A1
A2

S1

INT0

P1.0

V1

INT1

P1.1

V2

Fig. 7.28 Conexin sensores y actuadores con el C 8XC251Sx

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

206

La estrategia que debe llevar a cabo el sistema de control para gestionar el funcionamiento de
la planta de tratamiento de aguas residuales se puede resumir en dos puntos:
) La vlvula V1 debe permanecer abierta hasta que el sensor S1 se active, en cuyo caso se
cerrar durante treinta segundos. Si una vez pasado este tiempo el sensor S1 sigue
activo, se repetir la operacin de cierre de la vlvula V1. Mientras V1 est abierta, el
indicador A1 permanecer encendido; en caso contrario el indicador parpadear.
) La vlvula V2 debe estar cerrada hasta que se active el sensor M, en cuyo caso se abrir
durante cinco segundos. Una vez transcurrido ese tiempo, si el sensor M contina activo,
se repetir la operacin de apertura de la vlvula V2. El indicador A2 se activa cuando
la vlvula V2 est abierta y parpadea cuando est cerrada.
Los recursos utilizados para resolver esta aplicacin son cuatro:
) La interrupcin externa /INT0, que se encarga de detectar la activacin del sensor S1.
La interrupcin se activa por nivel para que pueda ser atendida por la CPU mientras el
sensor S1 se encuentre a uno lgico.
) La interrupcin externa /INT1, cuya funcin es detectar la activacin del medidor de
pH. Esta interrupcin tambin se programa por nivel por el mismo motivo que la /INT0.
) El Timer 0, que se encarga de temporizar el intervalo de 30s, tiempo que debe
permanecer abierta la vlvula V1 cuando se active S1.
) El Timer 1, que se encarga de temporizar los 5s de apertura de la vlvula V2.
) El programa est compuesto de una rutina principal y de cuatro rutinas de atencin a la
interrupcin, una para cada fuente de interrupcin utilizada en la aplicacin.
La funcin del programa principal ser bsicamente la de habilitar y programar los niveles de
prioridad de las diversas fuentes de interrupcin utilizadas, as como la de ejecutar la secuencia
de parpadeo de los indicadores luminosos A1 y A2.
Para habilitar las cuatro fuentes de interrupcin utilizadas, se ponen a uno lgico los bits
correspondientes del registro habilitador de interrupciones IE0: EX0, ET0, EX1 y ET1. Esto se
consigue cargando en el registro IE0 el valor 8FH (10001111b).
Por otra parte, se deben poner a uno lgico los bits IT0 e IT1 del registro TCON, con el
objetivo de que las interrupciones externas /INT0 e /INT1 se activen por nivel. Esto se
consigue almacenando en el registro TCON el valor 0AH (0000 1010b).
A continuacin se debe establecer la prioridad de las interrupciones. En principio se adjudica a
las interrupciones /INT0 y Timer 0 una prioridad mayor que a las interrupciones /INT1 y Timer
1, dado que la situacin de rebasamiento requiere una actuacin ms urgente que la superacin
del nivel de pH. Las fuentes /INT0 y Timer 0 se programan con nivel de prioridad tres,
mientras que las fuentes de interrupcin /INT1 y Timer 1 se programan con un nivel de
prioridad menor, por ejemplo con nivel cero. Por tanto, los registros de nivel de prioridad IPH0
e IPL0 quedan: IPH0 = 03H y IPL0 = 03H.
Por ltimo, se debe poner el bit INTR del byte de configuracin CONFIG1 a uno lgico. De
esta forma, cuando la CPU ejecute una interrupcin, se cargarn en la pila, automticamente,

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

207

los tres bytes del contador de programa, PC, y el registro de estado, PSW1.
En cuanto a la rutina de retardo, que se utiliza para temporizar el parpadeo de los indicadores
luminosos, estar compuesta de dos bucles anidados basados en decrementar los registros R0 y
R1. Modificando el valor de los registros R0 y R1 se puede variar el tiempo de ejecucin de la
rutina y, por tanto, la frecuencia de parpadeo. Para calcular el tiempo de retardo hay que
determinar el nmero de veces que se ejecuta cada instruccin, as como el tiempo que tarda en
ejecutarse cada una de ellas.
En la figura 7.29 se muestran los flujogramas correspondientes al programa principal y a la
rutina de retardo. En la figura 7.30 se muestran los flujogramas de las rutinas de atencin a las
interrupciones /INT0 y Timer 0. Las tareas que debe realizar la rutina de atencin a la
interrupcin /INT0 son:
) Cerrar la vlvula V1.
) Inicializar el Timer 0 para que temporice 30s.
) Inhibir la interrupcin /INT0 para impedir que se ejecute de forma repetida la RSI de la
/INT0 mientras el sensor S1 se encuentra activo y no ha finalizado la temporizacin de 30s.
Si consideramos que la frecuencia de reloj es de 1.2MHz, se puede determinar, mediante un
clculo sencillo, que el Timer 0 debe rebasar varias veces para temporizar 30s.
PRINCIPAL

RETARDO

INICIALIZAR:
IE0 = 8FH
TCON = 0AH
IPH0 = 03H
IPL0 = 03H

R0 = 10H

P1.2 = 1
P1.3 = 1

DECREMENTA R1

RETARDO

R1 = 0?

R1 = FFH

NO

SI

P1.2 = 0
P1.3 = 0

DECREMENTA R0

RETARDO

R0 = 0?

NO

SI

RET

Fig. 7.29 Flujograma del programa principal y de la rutina de retardo

En la RSI del Timer 0 se debe contar el nmero de rebasamientos que sufre este temporizador. Cuando
el Timer 0 rebase un nmero de veces equivalente a 30s se abrir la vlvula V1, se detendr el

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

208

funcionamiento del Timer 0 y se habilitar de nuevo la interrupcin /INT0, de forma que si el sensor
S1 contina activo se repetir de nuevo la secuencia de cierre de V1.
INT0

T0

CERRAR VLVULA V1

NO

T = 30s?
SI

INICIALIZAR T0

PARAR T0
ACTIVACIN T0
ABRIR VLVULA V2
INHIBIR INT0
BORRAR IE0
RETI
HABILITAR INT0

RETI

Fig. 7.30 Flujogramas de las rutinas de servicio a las interrupciones /INT0 y Timer 0

Las rutinas de atencin a las interrupciones /INT1 y Timer 1 tienen funciones similares a las
interrupciones /INT0 y Timer 0. En la figura 7.31 se presentan los flujogramas
correspondientes a ambas rutinas.
INT1

T1

ABRIR VLVULA V2

INICIALIZAR T1

T = 5s?

NO

SI
PARAR T1

ACTIVACIN T1
CERRAR VLVULA V2
INHIBIR INT1
BORRAR IE1
RETI
HABILITAR INT1

RETI

Fig. 7.31 Flujogramas de las rutinas de servicio a las interrupciones /INT1 y Timer 1.

A continuacin se presentan el listado del programa principal y de la rutina de retardo.


;****************************************************************************
;
VECTORIZACION INTERRUPCIONES
;****************************************************************************
ORG FF:0003H
; Vector de interrupcin de /INT0.
JMP RSI_INT0
ORG FF:000BH
; Vector de interrupcin del Timer 0.
JMP RSI_T0

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog


ORG FF:0013H
; Vector de interrupcin de /INT1.
JMP RSI_INT1
ORG FF:001BH
; Vector de interrupcin del Timer 1.
JMP RSI_T1
;******************************************************************************
;
PROGRAMA PRINCIPAL
;******************************************************************************
ORG FF:0000H
JMP PRINCIP
ORG FF:0100H
; Programacin del nivel de prioridad de las interrupciones externas 0 y 1
PRINCIP: MOV IE0,#8FH
; Habilitacin de las interrupciones
MOV TCON,#0AH
; Se programa /INT0 e /INT1 por nivel
MOV IPL0,#03H
; Programacin de los niveles de prioridad
MOV IPH0,#03H
SETB INTR
; Cuando la CPU vectorice una interrupcin cargar en la pila
; los 3 bytes del PC y el registro de estado PSW1.
;Secuencia de parpadeo de los indicadores luminosos A1 y A2
SALTO0: SETB P1.2
SETB P1.3
CALL RETARDO
CLR P1.2
CLR P1.3
CALL RETARDO
JMP SALTO0
;************************************************************************
;
RUTINA DE RETARDO
;*************************************************************************
ORG FF:0200H
RETARDO: MOV R0,#10H
; R0 = 10H.
SALT2:
MOV R1,#FFH
; R1 = FFH.
SALT1:
DJNZ R1,SALT1
; Decrementa R1 y si es distinto de 0 salta a SALT1.
DJNZ R0,SALT2
; Decrementa R2 y si es distinto de 0 salta a SALT2.
RET
;************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT0
;*************************************************************************
ORG FF:0300H
RSI_INT0: CLR P1.0
; Se cierra la vlvula V1.
SETB TMOD.0
; Se programa el Timer 0 en modo 1.
MOV TH0,#3CH
; Se inicializa el Timer 0 para temporizar 0.5 s.
MOV TL0,#AFH
;
MOV R3,#00H
; El registro R3 contar los rebasamientos del Timer 0.
SETB TR0
; Puesta en marcha del Timer 0.
CLR EX0
; Se inhibe la interrupcin /INT0.
RETI

Clculo del valor inicial del Timer 0


Para temporizar los treinta segundos se inicia el Timer 0 para que tarde 0.5s en rebasar, de
forma que se deben contabilizar 60 rebasamientos en la RSI del Timer 0 para abrir de nuevo la
vlvula V1. Para temporizar 0.5s, con una frecuencia de reloj de 1.2MHz, el Timer 0 debe
incrementarse 50.000 veces (C350H); luego se ha de cargar dicho Timer con la combinacin
resultante de restar a FFFFH el valor C350H:
FFFFH - C350H = 3CAFH

Los autores, 2001; Edicions UPC, 2001.

209

Microcontroladores MCS-51 y MCS-251

210

;*****************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION TIMER 0
;*****************************************************************************
ORG FF:0400H
RSI_T0: INC R3
; Se incrementa el contador de rebasamientos.
CMP R3,59d
; Se compara el nmero de rebasamientos con 59.
JNC SIGUE
; Si el nmero de rebasamientos es menor o igual que 59 contina temporizando.
CLR TR0
; En caso contrario se detiene el Timer 0 y
CLR P1.0
; se abre la vlvula V1.
SETB EX0
; Se habilita de nuevo la interrupcin /INT0.
CLR IE0
; Se borra el flag de la interrupcin /INT0.
SIGUE: RETI
; Retorno al programa principal.
;****************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION INT1
;*****************************************************************************
ORG FF:0500H
RSI_INT1: SETB P1.1
; Se abre la vlvula V2.
SETB TMOD.4
; Se programa el Timer 1 en modo 1.
MOV TH1,#3CH
; Se inicializa el Timer 1 para temporizar 0.5 s.
MOV TL1,#AFH
MOV R4,#00H
; El registro R4 contar los rebasamientos del Timer 1.
SETB TR1
; Puesta en marcha del Timer 1.
CLR EX1
; Se inhibe la interrupcin /INT1
RETI
;**************************************************************************
;
RUTINA DE SERVICIO A LA INTERRUPCION TIMER 1
;**************************************************************************
ORG FF:0600H
RSI_T1: INC R4
; Se incrementa el contador de rebasamientos
CMP R4,09d
; Se compara el nmero de rebasamientos con 9
JNC SIGUE1
; Si el nmero de rebasamientos es menor o igual que 9
; continua temporizando.
CLR TR1
; Se detiene el Timer 1
SETB P1.1
; Se abre la vlvula V2
SETB EX1
; Se habilita la interrupcin /INT1
CLR IE1
; Se borra el flag de la interrupcin /INT1
SIGUE1: RETI
; Retorno al programa principal

c) Modo 2: Temporizador/contador de 8 bits con autorrecarga


El modo 2 configura a los Timers 0 o 1 como temporizador/contador de 8 bits, implementado con el
registro TLx (con x = 0 1).
XTAL1

12
0
1

TLx
(8 bits)

Desbordamiento

Tx
C/Tx
Recarga
TRx
GATEx
INTx

THx
(8 bits)
x=01

Fig. 7.32 Modo 2 de autorrecarga de los Timers 0 y 1

Los autores, 2001; Edicions UPC, 2001.

Peticin de
interrupcin
TFx

7 Temporizadores/contadores internos y watchdog

211

En este modo de trabajo cuando el Timer sufre desbordamiento se activa el flag TFx y
automticamente se carga el contenido del registro THx en el registro TLx, de forma que el Timer
comienza a contar a partir del valor cargado en el registro THx. El proceso de recarga no modifica el
contenido del registro THx. En la figura 7.32 est representado el esquema del Timer 0 o de Timer 1
funcionando en modo 2.
Ejemplo 7.10 Contador mdulo 12 con el Timer 1
Este ejemplo consiste en la realizacin de un contador mdulo 12 con el Timer 1 programado
en modo 2. El contador cuenta desde el valor inicial 3 hasta el 15. En la figura 7.33 se muestra
el esquema general de un contador mdulo 12, que incluye las salidas de cuenta, una entrada de
reloj y una entrada de habilitacin del contador.
Contador de 4 bits
Seal de
habilitacin

Habilitador
del contador

Seal de reloj

Entrada
de cuenta

Salida de
cuenta: 3-15

Fig. 7.33 Esquema general de un contador mdulo 12

En la figura 7.34 se muestra cmo se puede realizar este contador utilizando el


microcontrolador 8XC251Sx. Basta con conectar la seal de reloj a la entrada de cuenta del
Timer 1 (pin P3.5), conectan la seal de habilitacin del contador a la entrada de control por
hardware del Timer 1 (pin P3.3); las salidas del contador pueden tomarse de los cuatro bits de
menor peso del puerto 0.
8XC251
+5V

INT1

P0.0
P0.1
P0.2

Entrada
de cuenta

Salida de
cuenta: 3-15

P0.3
T1

Fig. 7.34 Contador mdulo 12 con el microcontrolador 8XC251Sx

El programa comienza configurando el Timer 1 como contador en modo 2 y controlado por


hardware. Seguidamente se deben inicializar los registros TH1 y TL1 con el valor adecuado
para esta aplicacin. A continuacin se vuelca el contenido del registro TL0 sobre el puerto P0
de forma continuada, con el objetivo de visualizar sobre este puerto los incrementos que sufre
el contador a medida que va recibiendo los pulsos aplicados en la entrada de cuenta.
El valor elegido para inicializar los registros del Timer 1 es el F3H, de forma que al volcar este
contenido sobre el puerto P0, en los cuatro bits de menor peso aparece el valor 3H (valor inicial
de cuenta). A medida que el Timer 1 se incrementa se puede seguir el incremento a travs del
puerto P0. Cuando se llega al valor FH (15d) y se recibe un nuevo pulso se produce
desbordamiento y el registro TL1 se carga de nuevo con F3H (figura 7.35).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

212

Desbordamiento

F3H

F4H

F5H

FEH

FFH

P0:3=3H

P0:3=4H

P0:3=5H

P0:3=EH

P0:3=FH

TL0

P0

Fig. 7.35 Evolucin del contador mdulo 12

En la figura 7.36 est representado el diagrama de flujo del programa que controla el
funcionamiento del contador mdulo 12.
INICIO

TIMER 1
CONTADOR
CONTROL HARDWARE

TH1 = TL1 = F3H

CARGAR TL1 EN P0

Fig. 7.36 Diagrama de flujo del contador mdulo 12

Seguidamente se presenta el listado del programa.


;****************************************************************************************
;
PROGRAMA DE TEMPORIZACIN DE GENERACIN DE ONDA CUADRADA
;****************************************************************************************
ORG FF:0000H
; El programa comienza en la direccin FF:0000H
MOV TH1,#F3H
; Se inicializa los registros del Timer 0 a cero .
MOV TL1,#F3H
MOV TMOD,#E0H
; Timer 0 en modo 0 como temporizador y controlado por software.
SETB TR1
SALT1: MOV P0,TL1
; Se copia el contenido del registro TL0 en el puerto cero.
JMP SALT1

d) Modo 3: Timer 0: dos temporizadores/contadores de 8 bits; Timer 1: parado


Cuando el Timer 0 se programa en modo 3, los registros TL0 y TH0 operan como dos temporizadores
independientes de 8 bits (figura 7.37). Este modo se utiliza en aquellas aplicaciones que requieren un
temporizador o contador adicional.
En este modo de funcionamiento, el registro TL0 utiliza todos los bits de control del Timer 0 para su
funcionamiento normal: C/T0, GATE0, TR0 y TF0.
En cambio, las prestaciones de funcionamiento del registro TH0 se ven muy reducidas debido a que
los nicos flags que controlan su funcionamiento son el TR1 y el TF1. El flag TR1 permite habilitar el
funcionamiento del registro TH0 y el flag TF1 se activa cuando este registro sufre desbordamiento.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

213

Por otra parte, el registro TH0 slo puede operar como temporizador y no como contador (figura
7.37).
XTAL1

12

1/12 Fosc
Desbordamiento

0
1

TL0
(8 bits)

1/12 Fosc

TH0
(8 bits)

Peticin de
interrupcin

TF0

T0
C/T0
TR0
Desbordamiento

GATE0
INT0

Peticin de
interrupcin

TF1

TR1

Fig. 7.37 Modo 3 del Timer 0, dos Timers de 8 bits

Por este motivo, cuando el Timer 0 est programado en modo 3, el Timer 1 no puede utilizar los flags
TR1 y TF1 para su normal funcionamiento. Esto significa que cuando el Timer 1 desborde no se
activar el flag TF1; igualmente, no se puede utilizar el bit TR1 para habilitar el funcionamiento de
este Timer.
Por otra parte, cuando el Timer 1 se programa en modo 3 se detiene su funcionamiento. Este modo
puede utilizarse para detener el Timer 1 cuando el Timer 0 est programado en modo 3 y el bit TR1 no
est disponible.

7.6 Timer 2
El Timer 2 es un temporizador/contador de 16 bits implementado mediante dos registros de 8 bits
conectados en cascada: TH2 y TL2. Para controlar su funcionamiento se dispone de 2 registros:
T2MOD y T2CON (tablas 7.10 y 7.11).
Tabla 7.10 Registro de control de modo del Timer 2

T2MOD
b7
-Nmero
de bit

Direccin: S:0C9H
b6
b5
---

Nombre
del bit

7:2

--

T2OE

DCEN

b4
--

Valor de reset: XXXX XX00b


b3
b2
b1
--T2OE

b0
DCEN

Funcin
Reservado.
Estos bits estn reservados para futuras aplicaciones y no se pueden utilizar.
Bit de habilitacin del Timer 2.
Cuando el Timer 2 trabaja en modo Clock-out, este bit conecta la salida de reloj con el
pin T2.
Bit de cuenta atrs.
Este bit configura al Timer 2 como un contador ascendente o descendente.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

214
Tabla 7.11 Registro de control del Timer 2

T2CON
b7
TF2
Nmero
de bit

Direccin: S:0C8H
b6
b5
EXF2
RCLK

b4
TCLK

Valor de reset: 0000 0000b


b3
b2
b1
EXEN2
TR2
C/T2

Nombre
del bit

TF2

EXF2

RCLK

4
3

TCLK
EXEN2

TR2

C/T2

CP/RL2

b0
CP/RL2

Funcin
Flag de desbordamiento del Timer 2.
Este flag se pone a 1 cuando el Timer 2 sufre desbordamiento, o sea, cuando pasa de
la combinacin todo unos a la combinacin todo ceros. Este bit no se activa si
RCLK=1 o TCLK=1.
Flag externo del Timer 2.
Este flag se pone a 1 cuando se produce un flanco negativo en el pin T2EX con el flag
EXEN2=1.
Bit de reloj en recepcin.
Este flag se pone a 1 cuando el Timer 0 sufre desbordamiento, o sea cuando pasa de la
combinacin todo unos a la combinacin todo ceros.
Bit de reloj en transmisin.
Bit de habilitacin externa del Timer 2.
Cuando este bit est a 1 y se produce una transicin negativa en el pin T2EX, se
produce una recarga o captura, a menos que el Timer 2 se utilice como generador de
Baud Rate del puerto de comunicacin serie. Si el bit EXEN2 est a cero se ignoran
las transiciones en el pin T2EX.
Bit de puesta en marcha del Timer 2.
Cuando est a 1 lgico el Timer 2 est habilitado para funcionar; en caso contrario
esta parado.
Bit de seleccin de contador/temporizador:
C/T2 = 0: el Timer 2 funciona como temporizador.
C/T2 = 1: el Timer 2 funciona como contador.
Bit de captura/recarga.
Cuando este bit est a 1 se produce una captura al aplicar un flanco negativo en la
entrada T2EX con EXEN2=1. Cuando este bit est a cero se produce un recarga al
aplicar un flanco negativo en la entrada T2EX con EXEN2=1. Si RCLK=1 o
TCLK=1, se ignora el bit CP/RL2 y se fuerza la recarga del Timer 2 cuando sufre
desbordamiento.

Los bits de los registros T2MOD y T2CON permiten programar el modo de funcionamiento de los
Timers, controlar su puesta en marcha, programar su modo de operacin (contador o temporizador) y
detectar el desbordamiento. En la tabla 7.12 se indican los cuatro modos de operacin en los que
puede funcionar el Timer 2.
Tabla 7.12 Modos de operacin del Timer 2

Modo
Modo autorrecarga
Modo captura
Modo Baud Rate
Clock-out programable

RCLK o TCLK

CP/RL2

T2OE

0
0
1
X

0
1
X
0

0
0
X
1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

215

7.6.1 Modo captura


En el modo captura, el Timer 2 funciona como un temporizador o contador de 16 bits (figura 7.38).
Cuando el Timer 2 sufre desbordamiento se activa el flag TF2, con lo que se genera una peticin de
interrupcin al microcontrolador.
Si el bit EXEN2 est a 1 lgico, un flanco de bajada en el pin T2EX captura el valor actual de los
registros del Timer 2, TH2 y TL2, en los registros RCAP2H y RCAP2L respectivamente. Al mismo
tiempo, el flanco de bajada en el pin T2EX produce la activacin del bit EXF2, lo cual genera una
peticin de interrupcin al microcontrolador.
XTAL1

Desbordamiento

12

TH2
(8 bits)

1
T2

TL2
(8 bits)

TF2

TR2
C/T2
Peticin de
interrupcin
RCAP2H RCAP2L
T2EX

EXF2

EXEN2

Fig. 7.38 Modo captura del Timer 2

7.6.2 Modo autorrecarga


El modo autorrecarga configura al Timer 2 como un temporizador o contador de 16 bits con recarga
automtica. En este modo de funcionamiento el Timer opera como un contador ascendente o
ascendente/descendente, segn sea el valor del bit DCEN (Down Counter Enable Bit). Cuando se
realiza un reset del microcontrolador, el bit DCEN se pone automticamente a cero, de forma que si se
programa el Timer 2 en modo autorrecarga, ste funcionar como contador ascendente.

a) Contador ascendente (DCEN=0)


Cuando DCEN=0, el Timer 2 opera como un contador ascendente (figura 7.39). El valor del bit
EXEN2 permite dos posibilidades de funcionamiento dentro de este modo. Si EXEN2=0, el Timer 2
cuenta hacia arriba hasta el valor FFFFH y activa el flag TF2 cuando sufre desbordamiento. Con el
desbordamiento se recarga, en los registros del Timer 2, TH2 y TL2, el valor contenido en los
registros de recarga/captura, RCAP2H y RCAP2L, respectivamente.
Si EXEN2=1, los registros del Timer se recargan por dos motivos distintos: cuando se produce
desbordamiento y cuando se aplica un flanco de bajada en el pin T2EX. El flanco de bajada en T2EX
tambin activa el bit EXF2, que realiza una peticin de interrupcin al microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

216
XTAL1

12

TH2
(8 bits)

1
T2

TL2
(8 bits)

Desbordamiento

TR2
C/T2
Recarga

RCAP2H RCAP2L

Peticin de
interrupcin

TF2
T2EX
EXF2
EXEN2

Fig. 7.39 Modo autorecarga del Timer 2 con DCEN = 0

b) Contador ascendente/descendente (DCEN=1)


Cuando DCEN=1, el Timer 2 opera como un contador ascendente/descendente (figura 7.40). La
direccin de cuenta se puede controlar mediante el valor lgico aplicado al pin T2EX. Cuando este pin
est a nivel alto, 1 lgico, el Timer 2 cuenta de forma ascendente. En este caso, cuando el Timer llega
a FFFFH y se incrementa otra vez, se produce desbordamiento y se activa el flag TF2, lo que genera
una peticin de interrupcin al microcontrolador. El desbordamiento tambin produce la recarga
automtica de los registros del Timer 2, TH2 y TL2, con el valor almacenado en los registros de
recarga/captura, RCAP2H y RCAP2L, respectivamente.
Valor de recarga para
cuenta hacia abajo
FFH

FFH
Complemento

XTAL1

12

EXF2

0
T2

TH2
(8 bits)

1
C/T2

TL2
(8 bits)

Peticin de
interrupcin

Desbordamiento

TF2

TR2
Direccin de cuenta
1 = ascendente
T2EX 0 = descendente
RCAP2H RCAP2L
Valor de recarga para
cuenta hacia arriba

Fig. 7.40 Timer 2: modo autorecarga con DCEN = 1

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

217

Cuando T2EX vale 0 lgico, el Timer 2 cuenta hacia abajo. El desbordamiento del Timer 2 ocurre, en
este caso, cuando el contenido de los registros TH2 y TL2 es igual al valor cargado en los registros
RCAP2H y RCAP2L, respectivamente. El desbordamiento provoca la activacin del flag TF2 y
recarga los registros del Timer con el valor FFFFH.
Por otra parte, cuando el Timer sufre desbordamiento, en la cuenta ascendente o descendente, el bit
EXF2 cambia de valor. En este modo de funcionamiento el bit EXF2 no genera ninguna peticin de
interrupcin al microcontrolador y puede utilizarse como bit 17 del Timer 2.

7.6.3 Modo de generador de baudios (Baud Rate Generator Mode)


En este modo el Timer 2 queda configurado como generador de baudios para fijar la velocidad de
transmisin del puerto de comunicacin serie. Para seleccionar este modo es necesario activar los bits
RCLK y/o TCLK de registro T2CON (tabla 7.12).

7.6.4 Modo Clock-out


En este modo de funcionamiento, el Timer 2 funciona como un reloj de frecuencia variable con un
ciclo de trabajo del 50% (figura 7.41) y se incrementa con una frecuencia FOSC/2 hasta que sufre
desbordamiento; entonces se recarga automticamente los registros TH2 y TL2 con el valor contenido
en los registros RCAP2H y RCAP2L, respectivamente. En el modo Clock-out, el desbordamiento del
Timer 2 no genera peticin de interrupcin.
XTAL1

TH2
(8 bits)

1
T2

Desbordamiento

TL2
(8 bits)

TR2
C/T2

RCAP2H RCAP2L
2
T2OE
Peticin de
interrupcin
T2EX

EXF2

EXEN2

Fig. 7.41 Timer 2: modo generacin de reloj

La frecuencia de la seal de reloj que se genera con este modo se puede programar adecuadamente
fijando el valor de los registros RCAP2H y RCAP2L:

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

218

Frecuencia reloj ]

FOSC
4 ( 65535 RCAP 2 H , RCAP2 L

(7.1)

Si el microcontrolador funciona con un reloj de 16MHz, se podr programar un rango de frecuencias


de 61Hz a 4MHz. La seal de reloj, generada en este modo, est disponible en el pin T2.
Para programar el Timer 2 en el modo Clock-out se debe poner a 1 lgico el bit T2OE del registro
T2MOD. Tambin se debe poner a cero lgico el bit C/T2, para que el Timer 2 funcione como
temporizador y para habilitar al mismo tiempo el pin T2 como salida de reloj. Los registros RCAP2H
y RCAP2L se inicializan adecuadamente, segn la expresin 7.1, para fijar la frecuencia de la seal
generada. Por otra parte, los registros TH2 y TL2 se cargan con el mismo valor, o con otro distinto,
dependiendo de la aplicacin. Finalmente, se activa el bit TR2 para poner en marcha el Timer 2.
Es posible utilizar el Timer 2 como generador de baudios y como generador de reloj de forma
simultnea.
Ejemplo 7.11 Control de llenado de un garaje
Esta aplicacin consiste en contar el nmero de coches que hay en un garaje mediante el
microcontrolador 8XC251Sx. La cuenta est controlada por el Timer 2, que debe trabajar como
contador bidireccional: incrementndose cada vez que entra un coche y decrementndose
cuando sale. Por tanto, se debe programar el Timer 2 en modo autorrecarga con DCEN=1. Para
detectar la presencia de vehculos y su direccin, entrada o salida, se dispone de tres sensores
de presencia, S1, S2 y S3, activos a nivel alto (figura 7.42).
G AR

S1

A JE

S3

S2

Sistema
de control

Fig. 7.42 Esquema de la entrada al garaje

Para realizar esta aplicacin se conecta el sensor S3 a la entrada de cuenta del Timer 2: T2.
Cada vez que un coche entra o sale del garaje, el sensor S3 genera un pulso en esta entrada, de
forma que el Timer se incrementa o decrementa, dependiendo del valor lgico aplicado en el
pin T2EX (figura 7.43).
Los sensores S1 y S2 controlan la direccin de cuenta a travs de la bscula RS conectada a la
entrada T2EX. Si el vehculo entra en el garaje se activa, en primer lugar, el sensor S2 y, por
tanto, se aplica un pulso a la entrada S de la bscula RS. Como resultado, la salida Q de la
bscula se pone a 1, T2EX=1, lo que permite al Timer 2 incrementarse cuando el vehculo
genera un pulso en la entrada T2. Igualmente, si el vehculo sale del garaje, se activa el sensor
S1 que pone a cero la bscula RS, y el Timer 2 se decrementa al activarse el sensor S3.

Los autores, 2001; Edicions UPC, 2001.

7 Temporizadores/contadores internos y watchdog

219

8XC251
S1

S2

T2EX

T2

S3

Q+

0
0
1
1

0
1
0
1

Q
1
0
X

Fig. 7.43 Conexin de los sensores al [C 8XC251Sx y tabla de funcionamiento de una bscula RS

En esta aplicacin, el Timer 2 debe trabajar como contador bidireccional; se deber programar,
por tanto, en modo autorrecarga con DCEN=1. Para ello se deben inicializar los siguientes bits:
RCLK = TCLK = 0, CP/RL2 = 0, T2OE = 0 y el bit DCEN = 1. Los bits RCLK, TCLK y
CP/RL2 estn ubicados en el registro T2CON, mientras que el bit T2OE y DCEN estn
ubicados en el registro T2MOD. Seguidamente se deben inicializar los registros del Timer 2 a
cero, y ponerlo en marcha.
;********************************************************************************
;
PROGRAMA DE CONTROL DEL GARAJE
;********************************************************************************
ORG FF:0000H
; El programa est almacenado a partir de la direccin de memoria FF:0000H
CLR RCLK
; Se pone a cero el bit RCLK del registro T2CON.
CLR TCLK
; Se pone a cero el bit TCLK del registro T2CON.
CLR CP/RL2
; Se pone a cero el bit CP/RL2 del registro T2CON.
CLR T2OE
; Se pone a cero el bit T2OE del registro T2MOD.
SETB C/T2
; Se programa el Timer 2 como contador.
SETB DCEN
; El Timer 2 trabaja como contador Up/Down
SETB TR2
; Se habilita el funcionamiento del Timer 2.
MOV TL2,#00H
; Se inicializa el contador a cero.
MOV TH2,#00H
;

7.7 Timer watchdog


Los microcontroladores de la serie 8XC251Sx contienen un Timer watchdog, WDT, que genera un
reset automtico del microcontrolador si pasa un cierto tiempo sin recargar el contenido de este Timer.
La utilidad del WDT es la de posibilitar el reset del microcontrolador en casos de funcionamiento
inadecuado del programa.

7.7.1 Descripcin de funcionamiento


El WDT es un Timer de 14 bits que se incrementa automticamente cada ciclo de perifrico, o sea,
cada 12 perodos de reloj, y su funcionamiento est controlado por el registro WDTRST, ubicado en la
direccin S:0A6H del rea de registros de funcin especfica.
El Timer WDT se gestiona bsicamente a travs de dos operaciones:
)
)

Un reset del microcontrolador borra e inhibe el funcionamiento del Timer WDT.


Escribiendo una secuencia especfica de dos bytes en el registro WDTRST se borra y habilita
el Timer WDT.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

220

Una vez habilitado para funcionar, el Timer WDT se incrementa cada 12 perodos de seal de reloj y,
si no se borra, sufre desbordamiento cuando llega a la combinacin 3FFFH+1; entonces genera,
adems, un reset al microcontrolador 8XC251Sx.
Si, por ejemplo, la frecuencia de reloj del microcontrolador es de 16MHz, el ciclo de perifrico es de
750ns y el Timer WDT desborda en 750ns x 16384 = 12,288ms.

7.7.2 Utilizacin del Timer WDT


Se puede utilizar el Timer WDT para que, en caso de funcionamiento errneo del programa, se realice
un reset del microcontrolador. La idea es que desde el programa de la aplicacin se borre
peridicamente el Timer WDT, antes de que desborde. Si el programa entra en secuencia de
funcionamiento errnea, el Timer WDT no se borrar y cuando sufra desbordamiento se efectuar el
reset el Timer WDT quedar automticamente inhibido.
Para borrar el Timer WDT se debe escribir en el registro WDTRST una secuencia de dos bytes: 1EH y
1EH. Esta operacin habilita y borra el Timer WDT, de forma que comienza de nuevo a incrementarse
a partir del valor inicial 0000H. A lo largo del programa se deber escribir la secuencia de dos bytes
para borrar y habilitar de nuevo el Timer WDT antes de que desborde.

7.7.3 Timer WDT durante el modo Idle


El Timer WDT contina su funcionamiento mientras el microcontrolador est en modo de operacin
Idle. Esto significa que el usuario debe controlar el funcionamiento de este Timer durante el modo
Idle. Por ejemplo, se puede utilizar el Timer 0 programado convenientemente para desbordar antes que
el Timer WDT. Cuando el Timer 0 desborda, genera una interrupcin al microcontrolador. En la rutina
de interrupcin del Timer 0 se pone a cero el Timer WDT, se inicializa el Timer 0 y se coloca de
nuevo el microcontrolador en modo Idle.

7.7.4 Timer WDT durante Power Down


Cuando el microcontrolador est en el modo Power Down se paran todos los relojes del
microcontrolador. Esto detiene automticamente el funcionamiento del Timer WDT y mantiene su
valor de cuenta. Cuando el microcontrolador sale de este modo de funcionamiento, mediante la
activacin de las entradas /INT0 o /INT1, el Timer WDT contina su cuenta por donde la dej. Para
asegurarse de que el Timer WDT no llega a desbordamiento en un tiempo corto despus de que el
microcontrolador sale del modo Power Down, se debe inicializar justo antes de entrar en dicho modo
de funcionamiento.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

221

8 Memoria externa
8.1 Introduccin
Muchas aplicaciones realizadas con microcontroladores de las familias MCS-51 y MCS-251 se pueden
resolver con versiones que disponen de memoria interna de programa, por lo que no es necesario, en
estas versiones, el uso de circuito integrados de memoria adicionales. Las versiones con memoria
interna EPROM son tiles para elaborar prototipos, pero ms an son viables las versiones con
memoria EPROM del tipo OTP, One-Time Programmable, y las versiones con memoria EEPROM
tipo flash de Atmel, ya que las primeras carecen de la ventana de cuarzo para borrar las memorias
EPROM, lo que simplifica su encapsulado y reduce considerablemente su coste, y las segundas
disponen de una tecnologa que permite un coste reducido.
De toda maneras, segn la aplicacin, puede ser necesario ampliar la capacidad de memoria de los
microcontroladores, o emplear versiones que carezcan de memoria interna; en estos casos resulta
imprescindible usar circuitos integrados de memoria externa para resolver la aplicacin. Entonces, es
importante conocer correctamente la forma de conectar los circuitos de memoria al microcontrolador y
saber determinar si las memorias son compatibles a nivel temporal con el microcontrolador.

8.2 Memorias semiconductoras


En un sistema basado en microprocesador o microcontrolador es necesario conocer los distintos tipos
de memoria que se pueden utilizar, as como la formar de realizar el acceso a stas. Las memorias que
ms se emplean son memorias no voltiles de slo lectura, ROM, destinadas a almacenar el cdigo de
programa generado en la aplicacin. Estas memorias mantienen la informacin almacenada en
ausencia de tensin de alimentacin. Las memorias voltiles de lectura/escritura, RAM, se emplean
para contener las variables temporales utilizadas en el mismo programa de la aplicacin.
Los tipos de memoria ROM ms usuales se clasifican en funcin de la forma de grabar los datos:
-ROM, Read Only Memory: esta memoria se graba mediante la configuracin interna del
circuito integrado durante el proceso de fabricacin. Luego, se debe proporcionar el programa
de la aplicacin al fabricante y resulta adecuada para largas series de fabricacin.
-PROM, ROM Programmable: la memoria PROM incorpora fusibles en la constitucin de cada
celda interna de memoria, por lo que puede programarse por el usuario. La forma de grabar un
dato en esta memoria suele consistir en aplicar una sobrecorriente al fusible de una celda de
forma que cause su destruccin; en consecuencia, tan slo puede grabarse una vez.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

222

-EPROM, Erasable Programmable ROM: esta memoria emplea un transistor MOS de puerta
flotante como elemento bsico de cada una de sus celdas. Puede grabarse elctricamente y
borrarse mediante su exposicin a una fuente de rayos ultravioleta, para lo cual dispone de un
encapsulado especial cermico con una ventana de cristal de cuarzo que encarece su coste. Esta
memoria es adecuada para realizar prototipos y para series cortas de fabricacin, aunque, en su
versin OTP, One Time Programmable, se reduce considerablemente su costo debido a que se
elimina la ventana de cuarzo del encapsulado, por lo que slo puede programarse una vez y no
se puede borrar.
-EEPROM o E2PROM, Electrically Erasable and Programmable ROM: esta memoria utiliza
el mismo transistor MOS de puerta flotante que la memoria EPROM, pero con una
modificacin tecnolgica que permite grabar y borrar el transistor MOS elctricamente
1

mediante efecto tnel . La memoria EEPROM no tiene ventana de cuarzo, por lo que tiene un
coste ms reducido que la memoria EPROM. El tiempo de lectura de esta memoria es parecido
al tiempo de lectura de las memorias RAM; no obstante, su tiempo de escritura, del orden de
milisegundos, es demasiado elevado, lo que fuerza a establecer estados de espera en el proceso
de escritura. Esta memoria es adecuada para aquellos sistemas que necesitan tener datos
almacenados de forma estable, pero que pueden modificarse con cierta frecuencia.
-FLASH: este tipo de memoria es de reciente aparicin y son memorias EEPROM que tienen
una configuracin interna estructurada, a nivel de circuito, en bloques de bits, lo que permite
reducir de manera considerable el rea de silicio respecto a su homloga EEPROM, lo que
reduce, por tanto, su coste e incrementa su capacidad. El tiempo de escritura y de lectura de
estas memorias es comparable con el requerido para las memorias RAM. Estas memorias se
proporcionan con capacidades considerables, del orden del megabit, lo que hace que se
apliquen para el almacenamiento de imgenes en cmaras digitales y en la sustitucin de la
cinta magntica de los contestadores telefnicos. El problema que presentan estas memorias es
que pueden soportar un nmero bastante menor de ciclos de lectura/escritura que las memorias
EEPROM.
Las memorias del tipo RAM, Ramdom Access Memory, de lectura/escritura, se utilizan bsicamente
para grabar datos y resultados relacionados con el programa que ejecuta la aplicacin, y son voltiles,
es decir, pierden la informacin contenida cuando se interrumpe la tensin de alimentacin del circuito
integrado. Existen dos tipos de memorias RAM:
-SRAM, Static RAM: esta memoria suele tener por base un biestable del tipo RS formado por
cuatro transistores que almacenan el bit concreto, y un par de transistores adicionales que se
usan para efectuar las operaciones de lectura/escritura.
-DRAM, Dynamic RAM: existen muchos tipos de memorias DRAM en el mercado y se utilizan
de forma masiva dentro del mercado de ordenadores destinados a la computacin y el
procesamiento de datos. La clula bsica de esta memoria consiste en un nico transistor y un
condensador implementado en silicio de manera que su tamao es sumamente reducido, por lo

El efecto tnel requiere de una capa muy delgada de xido aislante, SiO2, de alta calidad, para evitar que los electrones
que atraviesan el xido entre la puerta flotante y el drenador del transistor MOS queden atrapados en esta capa por los
defectos del xido.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

223

que suelen ser memorias de alta capacidad de almacenamiento. La informacin se almacena en


el condensador de celda de la memoria, utilizando para ello la carga y descarga del
condensador, factor que hace que sean memorias de bajo consumo. Tienen el inconveniente de
que deben regrabarse cada pocos milisegundos, debido a que se producen pequeas fugas en
las cargas de los condensadores que causan la prdida del estado lgico almacenado, lo que
hace que tengan una circuitera interna compleja para el refresco de la memoria.

8.3 Estructura externa de las memorias


En la figura 8.1 se presenta el esquema genrico de cualquier tipo de memoria y se indican cules son
las entradas/salidas ms comunes de este tipo de dispositivos.

Entradas de
direcciones
A0,...,An-1

Memoria

Entradas/salidas
de datos

Entradas
de control

Fig. 8.1 Esquema general de un circuito integrado de memoria

Las memorias que se emplean para sistemas basados en un microcontrolador, suelen tener una
estructura interna de celdas de tipo matricial, organizada en filas y columnas, donde cada celda
contiene un bit de informacin, el nmero de columnas agrupa 8 bits (que forman un byte), y donde el
nmero de filas determina la capacidad de la memoria. El tamao de estas memorias es de 256x8bits o
256bytes, 1kx8bits o 1kbyte, 2kbytes, 4kbytes, 8kbytes y as sucesivamente en potencias de 2.
En estos sistemas tambin se utilizan memorias serie con un nico bit de entrada/salida. El dato a leer
o escribir en estas memorias puede tener varios tamaos: es comn que sea de 8bits, de 16bits o de
32bits. Estas memorias suelen tener un encapsulado reducido y unas pocas lneas de control.
Para acceder a cada posicin de memoria se dispone de un nmero determinado de lneas de direccin,
dependiendo del tamao de la memoria que se desea emplear, de manera que se cumple la siguiente
relacin: m = 2n, donde m es el tamao de la memoria en bytes y n el nmero de lneas de direccin.
Las memorias (figura 8.1) tambin suelen tener 8 lneas de entrada/salida de datos, en las que se
introducen los bytes que se quieren escribir o grabar. Se efecta su escritura o lectura, segn sea el
caso, por medio de la activacin de las lneas de control que tienen asociadas.
En lneas generales las memorias ROM, PROM y EPROM suelen tener una o ms seales del tipo CS,
Chip Select, o CE, Chip Enable, y OE, Output Enable, para seleccionar y realizar la lectura de la
memoria, respectivamente.
En el caso de las memorias EPROM, stas suelen tener dos seales de control: /CE, habilitacin o
seleccin del circuito integrado, y /OE, habilitacin de la salida. La tabla 8.1 resume los modos de
funcionamiento de la memoria EPROM, considerando todos los posibles valores /CE y /OE.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

224
Tabla 8.1 Lneas de control de una memoria EPROM

/OE
L
H
X

/CE
L
L
H

Salidas
Dato
Triestado
Triestado

Modo
Lectura
Salidas inhibidas
Bajo consumo

L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos.


Triestado= salidas en alta impedancia.

En la tabla 8.1 se observa cmo las salidas presentan un estado triestado en el cual cada lnea se pone
en estado de alta impedancia, esta situacin se da en la mayor parte de las memorias semiconductoras,
cuando la seal CE es inactiva, ya que la memoria entra un estado de bajo consumo, con un consumo
al menos un 25% menor de lo habitual.
En cuanto a las memorias del tipo RAM, suelen tener como seales de control /CS o /CE, que habilita
el funcionamiento del circuito integrado, y RD/(/WR), Read/Write (lectura/escritura), que determina si
se va a leer o escribir en la memoria; aunque, en lugar de esta seal combinada lectura/escritura, puede
tener una lnea propia, /OE, para la lectura, y otra, /WE, Write Enable, para la escritura. La tabla 8.2
resume el funcionamiento de esta memoria considerando las lneas /CS y RD/(/WR), y la tabla 8.3
muestra su funcionamiento considerando las lneas /CE, /OE y /WE.
Tabla 8.2 Lneas de control de una memoria RAM

/CS
H
L
L

RD/ WE

X
H
L

E/S de datos
Triestado
Salida dato
Entrada dato

Modo de funcionamiento
Inhabilitada
Lectura
Escritura

L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos.


Triestado= salidas en alta impedancia

Tabla 8.3 Lneas de control de una memoria RAM con las entradas de lectura/escritura separadas

/CE
H
L
L
L
L

/OE
X
L
H
L
H

/WE
X
H
L
L
H

E/S de datos
Tri-estado
Salida dato
Entrada dato
Entrada dato
Tri-estado

Modo
Standby
Lectura
Escritura
Escritura
Inhabilitada

L=Low, 0 lgico. H=High, 1 lgico. X= indeterminado, 0 1 lgicos.


Triestado= salidas en alta impedancia. Standby= estado de espera

8.4 Ciclos de fetch, de lectura y de escritura


El acceso a la memoria por parte del microcontrolador se puede efectuar de tres formas distintas,
denominadas ciclos, donde se lleva a cabo, en cada una de ellas, una secuencia determinada de
tiempos. Estos ciclos son:
-Ciclo de fetch o de lectura de cdigo de operacin: el ciclo de fetch es una operacin de
lectura de la memoria externa, donde la informacin leda es el cdigo de operacin de las
instrucciones que debe ejecutar el microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

225

-Ciclo de lectura: el ciclo de lectura efecta una lectura sobre la memoria externa para leer un
operando de una instruccin, que puede ser un dato o una direccin.
-Ciclo de escritura: el ciclo de escritura escribe un dato sobre la memoria.
La duracin de estos ciclos es diferente dependiendo del tipo de ciclo y es distinto para las familias
MCS-51 y MCS-251. La duracin habitual de estos ciclos para la MCS-251 es de dos o tres estados,
mientras que para la MCS-51 suele ser al menos de un ciclo mquina. Durante este tiempo se activan
las seales involucradas en el acceso a la memoria externa de forma adecuada.

8.5 Conexin entre la MCS-51 y la memoria externa


En la conexin entre un microcontrolador de la MCS-51 y la memoria externa intervienen el bus de
direcciones, el bus de datos y las lneas de control para gestionar la lectura/escritura en la memoria
externa. El bus de direcciones para la MCS-51 es de 16 lneas y est soportado por los puertos P0 y P2
del microcontrolador. El bus de datos es de 8 bits y est ubicado en el puerto P0.
El puerto P0 soporta, pues, el byte bajo del bus de direcciones y el bus de datos, de forma simultnea,
mediante una multiplexacin temporal que se indica con la seal ALE. Esta multiplexacin temporal
se puede deshacer con un latch externo de 8 bits (figura 8.2) conectando el puerto P0 al latch y la
seal ALE a la entrada de reloj de ste.
Memoria
RAM/ EPROM

MCS-51
P2

A15A8

P0

D7D0
Latch

ALE

A7A0

CLK

Fig. 8.2 Conexin del bus de direcciones y de datos con una memoria externa, para la MCS-51

Adems de la seal ALE, en la MCS-51 existen ms lneas de control: /EA, /PSEN, /RD y /WR. /EA
External Access inhibe, a 0 lgico, el acceso a la memoria interna de programas del microcontrolador.
/PSEN se activa cuando se accede a la memoria externa de programa. /RD se activa cuando el
microcontrolador procede a la lectura de la memoria externa de datos (RAM). Y /WR se activa al
escribir en la memoria externa de datos.
8.5.1 Diagramas de tiempos para la MCS-51
Las figuras 8.3, 8.4 y 8.5 muestran los diagramas de tiempos del ciclo de fetch, de lectura y de
escritura para la MCS-51. En las tablas 8.4 y 8.5 se indica el valor de los tiempos asociados para una
frecuencia de reloj de 16MHz.
Tabla 8.4 Valores mnimos en nanosegundos de los tiempos indicados en los ciclos de fetch, de lectura y de
escritura para la MCS-51, con una frecuencia de reloj de 16MHz

tLL

tAL

tLA

tLC

tCC

tCI

tRR tWW tDR

tLW tAW

85

28

23

143

275

138

275

120

Los autores, 2001; Edicions UPC, 2001.

tWHLH
23

tDWX tDW tWD


3

288

13

Microcontroladores MCS-51 y MCS-251

226

Tabla 8.5 Valores mximos de los tiempos en nanosegundos de los tiempos indicados en los ciclos de fetch, de
lectura y de escritura para la MCS-51, con una frecuencia de reloj de 16MHz

tLIV tCIV tCIF tAIV

tCC tAFC tRD tDFR tLD

tAD

tLW

tWHLH

tAFR

150

143

398

238

103

83

38

208

10

148

55

350

t CY
t LIV

t LL
ALE

t LC

t CC

PSEN

t AL

t LA
AD0..AD7

P0

t CIF

t CIV
INSTRUC

t AFC

INSTRUC

AD0..AD7

t CI
t AIV

P2

AD8..AD15

AD8..AD15

Fig. 8.3 Diagrama de tiempos de un ciclo fetch en memoria externa para la MCS-51
t WHLH

t LD

ALE

PSEN

t LW
RD

t AL

P0

t RR

t LA
t AW

t DFR

t RD

t DR
ENTRADA DEL DATO

AD0..AD7

t AFR

t AD
P2

AD8..AD15

Fig. 8.4 Diagrama de tiempos de un ciclo de lectura en memoria externa para la MCS-51
t WHLH
ALE

PSEN

t LW
WD

t AL
P0

P2

t AW
t LA
AD0..AD7

t WW
t DWX

t DW

t WD

SALIDA DEL DATO

AD8..AD15

Fig. 8.5 Diagrama de tiempos de un ciclo escritura en memoria externa para la MCS-51

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

227

En la ejecucin del ciclo de fetch para la MCS-51 se realizan los siguientes pasos:
1.
2.
3.
4.

Colocar el byte alto y el byte bajo del bus de direcciones en el puerto P2, lneas A8,, A15,
y P0, lneas A0,, A7, respectivamente.
Forzar a que la seal ALE tenga un flanco de bajada para que el contenido del puerto P0,
lneas A0,, A7, se almacenen en el latch.
Una vez que la direccin est presente a la entrada de la memoria, se activa la seal /PSEN
para realizar la lectura de la memoria.
La memoria coloca el cdigo de operacin en el bus de datos, puerto P0; el
microcontrolador lee este dato coincidiendo con el flanco de subida de /PSEN.

8.6 Ejemplos de conexin para la MCS-51


Ejemplo 8.1 Conexin de memorias EPROM y RAM
La figura 8.6 muestra un ejemplo de conexin de una memoria EPROM 27C256 de 32kbytes y
una memoria RAM 6164 de 8kbytes a un microcontrolador 80C31. Segn esta figura, la seal
de habilitacin de la memoria EPROM, /CE, est conectada directamente a lnea A15 del bus
de direcciones, de forma que cuando A15=0 la memoria est seleccionada, y cuando A15=1, no
lo est. Este hecho implica que siempre que el cdigo de las instrucciones del programa est
ubicado dentro de las primeras 32k direcciones, de las 64k direcciones posibles, la memoria
EPROM quedar seleccionada, pues en el bus de direcciones aparece una direccin
correspondiente a este rango. Estos rangos de direcciones donde se seleccionan las memorias
EPROM, RAM o cualquier otro dispositivo que tenga que seleccionarse por medio de una
direccin concreta, se denominan Mapa de memoria. El mapa de memoria donde se indican los
rangos de direcciones de seleccin de las memorias EPROM y RAM de este ejemplo se
muestran en la figura 8.7.
En el circuito de la figura 8.7 se utiliza el circuito integrado 74LS373, constituido por 8
bsculas D con salida triestada, para deshacer la multiplexacin temporal en el puerto P0 entre
las 8 lneas del bus de datos y las 8 lneas bajas del bus de direcciones. La seal de reloj de las
bsculas est conectada a la seal ALE, de manera que cuando ALE est a 1 lgico, el estado
lgico presente a la entrada de las 8 bsculas D pasa a la salida, y cuando la seal ALE pasa a 1
lgico, las bsculas mantienen el ltimo estado lgico presente en sus entradas.
La lectura de la memoria EPROM se realiza a travs de la seal /PSEN (activa a 0 lgico y
conectada a la entrada /OE de la memoria), para ello la memoria se debe seleccionar
previamente con A15.
La seleccin de la memoria RAM se realiza por medio de la seal /CS, que selecciona la
memoria cuando est a 0 lgico. La seal /CS se ha conectado directamente a la lnea de
direccin A13, de manera que la memoria se selecciona siempre que el microcontrolador
realiza una lectura o escritura en los primeros 8kbytes de los 64kbytes posibles para la MCS51. No obstante, la memoria RAM se selecciona cada vez que la seal /CS est a 0 lgico, lo
que ocurre cuando las direcciones del bus estn dentro de uno de los siguientes rangos de
direcciones: 0000H-0FFFH, 2000H-2FFFH, 4000H-4FFFH, 6000H-6FFFH, 8000H-8FFFH,

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

228

A000H-AFFFH, C000H-CFFFH y E000H-EFFFH. Fuera de estas zonas la memoria no est


seleccionada, tal y como se indica en la figura 8.7.

RAM 6164
(8 kbytes)

80C31
P0

EPROM
27C256
(32 kbytes)

D7D0

D7D0

Latch
D7D0

A13
ALE

Q7Q0

A7A0
A7A0

74LS373
CLK

/EA
/RD

A15

/WR

A14A8

A12A8

P2

/CS

/PSEN

/OE

/OE

/WE

/CE

Fig. 8.6 Conexin de una memoria RAM de 8kbytes y una memoria EPROM de 32kbytes al 80C31

c)

Memoria de datos
0000H

RAM (8 k)
1FFFH

a) Memoria de programas
0000H

b)

Memoria de datos
0000H

RAM (8 kbytes)
EPROM
(32 kbytes)

1FFFH
2000H

7FFFH
8000H

2000H
Zona Imagen (8k)
2FFFH
4000H
Zona Imagen (8k)
4FFFH
6000H
Zona Imagen (8k)
6FFFH
8000H
Zona Imagen (8k)
8FFFH

Sin memoria

FFFFH

Sin memoria

FFFFH

A000H
Zona Imagen (8k)
AFFFH
C000H
Zona Imagen (8k)
CFFFH
E000H
Zona Imagen (8k)
EFFFH

Fig. 8.7 Mapa de memoria del circuito de la figura 8.6. a) Mapa de la memoria de programas. b) Mapa
de la memoria de datos. c) Mapa de la memoria de datos considerando imgenes

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

229

RAM1 6164
(8 kbytes)

80C31
P0

RAM2 6164
(8 kbytes)

D7D0

D7D0

A7A0

A7A0

D7D0

Latch
D7D0

A13
ALE
/EA
P2
/RD
/WR

A15
/PSEN

Q7Q0

EPROM
27C256
(32 kbytes)

A7A0

74LS373
CLK
A12A8

A12A8

/CS

/CS

/OE

/WE

/OE

A14A8

/WE

/OE

/CE

Fig. 8.8 Conexin de dos memorias RAM de 8kbytes y una memoria EPROM de 32kbytes al 80C31

Segn el mapa de memoria de la figura 8.7, la capacidad de memoria RAM del sistema puede
ampliarse en 8kbytes ms conectando un circuito integrado de memoria RAM 6164 adicional,
como se muestra en la figura 8.8. La memoria RAM2 se sita en las zonas del mapa de
memoria de datos que no es imagen; para ello se conecta la lnea A13 mediante una puerta
lgica NOT a la seal /CS de la memoria. Con el circuito de la figura 8.8, la memoria RAM1 se
selecciona cuando la lnea A13 est a 0 lgico, mientras que la memoria RAM2 se selecciona
cuando la lnea A13 est a 1 lgico. La memoria RAM2 ocupa las zonas sombreadas que hay
en el mapa de memoria de la figura 8.7, y se selecciona cuando las direcciones del bus estn
dentro de uno de los siguientes rangos de direcciones: 1000H-1FFFH, 3000H-3FFFH, 5000H5FFFH, 7000H-7FFFH, 9000H-9FFFH, B000H-BFFFH, D000H-DFFFH y F000H-FFFFH.
Para utilizar ms circuitos integrados de memoria se necesita emplear una lgica de seleccin
de la memoria algo ms compleja, que garantice la conexin de ms memorias y de otros
dispositivos al microcontrolador; para ello en el siguiente ejemplo se propone el uso de un
decodificador en la seleccin de las memorias.
Ejemplo 8.2 Seleccin de memorias mediante el 74LS138
La figura 8.9 muestra el circuito de conexin de dos memorias EPROM 27C128 de 16kbytes
cada una, y de dos memorias RAM 6164 de 8kbytes cada una. La seleccin de las memorias se
efecta con el decodificador de 3 a 8 lneas 74LS138.
Las salidas Y0-Y7 del 74LS138 se activan a 0 lgico cuando en las entradas, C, B y A, aparece
el cdigo correspondiente de la salida, segn la tabla de verdad del decodificador de la figura
6.18. Las entradas G1, /G2A y /G2B son las lneas de habilitacin del decodificador y deben
estar a 1, 0 y 0 lgicos, respectivamente, para que el decodificador funcione correctamente. El
decodificador queda inhabilitado si la entrada G1 est a 0 lgico o cualquiera de las entradas
/G2A o /G2B est a 1 lgico, es decir, si cualquiera de estas entradas est inhabilitada.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

230

RAM1 6164
(8 kbytes)

80C31
P0

RAM2 6164
(8 kbytes)

D7D0

D7D0

A7A0

A7A0

Latch
D7D0

Q7Q0

EPROM1
27C128
(16 kbytes)

EPROM2
27C128
(16 kbytes)

D7D0

D7D0

A7A0

A7A0

A13A8

A13A8

74LS373
ALE
/EA
A15
A14
A13

CLK

P2
/PSEN
/WR
/RD

A12A8

A12A8

/CS

/CS

/OE

/WE

/OE

/OE

/WE

/CE

/OE

/CE

74LS138
Vcc
G1
/G2A
/G2B
C
B
A

Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7

Entradas
Habilit.
Seleccin
G1 G2* C
B
A
X
H
X
X
X
L
X
X
X
X
H
L
L
L
L
H
L
L
L
H
H
L
L
H
L
H
L
L
H
H
H
L
H
L
L
H
L
H
L
H
H
L
H
H
L
H
L
H
H
H

Salidas
Y0
H
H
L
H
H
H
H
H
H
H

Y1
H
H
H
L
H
H
H
H
H
H

Y2
H
H
H
H
L
H
H
H
H
H

Y3
H
H
H
H
H
L
H
H
H
H

Y4
H
H
H
H
H
H
L
H
H
H

Y5
H
H
H
H
H
H
H
L
H
H

Y6
H
H
H
H
H
H
H
H
L
H

Y7
H
H
H
H
H
H
H
H
H
L

*G2=G2A+G2B

Fig. 8.9 Conexin de dos memorias RAM y de dos memorias EPROM con el 74LS138

Conectando la lnea A15 a la entrada C del 74LS138, la lnea A14 a la entrada B y la lnea A13
a la entrada A, la salida Y0 del decodificador se activa siempre y cuando las lneas A15, A14 y
A13 estn a 0 lgico, lo que ocurre en el rango de direcciones comprendido entre 0000H y
1FFFH, es decir, las primeras 8k posiciones del mapa de memoria. De la misma forma, cada
una de las restantes entradas se activa con un rango de 8k posiciones del mapa de memoria,
segn la tabla 8.6.
Tabla 8.6 Espacio de memoria en el cual se activan las salidas del 74LS138 en la figura 8.9

Salida activa

Espacio de memoria

Memoria habilitada

Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7

0000H-1FFFH
2000H-3FFFH
4000H-5FFFH
6000H-7FFFH
8000H-9FFFH
A000H-BFFFH
C000H-DFFFH
E000H-FFFFH

RAM1 y EPROM1
RAM2 y EPROM1
EPROM2
EPROM2
-

Las lneas de seleccin de las memorias RAM1 y RAM2, al tener una capacidad de 8kbytes, se
conectan directamente a las salidas Y0 y Y1 del decodificador, respectivamente. La memoria
EPROM1 tiene una capacidad de 16kbytes, por lo que su lnea de seleccin, /CE, est
conectada a las salidas Y0 e Y1 por medio de una puerta AND. Esta memoria se habilita
siempre y cuando el microcontrolador efecte una lectura en los primeros 16kbytes del mapa de

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

231

memoria. De la misma forma, la entrada /CE de la memoria EPROM2 se conecta a las salidas
Y2 y Y3; se habilita cuando el microcontrolador realiza una lectura en el espacio comprendido
entre 4000H y 7FFFH del mapa de memoria.

8.7 Conexin con la memoria externa para la familia MCS-251


La interfaz de acceso a la memoria externa comprende todas las lneas del microcontrolador que
intervienen en la conexin con la memoria externa. Estas lneas estn agrupadas en tres buses: bus de
direcciones, bus de datos y bus de control.
El bus de direcciones puede ser de 16, 17 18 lneas, configurable por el usuario. En cualquier caso,
independientemente de la opcin elegida, los 16 bits de menor peso del bus de direcciones estn
implementados por los puertos P0 y P2. Si se configura el microcontrolador para tener 17 lneas de
bus de direcciones, el bit de mayor peso del bus, A16, est ubicado en el pin P3.7. Si se utilizan 18
lneas de bus de direcciones, la lnea de mayor peso, A17, est ubicada en el pin P1.7. En la tabla 8.7
se indica la localizacin de las diferentes lneas del bus de direcciones.
Tabla 8.7 Ubicacin del bus de direcciones

Bus de direcciones

Ubicacin

A0,,A7
A8,,A15
A16
A17

P0.0,,P0.7
P2.0,,P2.7
P3.7
P1.7

El bus de datos es de 8 bits y su ubicacin es configurable por el usuario, quien debe elegir entre dos
opciones: modo paginado y modo no paginado (tabla 8.8).
Tabla 8.8 Posibilidades de ubicacin del bus de datos

Bus de datos

Ubicacin

Caractersticas

Modo no paginado
Modo paginado

P0.0,,P0.7
P2.0,,P2.7

Compatible con el 8XC51


Acceso ptimo a la memoria externa

El modo paginado es ms eficiente en el acceso a la memoria externa, ya que reduce el tiempo


invertido por el microcontrolador para leer los cdigos de operacin de las instrucciones, pero no es
compatible con los microcontroladores de la familia MCS-51.
En cuanto a las conexiones externas, la diferencia entre ambos modos radica en la ubicacin del bus de
datos. En el modo no paginado el bus de datos est implementado por el puerto P0, que al mismo
tiempo implementa las 8 lneas de menor peso del bus de direcciones, de la A0 a la A7. Debido a esta
duplicidad de tareas, el puerto P0 debe conectarse a un registro, o latch, de 8 bits, cuya carga est
controlada por la seal ALE, a fin de almacenar la parte baja de la direccin (figura 8.10). En cambio,
si el microcontrolador est configurado en modo paginado, es el puerto P2 el que realiza la funcin de
bus de datos, al mismo tiempo que implementa las 8 lneas del bus de direcciones que van de la A8 a
la A15. En este caso el latch se conecta al puerto P2, a fin de almacenar los bits de direcciones
A8,..,A15.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

232
RAM/
EPROM

8XC251Sx
P2

RAM/
EPROM

8XC251Sx

D7:0

A15:8

P0
ALE

Latch

D7:0

P2
ALE

A7:0

P0

Modo no paginado

Latch

A15:8
A7:0

Modo paginado

Fig. 8.10 Estructura del bus en modo no paginado y modo paginado

El bus de control est compuesto por todas aquellas seales que permiten controlar qu tipo de
operacin, de lectura o escritura se realiza sobre la memoria externa. El microcontrolador 8XC251Sx
dispone de dos seales de control de lectura, /RD y /PSEN, y una de escritura, /WR (tabla 8.9). El
rango de direcciones asociadas a estas seales de control depende del valor de los bits de
configuracin RD1 y RD0.
Tabla 8.9 Seales de acceso a la memoria externa

Nombre Tipo
A17
A16
A15:8
AD7:0
ALE

O
O
O
I/O
O

/EA

/PSEN

/RD

/WR

Descripcin
Lnea de direccin A17.
Lnea de direccin A16.
Parte alta del bus de direcciones.
Bus de datos y parte baja del bus de direcciones (nodo no paginado).
Address Latch Enable. Controla la carga del registro de 8 bits que est
conectado al puerto que realiza las funciones de bus de datos.
External Access. Esta entrada inhibe, si esta a cero lgico, el acceso a
la memoria OTPROM/ROM interna del microcontrolador.
Program Store Enable. Esta seal controla las operaciones de lectura
en la memoria externa. El rango de direcciones para las que opera esta
seal de control depende de los bits de configuracin RD1 y RD0.
Seal de lectura o lnea A16 del bus de direcciones. Dependiendo del
valor de los bits de configuracin RD1 y RD0 esta lnea controla la
lectura de memoria externa en las direcciones [ 7F:FFFFH, o bien
implementa la lnea de mayor peso del bus de direcciones.
Seal de escritura. Esta seal controla las operaciones de escritura en
la memoria externa.

Multiplexado con
P1.7/CEX4
P3.7/RD
P2.0,..,P2.7
P0.0,..,P0.7
/PROG

P3.7/A16

P3.6

Existen otras seales de control auxiliar que intervienen en el acceso a la memoria externa, como son
la seal ALE (Address Latch Enable) y /EA (External Access). La seal ALE est ubicada en el pin 30
del microcontrolador (encapsulado DIP) y controla la carga del registro que est conectado al bus de
datos. El pin /EA se corresponde con el pin 31 del microcontrolador (encapsulado DIP) e inhibe,
cuando est a 0 lgico, el acceso a la memoria interna del tipo ROM. En la tabla 8.9 se resume la
totalidad de seales que intervienen, por parte del microcontrolador, en el acceso a la memoria
externa.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

233

8.8 Configuraciones de acceso a la memoria externa


Como ya se ha comentado en los apartados anteriores, el usuario puede escoger entre diversas
opciones de configuracin de acceso a la memoria externa, que bsicamente consisten en elegir el
nmero de lneas del bus de direcciones y la ubicacin del bus de datos. En los apartados siguientes se
estudiarn algunas de estas configuraciones a travs de ejemplos prcticos.
8.8.1 18 bits de bus de direcciones (RD1, RD0 = 00)
Se va ha considerar, en primer lugar, la configuracin que permite tener 18 lneas de bus de
direcciones: RD1 = 0 y RD0 = 0. Con 18 lneas de bus de direcciones se pueden direccionar hasta
256Kbytes de memoria externa. Para esta configuracin las seales que controlan las operaciones de
lectura/escritura en la memoria externa son dos:
] /PSEN: controla las operaciones de lectura en la memoria externa para cualquier direccin, de
la 00:0000H a la FF:FFFFH.
] /WR: controla las operaciones de escritura en la memoria externa para cualquier direccin, de
la 00:0000H a la FF:FFFFH.
Ejemplo 8.3 Conexin de una memoria RAM de 256Kbytes
En la figura 8.11 se presenta un ejemplo de conexin de una memoria RAM de 256Kbytes de
capacidad al microcontrolador 8XC251Sx: se puede observar cmo el registro est conectado
al puerto P0, al igual que las entradas de datos de la memoria RAM. Esto significa que el bus
de datos est ubicado en el puerto P0, por tanto, el microcontrolador est trabajando en modo
no paginado.
RAM
256Kbytes

8XC251Sx

D7:0
P0

Latch

A7:0

ALE
EA

WR

A15:8

P2
A16

A16

A17

A17

PSEN

OE

CE
WE

Fig. 8.11 Conexin de una memoria RAM de 256Kbytes al microcontrolador 8XC251Sx en modo paginado

La seal ALE controla la carga del registro y se activa cuando en el puerto P0 est disponible la
parte baja de la direccin (A0, , A7). Esta parte baja quedar almacenada en el registro,
cuyas salidas estn conectadas a las 8 lneas de direcciones de menor peso de la memoria
RAM.
El puerto P2 est conectado a las lneas de direcciones A8, ..., A15 de la memoria RAM. Las

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

234

dos ltimas lneas de direcciones del microcontrolador, A16 y A17, estn conectadas a las dos
entradas de direcciones de mayor peso de la memoria RAM.
Para controlar las operaciones de lectura y escritura se han conectado las salidas /WR y /PSEN
del microcontrolador a las entradas de control de la memoria RAM, /WE (Write Enable) y /OE
(Output Enable), respectivamente.
Por otra parte, la entrada /CE de la memoria RAM est conectada a masa, de forma que el
integrado de memoria RAM est permanentemente habilitado.
Tambin se puede observar en la figura 8.11 que el pin /EA del microcontrolador est
conectado a masa, lo que significa que la memoria ROM interna est inhibida y no es accesible.
El microcontrolador puede realizar tres tipos de operaciones, denominadas ciclos, sobre la memoria
externa:
1. Ciclo de lectura: el microcontrolador ejecuta un ciclo de lectura sobre la memoria externa para
leer un operando, que puede ser un dato o una direccin, almacenado en una posicin de la
memoria externa.
2. Ciclo de escritura: el microcontrolador ejecuta un ciclo de escritura sobre la memoria externa
para escribir el contenido de una posicin de memoria.
3. Ciclo de fetch o de lectura de cdigo de operacin: el ciclo de fetch es una operacin de lectura
de la memoria externa, donde la informacin leda es el cdigo de operacin de la siguiente
instruccin que debe ejecutar el microcontrolador.
Estas operaciones tienen una duracin de dos o tres estados, durante los cuales se activan las seales
involucradas en el acceso a la memoria externa, en el momento y orden adecuado, como se puede
observar en los cronogramas correspondientes. En la figura 8.12 est representado el cronograma del
ciclo de fetch para el modo no paginado, que tiene una duracin de dos estados, o sea, cuatro perodos
de reloj.
En la ejecucin del ciclo de fetch se realizan los siguientes pasos:
1. Al comienzo del ciclo de fetch se coloca la parte alta de la direccin, donde est almacenado el
cdigo de operacin que va a leer el microcontrolador, en el puerto P2 (A8, , A15). Si se utiliza
un bus de direcciones de 17 18 lneas tambin aparece en ese momento su valor correspondiente
en sus respectivas ubicaciones (P3.7 y P1.7).
2. A continuacin el microcontrolador coloca la parte baja de la direccin (A0, , A7) en el puerto
P0.
3. El microcontrolador hace pasar la seal ALE por un flanco de bajada de forma que se carga en el
registro el contenido del puerto P0, o sea, las lneas A0, , A7 del bus de direcciones.
4. Una vez que la direccin est disponible en las entradas de direcciones de la memoria, el
microcontrolador activa la seal de lectura, indicando con ello a la memoria que ya puede colocar
un dato vlido en el bus de datos.
5. Si todo va bien la memoria RAM responde a la activacin de la seal de lectura colocando el
cdigo de operacin en el bus de datos. El microcontrolador lee este cdigo coincidiendo con el
flanco de subida de /PSEN.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

235
Estado 1

Estado 2

XTAL

ALE

/RD, /PSEN

5
A7:0

P0

D7:0

1
A17,A16,A15:8

A17, A16, P2

Fig. 8.12 Ciclo de fetch en modo no paginado

En la figura 8.13 est representado el cronograma del ciclo de lectura en modo no paginado. Este ciclo
tiene una duracin de 6 perodos de reloj. La secuencia de un ciclo de lectura es similar a la del ciclo
de fetch, con la nica diferencia que tiene una duracin mayor.
Estado 1

Estado 2

Estado 3

XTAL

ALE

/RD, /PSEN

P0

A17, A16, P2

A7:0

D7:0

A17, A16, A15:8

Fig. 8.13 Ciclo de lectura en modo no paginado

En la figura 8.14 est representado el cronograma correspondiente al ciclo de escritura en modo no


paginado, cuya duracin tambin es de 6 perodos de reloj. La secuencia de activacin de las seales
de control tambin es similar a la del ciclo de lectura, con la nica diferencia que, en este caso, el
microcontrolador activa la seal de escritura /WR en lugar de la seal de lectura.
Si se opta por trabajar en modo paginado, se deber conectar el registro, o latch, de 8 bits a la salida
del puerto P2 (figura 8.15). Trabajar en modo paginado tiene como principal ventaja un ahorro de
tiempo en el acceso a la memoria externa. Esto es debido a que el ciclo de fetch, en determinadas
circunstancias, se ejecuta en tan slo un estado en lugar de dos. En efecto, cuando el microcontrolador
debe leer el siguiente cdigo de operacin en una direccin donde los bits A8, , A15 del bus de
direcciones han cambiado con respecto al valor que tenan para la instruccin anterior, la lectura dura
dos estados. Ahora bien, la lectura de los siguientes cdigos de operacin dura un solo estado, siempre
y cuando los bits A8, , A15 del bus de direcciones no cambien.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

236
Estado 1

Estado 2

Estado 3

XTAL

ALE

/WR
A7:0

P0

D7:0

A17, A16, A15:8

A17, A16, P2

Fig. 8.14 Ciclo de escritura en modo no paginado


RAM
256Kbytes

8XC251Sx

D7:0
P2

A15:8

Latch

ALE
P0

EA

A7:0

A16

A16

A17

A17

CE
WR

PSEN

OE

WE

Fig. 8.15 Conexin de una memoria RAM de 256Kbytes al microcontrolador 8XC251Sx en modo paginado

En la figura 8.16 se presenta el cronograma para estas dos situaciones. El primer ciclo de fetch tiene
una duracin de 2 estados, porque hay un cambio de los bits A8, , A15, con respecto a la direccin
anterior. En el segundo ciclo de fetch se mantiene el valor de los bits A8, , A15 y, por tanto, la
duracin es de solo 1 estado.
Ciclo 2
misma pgina

Ciclo 1, cambio de pgina


Estado 1

Estado 2

Estado 1

XTAL

ALE

/PSEN

A17, A16, P0

P2

A17, A16, A7:0

A15:8

A17, A16, A7:0

D7:0

Fig. 8.16 Ciclo de fetch en modo paginado

Los autores, 2001; Edicions UPC, 2001.

D7:0

8 Memoria externa

237

Finalmente, en las figuras 8.17a) y 8.17b) se presenta el cronograma de los ciclos de lectura y escritura
en modo paginado. La nica diferencia con respecto a los cronogramas del modo no paginado (figuras
8.13 y 8.14) es que el bus de datos est ubicado en el puerto P2.
Estado 1

Estado 2

Estado 1

Estado 3

XTAL

XTAL

ALE

ALE

/RD, /PSEN

/WR

A17, A16, A7:0

A17, A16, P0
A15:8

P2

Estado 2

A17, A16, A7:0

A17, A16, P0
D7:0

P2

Estado 3

A15:8

a)

D7:0

b)

Fig. 8.17 a) Ciclo de lectura y b) ciclo de escritura en modo paginado

Hay diseos en los que la memoria externa utilizada tiene un retardo importante y no puede responder
al microcontrolador con la rapidez necesaria. En estos casos, para que no se produzcan lecturas o
escrituras errneas se deben introducir ciclos de espera. Los ciclos de espera resuelven este problema,
ya que alargan el ciclo de fetch, el ciclo de lectura y el de escritura, el tiempo suficiente para que la
memoria externa responda adecuadamente.
Configurando convenientemente el microcontrolador es posible introducir 0, 1, 2 3 ciclos de espera
para las seales /RD, /WR y /PSEN. En la figura 8.18 est representado el cronograma del ciclo de
fetch con un estado de espera adicional que proporciona a la memoria externa un tiempo
suplementario, equivalente a dos periodos de reloj, para que coloque el cdigo de operacin en el bus
de datos. En la figura 8.19 est representado el ciclo de lectura con un estado de espera adicional.
Tambin es posible introducir un estado de espera en la seal ALE para poder cargar adecuadamente
el registro cuando ste es excesivamente lento. En la figura 8.20 se muestra un ciclo de fetch donde se
ha introducido un estado de espera en la seal ALE.
Estado 1

Estado 2

Estado 3

XTAL

ALE

/RD, /PSEN

P0

A17, A16, P2

A7:0

D7:0

A17, A16, A15:8

Fig. 8.18 Ciclo de fetch en modo no paginado con un estado de espera adicional

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

238
Estado 1

Estado 2

Estado 3

Estado 4

XTAL

ALE

/WR
A7:0

P0

D7:0

A17, A16, A15:8

A17, A16, P2

Fig. 8.19 Ciclo de escritura en modo no paginado con un estado de espera


Estado 1

Estado 2

Estado 3

XTAL

ALE

/RD, /PSEN

A7:0

P0

D7:0

A17, A16, A15:8

A17, A16, P2

Fig. 8.20 Ciclo de fetch en modo no paginado con un estado de espera en la seal ALE

Ejemplo 8.4 Conexin de una memoria EPROM y otra RAM de 128Kbytes cada una
En la figura 8.21 se presenta un ejemplo de conexin de la memoria externa al
microcontrolador para una configuracin de 18 lneas de bus de direcciones y modo no
paginado. En este caso se ha conectado al microcontrolador una memoria RAM de 128Kbytes
de capacidad y una memoria EPROM de la misma capacidad.

RAM
128Kbytes

8XC251S x

P0
ALE
P2

Latch

EPROM
128Kbytes

D7:0

D7:0

A7:0

A7:0

A15:8

A15:8

A16

A16

EA
A16

WR

A17

CE

PSEN

OE

WE

OE

Fig. 8.21 Esquema de conexin en modo no paginado (RD1, RD0 = 00)

Los autores, 2001; Edicions UPC, 2001.

CE

8 Memoria externa

239

En la figura 8.22 se muestra cmo queda distribuido el espacio de direcciones del


microcontrolador entre los integrados de memoria considerados en este ejemplo. En esta figura
se puede observar que la memoria RAM est vinculada a las direcciones de las regiones 00:,
01:, FC: y FD:, mientras que la memoria EPROM est vinculada a las direcciones de las
regiones FE:, FF:, 02: y 03:.
A cada posicin fsica de la memoria RAM se puede acceder a travs de dos direcciones
distintas, una perteneciente a las regiones 00: 01:, y la otra perteneciente a las regiones FC: o
FD: que se denominan zonas imagen. Igualmente se puede acceder a cualquier posicin de la
memoria EPROM utilizando dos direcciones distintas: una perteneciente a las regiones FE: o
FF:, y la otra perteneciente a las regiones 02: o 03: (zonas imagen).
En la figura 8.23 se puede observar las direcciones de memoria externa asociadas a cada uno de
los circuitos integrados de la figura 8.21, junto con las regiones del mapa de memoria del
microcontrolador al que estn vinculadas esas direcciones.
Espacio de memoria
(512Kbytes)
FFFFH
FF:
Memoria EPROM externa
128Kbytes

0000H
FE:

Memoria externa
256Kbytes

FD:

Memoria RAM externa


128Kbytes
(imagen)

FC:

03:

Memoria EPROM externa


128Kbytes
(imagen)

02:

A17 A16

EPROM

03:, FF:
02:, FE:

RAM

01:, FD:
00:, FC:

Fig. 8.23 Regiones asociadas a las memorias


RAM y EPROM

FFFFH

01:
0000H
00: 0420H
00:0000H

Memoria RAM externa


128Kbytes
1056 Bytes de memoria RAM interna

Fig. 8.22 Espacio de memoria para el ejemplo 8.2

8.8.2 17 bits de bus de direcciones (RD1, RD0 = 01)


Con esta configuracin se dispone de 17 lneas de bus de direcciones externo: las 16 primeras lneas,
A0-A15, implementadas mediante los puertos P0 y P2, y la lnea A16 implementada en el pin P3.7.
Esta configuracin permite direccionar hasta 128Kbytes de memoria externa. La lnea A16 del bus de
direcciones externo selecciona entre las dos regiones de 64Kbytes de memoria externa. En este caso
las direcciones de las regiones 00:, 02:, FC: y FE: (todas ellas con el bit A16 =0) permiten acceder a la
primera regin de 64Kbytes de memoria externa. Por otra parte, las direcciones de las regiones 01:,
02:, FD: y FF: (todas ellas con el bit A16=1) posibilitan el acceso a la otra regin de 64Kbytes de
memoria externa (figura 8.24).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

240

A16

Memoria externa
128Kbytes

64Kbytes 01:, 03:, FD:, FF:

64Kbytes 00:, 02:, FC:, FE:

Fig. 8.24 Regiones asociadas a las direcciones de memoria externa para RD1, RD0 = 01

Ejemplo 8.5 Conexin de una memoria RAM de 128Kbytes


En la figura 8.25 est representada la conexin de una memoria RAM de 128Kbytes de
capacidad al microcontrolador 8XC251Sx, configurado con 17 lneas de bus de direcciones en
modo no paginado.
RAM
128Kbytes
D7:0

8XC251Sx

P0

Latch

A7:0

ALE
EA

P2
A16

WR

PSEN

A15:8
A16
OE

CE
WE

Fig. 8.25 Esquema de conexin modo no paginado

8.8.3 16 bits de bus de direcciones (RD1, RD0 = 10)


Esta configuracin permite tener un total de 16 lneas de bus de direcciones, de la A0 a la A15,
implementadas con los puertos P0 y P2, lo que posibilita direccionar hasta 64Kbytes de memoria
externa. Para esta configuracin todas las regiones de memoria interna (00:, 01:, 02:, 03:, FC:, FD:,
FE: y FF:) estn ubicadas en la misma regin de memoria externa de 64Kbytes (figura 8.26).
Memoria externa
64Kbytes
64Kbytes 00:, 01:, 02:, 03:, FC:, FD:, FE:, FF:
Fig. 8.26 Regiones asociadas a las direcciones de memoria externa para RD1, RD0 = 10

8.8.4 16 bits de bus de direcciones (RD1, RD0 = 11)


Esta configuracin es la nica compatible con los microcontroladores de la familia MCS-51. Por este
motivo, dispone de 16 lneas de bus de direcciones y de tres seales de control de acceso a la memoria
externa:
] /PSEN: seal de control de lectura de la memoria externa para las regiones FC:, FD:, FE: y FF:.
] /RD: seal de control de lectura de la memoria externa para las regiones 00:, 01:, 02: y 03:.
] /WR: seal de control de escritura de la memoria externa para las regiones 00:, 01:, 02: y 03:.

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

241

Para que la compatibilidad con la familia MCS-51 sea completa, se debe configurar al
microcontrolador 8XC251Sx para que trabaje en modo no paginado.
Ejemplo 8.6 Conexin de una memoria RAM de 64Kbytes en modo paginado
En la figura 8.27 est representado un ejemplo de conexin de una memoria RAM de
64Kbytes al microcontrolador 8XC251Sx configurado en modo paginado. En esta aplicacin el
cdigo del programa se almacena en la memoria interna ROM/OTPROM/EPROM.
RAM
64 Kbytes

8XC251Sx

D7:0
P2

A15:8

Latch

ALE
EA
P0
WR

CE

A7:0

PSEN

OE

WE

Fig. 8.27 Ejemplo de conexin para modo paginado (RD1, RD0 = 10)

Ejemplo 8.7 Conexin de una memoria RAM de 64Kbytes en modo no paginado


En la figura 8.28 se muestra el esquema de un ejemplo de conexin, para esta configuracin, de
un microcontrolador 8XC251Sx con una memoria RAM de 64Kbytes. En este caso, se ha
conectado la entrada de escritura de la memoria RAM, /WE, a la salida de escritura del
microcontrolador, /WR. Por otra parte, se ha conectado la entrada de habilitacin de lectura,
/OE, a la salida de una puerta lgica que realiza la operacin AND entre las dos seales de
control de lectura del microcontrolador, /PSEN y /RD. De esta forma, siempre que se ejecute
una lectura en la memoria externa, para cualquier regin del mapa de memoria disponible (00:,
01:, 02:, 03:, FC:, FD:, FE: y FF:), se activar la entrada de lectura de la memoria RAM.
RAM
64 Kbytes

8XC251Sx

D7:0

P0

Latch

A7:0

ALE
EA

P2

A15:8
CE

RD
OE
WR

PSEN

WE

Fig. 8.28 Ejemplo de conexin en modo no paginado (RD1, RD0 = 11)

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

242

A pesar de que slo se dispone de 16 lneas de bus de direcciones en esta configuracin, es posible
direccionar hasta un total de 128Kbytes de memoria externa utilizando de forma separada las seales
de control /PSEN, /WR y /RD (ejemplo 8.8).
Ejemplo 8.8 Conexin de dos memorias de 64Kbytes con RD1, RD0 = 11
En la figura 8.29 se muestra la conexin de dos integrados de memoria, de 64Kbytes cada uno,
al microcontrolador 8XC251Sx, configurado con RD1, RD0 = 11. La memoria RAM se
controla exclusivamente con las seales /WR y /RD, de forma que se habilitar su
funcionamiento para aquellas direcciones correspondientes a las regiones 00:, 01:, 02: y 03:.
Por otra parte, el integrado de memoria EPROM se controla con la seal /PSEN; esto significa
que slo se habilita cuando se efectan lecturas en direcciones correspondientes a las regiones
FC:, FD:, FE: y FF:.

RAM
64 Kbytes

8XC251Sx

P0

Latch

ALE
P2

EPROM
64 Kbytes

D7:0

D7:0

A7:0

A7:0

A15:8

A15:8

EA

PSEN

WR

WE

RD

OE

CE

OE

CE

Fig. 8.29 Ejemplo de conexin en modo no paginado (RD1, RD0 = 11)

Ejemplo 8.9 Diseo de la decodificacin de memoria de un sistema microprocesador


Se pretende disear un sistema basado en el microcontrolador 8XC251 que se ajuste al mapa de
memoria de la figura 8.30, estando el microcontrolador configurado para ser compatible con la
familia MCS-51: modo no paginado y 16 lneas de bus de direcciones (RD1, RD0 = 11).
Mapa de memoria
controlado por /PSEN
VAC O

FFFFH
C000H
BFFFH

Mapa de memoria
controlado por /WR y /RD
FFFFH
RAM

RAM
A000H
9FFFH

C000H
BFFFH
VACO

VACO
EPROM
EPROM

2000H
1FFFH

6000H
5FFFH
4000H
3FFFH

VACO

0000H

0000H

Fig. 8.30 Mapa de memoria del sistema microcontrolador

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

243

Para realizarlo se dispone de un circuito integrado de memoria EPROM de 32Kbytes y de un


circuito integrado de memoria RAM de 32Kbytes (figura 8.31).
EPROM
OE

RAM
8

DO

OE

D7

CE

D7

WE
15

A0
A14

DO

15

A0
CE

A14

Fig. 8.31 Integrados de memoria utilizados

En la decodificacin del mapa de memoria se ha utilizado el decodificador 74138 cuyo


esquema elctrico y tabla de verdad aparecen en la figura 8.32.
Entradas
Habilit.
Seleccin
G1 G2* C
B
A
X
H
X
X
X
L
X
X
X
X
H
L
L
L
L
H
L
L
L
H
H
L
L
H
L
H
L
L
H
H
H
L
H
L
L
H
L
H
L
H
H
L
H
H
L
H
L
H
H
H

74LS138
G1
G2A
G2B
C
B
A

Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7

Salidas
Y0
H
H
L
H
H
H
H
H
H
H

Y1
H
H
H
L
H
H
H
H
H
H

Y2
H
H
H
H
L
H
H
H
H
H

Y3
H
H
H
H
H
L
H
H
H
H

Y4
H
H
H
H
H
H
L
H
H
H

Y5
H
H
H
H
H
H
H
L
H
H

Y6
H
H
H
H
H
H
H
H
L
H

Y7
H
H
H
H
H
H
H
H
H
L

* G2=G2A+G2B

Fig. 8.32 Decodificador octal 74138

En la figura 8.33 est representado el esquema elctrico correspondiente a la decodificacin de


la memoria externa.
8XC251
LATCH
8 BITS

ALE
P0

EPROM
A0,...,A12

P2
RD

OE
CE
D0,...,D7

PSEN

WR

RAM
0V
0V
5V

A13
A14
A15

74138
Y0
G2A
Y1
G2B
Y2
G1
Y3
Y4
A
Y5
B
Y6
C
Y7

PSEN

RD

D0,...,D7
A0,...,A14
OE
CE
WE

PSEN

RD
WR

Fig. 8.33 Esquema elctrico de la decodificacin de memoria

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

244

Ejemplo 8.10 Decodificacin de memoria de un sistema microprocesador con RD1, RD0=10


Se desea disear un sistema basado en el microcontrolador 8XC251Sx que se ajuste al mapa de
memoria de la figura 8.34. El microcontrolador est configurado para trabajar en modo no
paginado con 16 lneas de bus de direcciones (RD1, RD0 = 10). Para realizarlo se disponen de
integrados de memoria PROM de 4Kbytes e integrados de memoria RAM de 4K x 4 bits cuyos
esquemas elctricos aparecen en la figura 8.35.
VAC O

FFFFH
B000H
AFFFH

RAM
9000H
8FFFH
VACO

PROM

1000H
0FFFH

Fig. 8.35 Esquema elctrico de las memorias RAM y PROM

0000H

Fig. 8.34 Mapa de memoria del sistema C

Para implementar los 4Kbytes de memoria PROM, de la direccin 0000H a la 0FFFH, slo es
necesario un circuito integrado. En la tabla 8.10 se indican los valores de las lneas del bus de
direcciones que habilitan el integrado de memoria PROM.
Tabla 8.10 Direcciones asociadas a la memoria PROM

A15 A14 A13 A12 A11 . . . . . . .A0


0 0 0 0 0....... 0
0 0 0 0 X.......X
0 0 0 0 1....... 1

Direcciones
0000H
......
0FFFH

Se accede a la memoria PROM cuando las cuatro lneas de mayor peso del bus de direcciones
valen 0 lgico, A15=A14=A13=A12=0; por tanto, la funcin que habilita o selecciona el
funcionamiento de la memoria PROM es:
CSPROM = A 15 A 14 A 13 A 12

Esta funcin se implementa mediante una puerta NOR de cuatro entradas (figura 8.36).

PSEN

Fig. 8.36 Decodificacin de la memoria PROM

Los autores, 2001; Edicions UPC, 2001.

8 Memoria externa

245

La salida de esta puerta NOR estar conectada a una de las entradas de habilitacin de la
memoria, CS2, mientras que la otra entrada de habilitacin, CS1, est conectada a la seal de
lectura de memoria externa, /PSEN.
Por otra parte, para implementar la zona de memoria RAM de 8Kbytes se divide sta en dos
zonas de 4Kbytes cada una (figura 8.37), ya que los integrados de memoria RAM disponibles
son de 4Kbytes.

9000 H
RAM 1
9FFF H
A000 H
RAM 2
AFFF H

Fig. 8.37 Ubicacin de las memorias RAM

Para cubrir cada zona de memoria RAM (RAM 1 y RAM 2) necesitamos utilizar dos
integrados de memoria RAM de 4K x 4 bit: uno se encargar de almacenar los 4 bits de menor
peso del dato y el otro almacenar los 4 bits de mayor peso.
En la tabla 8.11 se indican los valores de las lneas del bus de direcciones que permiten el
acceso a la zona RAM 1.
Tabla 8.11 Direcciones asociadas a la memoria RAM 1

A15 A14 A13 A12 A11 . . . . . . .A0


1 0 0 1 0....... 0
0 0 0 0 X.......X
1 0 0 1 1....... 1

Direcciones
9000 H
......
9FFF H

Vemos, pues, que para acceder a la zona de memoria RAM 1, las cuatro lneas de mayor peso
del bus de direcciones deben adquirir los siguientes valores: A15=1, A14=0, A13=0 y A12=1. Por
tanto, la funcin que selecciona la zona de memoria RAM 1 es:

CSRAM1 = A15 A14 A13 A12


En la tabla 8.12 se indican los valores del bus de direcciones que permiten acceder a la
memoria RAM 2.
Tabla 8.12 Direcciones asociadas a la memoria RAM 2

A15 A14 A13 A12 A11 . . . . . . .A0


1 0 1 0 0....... 0
0 0 0 0 X.......X
1 0 1 0 1....... 1

Direcciones
A000 H
......
AFFF H

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

246

Para acceder a la zona de memoria RAM 2, las cuatro lneas de mayor peso del bus de
direcciones deben adquirir los siguientes valores: A15=1, A14=0, A13=1 y A12=0. La funcin que
selecciona la zona de memoria RAM 2 es:

CSRAM 2 = A15 A14 A13 A12


Podemos implementar ambas funciones mediante puertas NAND de cuatro entradas y puertas
NOT. En la figura 8.38 aparece el esquema elctrico de conexin de los integrados de memoria
RAM.

WR
PSEN

WR
PSEN

WR
PSEN

WR
PSEN

Fig. 8.38 Conexin de las memorias RAM

En la figura 8.39 aparece el esquema elctrico del decodificador 74138 conectado


adecuadamente para generar las seales de habilitacin de las memorias PROM y RAM.

74138
0V
A14
5V

A12
A13
A15

G2A
G2B
G1

A
B
C

Y0
Y1
Y2
Y3
Y4
Y5
Y6
Y7

CSPROM

CSRAM1
CSRAM2

Fig. 8.39 Circuito de habilitacin de las memorias

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

247

9 Puerto de comunicacin serie


9.1 Introduccin
Es frecuente que un sistema basado en microprocesador tenga que transmitir datos hacia otro sistema,
o hacia un perifrico, o un terminal del sistema. La informacin se puede enviar en serie a travs de
una simple lnea, o canal de comunicacin; o en paralelo, lo que requiere de un nmero considerable
de lneas. La transmisin serie es adecuada para largas distancias por su simplicidad, y la transmisin
paralelo es adecuada en distancias relativamente cortas, debido a que el nmero de lneas hace que sea
una solucin con un elevado costo.
Para transmitir datos por la lnea telefnica a largas distancias es conveniente emplear un mdem, que
transforme las seales digitales a un formato analgico y que, as, haga ocupar un ancho de banda
menor, debido a que la transmisin digital directa resulta inapropiada por el enorme ancho de banda
que supone. No obstante, cuando las lneas de comunicacin son propias del sistema, la transmisin se
puede hacer ntegramente en formato digital, para lo cual existen varios estndares de comunicacin,
como el RS-232, el RS-422, el RS-485 y otros.
El formato de la informacin a transmitir en una comunicacin serie puede ser de 7 8 bits,
coincidiendo con los empleados por la tabla de caracteres ASCII. La transmisin puede ser sncrona o
asncrona y puede efectuarse en varios sentidos: simplex, half-duplex y full-duplex.
Cuando la comunicacin serie es sncrona se enva una seal de reloj en la transmisin que marca las
pautas de la comunicacin. Esta seal se puede proporcionar a travs de una lnea adicional entre los
sistemas que se quiere comunicar, o bien, se puede extraer de alguna forma especifica de codificacin:
en ese caso el receptor obtiene la seal de reloj de la propia seal recibida.
En el caso de que la comunicacin sea asncrona tanto el transmisor como el receptor deben
secuenciar la comunicacin de acuerdo con una base de tiempos, pues la transmisin o la recepcin
pueden ocurrir en cualquier momento. En este tipo de comunicacin la inactividad en la transmisin
se indica mediante un nivel lgico alto.
El inicio de la transmisin de un carcter, en una comunicacin serie asncrona, se indica mediante
una transicin brusca entre un nivel lgico alto y un nivel lgico bajo, a partir del cual se extrae cada
uno de los bits hacia la lnea, con intervalos fijos de tiempo t (figura 9.1): los intervalos de tiempo en
la comunicacin determinan la velocidad de transmisin en bits por segundo, bits/seg, o baudios. El
primer bit de la transmisin consiste en un bit de inicio (start), que es un cero lgico. Luego le siguen
los bits del dato, comenzando por el bit menos significativo y finalizando con un bit, o dos, de parada
(stop).

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

248

Al principio de establecer las bases de la comunicacin serie, se utilizaban dos bits de stop por
cuestiones tecnolgicas del momento. No obstante, en la actualidad es suficiente con emplear un solo
bit de stop. El bit de stop (figura 9.1) se indica manteniendo un nivel lgico alto durante un intervalo t,
tras el cual, puede procederse a transmitir el siguiente dato. As, la inclusin del bit de start y el de
stop, en la comunicacin serie asncrona, resulta imprescindible para separar y distinguir los datos
transmitidos.
t
Inactivo

Bit
start

Bit
stop
(LSB)
0
1

Inactivo

(MSB)
1
0

2
0

3
1

4
1

5
0

6
0

7
0

Estado

Fig. 9.1

Generalmente, el dato en una comunicacin serie es de 8 bits, a los que se puede aadir un noveno bit
de paridad, con el fin de detectar errores en la transmisin.
El sentido de la transmisin es simplex cuando se realiza en una nica direccin, del emisor al
receptor, es haf-duplex cuando se puede realizar en ambas direcciones, emisor-receptor y receptoremisor (pero no en ambas direcciones simultneamente), y full-duplex cuando se pueden enviar datos
en ambas direcciones de forma simultnea.
En la transmisin asncrona se puede dar el caso de que un sistema sea lento a la hora de procesar los
datos que recibe, por lo que ste debe ser capaz de indicarle al transmisor su incapacidad de procesar
ms datos y que, por tanto, se espere hasta una nueva transmisin. Este problema se suele solventar
mediante el protocolo XON/XOFF, en el cual se dispone de dos caracteres ASCII de control, DC1
(XON) y DC3 (XOFF), para detener y para reanudar la comunicacin, respectivamente. Cuando el
receptor no puede procesar ms datos enva un carcter XOFF al emisor, tras el cual el emisor deja de
transmitir hasta que recibe un carcter XON.

9.2 La comunicacin serie en la MCS-51


El puerto de comunicacin serie de la MCS-51 permite realizar transmisiones de datos en serie en los
modos sncrono y asncrono. Para la transmisin sncrona dispone de un nico modo de
funcionamiento, modo 0, y para la transmisin asncrona full-duplex con velocidad de transmisin
programable dispone de los modos 1, 2 y 3 de funcionamiento. La generacin de la velocidad de
transmisin del puerto serie se puede basar tanto en el Timer 1 como en el Timer 2, y utiliza sus
recursos para determinar la base de tiempos de la transmisin.
El puerto serie, adems, tiene un sistema automtico que es capaz de detectar un error en el bit de
stop. Adems, el bit de paridad se puede emplear en la transmisin para poder detectar un error de 1
bit en la comunicacin; para ello el bit de paridad se transmite con el dato como noveno bit de
transmisin. El puerto tambin tiene un sistema de reconocimiento de direcciones, el cual permite la
conexin de varios microcontroladores entre s.
La determinacin de la velocidad de transmisin depende del modo en que se est operando. Por
ejemplo, para el Timer 1, en el modo 0 tan slo se permite una velocidad de transmisin, mientras que

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

249

en el modo 2 pueden programarse dos velocidades de transmisin, y en los modos 1 y 3 se pueden


programar distintas velocidades de transmisin.
Los terminales asociados al puerto serie son TXD, terminal P3.1, y RXD, terminal P3.0. En el modo
0, el terminal TXD soporta la seal de reloj de la transmisin sncrona.
Los registros asociados al puerto de comunicacin serie son SBUF, SCON en toda la familia MCS-51,
y los registros SADDR y SADEN para las versiones 8XC52/54/58, 8XC51FX y 87C51GB. El registro
SBUF, Serial Buffer, es el buffer del puerto serie, que almacena el dato recibido o enviado por el
puerto. El registro SCON, Serial Control (tabla 9.1), es el registro de control que permite programar
las caractersticas de funcionamiento del puerto. El registro SADDR se utiliza para definir la direccin
del microcontrolador que hace la funcin de esclavo, cuando ste se encuentra en un entorno de
comunicacin multiprocesador. Finalmente, el registro SADEN especifica el byte de mscara para el
microcontrolador esclavo, en la comunicacin multiprocesador.
Tabla 9.1 Registro SCON para la MCS-51
Registro SCON

(MSB)
SM0 *
FE/SM0

Bit

SM1

SM2

REN

TB8

(LSB)
RB8

TI

RI

Comentario

FE/SM0 Frame Error o bit 0 de seleccin de modo del puerto serie. Esta opcin slo es valida para las
versiones 8XC51Fx de la MCS-51. Este bit acta como FE o SM0 segn sea el estado del registro
SMOD0 (bit 6 del registro PCON), si SMOD0=1 acta como FE y si SMOD=0 acta como SM0.
El bit FE se activa a 1 lgico cuando se detecta un bit de stop invlido en la recepcin de un dato.
Una vez activo, este bit no se borra por otros datos recibidos y se debe borrar por software.
SM0 es el bit de seleccin del puerto serie; su modo de funcionamiento se selecciona junto con SM1.
SM0
Bit 0 de seleccin de modo del puerto serie. Aparece con este formato en la MCS-51, excepto para
las versiones 8XC51Fx.. SM0 junto con SM1, determina el modo de funcionamiento del puerto serie.
SM1
Bit 1 de seleccin de modo del puerto serie.
SM1 SM0 Modo
0
0
0
0
1
1
1
0
2
1
1
3
SM2
Bit 2 de modo del puerto serie. Permite habilitar, o no, la comunicacin serie, en entornos
multiprocesador.
REN
Bit de habilitacin de la recepcin. REN=1 habilita la recepcin de un dato y REN=0 la inhabilita.
TB8
Bit noveno de transmisin. Es el dcimo bit en la transmisin de un dato para los modos 2 y 3.
RB8
Bit noveno de recepcin. Obtiene el valor del dcimo bit del dato transmitido en los modos 2 y 3.
TI
Bit de interrupcin en transmisin. Se pone a 1 cuando finaliza la transmisin del dato. Debe
borrarse por software.
RI
Bit de interrupcin en recepcin. Se pone a 1 cuando se recibe un dato. Debe borrarse por software.
* Para la MCS-51, excepto para la versin 8XC51Fx.
Slo para la versin 8XC51Fx.

En el puerto de comunicacin serie el registro SBUF est duplicado, de manera que uno de los
registros est conectado al terminal TXD y el otro registro est conectado al terminal RXD. Esta
duplicidad del registro SBUF permite poder transmitir y recibir datos simultneamente (comunicacin
full-duplex). Sin embargo, con el registro SBUF se trabaja de una manera sencilla, pues se trata a ste
como a un nico registro: se transmite un dato al cargarlo en SBUF, y se lee un dato de SBUF cuando
ste se ha recibido.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

250

9.3 Modos de funcionamiento del puerto serie


El puerto de comunicacin serie de la MCS-51 puede funcionar con cuatro modos distintos de
funcionamiento: modos 0, 1, 2 y 3. El modo 0 se emplea para la comunicacin sncrona y los modos
1, 2 y 3 en la comunicacin asncrona.
En cualquiera de los modos de funcionamiento del puerto serie, la transmisin se efecta en el
momento que se carga el registro SBUF con un dato mediante una instruccin de escritura. La
recepcin de un dato debe habilitarse de antemano, poniendo a 1 lgico el bit REN del registro SCON
y poniendo a cero el bit RI. Cuando se recibe un dato el bit RI se pone a 1 lgico y activa el proceso
de interrupcin del puerto, en el cual debe realizarse la lectura del registro SBUF por medio de la
rutina de RSI.

9.3.1 Modo 0. Modo sncrono


Este modo se determina mediante la puesta a cero lgico de los bits SM0 y SM1 del registro SCON.
La velocidad de transmisin de datos es de FOSC/12, donde FOSC es la frecuencia de reloj del
microcontrolador. El terminal TXD genera la seal de reloj que sincroniza la comunicacin, y la
transmisin y recepcin de datos se lleva a cabo a travs del terminal RXD.

9.3.2 Modos 1, 2 y 3. Modos asncronos


En los modos 1, 2 y 3 se pueden enviar datos a travs de la lnea TXD y recibirlos a travs de la lnea
RXD de forma simultnea (full-duplex). En la figura 9.2 se muestra la trama del dato en la transmisin
de estos modos.
Noveno bit
(Slo modos 2 y 3)
Bit 1

D0

D1

D2

Bit de start

D3

D4

D5

D6

D7

Dato de 8 bits

TB8
Bit de stop

Fig. 9.2 Trama de datos para los modos 1, 2 y 3

a) Modo 1
En el modo 1, la trama de datos est formada por 10 bits. El primer bit de la trama es el bit de start, a
0 lgico, le siguen los 8 bits del dato, y finaliza con un dcimo bit que consiste en el bit de stop, a 1
lgico.
La base de tiempos se puede generar, en este modo, por medio del Timer 1, del Timer 2 (en aquellas
versiones que disponen de tres Timers) o de ambos Timers. La velocidad de transmisin del puerto
serie, en baudios, depende del tiempo de desbordamiento de los Timers. Por defecto, la velocidad de
transmisin la establece el Timer 1, y viene dada en baudios por la frmula siguiente:

Frec. transmisin [ 2 X

Frec. rebasamiento del Timer 1


32

Los autores, 2001; Edicions UPC, 2001.

(9.1)

9 Puerto de comunicacin serie

251

donde X puede valer 0 1 lgico. Para la MCS-51, excepto las versiones 8XC51Fx, el bit X se
corresponde con el bit SMOD del registro PCON. Para las versiones 8XC51Fx el bit X se corresponde
con el bit SMOD1 del registro PCON. En realidad el bit SMOD y SMOD1 son el mismo bit con
distintos nombres, y corresponden al bit 7 del registro PCON.
En la comunicacin serie se debe evitar que el Timer provoque una interrupcin cada vez que llega a
desbordamiento; para ello debe de inhibirse la interrupcin del Timer mediante el bit ET del registro
IE. El Timer 1 se suele configurar en el modo 2, como temporizador de 8 bits con autorrecarga (modo
2), aunque puede tambin configurarse en los modos 0, 2 y 3. Para este caso, la velocidad de
transmisin depender del valor cargado el registro TH1 del Timer 1:
Frec. transmisin [ 2 X

FOSC
32 12 ]256 TH1

(9.2)

donde FOSC es la frecuencia de reloj del microcontrolador. El bit X, al igual que para la ecuacin (9.1),
es el sptimo bit del registro PCON. La tabla 9.2 muestra distintas frecuencias de transmisin que se
pueden obtener con el Timer 1 en el modo 2 de funcionamiento.
Tabla 9.2 Timer 1 como generador de baudios para el modo 2 de funcionamiento

Frecuencia
(Baudios)

62.5 Kbaud (Max)


19.2 Kbaud
9.6 Kbaud
4.8 Kbaud
2.4 Kbaud
1.2 Kbaud
137.5 Baud
110.0 Baud

Frecuencia
Oscilador
12.0 MHz
11.059 MHz
11.059 MHz
11.059 MHz
11.059 MHz
11.059 MHz
11.059 MHz
6.0 MHz

SMOD
C/T
0
0
0
0
0
0
0
0

1
1
0
0
0
0
0
0

Timer 1
Valor recarga TH1
FFH
FDH
FDH
FAH
F4H
E8H
1DH
72H

b) Modo 2
En el modo 2, la trama de bits del puerto serie est compuesta de 11 bits. El primer bit es el bit de
start, le siguen los 8 bits del dato ms un noveno bit definible por el usuario, y termina con un bit de
stop. El noveno bit del dato transmitido se corresponde con el estado del bit TB8 del registro SCON.
En la recepcin, este noveno bit se ubica en el bit RB8 del registro SCON.
Para transmitir en este modo se debe poner el noveno bit a transmitir en el bit TR8, antes de realizar la
escritura del dato en el registro SBUF. La recepcin se debe habilitar antes que se produzca, poniendo
para ello el bit REN a 1 lgico y el bit RI a 0 lgico.
En el modo 2 slo se permiten dos velocidades de comunicacin para el puerto serie, dependiendo del
valor del bit X:
Frec. transmisin [ 2 X

FOSC
64

(9.3)

El bit X tiene la misma correspondencia que la definida para el resto de modos de funcionamiento.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

252

c) Modo 3
El modo 3 del puerto serie es similar al modo 2, con la nica diferencia que la velocidad de la
comunicacin del puerto serie se obtiene de la misma manera que en el modo 1.

9.3.3 El Timer 2 como base para el puerto serie


El Timer 2 tiene un modo de funcionamiento especfico utilizado para fijar la velocidad de
comunicacin de datos por el puerto serie, Baud Rate Generator Mode (figura 9.3). Para seleccionar
este modo se deben programar adecuadamente los bits RCLCK y TCLCK del registro T2CON, como
se muestra en la tabla 9.3.
0

Rebasamiento
del Timer 1

1
X

XTAL1

0
TH2

TL2

RX
Clock

16

TX
Clock

TR2

T2

16
RCLCK

C/T2

1
0
RCAP2H RCAP2L
TCLCK
Peticin de
interrupcin

T2EX

EXF2
EXEN2
X=SMOD para la MCS-51, excepto para la versin 8XC51Fx.
X=SMOD1 para la versin 8XC51Fx.

Fig. 9.3 Diagrama de bloques del Timer 2 funcionando en el modo generador de Baud Rate
Tabla 9.3 Seleccin del Timer 2 como generador de baudios

RCLCK

TCLCK

0
0
1
1

0
1
0
1

Generador de baudios en
recepcin
Timer 1
Timer 1
Timer 2
Timer 2

Generador de baudios en
transmisin
Timer 1
Timer 2
Timer 1
Timer 2

Cuando el Timer 2 se selecciona como generador de baudios funciona de forma similar al modo
autorrecarga. Los registros TH2 y TL2 se recargan con el valor de los registros RCAP2H y RCAP2L,
en cada desbordamiento. La velocidad de comunicacin depende del valor puesto en estos registros:
Frec. transmisin [

32 ]65536

FOSC
(RCAP 2H ,RCAP2L )

(9.4)

En la figura 9.3 se muestra el diagrama de bloques del Timer 2 configurado en modo generador de

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

253

baudios. En la tabla 9.4 se indican las distintas velocidades de comunicacin y el valor a cargar en los
registros RCAP2H y RCAP2L para conseguir distintas velocidades de transmisin.
Tabla 9.4 Timer 2 como generador de baudios para los modos 1 y 3 del puerto serie

Baudios
375.0 Kbaud
9.6 Kbaud
4.8 Kbaud
2.4 Kbaud
1.2 Kbaud
300.0 baud
110.0 baud
300.0 baud
110.0 baud

Frecuencia oscilador
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
6.0 MHz
6.0 MHz

RCAP2H RCAP2L
FFH
FFH
FFH
D9H
FFH
B2H
FFH
64H
FEH
C8H
FBH
1EH
F2H
AFH
FDH
8FH
F9H
57H

9.4 Deteccin de errores


En las versiones 8XC51Fx es posible detectar errores en la recepcin del bit de stop para los modos de
trabajo 1, 2 y 3, para lo cual se debe poner a 1 lgico el bit SMOD0 del registro PCON.
Con esta opcin habilitada, el puerto serie comprueba el bit de stop de cada dato recibido y si es
errneo se pone a 1, de manera automtica, el bit FE del registro SCON. En consecuencia, para
emplear este recurso, se debe examinar el estado del bit FE cada vez que se recibe un dato. El bit FE
no es modificado por datos posteriores recibidos en el puerto serie, y se debe borrar por software, por
lo que se deber incluir una instruccin que lo borre cada vez que se active.
Ejemplo 9.1 Control de una impresora de 40 columnas
En los equipos de tipo comercial, como una balanza electrnica o un terminal punto de venta,
se utilizan impresoras de 40 columnas para la impresin del tiquet de la compra del usuario.
Estas impresoras se conectan al sistema basado en microcontrolador mediante el bus RS-232C,
que es un bus de comunicacin para distancias cortas y velocidades de comunicacin
moderadas.
Con el bus RS-232C slo se pueden conectar un emisor y un receptor, y las velocidades de
comunicacin ms comunes son: 300, 1.200, 2.400, 4.800, 9.600 y 19.200. Los niveles de
tensin del bus son bipolares, el transmisor debe generar un nivel de tensin entre -5 y -15V
para un 1 lgico, y entre +5 y +15V para un 0 lgico. El receptor responde con una tensin ms
negativa que -3V para un 1 lgico, y con una tensin ms positiva que +3V para un 0 lgico.
Para realizar la interfaz con el bus existen distintos circuitos integrados de interfaz entre niveles
TTL y RS-232, y viceversa. Los circuitos integrados ms comunes son el MC1488, que tiene
cuatro transmisores, y el MC1489A, que tiene cuatro receptores. Estos circuitos integrados los
realizan distintos fabricantes y son de bajo coste. El MC1488 necesita una tensin de
alimentacin entre 9V y 15V. Para niveles CMOS se pueden usar el DS14C88 y el
DS14C89A de National Semiconductor, para la interfaz entre CMOS y RS-232, y viceversa.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

254

El nmero mnimo de seales con el que se puede realizar la comunicacin bidireccional entre
dos equipos es: TXD para la transmisin, RXD para la recepcin y una lnea de masa (figura
9.4).
Equipo A

Equipo B
MC1488

MC1489

TXD

RXD

RXD

TXD
MC1488

MC1489

Fig. 9.4 Conexin de dos equipos distantes mediante RS-232

En este ejemplo se desea conectar una impresora de 40 columnas a un 87C51 mediante el bus
RS-232 (figura 9.5). El microcontrolador se utiliza en una aplicacin de etiquetaje, donde se
imprime un nmero asignado al producto y un texto determinado segn el tipo de producto.
Las etiquetas son autoadhesivas y se pegan al producto mediante un aplicador automtico.
87C51

Entrada de producto

/INT0

MC1488
RS-232

TXD
RXD

Impresora
RXD
TXD

P2.0
P2.1
P2.5

MC1489

Tipo de producto

GND
Fig. 9.5 Conexin de una impresora va RS-232

El control de la impresora se realiza mediante caracteres ASCII reservados para ello. El


microcontrolador iniciar la comunicacin con la impresora envindole el carcter ASCII STX
Start of text, que se corresponde con el nmero hexadecimal 02H. Tras este carcter se le puede
enviar un carcter de comando como LF, Line feed, (0AH); CAN, Cancel, (18H); ESC,
Escape, (1BH); carcter de impresin en negrita, cursiva, etc. Tras este comando, se le enva el
texto que se quiere imprimir en ASCII, y por ltimo el comando de impresin CR, Carriage
return, (0DH), por lo que se imprimir el texto transmitido.
En este ejemplo se trata tan slo de imprimir el texto PRODUCTO N: seguido de cuatro
cifras que identifican el tipo de producto. La aplicacin tiene un interruptor de final de carrera
como sensor de la llegada del producto conectado a la entrada de interrupcin /INT0. El

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

255

interruptor proporciona un 0 lgico cuando hay un producto a etiquetar y un 1 lgico cuando


no hay producto. La empresa tiene 64 tipos de productos diferentes, codificados con cuatro
cifras cada uno. Los cdigos de estos productos se han almacenado en la memoria de
programas. El microcontrolador recibe en el puerto P2 seis lneas de entrada que identifican el
tipo de producto, al mismo tiempo que se activa el interruptor final de carrera conectado a
/INT0.
El programa de este ejemplo se muestra a continuacin
;**************************************************************************
; Programa para la comunicacin y control de una impresora de 40 columnas
;**************************************************************************
ORG 0H
; Vectorizacin
LJMP Inicio
ORG 03H
LJMP RSI_INT0
ORG 023H
;Vectorizacin del puerto de comunicacin serie
LJMP RSI_RS
;**************************************************************************
; Rutina de Inicio
;**************************************************************************
Inicio: MOV SP, #30H
;Sita SP en la 30H
SETB IT0
;Interrupcin INT0 por flanco descendente
SETB EX0
;Habilita interrupcin INT0
SETB ES
;Habilita interrupcin del puerto de comunicacin serie
SETB SM1
;Configura la comunicacin serie en el modo 1
SETB REN
;Habilita la recepcin de un dato por el puerto serie
MOV TMOD, #20H
;Timer 1 en Modo 2, GATE=0 y C/T=0
MOV TL1, #0FDH
;Valor de TL1, para velocidad de 9600 baudios
MOV TH1, #0FDH
;Valor de recarga de Timer 1, para velocidad de 9600 baudios
SETB EA
;Habilita bit de interrupcin general
SETB TR1
;Pone marcha el Timer 1 (Genera la base de tiempos de la RS-232).
MOV R6, #01H
;R6 se utiliza para indicar que se puede transmitir
LJMP Principal
;Ir hacia rutina principal
;**************************************************************************
; Rutina de servicio de INT0
;**************************************************************************
RSI_INT0: MOV R7, #01
;R7=1 para indicar inicio de transmisin
RETI
;**************************************************************************
; Rutina de servicio del puerto serie
;**************************************************************************
RSI_RS: JNB TI, Recibe
;Si no interrumpe TI, entonces es RI
CLR TI
;Borra bit TI
RETI
Recibe: CLR RI
;Borra bit RI
RETI
;***************************************************************************
; Rutina Principal (R7 se emplea como indicador de final de conversin. R7=1 Conversin finalizada)
;***************************************************************************
Principal: CJNE R7, #01, Principal
;Bucle de espera a que R7 sea igual a 01H
MOV R7, #0
;Borra R6
MOV R1, P2
;Lee P2 para saber el tipo de producto
MOV A, R1
ANL A, #3FH
;Mscara con 3FH
MOV R1, A
ACALL Imprime_cod
;Realiza la lectura del A/D
SJMP Principal
;Bucle infinito

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

256

;**************************************************************************
; Subrutina de Impresin
;**************************************************************************
Imprime_cod: MOV R5, #14
;Nmero de caracteres del texto
MOV R0, #10H
;Pone direccin 10H en puntero
Imp_buc: CLR C
;Borra acarreo
MOV A, #14
;Pone dato 14 en A
SUBB A, R5
;Resta de 14-R5, contador de 0 a 14.
LCALL Tab_tex
;Toma un caracter del texto
MOV A, @R0
;Pone caracter ledo en memoria interna
INC R0
;Incrementa puntero
DJNZ R5, Imp_buc
;Realiza bucle hasta final de texto (14 caracteres)
Lee_cod: MOV A, R1
;Situado el texto, falta situar cdigo en la memoria
MOV B, #2
;Multiplica A por 2
MUL AB
PUSH A
;Guarda A en la pila
LCALL Tabla_cod
;Lee byte alto del cdigo
LCALL Bin_ASCII
;Llama a la rutina de conversin de binario a ASCII
MOV @R0, B
;Guarda B en la memoria
INC R0
;Incrementa puntero
MOV @R0, A
;Guarda A en la memoria
INC R0
;Incrementa puntero
POP A
;Recupera la situacin de producto en la tabla
INC A
;Posicin de byte bajo del cdigo en la tabla
LCALL Tabla_cod
;Lee byte bajo del cdigo
LCALL Bin_ASCII
;Llama a la rutina de conversin de binario a ASCII
MOV @R0, B
;Guarda B en la memoria
INC R0
;Incrementa puntero
MOV @R0, A
;Guarda A en la memoria
LCALL Print
;Salta a la subrutina de impresin
LJMP Principal
Tab_text: INC A
;Tabla con el texto a imprimir
MOVC A, @A+PC
RET
DB
PRODUCTO N:
Tabla_cod: INC A
;Tabla con los cdigos de los productos
MOVC A, @A+PC
;Lee tabla de cdigos
RET
DB 10H, 15H
;Cdigo del producto n 1
DB 25H, 46H
;Cdigo del producto n 2
DB 1AH, 1FH
;Cdigo del producto n 3
DB 78H, 22H
;Cdigo del producto n 1
...........
; ....................
...........
; ....................
DB 99H, 56H
;Cdigo del producto n 64
Print: MOV R0, #10H
;Pone puntero con direccin de buffer de impresin
MOV R5, #18
;Pone tamao de caracteres a imprimir
MOV A, #02H
;Pone caracter STX en A
LCALL Transmite
;Transmite dato
Print_buc: MOV A, @R0
;Lee texto del buffer de memoria
LCALL Transmite
;Transmite dato
INC R0
;Incrementa puntero
DJNZ R5, Print_buc
;Realiza bucle hasta enviar el buffer entero
MOV A, #0DH
;Pone caracter CR en A
LCALL Transmite
;Transmite caracter
LJMP Principal
;Regresa al bucle principal
Bin_ASCII: PUSH A
;Guarda A en la pila
ANL A, #0F0H
;Mscara. Borra los 4 bits bajos, mantiene los altos
SWAP A
LCALL Tab_BinASCII
MOV B, A
POP A
;Recupera A de la pila

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

257

ANL A, #0FH
;Mscara. Borra los 4 bit bajos
LCALL Tab_BinACSII
RET
Transmite: MOV SBUF, A
;Transmite dato contenido en A
RET
Tab_BinASCII: INC A
;Tabla de conversin de binario a ASCII
MOVC A, @A+PC
RET
DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H
DB 38H, 39H, 41H, 42H, 43H, 44H, 45H, 46H

En este programa se utiliza el registro R7 como indicativo de que ha entrado un producto. La


transmisin consiste en ir colocando los datos contenidos a partir de la posicin 10H de
memoria interna que se utiliza como buffer de datos para la transmisin. En total se transmiten
cada vez 18 caracteres: 14 caracteres correspondientes al texto y 4 caracteres correspondientes
al cdigo de cuatro cifras del producto.
El cdigo del producto se ha situado en la subrutina Tab_cod y est formado por dos bytes.
En el programa primero se lee el byte alto del cdigo en la tabla, que se desglosa en dos bytes
en formato ASCII: el primero corresponde a los 4 bits altos y el otro a los 4 bits bajos. Luego
se lee el byte bajo del cdigo, que se convierte a ASCII de la misma manera que el primer byte.
A la impresora se transmite primero el carcter STX (02H), seguido de 18 bytes, almacenados
en el buffer de memoria a partir de la posicin 10H y que corresponden al texto y al cdigo de
producto, y por ltimo el carcter CR (0DH), que hace que se impriman los datos transmitidos.
Para realizar la comunicacin se ha seleccionado una velocidad de 9.600 baudios; para ello se
configura el puerto serie en el modo 1, en el que se transmiten 10 bits: 1 bit de start, 8 bits del
dato y 1 bit de stop. El Timer 1 del microcontrolador se utiliza como base de tiempos para la
transmisin, por lo que debe estar configurado en el modo 2 de 8 bits con autorrecarga, con el
bit C/T a 0 lgico, con el bit SMOD a 0 lgico, con el valor FDH de recarga en el registro
TH1, y con una frecuencia de reloj de 11.059MHz.
Ejemplo 9.2 Comunicacin multipunto mediante RS-485
En la industria de la alimentacin es frecuente tener mltiples cmaras frigorficas en distintos
puntos de una nave industrial, o bien dentro de una misma rea comercial. La regulacin y la
monitorizacin de la temperatura en cada una de las cmaras frigorficas es de suma
importancia, especialmente en el sector de los congelados, donde es imprescindible controlar
en todo momento el estado de conservacin y la calidad de un producto.
En la figura 9.6 se propone una red de comunicacin basada en la norma RS-485, para realizar
el control y la monitorizacin entre un ordenador central que hace la funcin de maestro y las
cmaras frigorficas que hacen la funcin de esclavos. En esta aplicacin se ha escogido la
norma RS-485 porque es un sistema de transmisin diferencial que permite la comunicacin
bidireccional de hasta 32 equipos en un bus de datos comn, permite la transmisin a gran
distancia y a gran velocidad, y los emisores deben incorporar autoproteccin contra la
sobrecarga de acceso (es decir, la situacin de tener mltiples emisores intentando acceder al
mismo tiempo a la lnea de transmisin). Las principales caractersticas de la RS-485 son:

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

258

La mxima longitud de cable es de 1.200 metros.


La velocidad mxima de transmisin es de 10Mbits/seg.
Impedancia de entrada del receptor de 12k4.
Margen de modo comn de la entrada del receptor de -7V a +12V.
Sensibilidad de la entrada diferencial de 200mV en un margen de modo
comn de -7V a +12V.

La interfaz con el bus RS-485 se implementa con el circuito integrado DS3695 o el DS75176
de National Semiconductor, que tiene un transmisor y un receptor diferencial, cuyo estado se
controla con las entradas DE y /RE, respectivamente.
Cada una de las cmaras frigorficas tiene un circuito electrnico formado por un
microcontrolador 87C51, cuatro dgitos de siete segmentos donde se visualiza la temperatura
en grados centgrados de la cmara, un DS1620 de Dallas Semiconductor que hace de sensor
de temperatura y de acondicionador de seal, y un DS3695 para la interfaz RS-485 (figura 9.7).

Maestro
TXD
RXD

Esclavo 1
DS3695

Nodo 0

/RE

DI

RT

RO

Direccin

Nodo 1

+
_

DE

RXD

RO

DI

TXD

DE /RE

DS3695

Direccin

Direccin

DS3695
/RE

Nodo 2

DE

RXD

RO

DI

TXD

Esclavo 2
Direccin
DS3695
/RE

+
RT

DE

RXD
RO

Nodo N
D

DI

TXD

Esclavo N
Fig. 9.6 Red de comunicacin basada en la RS-485

Para realizar la comunicacin en la red se debe establecer un protocolo, en el que se definen


una serie de reglas con las que se gestionar la comunicacin entre las cmaras frigorficas y el

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

259

equipo maestro. Cada una de las conexiones en la red RS-485 se denomina nodo. Cada nodo
puede, mediante un protocolo, enviar o recibir mensajes o bloques de datos de la red.
87C51
DS1620

DS3695

RXD

RS-485

TXD
P1.1
Direccin

DE
/RE

Fig. 9.7 Componentes del circuito de una cmara frigorfica

Las funciones que deber realizar el circuito electrnico de cada una de las cmaras son
monitorizar la temperatura de la cmara en el visualizador de cuatro dgitos de siete segmentos
y transmitir la temperatura de la cmara al equipo maestro cada vez que ste se lo pida.
Para comprobar el estado de la red y de la interfaz con cada nodo, el equipo maestro enviar un
comando y un dato a cada uno de los esclavos, lo que forzar al esclavo a transmitir el dato
recibido al maestro. De esta forma el equipo maestro puede comprobar si hay alguna anomala
en la red o en la interfaz de un nodo determinado.
La red estar formada por un equipo central que har de maestro y por veinticinco esclavos. El
protocolo estar formado por tres bytes. El primer byte se corresponder con el nmero del
nodo destino de la transmisin. A cada nodo se le asignar un nmero: el nodo 0 se
corresponder con el nodo maestro y los nodos esclavos se numerarn consecutivamente como
nodo 1, nodo 2, , nodo 25. El segundo byte del protocolo ser el nmero del nodo que
origina el mensaje. Y, por ltimo, el tercer byte se corresponder con un comando ejecutable
por el nodo esclavo, que podr ser el carcter ASCII DC1 (11H) o DC2 (12H). El comando
DC1 indicar al nodo esclavo que debe transmitir los datos correspondientes a la temperatura al
nodo maestro, y el comando DC2 indicar que se va a hacer un chequeo de la lnea por parte
del nodo maestro.
La lectura de la temperatura en cada microcontrolador estar almacenada en las posiciones 20H
y 21H de la memoria interna. La posicin 20H contendr el byte de menor peso y la posicin
21H el byte de mayor peso. En consecuencia, cuando un nodo esclavo reciba el comando DC1,
le transmitir al nodo maestro estos dos bytes correspondientes a la temperatura de la cmara
frigorfica. El nodo esclavo, en este caso, transmitir un primer byte correspondiente al nmero
del nodo maestro (00H), un segundo byte que corresponde con el nmero del nodo esclavo y
los dos bytes correspondientes al valor de la temperatura de la cmara.
En el caso que un nodo esclavo reciba el comando DC2 de chequeo de la red, ste pasar a la
espera de un dato concreto que le debe transmitir el nodo maestro. Para ello, el nodo maestro

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

260

transmite un primer byte correspondiente al nmero del esclavo y un segundo byte que consiste
en la constante AAH.
A continuacin se muestra el programa que realiza la comunicacin de un microcontrolador
87C51 como el nodo esclavo nmero 2 de la red. En este programa no se considera el control
del DS1620 ni la visualizacin en los cuatro dgitos de siete segmentos de la figura 9.7. La
velocidad de comunicacin se ha configurado para 19.200 baudios, y se ha programado el
puerto serie en el modo asncrono 1, al igual que en el ejemplo anterior. El Timer 1 est
configurado en el modo 2 de 8 bits con autorrecarga, con el bit C/T a 0 lgico, con el bit
SMOD a 1 lgico, con el valor FDH de recarga en el registro TH1 y con 11.059MHz de
frecuencia de reloj.
;**************************************************************************
; Programa para la comunicacin del bus RS-485 del segundo mdulo esclavo
;**************************************************************************
; Declaracin de constantes y de variables
;**************************************************************************
ID_MOD
EQU #02H
;Nmero de identificacin de este mdulo
ID_Master
EQU #00H
;Nmero de identificacin del maestro
DC1
EQU #11H
;Valor del comando DC1
DC2
EQU #12H
;Valor del comando DC2
Orden_in
EQU 10H
;Variable que indica el n de byte recibido
Haz_Eco
EQU 13H
;Variable que indica el la accin de eco
Dato_Eco
EQU 14H
;Variable que contendr el dato enviado por el maestro
Temp_bajo
EQU 20H
;Variable que contiene el byte bajo de la temperatura
Temp_alto
EQU 21H
;Variable que contiene el byte bajo de la temperatura
;**************************************************************************
; ; Rutina de Vectorizacin
;**************************************************************************
ORG 0H
LJMP Inicio
ORG 023H
;Vectorizacin del puerto de comunicacin serie
LJMP RSI_RS
;**************************************************************************
; Rutina de Inicio
(Configuracin de la comunicacin a 19200 baudios)
;**************************************************************************
Inicio: MOV Orden_in, #0
;Pone a 0
MOV Orden_out, #0 ;Pone a 0
MOV Orden_tx, #0
;Pone a 0
MOV SP, #30H
;Reubica el Stack Pointer
CLR P1.1
;Establece el sentido RS-485 en recepcin
SETB ES
;Habilita interrupcin del puerto de comunicacin serie
ORL PCON, #80H
;Pone el bit 7 de PCON, bit SMOD, a 1 lgico
SETB SM1
;Configura la comunicacin serie en el modo 1
SETB REN
;Habilita la recepcin de un dato por el puerto serie
MOV TMOD, #20H ;Timer 1 en Modo 2, GATE=0 y C/T=0
MOV TL1, #0FDH
;Valor de TL1, para velocidad de 19200 baudios
MOV TH1, #0FDH
;Valor de recarga de Timer 1, para velocidad de 19200 baudios
SETB EA
;Habilita bit de interrupcin general
SETB TR1
;Pone marcha el Timer 1 (Genera la base de tiempos de la RS-485)
LJMP Principal
;Ir hacia rutina principal
;**************************************************************************
; Rutina de servicio del puerto serie
;**************************************************************************
RSI_RS:
JNB TI, Recibe
;Si no interrumpe TI, entonces es RI
CLR TI
;Borra bit TI
RETI

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie


Recibe:

Es_byte2:
S_byte1:

S_byte2:

S_byte3:

Es_DC2:

Es_Eco:

Abortar:
Salir:

261
MOV A, SBUF
;Lee dato recibido
CJNE Orden_in, #0, Es_byte2
;Identifca si se recibe el 1, el 2 o el 3 byte
SJMP S_byte1
CJNE Orden_in, #01, S_byte3
;Si no es el byte1 ni el byte2, entonces es el byte3
SJMP S_byte2
CJNE A, ID_MOD, Salir
;Comprueba que sea este mdulo, si no es sale
INC Orden_in
;Incrementa contador. Pasa a la espera del siguiente byte
SJMP Salir
CJNE A, ID_Master, Salir
;Comprueba que le enva el mensaje el mod. maestro
INC Orden_in
;Incrementa contador. Pasa a la espera del siguiente byte
SJMP Salir
CJNE A, DC1, Es_DC2
;Comprueba que sea el comando DC1 o DC2
MOV Orden_in, #0
;Inicializa contador
MOV Orden_tx, #01H
;Da la orden de transmitir la temperatura de la cmara
SJMP Salir
CJNE A, DC2, Es_Eco
;Comprueba que sea el comando DC2. Si no, aborta
MOV Orden_in, #0
;Inicializa contador
MOV Haz_Eco, #01H
;Activa el eco. Pasa a la espera del caracter de eco
SJMP Salir
CJNE Haz_Eco, #01H, Abortar
;Aborta la recepcin
MOV Dato_Eco, A
;Guarda dato recibido en memoria, para transmitirlo
MOV Orden_tx, #02H
;Da la orden de transmitir el dato recibido
MOV Haz_Eco, #0
;Borra indicador de eco
MOV Orden_in, #0
;Inicializa contador
CLR RI
RETI

;***************************************************************************
; Rutina Principal
;***************************************************************************
Principal: CJNE Orden_tx, #0, Es_trans_1
;Comprueba si se debe transmitir la
SJMP Principal
;temperatura
Es_trans_1: CJNE Orden_tx, #01H, Es_trans_2
;Comprueba si debe transmitir Eco
MOV Orden_tx, #0
;Borra variable
LCALL Trans_temp
;Transmite la temperatura
SJMP Principal
Es_trans_2: MOV Orden_tx, #0
;Borra variable
LCALL Trans_Eco
;Transmite el dato recibido
SJMP Principal
;***************************************************************************
; Subrutina Trans_temp para la transmisin de la temperatura
;***************************************************************************
Trans_Temp: MOV A, ID_Master
;Carga n de identificacin del maestro
LCALL Transmite
MOV A, ID_MOD
;Carga el n de identificacin de este mdulo
LCALL Transmite
MOV A, Temp_alto
;Carga el byte alto de la temperatura leda por el .C
LCALL Transmite
MOV A, Temp_bajo
;Carga el byte bajo de la temperatura leda por el .C
LCALL Transmite
RET
;***************************************************************************
; Subrutina Trans_Eco para Eco con el dato enviado por el .C
;***************************************************************************
Trans_Eco:
MOV A, ID_Master
;Carga n de identificacin del maestro
LCALL Transmite
MOV A, ID_MOD
;Carga el n de identificacin de este mdulo
LCALL Transmite
MOV A, Dato_Eco
;Carga el dato a enviar de Eco
LCALL Transmite
RET

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

262
Transmite: SETB P1.1
MOV SBUF, A
CLR P1.1
RET

;Establece el sentido RS-485 en transmisin


;Transmite dato contenido en A
;Establece el sentido RS-485 en recepcin

La rutina principal est continuamente pendiente de la operacin con el nodo maestro, que
viene indicada por la variable Orden_tx. Esta variable puede valer 01H cuando se debe
transmitir la temperatura leda por el microcontrolador, o bien 02H cuando debe transmitir el
dato recibido por parte del nodo maestro.
Las entradas DE y /RE del DS3695 determinan el sentido de la comunicacin con la red, y
ambas estn conectadas a la patilla P1.1 (figura 9.7), de manera que cuando P1.1 est a 0
lgico el DS3596 est configurado para recibir datos y a 1 lgico para transmitir datos. El
terminal P1.1 establece el sentido de la comunicacin.
En la rutina de RSI del puerto serie se utiliza la variable Orden_in como contador de 0 a 2 que
indica el orden del byte recibido por parte del nodo maestro. El protocolo establece que, para
dirigirse al microcontrolador del ejemplo (nodo 2), el nodo maestro debe transmitir el dato 02H
(destino del mensaje), el dato 00H (origen del mensaje) y un comando de orden que puede ser
DC1 o DC2. En el caso de recibir el carcter DC2, la rutina de RSI inicializa la variable
Orden_in y pasa a la espera del dato que se debe transmitir como eco. En el caso de que el
destino de la comunicacin no sea este nodo, o bien que el origen de la comunicacin no sea el
nodo maestro, el proceso obviar los datos recibidos, y pasar a la espera de un mensaje del
nodo maestro.

9.5 La comunicacin serie en la MCS-251


El puerto de comunicacin serie permite realizar comunicaciones en serie en modo sncrono y
asncrono. En concreto dispone de un modo de operacin sncrono, el modo 0, y de tres modos de
comunicacin asncronos full-duplex, los modos 1, 2 y 3, con velocidades de transmisin
programables. Asimismo, implementa un sistema de deteccin de errores y de reconocimiento de
direcciones, que permite la comunicacin, a travs del canal serie, entre varios microcontroladores.
En el modo 0, slo se permite una velocidad de transmisin, mientras que en el modo 2 es posible
programar dos velocidades de transmisin. En cambio, en los modos 1 y 3 se pueden programar
distintas velocidades de transmisin, generadas por los Timers 1 y 2.
En la tabla 9.5 se muestran las seales asociadas al puerto de comunicacin serie. Bsicamente
consiste en dos pines: TXD para transmitir datos y RXD para recibir datos.
Tabla 9.5 Seales asociadas al puerto de comunicacin serie
Nombre pin
TXD

RXD

Tipo
Descripcin
O
Transmisin de datos. En modo 0, TXD genera la seal de reloj que
sincroniza la transmisin. En los modos 1, 2 y 3, es el pin de transmisin
de datos serie.
I/O Recepcin de datos. En modo 0, RXD transmite y recibe los datos en
serie. En los modos 1, 2 y 3, es el pin de recepcin de datos en serie.

Los autores, 2001; Edicions UPC, 2001.

Ubicacin
P3.1

P3.0

9 Puerto de comunicacin serie

263

En la tabla 9.6 se muestran los registros asociados al puerto de comunicacin serie. El registro SBUF
almacena el dato recibido o enviado por el puerto serie. El registro SCON permite programar las
caractersticas de funcionamiento del puerto serie y los registros SADDR y SADEN estn
relacionados con la configuracin de la direccin del puerto serie en el caso de que se trabaje en
entornos multiprocesador.
Tabla 9.6 Registros asociados al puerto de comunicacin serie
Mnemnico
SBUF
SCON
SADDR
SADEN

Descripcin
Buffer del puerto serie. Este registro est compuesto por dos registros: en uno se
carga el dato recibido y en el otro se almacena el dato enviado.
Registro de control del puerto serie. Este registro permite programar las
prestaciones de funcionamiento del puerto serie.
Direccin del puerto serie. Define la direccin individual del dispositivo esclavo.
Habilitacin de la direccin del puerto serie. Especifica el byte de mscara que se
utiliza para definir la direccin de un dispositivo esclavo.

Direccin
S:099H
S:098H
S:0A8H
S:0B8H

En la tabla 9.7 se indica brevemente la funcin de cada uno de los bits del registro SCON.
Tabla 9.7 Registro de control del puerto de comunicacin serie

SCON
b7
FE/SM0
Bit
7

Direccin: S:098H
b6
b5
SM1
SM2

Mnemnico
FE

SM0
6

SM1

SM2

REN

TB8

RB8

TI

RI

b4
REN

Valor de Reset: 0000 0000b


b3
b2
b1
TB8
RB8
TI

b0
RI

Funcin
Bit de Frame Error. Para seleccionar esta opcin de funcionamiento se debe colocar a
1 lgico el bit SMOD0 del registro PCON. En este caso, el bit FE se pone a 1 cuando
se detecta un error en el bit de stop del dato recibido.
Bit 0 del modo del puerto serie. Para seleccionar esta opcin se debe poner a 0 el bit
SMOD0. Los bits SM0 y SM1 permiten seleccionar el modo de trabajo del puerto.
Bit 1 de modo del puerto serie. Programando adecuadamente los bits SM0 y SM1 se
puede seleccionar el modo de trabajo del puerto serie.
SM0 SM1 Modo
0
0
0
0
1
1
1
0
2
1
1
3
Bit 2 de modo del Puerto Serie. Este bit permite habilitar, o no, la comunicacin serie
en entornos multiprocesador.
Bit de habilitacin de recepcin. Este bit se pone a 1 lgico para habilitar la
recepcin, y se pone a 0 lgico, para habilitar la transmisin.
Bit 8 del dato transmitido.
En los modos 2 y 3, se escribe en este bit el valor del noveno bit que se transmite.
Bit 8 del dato recibido. En el modo 1 este bit adquiere, automticamente, el valor del
bit de stop recibido, si SM2=0. En los modos 2 y 3, este bit adquiere automticamente
el valor del noveno bit recibido si SM2=0.
Flag de interrupcin en transmisin. Este bit se pone a 1 lgico cuando finaliza la
transmisin del dato. Se debe borrar por programa.
Flag de interrupcin en recepcin. Este bit se pone a 1 lgico despus de recibir un
dato. Debe ponerse a cero por programa.

En la figura 9.8 se observa el esquema del puerto de comunicacin serie. Este perifrico incorpora un
registro denominado SBUF que almacena el dato a transmitir o el dato recibido. Fsicamente este
registro est compuesto por dos registros distintos, un registro conectado al pin TXD, que almacena el

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

264

dato a transmitir, y otro registro conectado al pin RXD, a travs de un registro de desplazamiento, que
almacena el dato recibido por el puerto serie. Esta duplicidad de registros permite poder transmitir y
recibir datos al mismo tiempo (comunicacin full-duplex).
IB bus

Escribir SBUF

Leer SBUF

TxD

SBUF
transmisin

SBUF
recepcin

Modo 0
transmisin

Cargar SBUF

SBUF
Registro de
desplazamiento

RxD

Peticin de
interrupcin
RI

TI
SCON
Control del
puerto serie

Fig. 9.8 Diagrama de bloques del puerto de comunicacin serie

9.6 Modos de operacin


El puerto de comunicacin serie soporta cuatro modos de operacin distintos: uno sncrono, el modo
0, y tres asncronos, los modos 1, 2 y 3.

9.6.1 Modo 0 o sncrono


Para programar el puerto de comunicacin serie en modo cero hay que colocar los bits SM0 y SM1
del registro SCON, a cero lgico. En este modo la velocidad de transmisin de datos es FOSC/12 y la
transmisin-recepcin de datos se produce a travs del pin RXD, mientras que por el pin TXD se
genera la seal de reloj que sincroniza la transmisin. Los ocho bits del dato se transmiten y se reciben
comenzando por el bit de menor peso, LSB, y acabando por el bit de mayor peso, MSB.
Para transmitir un dato hay que poner a cero el bit REN del registro SCON y escribir en el registro
SBUF el dato a transmitir. La transmisin se inicia cuando se ejecuta la instruccin de escritura en el
registro SBUF.
En la figura 9.9 se muestra el cronograma correspondiente a la transmisin de un dato. La transmisin
comienza por el bit de menor peso del dato a transmitir, D0, en el estado S6P2 del ciclo de perifrico
que viene a continuacin de la ejecucin de la instruccin SBUF. En el estado S3P1 del siguiente ciclo
de perifrico, la salida TXD pasa a cero para generar el primer pulso de la seal de reloj que
sincroniza la transmisin. Este flanco de bajada en TXD se utiliza para comunicar al receptor que ya

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

265

hay un bit vlido en el pin RXD. En cada ciclo de perifrico se transmite un nuevo bit hasta acabar
con el bit de mayor peso, D7. Al finalizar la transmisin, la lnea RXD se queda con el valor 1 lgico
y se activa el flag de interrupcin TI.
TXD
S3P1

S6P1

Escribir
en SBUF
S6P2
Registro
S6P2
RXD

D0
S6P2

S6P2
D1

D2

S6P2
D6

S6P2
D7

S6P2

TI
S1P1

Fig. 9.9 Temporizacin del puerto serie transmitiendo en modo cero

En la figura 9.10 se muestra el cronograma correspondiente a la recepcin de un dato. El proceso de


recepcin comienza cuando se escribe en el registro SCON la combinacin binaria que pone los bits
SM0, SM1 y RI a cero y el bit REN a 1 lgico. Un ciclo de perifrico despus de ejecutada esta
instruccin, en el estado S3P1, la salida TXD pasa a 0 lgico para generar el primer pulso de la seal
de reloj que sincroniza la recepcin. Este flanco de bajada avisa al dispositivo transmisor para que
coloque en la entrada RXD el primer bit, D0, del dato a transmitir. El microcontrolador lee el bit
suministrado por el transmisor en el estado S5P2 de ese mismo ciclo de perifrico e introduce el bit
ledo en el registro de recepcin en el estado S6P2. Despus de haber ledo los ocho bits del dato se
activa el flag de interrupcin RI del registro SCON. El dato recibido se puede leer ejecutando una
instruccin de lectura del registro SBUF.
TXD
S3P1
Escribir
en SCON

S6P1

REN = 1, RI = 0

S6P2
Registro
S6P2
D0

S6P2
D1

S6P2
D6

S6P2
D7

RXD
S6P2

S6P2
S5P2

RI
S1P1

Fig. 9.10 Temporizacin del puerto serie recibiendo en modo cero

Ejemplo 9.3 Comunicacin va serie entre un 8XC251Sx y un perifrico en modo 0


En este ejemplo se trata de disear una rutina que controle la transmisin a un perifrico, a
travs del puerto serie, de los datos almacenados entre las direcciones 50H y 60H de la
memoria del microcontrolador 8XC251Sx.
El perifrico dispone de un registro de desplazamiento con entrada serie y salida paralelo, para
recibir los datos que le enva el puerto serie programado en modo cero. La entrada serie del
registro de desplazamiento se conecta a la salida de datos del puerto serie (pin P3.0 o RXD),

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

266

mientras que la entrada de reloj se conecta al pin P3.1, para poder sincronizar la carga de datos
en el registro de desplazamiento con la seal de reloj del puerto serie (figura 9.11).
Perifrico

8XC251Sx

Registro de desplazamiento
P3.0
P3.1

TXD

Entrada serie

Seal de reloj

Reloj

Salida paralelo

Fig. 9.11 Conexin del microcontrolador al perifrico a travs del puerto serie

El programa debe comenzar con instrucciones que configuren el puerto de comunicacin serie
en modo 0 y habilitado para transmitir.
Si se realiza el control del puerto serie mediante interrupciones, se debe habilitar la
interrupcin de este perifrico y disear una rutina de servicio de interrupcin del puerto serie
que enve un dato cada vez que se active el flag TI. Para recorrer el margen de posiciones de
memoria que contienen los datos a transmitir se utiliza un registro como puntero de memoria
inicializado con el valor 50H. Si la frecuencia de la seal de reloj del microcontrolador es, por
ejemplo, de 12MHz, la velocidad de transmisin en este modo es de 1Mbaud.
A continuacin se presenta el listado del programa principal y de la rutina de servicio a la
interrupcin del puerto serie.
;------------------------------------------------------------------------------------------------------------;
PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE
;------------------------------------------------------------------------------------------------------------ORG FF:0000H
; Se salta a una zona de memoria con espacio suficiente
JMP INICIO
; para almacenar las instrucciones del programa principal.
ORG FF:0500H
; Programacin del puerto serie
INICIO: CLR SM1
; Se programa el puerto serie en modo 0.
CLR SM0
;
CLR REN
; Se habilita la transmisin por el puerto serie.
SETB ES
; Se habilita la interrupcin del puerto serie.
SETB EA
; Se activa el bit habilitador de interrupciones.
SETB INTR
; Cuando la CPU vectorice una interrupcin cargar en
; la pila los 3 bytes del PC y el registro de estado.
; Inicializacin del puntero
MOV R0, #50H
; Se inicializa el registro R0 con el valor 50H.
MOV SBUF,R0
; Se enva el primer dato de la zona de memoria por el puerto serie.
;------------------------------------------------------------------------------------------------------------;
RUTINA DE SERVICIO A LA INTERRUPCION DEL PUERTO SERIE
;------------------------------------------------------------------------------------------------------------ORG FF:0023H
; Vector de interrupcin del puerto serie.
JMP RSI_PS
; Se salta a una zona de memoria con espacio suficiente
; para almacenar las instrucciones de la rutina.
ORG FF:1000H
RSI_PS: CLR TI
; Se borra el flag TI.
INC R0
; Se incrementa el puntero R0.
MOV SBUF,R0
; Se enva el dato por el puerto serie.
CMP R0,#60H
; Se compara el contenido del puntero con la ltima
; posicin de memoria de la zona a transmitir.

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

267

JNE CONT

; Si todava no se han enviado todos los datos se retorna


; al programa principal.
; Si se ha terminado la transmisin se borra el flag de
; interrupcin del puerto serie.
; Se retorna al programa principal.

CLR ES
RETI

9.6.2 Modos 1, 2 y 3. Modos asncronos


Cuando se programa el puerto de comunicacin serie en alguno de los modos asncronos, se pueden
enviar datos, a travs de la lnea TXD, y recibir datos, a travs de la lnea RXD, de forma simultnea.
En la figura 9.12 est representada la trama del dato que se transmite en los modos asncronos, los
modos 1, 2 y 3.
D0

D1

D2

D3

D4

D5

D6

D7

D8

Dato
Bit de Start

Noveno bit (slo modos 2 y 3)


Bit de Stop

Fig. 9.12 Trama de datos para los modos 1, 2 y 3

a) Modo 1
En el modo 1, la trama de datos est compuesta de 10 bits: hay un primer bit de start o comienzo del
dato, que vale cero lgico, e indica el comienzo de la transmisin del dato; a continuacin vienen los 8
bits del dato a transmitir y finalmente el bit de stop, que siempre vale 1 lgico.
Para enviar un dato en modo 1 basta con poner a cero el bit REN, bit 4 del registro SCON y, a
continuacin, escribir en el registro SBUF el dato que se desea enviar. La transmisin comienza una
vez escrito el dato en el registro SBUF.
Para recibir un dato en modo 1, en primer lugar se debe habilitar la recepcin poniendo a 1 lgico el
bit REN. La recepcin comienza cuando se detecta un flanco de bajada en el pin RXD.
La velocidad de transmisin en el modo 1 depende de la velocidad de desbordamiento del Timer 1 y/o
del Timer 2. Se puede seleccionar cualquiera de ellas o ambos Timers para fijar la velocidad de
transmisin y/o recepcin. El Timer que fija por defecto la velocidad de transmisin es el Timer 1, y
sta viene dada por la frmula siguiente, en baudios o bits/s:
Velocidad de transmisin: 2SMOD1 Velocidad de rebasamiento del Timer 1 [baudios]
32
Si se desea utilizar el Timer 1 como generador de baudios, se debe inhibir la interrupcin del Timer 1,
poniendo a cero el bit ETI del registro IE0 y se debe configurar como contador o como temporizador
en el modo de trabajo que se desee. En muchas aplicaciones se configura el Timer 1 como
temporizador en el modo 2. En este caso, la velocidad de transmisin depender del valor cargado
inicialmente en el registro del Timer 1, TH1:
Velocidad de transmisin: 2SMOD1

FOSC
[baudios]
32 12 ]256 TH1

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

268

Tabla 9.8 Timer 1 como generador de baudios para los modos 1 y 3 del puerto serie
Frecuencia
Oscilador
12.0 MHz
11.059 MHz
11.059 MHz
11.059 MHz
11.059 MHz
11.059 MHz
11.059 MHz
6.0 MHz
12.0 MHz

Baudios
62.5 Kbaud (Max)
19.2 Kbaud
9.6 Kbaud
4.8 Kbaud
2.4 Kbaud
1.2 Kbaud
137.5 Baud
110.0 Baud
110.0 Baud

SMOD1
1
1
0
0
0
0
0
0
0

C/T
0
0
0
0
0
0
0
0
0

Timer 1
Modo Valor recarga
2
FFH
2
FDH
2
FDH
2
FAH
2
F4H
2
E8H
2
1DH
2
72H
1
FEEBH

Se pueden obtener velocidades de transmisin bajas configurando el Timer 1 en modo 1, habilitando


su interrupcin e inicializndolo, adecuadamente, en la rutina de servicio a la interrupcin. Si por
ejemplo, la frecuencia de reloj es de 12MHz y se recarga el Timer 1 en la rutina de interrupcin con el
valor FEEBH, se consigue fijar la velocidad de transmisin en 110.0 Baudios. Con otros valores de
recarga se pueden conseguir velocidades ms bajas.
El Timer 2 tiene un modo de funcionamiento especfico, denominado Baud Rate Generator Mode,
utilizado para fijar la velocidad de transmisin o de recepcin de datos por el puerto serie. Para
seleccionar el Timer 2 como generador de baudios, en transmisin y/o recepcin, se deben programar
adecuadamente los bits RCLCK y TCLCK del registro T2CON, tal y como se muestra en la tabla 9.9.
Tabla 9.9 Seleccin del Timer 2 como generador de baudios

RCLCK

TCLCK

0
0
1
1

0
1
0
1

Generador de baudios Generador de baudios


en recepcin
en transmisin
Timer 1
Timer 1
Timer 2
Timer 2

Timer 1
Timer 2
Timer 1
Timer 2

Cuando el Timer 2 se selecciona como generador de baudios funciona de forma similar al modo
autorrecarga. Al sufrir desbordamiento, los registros TH2 y TL2 se recargan con el valor de los
registros RCAP2H y RCAP2L, que se inicializan por programa. La velocidad de transmisin depende
de los valores cargados en estos registros:
Velocidad de transmisin:

FOSC
32 ]65536

(RCAP2H , RCAP2L )

[baudios]

En la figura 9.13 se muestra el esquema del Timer 2 configurado en modo generador de baudios. En la
tabla 9.10 se indican distintas velocidades de transmisin de acuerdo con los valores de los registros
RCAP2H y RCAP2L.

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

269
2

Rebasamiento
del Timer 1

0
1

SMOD1
XTAL1

TH2
(8 bits)

TL2
(8 bits)

16

RX
Clock

16

TX
Clock

0
T2

TR2

RCLCK

C/T2
1
0
RCAP2H RCAP2L

TCLCK
Peticin de
interrupcin

T2EX

EXF2

EXEN2

Fig. 9.13 Esquema del Timer 2 trabajando en el modo generador de Baud Rate
Tabla 9.10 Timer 2 como generador de baudios para los modos 1 y 3 del puerto serie

Baudios

Frecuencia oscilador

RCAP2H

RCAP2L

12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
12.0 MHz
6.0 MHz
6.0 MHz

FFH
FFH
FFH
FFH
FEH
FBH
F2H
FDH
F9H

FFH
D9H
B2H
64H
C8H
1EH
AFH
8FH
57H

375.0 Kbaud
9.6 Kbaud
4.8 Kbaud
2.4 Kbaud
1.2 Kbaud
300.0 baud
110.0 baud
300.0 baud
110.0 baud

Ejemplo 9.4 Comunicacin va serie entre dos microcontroladores 8XC251Sx en modo 1


En este ejemplo se trata de disear un canal de comunicacin que transmita, va serie entre dos
puntos remotos, datos de 8 bits. Para implementar este sistema se utilizan dos
microcontroladores de la serie 8XC251Sx. Uno de ellos, denominado emisor, recibe un dato de
entrada a travs de un canal paralelo de 8 bits que est conectado al puerto P1 y lo enva a
travs del puerto de comunicacin serie a otro microcontrolador 8XC251Sx, denominado
receptor, que lo recibe y lo reenva en formato paralelo por el puerto P1 (figura 9.14). Para
indicar que hay un nuevo dato en el puerto P1, listo para ser ledo por el microcontrolador
emisor, se activa la entrada de interrupcin externa cero con un flanco negativo.

Dato vlido
de entrada

Emisor

Receptor

8XC251Sx

8XC251Sx

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

TXD
P3.1

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

RXD
P3.0

P2.0

INT0

Fig. 9.14 Esquema del canal de comunicacin

Los autores, 2001; Edicions UPC, 2001.

Dato vlido
de salida

Microcontroladores MCS-51 y MCS-251

270

El microcontrolador receptor (figura 9.14) tambin dispone de una salida de dato vlido
ubicada en el pin P2.0. Por esta salida se genera un pulso positivo para indicar que ya est
disponible en el puerto P1 un nuevo dato recibido por el puerto serie.
Para realizar la transmisin, se programa en modo 1 el puerto serie de los dos
microcontroladores, con una velocidad de transmisin/recepcin de 9.600 baudios.
Esta aplicacin requiere el diseo de dos rutinas, una rutina de envo de datos, para el
microcontrolador emisor, y una rutina de recepcin para el microcontrolador receptor.
La rutina del emisor comienza programando el puerto serie en modo 1. A continuacin se debe
habilitar la interrupcin externa cero, programar el Timer 1 como temporizador en modo 2 e
inicializar adecuadamente los registros TH1 y TL1 para que la velocidad de transmisin sea de
9.600 baudios. Si consideramos que la frecuencia de la seal de reloj es de 11.059MHz y que el
bit SMOD1 est a 0 lgico, se debe cargar el valor FDH en TH1 y TL1 para obtener una
velocidad de transmisin de 9.600 baudios.
Por otra parte, la rutina de servicio a la interrupcin /INT0 incluye instrucciones que ejecutan
el envo del dato ledo en el puerto P1 por el puerto serie. En cualquier caso, se debe garantizar
que no se enviar un nuevo dato hasta que no finalice la transmisin del dato en curso. Por este
motivo, se chequea de forma reiterada el bit TI mientras ste valga 0 lgico. Cuando termine la
transmisin del dato, este bit pasar a 1 lgico, y finalizar la rutina de servicio a la
interrupcin /INT0.
A continuacin se presenta el listado del programa principal y de la rutina de servicio a la
interrupcin externa cero del microcontrolador emisor.
;------------------------------------------------------------------------------------------------------------;
PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE
;------------------------------------------------------------------------------------------------------------ORG FF:0000H
;
JMP TRSER
; Salto al programa principal.
ORG FF:0100H
; Programacin del puerto serie
TRSER:
SETB SM1
; Se programa el puerto serie en modo 1.
CLR SM0
;
CLR REN
; Se habilita la transmisin por el puerto serie.
; Programacin del Timer 1
MOV TMOD,#20H ; Se programa el Timer 1 en modo 2, como
MOV TL0,#FDH
; temporizador y se inicializa con el valor FDH para que
MOV TH0,#FDH
; la velocidad de transmisin sea de 9,6Kbaud.
CLR SMOD1
; Se pone a cero el bit SMOD1.
; Programacin de la interrupcin /INT0
SETB EX0
; Se habilita la interrupcin /INT0.
SETB EA
; Se activa el bit habilitador de interrupciones.
SETB INTR
; Para cargar en la pila 3 bytes del PC y el registro de estado.
SETB IT0
; Interrupcin /INT0 activa por flanco descendente.
;------------------------------------------------------------------------------------------------------------;
RUTINA DE SERVICIO A LA INTERRUPCION /INT0
;------------------------------------------------------------------------------------------------------------ORG FF:0003H
; Vector de interrupcin de /INT0.
JMP RSI_INT0
; Salto a la rutina de RSI.
ORG FF:2000H
RSI_INT0:
MOV R0,P1
; Se carga el dato del puerto P1 en el registro R0.

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

SIGUE:

271
MOV SBUF,R0
JNB TI,SIGUE
CLR TI
RETI

; Carga el dato en SBUF para comenzar la transmisin serie.


; Bucle de espera mientras dura la transmisin del dato.
; Se borra el flag TI.
; Se retorna al programa principal.

La rutina del receptor tiene en comn con la del emisor la programacin del Timer 1 y la
programacin del puerto serie, excepto en el bit REN, que debe ponerse a 1 lgico para
habilitar la recepcin. La rutina tambin incluye instrucciones que detectan cundo se ha
recibido un nuevo dato mediante el chequeo continuo del bit RI. Cuando se active este bit, se
cargar el dato recibido, que est ubicado en el registro SBUF, en el puerto P1, al mismo
tiempo que se generar un pulso positivo en la salida P2.0.
A continuacin se presenta el listado del programa que controla el funcionamiento del
microcontrolador receptor.
;------------------------------------------------------------------------------------------------------------;
PROGRAMA PRINCIPAL DE LA TRANSMISION SERIE
;------------------------------------------------------------------------------------------------------------ORG FF:0000H
; Programacin del puerto serie
SETB SM1
; Se programa el puerto serie en modo 1.
CLR SM0
;
SETB REN
; Se habilita la recepcin por el puerto serie.
; Programacin del Timer 1
MOV TMOD,#20H
; Se programa el Timer 1 en modo 2, como
MOV TL0,#FDH
; temporizador y se inicializa con el valor FDH para que
MOV TH0,#FDH
; la velocidad de transmisin sea de 9,6Kbaud.
CLR SMOD1
; Se pone a cero el bit SMOD1.
; Control de la recepcin de datos por el puerto serie.
SIGUE: JNB RI,SIGUE
; Bucle de espera hasta que no se reciba un nuevo dato por el puerto serie.
CLR RI
; Se borra el flag RI.
MOV R0,SBUF
; Se carga el dato recibido en el registro R0.
MOV P1,R0
; Se carga el dato en el registro P1.
SETB P2.0
; Se genera un pulso positivo por el pin P2.0 para
CLR P2.0
; indicar que hay un nuevo dato en el puerto P1.
JMP SIGUE
; Salta a la instruccin de chequeo de RI para detectar la recepcin de un nuevo dato.

b) Modo 2
Cuando el puerto serie est programado en el modo 2, la trama de bits que se transmite o se recibe est
compuesta por 11 bits: 1 bit de start, 8 bits de datos, comenzando siempre por el bit de menor peso, un
noveno bit programable por el usuario y un bit de stop. Los datos se transmiten por el pin TXD y se
reciben por el pin RXD. En la transmisin, el noveno bit transmitido se corresponde con el valor del
bit TR8 del registro SCON, mientras que en la recepcin, el noveno bit se almacena en el bit RB8 del
dicho registro.
El procedimiento para transmitir en modo 2 comienza seleccionando el modo de trabajo; a
continuacin se pone a 0 lgico el bit REN, se escribe el bit TR8 con el valor del noveno bit a
transmitir y se carga en el registro SBUF el dato que se desea enviar por el puerto serie. La
transmisin comienza justo despus de escribir el registro SBUF.
La recepcin se produce cuando se recibe un flanco descendente por el pin RXD, mientras el bit REN
est a 1 lgico. En este modo de trabajo, slo se permiten dos velocidades de transmisin/recepcin,
dependiendo del valor del bit SMOD1:

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

272

Velocidad puerto serie: 2 SMOD1 FOSC [baudios]


64
c) Modo 3
El modo 3 del puerto serie es similar al modo 2, con la nica diferencia que la velocidad de
transmisin/recepcin se obtiene de la misma manera que en el modo 1.

9.7 Deteccin de errores


El puerto de comunicacin serie permite detectar errores en la recepcin del bit de stop para los
modos de trabajo 1, 2 y 3. Para ello, basta poner a 1 lgico el bit SMOD0, que est ubicado en el
registro PCON. Cuando esta opcin est habilitada, el puerto serie verifica el bit de stop de cada dato
recibido: cuando este bit es errneo se pone a 1 lgico, automticamente, el bit FE del registro SCON.
Si se utiliza este recurso, se deben incluir en el programa instrucciones que examinen el bit FE cada
vez que se reciba una dato, para detectar posibles errores. Una vez activo, el bit FE slo se puede
borrar por programa, por lo que se deben incluir instrucciones especficas que borren el bit FE cada
vez que se ponga a 1 lgico.

9.8 Comunicacin multiprocesador


Los modos de trabajo 2 y 3 posibilitan la comunicacin, en entornos multiprocesador, a travs del
puerto serie. Esta prestacin permite el control de la comunicacin serie en un sistema donde varios
procesadores, que actan como esclavos, comparten la misma lnea de comunicacin serie junto con
un procesador maestro que realiza el control de la comunicacin. Para habilitar la opcin de
comunicacin multiprocesador, se debe poner a 1 lgico el bit SM2 del registro SCON.
En la figura 9.15 se muestra un ejemplo de entorno de comunicacin multiprocesador, donde se puede
observar que el pin de transmisin serie, TXD, del microcontrolador que acta de maestro, est
conectado al pin de recepcin serie, RXD, de los microcontroladores esclavos, mientras que el pin
RXD del maestro est conectado al pin TXD de los esclavos. Por otra parte, cada microcontrolador
dispone de una direccin que lo identifica y que posibilita al microcontrolador maestro comunicarse
con un microcontrolador esclavo concreto.
8XC251

8XC251

8XC251

8XC251

Maestro

Esclavo

Esclavo

Esclavo

TXD RXD

TXD RXD

TXD RXD

TXD RXD

Fig. 9.15 Comunicacin en entorno multiprocesador

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

273

Para que llevar a cabo la comunicacin va serie en un entorno multiprocesador, todos los
microcontroladores esclavos deben tener su bit SM2 a 1 lgico. En estas condiciones, cuando el
microcontrolador que acta de maestro quiere comunicarse con algn esclavo debe, en primer lugar,
transmitir a travs del puerto serie un dato con la direccin del esclavo. El noveno bit del dato
transmitido ser un 1 lgico como indicativo de que se enva una direccin. Todos los esclavos leern
esa direccin, pero slo aquel que reconozca su propia direccin pondr el bit RB8 a 1 lgico, al
mismo tiempo que activar su flag de interrupcin RI para generar una interrupcin. El
microcontrolador esclavo, que ha sido direccionado, pondr a cero su bit SM2, preparndose, de este
modo, para recibir los bytes de datos enviados por el maestro. Los bytes de datos tienen el noveno bit
a 0 lgico; por tanto, son ignorados por todos los esclavos que tienen su bit SM2 a 1. De este modo, el
nico microcontrolador esclavo que responde al maestro es el que ha reconocido su direccin.

9.9 Reconocimiento automtico de direcciones


La direccin individual de cada microcontrolador se especifica en los registros SADDR y SADEN.
Por otra parte, el microcontrolador se identifica mediante dos tipos de direcciones denominadas
direcciones given y direcciones broadcast.

9.9.1 Direcciones given


La direccin individual del microcontrolador se almacena en el registro SADDR; por otra parte, el
registro SADEN contiene una mscara de bits que permiten tomar, indistintamente, como 0 1 lgico,
aquellos bits del registro SADDR que en el registro SADEN estn a 0 lgico. De este modo se puede
direccionar ms de un esclavo al mismo tiempo.
Por ejemplo, si en el registro SADDR est almacenado el valor 1001 0011 y en el registro SADEN el
valor 0101 1111, el microcontrolador responde a las direcciones: X0X1 0011. En este caso, las
combinaciones posibles de valores que pueden tomar los bits 5 y 7, dan lugar a 4 direcciones distintas
asociadas al mismo microcontrolador y denominadas direcciones given.
En los casos extremos, si el registro SADEN almacena el valor 0000 0000, el microcontrolador
responde a cualquier direccin, y si el registro SADEN est cargado con el valor 1111 1111, slo
responde a la direccin almacenada en el registro SADDR.
Ejemplo 9.5 Direccionamiento de diferentes esclavos utilizando direcciones given
Se dispone de tres microcontroladores esclavos con las siguientes direcciones y mscaras:
Esclavo A:

SADDR = 1111 0001


SADEN = 1111 1010
Given = 1111 0X0X

Esclavo B:

SADDR = 1111 0011


SADEN = 1111 1001
Given = 1111 0XX1

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

274

Esclavo C:

SADDR = 1111 0011


SADEN = 1111 1101
Given = 1111 00X1

Si nos fijamos en las direcciones anteriores, se puede comprobar que, para el esclavo A, el bit
de menor peso de la direccin es indeterminado, mientras que en los esclavos B y C vale 1
lgico. Entonces, para comunicarse exclusivamente con el esclavo A, la direccin deber tener
el bit de menor peso a cero, como, por ejemplo, la direccin 1111 0000.
Por otra parte, para el esclavo A, el segundo bit vale 0 mientras que en los esclavos B y C es
indeterminado. Luego, para comunicarse con los esclavos B y C, pero no con el A, el
microcontrolador maestro deber enviar una direccin que tenga el segundo bit a 1 lgico, por
ejemplo la direccin 1111 0011.
Para los esclavos A y B el tercer bit es indeterminado, mientras que para el esclavo C el tercer
bit de la direccin vale 0. Para comunicarse con los esclavos A y B, pero no con el C, el
maestro deber enviar una direccin con el tercer bit a 1 lgico, por ejemplo la direccin 1111
0101.
Si el microcontrolador maestro debe comunicarse con los tres esclavos a la vez, enva una
direccin con el primer bit a 1 lgico, el segundo bit a 0 lgico y el tercero a 0 lgico, por
ejemplo la direccin 1111 0001.

9.9.2 Direcciones broadcast


Las direcciones broadcast se forman realizando la operacin OR lgica entre el contenido del registro
SADDR y el contenido del registro SADEN, donde los ceros representan bits indeterminados, por
ejemplo:
SADDR = 0101 0110
SADEN = 1111 1100
Broadcast (SADDR) or (SADEN) = 1111 111X
Ejemplo 9.6 Direccionamiento de diferentes esclavos utilizando direcciones broadcast
Se dispone de tres microcontroladores esclavos con las siguientes direcciones y mscaras:
Esclavo A:

SADDR = 1111 0001


SADEN = 1111 1010
Broadcast = 1111 1X11

Esclavo B:

SADDR = 1111 0011


SADEN = 1111 1001
Broadcast = 1111 1X11

Esclavo C:

SADDR = 1111 0010


SADEN = 1111 1101
Given = 1111 1111

Los autores, 2001; Edicions UPC, 2001.

9 Puerto de comunicacin serie

275

Para los esclavos A y B, el bit tercero es indeterminado, mientras que para el esclavo C es igual
a 1 lgico. En este caso, para comunicarse con todos los esclavos el microcontrolador maestro
debe enviar la direccin FFH.
Si el maestro debe comunicarse con los esclavos A y B pero no con el C debe enviar la
direccin FBH.
Ejemplo 9.7 Comunicacin multiprocesador en modo 2
Se dispone de un sistema que incorpora cinco microcontroladores, un maestro y cuatro
esclavos, denominados A, B, C y D, conectados entre s a travs del puerto serie para trabajar
en entorno multiprocesador (figura 9.16).

8XC251

8XC251

8XC251

8XC251

8XC251

Maestro

Esclavo
A

Esclavo
B

Esclavo
C

Esclavo
D

TXD RXD

TXD RXD

TXD RXD

TXD RXD

TXD RXD

Fig. 9.16 Comunicacin en entorno multiprocesador

En la tabla 9.11 se especifica el contenido de los registros SADDR y SADEN de los distintos
esclavos, as como las direcciones given y broadcast resultantes.
Tabla 9.11 Direcciones de los microcontroladores esclavos.

SADDR
SADEN
Given
Broadcast

Esclavo A

Esclavo B

Esclavo C

Esclavo D

0000 0001
1111 1100
0000 00XX
1111 11X1

0000 0010
1111 1010
0000 0X1X
1111 1X1X

0000 0100
1111 0101
0000 X1X0
1111 X1X1

0000 1000
1111 0011
0000 XX00
1111 1X11

Para controlar esta aplicacin, se debe disear un programa que gestione el envo de datos entre
el maestro y los esclavos. La secuencia de transferencia de datos es la siguiente:
En primer lugar el maestro transmite a los esclavos A y D, los datos contenidos entre las
direcciones de memoria 50H y 5FH.
A continuacin, enva al esclavo C los datos almacenados en las posiciones de memoria
de la 60H a la 6FH.
Finalmente, el maestro transmite a todos los esclavos el contenido de la direccin 70H.
El programa del microcontrolador que realiza las funciones de maestro, incluye instrucciones
que programan el puerto serie en modo 2 y que lo habilitan para transmitir. A continuacin,
vienen las instrucciones que realizan la transmisin de datos a los distintos esclavos. Para
mandar datos a los esclavos A y D se puede utilizar la direccin 0000 0000, que es comn a
ambos esclavos. Para transmitir datos al esclavo C se utiliza la direccin 0000 1110, que es
exclusiva de este esclavo. Finalmente, para direccionar todos los esclavos simultneamente se

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

276

puede emplear la direccin 1111 1111. A continuacin se detalla el programa de control de


transmisin de datos del maestro.
;------------------------------------------------------------------------------------------------------------;
PROGRAMA PRINCIPAL DEL MAESTRO
;------------------------------------------------------------------------------------------------------------ORG FF:0000H
; Programacin del puerto serie
SETB SM0
; Se programa el puerto serie en modo 2.
CLR SM1
;
CLR REN
; Se habilita la transmisin por el puerto serie.
SETB SMOD1
; Se pone el bit SMOD1 a 1 lgico.
; Envo de datos a los esclavos A y D.
SETB TB8
; Se coloca el 9 bit a 1 para indicar a los esclavos que se enva una direccin.
MOV SBUF,#00H ; El maestro enva por el puerto serie la direccin de los esclavos A y D.
SIG1: JNB TI,SIG1
; El maestro espera a que se acabe la transmisin.
CLR TI
; Se borra el flag TI.
CLR TB8
; El maestro se dispone a enviar los datos.
MOV R0,#10H
; Se carga un contador con el nmero de datos a enviar.
MOV R1,#50H
; Se carga un puntero con la direccin de memoria
; donde estn almacenados los datos.
SIG2: MOV SBUF,@R1
; Se enva un dato.
INC R1
; Se incrementa el puntero en una unidad.
SIG3: JNB TI,SIG3
; El maestro espera a que se acabe la transmisin.
CLR TI
; Se borra el flag de interrupcin en transmisin.
DJNZ R0,SIG2
; Se decrementa el contador de datos transmitidos.
; Envo de datos al esclavo C.
SETB TB8
; Se coloca el 9 bit a 1 para indicar a los esclavos que se enva una direccin.
MOV SBUF,#0EH ; El maestro enva por el puerto serie la direccin del esclavo C.
SIG4: JNB TI,SIG4
; El maestro espera a que se acabe la transmisin.
CLR TI
; Se borra el flag TI.
CLR TB8
; El maestro se dispone a enviar los datos.
MOV R0,#10H
; Se carga un contador con el nmero de datos a enviar.
MOV R1,#60H
; Se carga un puntero con la direccin de memoria donde estn los datos.
SIG5: MOV SBUF,@R1 ; Se enva un dato.
INC R1
; Se incrementa el puntero en una unidad.
SIG6: JNB TI,SIG6
; El maestro espera a que se acabe la transmisin.
CLR TI
; Se borra el flag de interrupcin en transmisin.
DJNZ R0,SIG5
; Se decrementa el contador de datos transmitidos.
; Envo de datos a todos los esclavos.
SETB TB8
; Se coloca el noveno bit a 1 lgico para indicar a los
; esclavos que se enva una direccin.
MOV SBUF,#FFH ; El maestro enva por el puerto serie una direccin comn a todos los esclavos.
SIG7: JNB TI,SIG7
; El maestro espera a que se acabe la transmisin.
CLR TI
; Se borra el flag TI.
CLR TB8
; El maestro se dispone a enviar los datos.
MOV SBUF,70H
; Se enva el dato de la direccin 70H.
SIG8: JNB TI,SIG8
; El maestro espera a que se acabe la transmisin.
CLR TI
; Se borra el flag de interrupcin en transmisin.

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

277

10 El array de contadores programables (PCA)


10.1 Introduccin
El array de contadores programable, PCA, est formado por un temporizador/contador de 16 bits y
por cinco mdulos de comparacin/captura. El temporizador/contador de 16 bits se utiliza como base
de tiempos de los mdulos del PCA y su valor se distribuye a todos ellos a travs de un bus interno de
16 lneas (figura 10.1). El array de contadores programable est disponible en las versiones 8XC51FX
de la familia MCS-51 y en toda la familia MCS-251. El modo de funcionamiento y la forma de operar
del PCA es el mismo para las dos familias, por lo que su explicacin en este captulo es vlida para
ambas.
Cada uno de los mdulos puede ser programado de forma independiente para realizar capturas de
flancos, comparacin, generacin de seal de modulacin de anchura de pulsos PWM, etc. Adems, el
mdulo cuatro del PCA puede realizar la funcin de temporizador watchdog.
Los registros CMOD y CCON controlan el modo de operacin del temporizador/contador del PCA,
mientras que los registros CCAPMx, con x = 0, , 4, se encargan de controlar el modo de operacin
de los mdulos de comparacin/captura del PCA.
En las tablas 10.1 y 10.2 se muestra el contenido de los registros CCON y CMOD, respectivamente, y
se indica el nombre y la funcin de cada uno de los bits que componen estos registros. En la tabla 10.3
estn listados los registros relacionados con la programacin y funcionamiento del PCA.
Tabla 10.1 Registro de control CCON del temporizador/contador del PCA
CCON
b7
CF

Bit

Mnemnico

CF

CR

5
4:0

b6
CR

--CCF4:0

b5
---

b4
CCF4

Valor de reset: 00X0 0000B


b3
b2
b1
CCF3
CCF2
CCF1

b0
CCF0

Funcin
Flag de desbordamiento del temporizador/contador del PCA. Este flag se activa
cuando el Timer del PCA sufre desbordamiento. Esto genera una interrupcin al
microcontrolador si el bit ECF (registro CMOD) est activo. Este bit se borra por
programa.
Bit de control de puesta en marcha del temporizador/contador del PCA. Bit de puesta
en marcha del Timer del PCA. Debe estar a 1 lgico para que el Timer funcione.
Reservado.
Flags del mdulo de comparacin/captura. Se pone a 1 lgico, automticamente,
cuando el comparador se activa, lo que genera una interrupcin al microcontrolador si
el bit ECCFx correspondiente est activo. Debe ser borrado por programa.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

278
Tabla 10.2 Registro de modo CMOD del temporizador/contador del PCA
CMOD
b7
CIDL

Bit

b5
---

Mnemnico

CIDL

WDTE

5:3
2:1

--CPS1:0

b6
WDTE

ECF

b4
---

Valor de reset: 00XX X000B


b3
b2
b1
--CPS1
CPS0

b0
ECF

Funcin
Bit de control del PCA temporizador/contador en modo Idle. Cuando CIDL=1 inhibe
al Timer del PCA durante el modo Idle. Si CIDL=0 el Timer del PCA funciona
durante el modo Idle.
Bit de habilitacin del Timer watchdog.
WDTE=1 habilita el Timer watchdog del mdulo 4 del PCA.
WDTE=0 inhibe el Timer watchdog del PCA
Bits reservados. Los valores de estos bits son indeterminados. No deben utilizarse.
Bits de seleccin de las entradas del PCA temporizador/contador.
CPS1 CPS0
0
0 FOSC/12
0
1 FOSC/4
1
0 Desbordamiento del Timer 0
1
1 Reloj externo en el pin ECI (frecuencia mx. =FOSC/8)
Bit de habilitacin de la interrupcin del PCA temporizador/contador.
Cuando ECF=1 se habilita el bit CF en el registro CCON para generar una peticin de
interrupcin.

Tabla 10.3 Registros asociados al PCA

Mnemnico
CL
CH
CCON

CMOD

CCAP0H
CCAP0L
CCAP1H
CCAP1L
CCAP2H
CCAP2L
CCAP3H
CCAP3L
CCAP4H
CCAP4L
CCAPM0
CCAPM1
CCAPM2
CCAPM3
CCAPM4

Descripcin
Temporizador/contador del PCA. Estos dos registros de 8 bits implementan fsicamente el
temporizador/contador de 16 bits del PCA.
Registro de control del temporizador/contador del PCA. Contiene los bits de puesta en
marcha y desbordamiento del temporizador; y los flags de interrupcin de los 5 mdulos de
comparacin/captura.
Registro de modo del temporizador/contador del PCA. Contiene los bits para habilitar el
temporizador/contador del PCA durante el modo de funcionamiento Idle, para habilitar el
temporizador watchdog, para seleccionar la entrada del temporizador/contador y para habilitar
la interrupcin por desbordamiento del temporizador/contador del PCA.
Registros de comparacin/captura del mdulo 0 del PCA. Estos registros cargan el valor
comparado o capturado. Cuando el PCA trabaja en modo PWM, el registro de menor peso
controla el ciclo de trabajo de la onda de salida.
Registros de comparacin/captura del mdulo 1 del PCA. Idem
Registros de comparacin/captura del mdulo 2 del PCA. Idem
Registros de comparacin/captura del mdulo 3 del PCA. Idem
Registros de comparacin/captura del mdulo 4 del PCA. Idem
Registros de modo de los mdulos de comparacin/captura del PCA. Contiene los bits que
permiten seleccionar el modo de operacin de los mdulos de comparacin/captura y
habilitacin del flag de comparacin captura.

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

279

10.2 Temporizador/contador del PCA


En la figura 10.1 se muestra el esquema asociado al temporizador/contador del PCA, formado por los
registros CH y CL de 8 bits cada uno.
Mdulos de comparacin y captura

Bus de
16 bits

Fosc /12

00

Fosc /4

01

Timer 0, desbordamiento
P1.2/ECI

CPS1

CPS0

Mdulo 0

P1.3/CEX0

Mdulo 1

P1.4/CEX1

Mdulo 3

P1.5/CEX2

Mdulo 2

P1.6/CEX3

Mdulo 4

P1.7/CEX4/A17

16 bits
CH
(8 bits)

10
11

CL
(8 bits)

Temporizador/contador del PCA

Peticin de
interrupcin
CF

CCON.7
Rebasamiento

ECF

CIDL

CMOD.0
CMOD.2 CMOD.1 CMOD.7
IDL

CR

PCON.0
Modo Idle

CCON.6
Run Control

Fig. 10.1 Array de contadores programables

Los bits CPS1 y CPS0 del registro CMOD seleccionan una de las cuatro posibles fuentes de entrada
del temporizador/contador:
1.
2.
3.
4.

FOSC/12: para CPS1, CPS0 = 00, el temporizador/contador se incrementa cada ciclo de


perifrico, en concreto en el perodo 2 del estado 5, S5P2.
FOSC/4: para CPS1, CPS0 = 01, el temporizador/contador se incrementa cada cuatro perodos
de seal de reloj.
Desbordamiento del Timer 0: para CPS1, CPS0 = 10, el temporizador/contador se
incrementa cada vez que desborda el Timer 0.
Pin P1.2/ECI: si se programan los bits CPS1, CPS0 = 11, el temporizador/contador se
incrementa cuando se aplica un flanco descendente en el pin P1.2/ECI. La frecuencia
mxima de incremento para este caso es de FOSC /8.

El PCA dispone de tres bits relacionados con la habilitacin del funcionamiento del temporizador. El
bit CR, ubicado en el registro CCON, pone en marcha el temporizador si la salida de la puerta NAND
est a 1 lgico (figura 10.1). En caso de que el microcontrolador est trabajando en el modo Idle de
bajo consumo (bit IDL del registro PCON a 1 lgico), el temporizador del PCA seguir funcionando
mientras el bit CIDL, registro CMOD, est a cero lgico.
Es posible leer el contenido de los registros CH y CL del temporizador/contador del PCA en cualquier
momento, pero no se puede escribir en estos registros mientras el temporizador est funcionando.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

280

10.3 Mdulos de comparacin/captura del PCA


El PCA dispone de cinco mdulos de comparacin/captura: cada uno de ellos incorpora dos registros
de comparacin/captura, registros CCAPxH/CCAPxL, con x = 0, , 4, y un comparador de 16 bits.
Los registros de comparacin/captura almacenan el valor del Timer del PCA cuando ocurre un evento
externo, captura, o bien, cuando se activa la salida del comparador del mdulo. En el modo PWM, el
byte bajo, CCAPxL, controla el ciclo de trabajo de la seal generada.
Cada uno de los mdulos puede ser programado mediante su correspondiente registro CCAPMx en
uno de estos modos de funcionamiento:

Modo de captura de flanco positivo, flanco negativo o ambos.


Modo de comparacin. En este modo se consiguen diferentes funcionamientos: temporizador
controlado por software de 16 bits, salida de alta velocidad, temporizador watchdog de 16
bits, o bien, PWM de 8 bits.
Sin operacin.

10.3.1 Modo captura


El modo captura permite medir perodos, anchos de pulso, ciclos de trabajo y diferencia de fase entre
cinco seales. En la figura 10.2 se muestra el esquema correspondiente al modo captura.
Temporizador/contador del PCA
CH
(8 bits)

Entrada de cuenta

CL
(8 bits)

Captura

CEXx
I/O Externa

CCAPxH CCAPxL
x = 0, 1, 2, 3 4
X=01

Peticin de
interrupcin
CCFx
Enable

Registro CCON
X
7

CAPPx CAPNx

ECCFx

Registro de modoCCAPMx

Fig. 10.2 Modo de captura de 16 bits

El microcontrolador verifica los pines de entrada CEX0, CEX1, CEX2, CEX3 y CEX4 para detectar
transiciones positivas y/o negativas en la seal binaria aplicada en estos pines (tabla 10.4).
Tabla 10.4 Seales externas asociadas al PCA

Nombre Tipo
ECI

CEX0
CEX1
CEX2
CEX3
CEX4

I/O

Descripcin

Ubicacin

Entrada externa del temporizador/contador del PCA. Esta seal es la entrada


de reloj externo para el temporizador/contador del PCA.
Entradas/salidas externas de los mdulos de comparacin/captura.
Cada mdulo de comparacin/captura tiene asociado como pin de
entrada/salida un pin del puerto P1.

P1.2

Los autores, 2001; Edicions UPC, 2001.

P1.3
P1.4
P1.5
P1.6
P1.7/A17

10 El array de contadores programables (PCA)

281

Cuando un mdulo de comparacin/captura, que est programado en modo captura, detecta una
transicin en su entrada CEXx, se carga en los registros CCAPxH/ CCAPxL el valor actual de los
registros del Timer del PCA. El objetivo de esta operacin es registrar el momento en que se produjo la
transicin de la seal de entrada, con una resolucin equivalente a un perodo de reloj del Timer del
PCA. Al producirse la captura, tambin se activa el flag de comparacin/captura CCFx del registro
CCON. Por otra parte, si el bit de habilitacin de interrupcin del registro CCAPMx, ECCFx, est
activo, el PCA realiza una peticin de interrupcin al microcontrolador.
En la rutina de servicio a la interrupcin del PCA se debe borrar el flag de interrupcin activo y
guardar el valor capturado en los registros CCAPxH/CCAPxL en la memoria RAM, ya que con la
siguiente captura se reemplaza ese valor.
Para configurar un mdulo del PCA en modo captura se debe programar adecuadamente el bit CAPPx
(captura de flanco positivo), y CAPNx (captura del flanco negativo) del registro CCAPMx de dicho
mdulo. En la tabla 10.5 se especifica el contenido de los registros CCAPMx y en la tabla 10.6 se
indica el valor que deben tomar estos bits para programar los mdulos del PCA en las distintas
configuraciones posibles.
Por ejemplo, para capturar una transicin positiva se debe activar el bit CAPPx y borrar el bit CAPNx.
Si se desea capturar una transicin negativa, el bit activo debe ser CAPNx, mientras que el bit CAPPx
debe estar a cero. Si ambos bits estn a 1 lgico, se capturan flancos positivos y negativos.
Tabla 10.5 Registros de comparacin/captura del PCA

CCAPMx
b7
--Bit

Mnemnico

7
6

--ECOMx

CAPPx

CAPNx

MATx

TOGx

PWMx

ECCFx

b6
ECOMx

b5
CAPPx

b4
CAPNx

b3
MATx

Valor de reset: X000 0000B


b2
b1
b0
TOGx
PWMx
ECCFx

Funcin
Reservado. Este bit no se puede utilizar.
Modos de comparacin. Cuando este bit est a 1 lgico se habilita el comparador del
mdulo. Este comparador se utiliza para generar un Timer, salidas de alta velocidad,
un modulador de anchura de pulso o un temporizador watchdog.
Modo captura positiva. Cuando este bit est a 1 lgico, habilita la captura de flancos
positivos en la entrada externa CEXx.
Modo captura negativa. Cuando este bit est a 1 lgico, habilita la captura de flancos
negativos en la entrada externa CEXx.
Si se pone este bit a 1 lgico, se habilita el flag de interrupcin del mdulo cuando se
activa el comparador.
Conmutacin. CuandoTOGx=1, estando el comparador habilitado, la salida CEXx
conmuta de valor cada vez que se activa el comparador.
Modo PWM. Cuando PWMx=1 se configura el mdulo como modulador de anchura
de pulsos con 8 bits de resolucin y con salida por el pin CEXx.
Habilitacin de interrupciones. Este bit habilita las interrupciones generadas al
activarse el comparador del mdulo.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

282
Tabla 10.6 Modos de trabajo del PCA

ECOMx CAPPx CAPNx MATx TOGx PWMx ECCFx


0
X

0
1

0
0

0
0

0
0

0
0

0
X

1
1
1
1

0
0
0
0

0
0
0
0

1
1
0
1

0
1
0
X

0
0
1
0

X
X
0
X

Modo
Sin operacin
Captura con el flanco positivo de la
entrada CEXx
Captura con el flanco negativo de la
entrada CEXx
Captura con el flanco positivo o negativo
de la entrada CEXx
Comparacin: software Timer
Comparacin: salida de alta velocidad
Comparacin: PWM de 8 bits
Comparacin: watchdog en el mdulo M4

Ejemplo 10.1 Funcionamiento del PCA en modo captura


En este ejemplo se trata de medir el desfase entre dos seales senoidales, Va(t) y Vb(t), de igual
frecuencia pero de distinta fase, utilizando dos mdulos del PCA programados para capturar
flancos positivos. En la figura 10.3 se muestra el esquema del montaje propuesto para medir el
desfase. Este esquema incorpora dos comparadores que digitalizan dos seales senoidales con
una precisin de 1 bit. La salida de los comparadores se aplica a la entrada de los mdulos 0 y
1 del PCA, CEX0 y CEX1, respectivamente. La salida del comparador vale 1 lgico cuando la
seal de entrada es positiva y 0 lgico cuando es negativa.

8XC251Sx
Va(t)

Comparador
+

CEX0

Vb(t)
+

CEX1

Desfase

Fig. 10.3 Detector de desfase

Los mdulos 0 y 1 del PCA trabajan en modo captura de flanco positivo, de forma que
capturan el valor de los registros del Timer del PCA cuando la entrada correspondiente pasa por
un flanco positivo. Midiendo el tiempo transcurrido entre el flanco de subida en la entrada
CEX0 y el flanco de subida en la entrada CEX1 y, conociendo la frecuencia de la seal de reloj
y el perodo de las seales Va(t) y Vb(t), se puede determinar, en grados, el retardo entre ambas
seales. El perodo de la seal de entrada se obtiene realizando la diferencia entre los valores
capturados por el mdulo 0 en dos flancos de subida consecutivos.
Para simplificar el programa que controla esta aplicacin se puede considerar que el perodo de
las seales de entrada es inferior a la mitad del tiempo que tarda el Timer del PCA en sufrir

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

283

desbordamiento, teniendo en cuenta que el reloj de entrada del Timer es FOSC/4 y FOSC=16MHz.
El programa de control de la aplicacin estar compuesto por un programa principal de
configuracin e inicializacin de perifricos y por una rutina de servicio a la interrupcin del
PCA.
En el programa principal se incluye, en primer lugar, una instruccin que inicializa un contador
de capturas del mdulo 0, que permite contabilizar las dos capturas necesarias para obtener el
perodo de la seal. Asimismo, se deben programar adecuadamente los registros CCAPM0 y
CCAPM1, para configurar los mdulos 0 y 1 del PCA en modo captura del flanco positivo; se
deber inicializar el registro CMOD para seleccionar la entrada FOSC/4 como reloj del Timer del
PCA; se deben poner a cero los registros de los mdulos 0 y 1 (CCAP0H/CCAP0L y
CCAP1H/CCAP1L); y se deben habilitar los flags de interrupcin del Timer del PCA, y del
mdulo 0, ubicados en el registro CCON.
El flag de interrupcin de mdulo 1 se habilita en la rutina RSI del PCA, despus de que el
mdulo 0 haya capturado el primer flanco.
Finalmente, se pone en marcha el Timer del PCA, activando el bit CR del registro CCON, y se
habilita la interrupcin del PCA en el registro de habilitacin de interrupciones.
En la figura 10.4 se muestra cmo se deben programar los registros CCON y CMOD, segn las
especificaciones del enunciado.
CCON
CF

CR

---

CCF4

CCF3

CCF2

CCF1

CCF0

Puesta en marcha del Timer del PCA


Borrado de los flags de interrupcin de los mdulos 0 y 1

CMOD
CIDL

WDTE

---

---

---

CPS1

CPS0

ECF

Seleccin de la entrada F OSC/4

Fig. 10.4 Programacin de los registros CCON y CMOD

En la figura 10.5 se muestran los bits que hay que activar en los registros CCAPM0 y
CCAPM1, para programar los mdulos 0 y 1 en el modo captura de flanco positivo.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

284
CCAPM0, CCAPM1
---

ECOMx CAPPx CAPNx MATx

TOGx

PWMx ECCF0

Habilita el modo de captura de flanco positivo


Habilita la interrupcin del mdulo 0
Fig. 10.5 Programacin de los registros CCAPM0 y CCAPM1

A continuacin se detalla el programa principal del medidor de desfase.


;---------------------------------------------------------------------------------------------------------;
PROGRAMA PRINCIPAL DEL MEDIDOR DE DESFASE
;---------------------------------------------------------------------------------------------------------ORG FF:0000H
; El programa comienza en la direccin FF:0000H
JMP FF:2000H
; Se salta a la direccin FF:2000H donde hay espacio de memoria
; suficiente para colocar el resto de instrucciones del programa.
ORG FF:2000H
;
MOV R6,#00H
; Se carga a cero un contador de capturas del mdulo 0.
CLR CCF0
; Se borra el flag de interrupcin del mdulo cero.
CLR CCF1
; Se borra el flag de interrupcin del mdulo uno.
SETB ECCF0
; Se habilita al mdulo 0 para interrumpir.
SETB CPS0
; Se selecciona como entrada de reloj del timer del PCA
CLR CPS1
; la seal FOSC/4.
MOV CCAP0H,#0H ; Se inicializan a cero los registros de
MOV CCAP0L,#0H ; comparacin/captura de los mdulos 0 y 1.
MOV CCAP1H,#0H ;
MOV CCAP1L,#0H ;
MOV CL,#00H
; Se inicializa a cero el timer del PCA.
MOV CH,#00H
;
SETB CR
; Se pone en marcha el timer del PCA.
SETB EC
; Habilitacin de la interrupcin generada por el PCA.
SETB EA
;

En la rutina RSI del PCA se debe determinar cul de los dos mdulos ha interrumpido y
almacenar, en algn registro tipo Word, el valor capturado por ese mdulo. La siguiente
interrupcin est generada necesariamente por una captura de flanco positivo del otro mdulo.
El valor capturado en este caso se cargar en otro registro tipo Word.
Finalmente, se deja que el primer mdulo vuelva a capturar otro flanco positivo. Realizando la
diferencia entre ambos valores capturados, se determina el periodo de la seal (figura 10.6).
Perodo
Segundo flanco
Primer flanco
Fig. 10.6 Medida del perodo de la seal

Teniendo el perodo y los valores de captura del primer flanco de ambos mdulos, es posible
calcular el desfase entre ambas seales, que en grados vendr dado por:
FP Vb[t ] FP Va [t ]
360
Periodo

Los autores, 2001; Edicions UPC, 2001.

(10.1)

10 El array de contadores programables (PCA)

285

donde FPVb(t) es el valor de captura del primer flanco positivo de la seal Vb(t) y FPVa(t) es
el valor de captura del primer flanco positivo de la seal Va(t).
A continuacin se detalla el listado de la rutina de servicio a la interrupcin del PCA.
;---------------------------------------------------------------------------------------------------------;
RUTINA DE SERVICIO A LA INTERRUPCIN DEL PCA
;---------------------------------------------------------------------------------------------------------ORG FF:0033H
; La rutina comienza en la direccin FF:0033H
JMP FF:1000H
; Se salta a la direccin FF:1000H donde hay espacio de memoria
; suficiente para colocar el resto de instrucciones de la rutina.
ORG FF:1000H
;
JB CCF1,FP1
; Si ha interrumpido el mdulo 1 se salta a FP1.
CLR CCF0
; Se borra el flag de interrupcin del mdulo cero.
SETB ECCF1
; Se habilita al mdulo 1 para interrumpir.
INC R6,#1H
; Se incrementa el contador de capturas.
CMP R6,#02H
; Si se han realizado dos capturas se inhibe la interrupcin del
JE SAL1
; mdulo 1 y se pasa a calcular el desfase.
MOV R0,CCAP0H ; Se carga el contenido de los registros de comparacin/captura del
MOV R1,CCAP0L ; mdulo 0 del PCA en el registro WR0.
RETI
; Se retorna al programa principal
SAL1:MOV R2,CCAP0H ; Se carga la segunda captura del mdulo 0 del PCA en el registro
MOV R3,CCAP0L ; WR2.
CLR ECCF0
; Se inhiben futuras interrupciones del mdulo 0.
MOV WR8,WR2
;
SUB WR8,WR0
; Se calcula el perodo.
MOV WR10,#360d ; Se carga el valor 360 en WR10.
DIV WR8,WR10
; Se divide el periodo entre 360 para determinar a cuantos
; incrementos del timer equivale a un grado.
SUB WR4,WR2
; Se obtiene el tiempo entre las dos capturas de las seales desfasadas.
DIV WR4,WR10
; Se obtiene el desfase en grados
RETI
; Se retorna al programa principal.
FP1: CLR CCF1
; Se borra el flag de interrupcin del mdulo 1.
CLR ECCF1
; Se inhibe futuras interrupciones del mdulo 1.
MOV R4,CCAP1H ; Se carga el contenido de los registros de comparacin/captura del
MOV R5,CCAP1L ; mdulo 1 del PCA en el registro WR4.
RETI
; Se retorna al programa principal.

Ejemplo 10.2 Medida del ancho de un pulso


El PCA puede medir el ancho de un pulso digital capturando los flancos positivo y negativo del
pulso (figura 10.7) y efectuando la diferencia entre el valor de las dos capturas. Si se conoce
cul es el tipo de flanco que se produce primero, el PCA puede configurarse para capturar
cualquiera de los flancos del pulso, tanto positivo como negativo. Por contra, si se desconoce
este hecho se puede determinar qu flanco realizar la primera captura eligiendo el modo
adecuado de funcionamiento del PCA. En este ejemplo se supone que el primer flanco que se
produce es el flanco positivo.
W

87C51FA
P1.3/CEX0

1 Captura

2 Captura

Ancho = Tpo (2 Captura)-Tpo (1 Captura)

Fig. 10.7 Medida del ancho de un pulso con el 87C51FA

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

286

La rutina para efectuar la medida del ancho del pulso se muestra a continuacin.
;************************************************************************
; Rutina para la lectura del ancho de un pulso mediante el PCA
;************************************************************************
CAPTL
EQU 20H
;Posicin para el byte bajo de la 1 captura
CAPTH
EQU 21H
;Posicin para el byte alto de la 2 captura
ANCHOL
EQU 22H
;Posicin para el byte bajo del ancho de pulso
ANCHOH
EQU 23H
;Posicin para el byte alto del ancho de pulso
Orden_captura EQU 24H.0
;Indicador de si ha sido la 1 o la 2 captura
ORG 00H
LJMP Inicio
ORG 033H
LJMP RSI_PCA
;************************************************************************
; Inicio
(En esta rutina slo se configura el PCA para la lectura del ancho)
;************************************************************************
Inicio: MOV CMOD, #0
;Inicializa el temporizador del PCA
MOV CL, #0
;Se escoge una entrada de (1/12)xFosc
MOV CH, #0
;Borra los registros CL y CH
MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo
SETB EC
;Habilita la interrupcin del PCA
SETB EA
;Activa el bit de habilitacin general
SETB CR
;Pone en marcha el temporizador del PCA
CLR Orden:_captura
;Borra el bit de orden de captura. Esta es la primera captura
;************************************************************************
; Rutina de RSI del PCA
;************************************************************************
RSI_PCA: CLR CCF0
;Borra el bit del mdulo 0 de comparacin/captura
JB Orden_captura, Captura_2 ;Comprueba si se trata de la primera o segunda captura
Captura_1: MOV CAPTL, CCAP0L
;Guarda el byte bajo de la captura
MOV CAPTH, CCAP0H
;Guarda el byte alto de la captura
MOV CCAPM0, #11H
;Configura el mdulo 0 para capturar el flanco negativo
SETB Orden_captura
RETI
Captura_2: PUSH ACC
;Guarda el acumulador y el registro de estado en la pila
PUSH PSW
CLR C
;Borra el bit de acarreo para efectuar una resta de 16 bits
MOV A, CCAP0L
;Lee el byte bajo de la 2 captura
SUBB A, CAPTL
;Efecta la resta con el byte bajo de la 1 captura
MOV ANCHOL
;Guarda resultado
MOV A, CCAP0H
;Lee el byte alto de la 2 captura
SUBB A, CAPTH
;Efecta la resta con el byte alto de la 1 captura
MOV ANCHOH
;Guarda resultado
MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el siguiente flanco +
CLR Orden_captura
POP PSW
;Recupera el PSW de la pila
POP ACC
;Recupera el acumulador de la pila
RETI

En esta rutina se utiliza el mdulo 0 para realizar la captura de los flancos, positivo y negativo,
del pulso. Para ello, primero se pone el dato 21H en el registro CCAPM0, lo que configura al
mdulo para una captura del flanco positivo, poniendo los bits CAPP0 y ECCF0, de captura
positiva y de habilitacin de interrupcin, respectivamente, a 1 lgico. Y, luego, al efectuarse
esta captura, se pone el dato 11H en CCAPM0, que configura al mdulo para una posterior
captura del flanco negativo (bits CAPN0 y ECCF0 a 1 lgico).

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

287

Al producirse la primera captura del flanco positivo de la seal, en la rutina de atencin a la


interrupcin del PCA, RSI_PCA, los registros CCAP0L y CCAP0H del mdulo se almacenan
en las posiciones 20H y 21H, respectivamente, de la memoria RAM interna. Cuando se realiza
la segunda captura, el valor de estos registros se recupera de la memoria interna para efectuar
una resta de 16 bits con el valor actual de la captura. De esta forma, el valor de la diferencia
entre las capturas es el valor de 16 bits del ancho del pulso a medir, y se guarda en las
posiciones 22H y 23H de la memoria RAM interna.
Para que la aplicacin funcione correctamente en los registro CL y CH no debe producirse un
desbordamiento, puesto que el programa no considera esta posibilidad.

10.3.2 Modos de comparacin


Los modos de comparacin permiten a los mdulos del PCA operar como temporizadores, como
contadores, o bien, como moduladores de anchura de pulsos, PWM. El funcionamiento del mdulo, en
estos modos, est basado en el comparador de 16 bits que incorpora cada mdulo, cuya funcin ser
bsicamente la de comparar el contenido de los registros de comparacin/captura con los registros del
Timer del PCA, y activar su salida cuando los contenidos de ambos registros sean iguales.
En total hay cuatro modos de comparacin: modo temporizador por software de 16 bits, modo de
salida de alta velocidad, modo de temporizador watchdog y modo PWM. Para que un mdulo del
PCA funcione en alguno de los modos de comparacin se debe llevar a cabo el siguiente
procedimiento general:
1.
2.
3.
4.
5.
6.

Poner a 1 lgico el bit ECOMx del registro CCAPMx, correspondiente al mdulo que
deseamos programar en algn modo de comparacin (tablas 10.3 y 10.4).
Programar adecuadamente el resto de bits del registro CCAPMx para seleccionar el modo
concreto de funcionamiento.
Seleccionar la seal de entrada del Timer del PCA.
Cargar el valor de comparacin en los registros de comparacin/captura del mdulo.
Poner a 1 lgico el bit de puesta en marcha del Timer del PCA.
Poner a cero el flag de interrupcin del mdulo de comparacin/captura una vez activo.

a) Modo temporizador de 16 bits


Para trabajar en este modo se ponen a 1 lgico los bits ECOMx y MATx del registro CCAPMx (tabla
10.6). En este modo de funcionamiento, el comparador que incorpora el mdulo compara el contenido
de los registros de comparacin/captura con el contenido de los registros del Timer del PCA. Cuando
el contenido de estos registros coincide, se activa el flag de interrupcin del mdulo, CCFx, ubicado
en el registro CCON. Si el bit de habilitacin de interrupcin del mdulo est activo se produce una
peticin de interrupcin.
En la figura 10.8 se muestra el esquema de bloques, correspondiente a los modos de funcionamiento
de temporizador de 16 bits y de salida de alta velocidad.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

288

Timer/ counter del PCA


Entrada
de cuenta

CH
(8 bits)

CL
(8 bits)

Mdulo de
comparacin y captura
CCAPxH CCAPxL

Comparador
de 16 bits

CEXx
Peticin de
interrupcin

CCFx
CCON
X
7
0
Reset

ECOMx

MATx TOGx

Registro de modo CCAPMx

Enable
ECCFx
0

X=01
x = 0, 1, 2, 3, 4

Escribir
CCAPxL
1
Escribir CCAPxH

Fig. 10.8 Modos de trabajo temporizador de 16 bits y salida de alta velocidad

b) Modo de salida de alta velocidad


En este modo de funcionamiento, se genera una seal binaria de salida a travs del pin CEXx,
asociado al mdulo, que conmuta de valor cada vez que se activa el comparador del mdulo (figura
10.8). La conmutacin de este pin es independiente de la atencin a la interrupcin. Esto permite dar
una respuesta ms rpida y precisa a la activacin del comparador. Para programar un mdulo en este
modo de funcionamiento se deben poner a 1 lgico los bits ECOMx, MATx, y TOGx del registro
CCAPMx (tabla 10.6).
c) Modo temporizador watchdog
El temporizador watchdog, WDT, tiene como funcin generar un reset del microcontrolador si no se
inicializan de forma regular sus registros. El WDT se utiliza en aplicaciones sometidas a fenmenos
que pueden inducir al microcontrolador a ejecutar errneamente el programa, como son el ruido
elctrico, derivas instantneas de la tensin de alimentacin, descargas elctricas, etc.
Los microcontrolador de la serie 8XC251Sx disponen de dos WDT: uno de 14 bits y otro de 16 bits,
que es una opcin de funcionamiento del mdulo 4 del PCA. Cuando el Timer del PCA alcanza el
valor cargado en los registros de comparacin/captura del mdulo 4, se genera un reset del
microcontrolador, que tiene el mismo efecto que un reset externo.
Para programar el mdulo 4 como WDT, se ponen a 1 lgico los bits ECOM4 y MAT4 del registro
CCAPM4 y el bit WDTE del registro CMOD; tambin debe seleccionarse la entrada del Timer del
PCA, programando los bits CPS0 y CPS1 del registro CMOD. El valor de comparacin se carga en
los registros CCAP4H/CCAP4L, aunque, si se desea, tambin se puede cargar un valor inicial distinto
de cero en los registros del Timer del PCA, CH/CL. La diferencia entre estos valores multiplicada por

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

289

el perodo de reloj de entrada del Timer del PCA, determina el tiempo que tarda el WDT en generar un
reset, si no se realiza ninguna accin que lo evite, como por ejemplo:
1.
2.
3.

Cambiar peridicamente el valor de los registros CCAP4H/CCAP4L antes de que se active el


comparador.
Cambiar repetidamente el contenido del temporizador del PCA antes de que alcance el valor
del mdulo 4.
Inhibir la salida del mdulo 4 poniendo a cero el bit WDTE = 0 antes de que se active el
comparador y habilitarlo de nuevo despus de que se halle activado.

La segunda opcin no es recomendable cuando se utilizan otros mdulos del PCA, pues el
temporizador del PCA es la base de tiempos de todos los mdulos y su cambio afectara al
funcionamiento del resto de los mdulos. La tercera opcin puede ser poco conveniente, pues podra
ocurrir un error en la ejecucin del programa cuando se tuviese inhibido el mdulo 4, de manera que
el watchdog no intervendra y la situacin no se solucionara.
La primera opcin es la ms viable debido a que no se inhabilita el watchdog, pero se debe cambiar
peridicamente el contenido de CCAP4H/CCAP4L por el programa para actualizar el watchdog.
En la siguiente rutina se muestra la inicializacin del PCA para utilizar el mdulo 4 como watchdog
en un microcontrolador 8XC51FX:
;************************************************************************
; Rutina de inicializacin del mdulo 4 en modo watchdog para 8XC51FX
;************************************************************************
INI_WATCHDOG:
MOV CCAPM4, #4CH
;Mdulo en modo de comparacin
MOV CCAP4L, #0FFH
;Se escribe primero en el byte bajo del mdulo
MOV CCAP4H, #0FFH
;Los valores de comparacin se deben cambiar
;antes de que el temporizador del PCA llegue a
;desbordamiento, es decir, a FFFFH
ORL CMOD, #40H
;Activa el bit WDTE para habilitar el watchdog
;sin tener que afectar al resto de bits de CMOD

A continuacin se muestra la subrutina, para un microcontrolador 8XC51FX, que permite actualizar


los registros del mdulo 4 del PCA:
;************************************************************************
; Subrutina de refresco del watchdog del PCA para 8XC51FX
;************************************************************************
WATCHDOG: CLR EA
;Inhabilita las interrupciones
MOV CCAP4L, #0
;Borra el byte bajo, de forma que la prxima comparacin
MOV CCAP4H, CH ;est dentro de 255 incrementos del PCA
SETB EA
;Habilita las interrupciones
RETI

En la figura 10.9 se muestra el diagrama de bloques del mdulo 4 cuando est programado como
WDT.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

290

Timer/ counter del PCA


Entrada
de cuenta

CH
(8 bits)

CL
(8 bits)

Mdulo de
comparacin y captura
CCAP4H CCAP4L

Reset PCA WDT

Comparador
de 16 bits
WDTE
CMOD.6

X
7
0

ECOM4

Registro de modo CCAPM4

X
0

X=01

Reset
Escribir
CCAP4L
1
Escribir CCAP4H

Fig. 10.9 Modo watchdog

c) Modo PWM
Los cinco mdulos de comparacin/captura pueden programarse independientemente en modo PWM.
La seal PWM est disponible en la salida CEXx, con una resolucin de ancho de pulso de 8 bits. Para
programar un mdulo del PCA en modo PWM se deben activar los bits ECOMx y PWMx del registro
CCAPMx.
En este modo de funcionamiento, se compara el registro CL del Timer del PCA con el registro
CCAPxL. Cuando CL es menor que CCAPxL, la salida CEXx es un 0 lgico. Para valores de CL
mayores o iguales que CCAPxH, la salida permanece a 1 lgico hasta que el registro CL sufre
desbordamiento y vuelve, automticamente, a 0 lgico. En ese momento se recarga el registro
CCAPxL con el contenido del registro CCAPxH, empezando, as, un nuevo perodo de la seal PWM
(figura 10.10).
El ciclo de trabajo de la seal PWM se controla mediante el valor almacenado en el registro CCAPxL,
mientras que el valor del registro CCAPxH proporciona el ciclo de trabajo del siguiente perodo.
Cargando el valor adecuado en el registro CCAPxH se puede variar el ciclo de trabajo desde un 0.4%,
para un valor de 255, hasta el 100%, para un valor de 0. En la figura 10.11 se muestran las seales
PWM obtenidas para distintos valores del registro CCAPxL.
La frecuencia de la seal PWM generada en este modo de funcionamiento es igual a la frecuencia de
la seal de entrada del temporizador del PCA dividida por 256. La mayor frecuencia de entrada del
Timer es FOSC/4, que da lugar a una frecuencia de seal PWM de 15.6kHz, considerando una
frecuencia de reloj de 16MHz.

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

291

CCAPxH
El rebasamiento de CL
carga el contenido de
CCAPxH en CCAPxL

CCAPxL
X=01
x = 0, 1, 2, 3, 4

8
0

CL
(8 bits)

CL < CCAPxL

Comparador
de 8 bits

CEXx
CL CCAPxL
1

Habilitacin

X
7

ECOMx

PWMx

Registro de modo CCAPMx

0
0

Fig. 10.10 Modo PWM 8 bits

CCAPxL

Ciclo
de trabajo

255

0.4%

230

10%

128

50%

25

90%

100%

Seal PWM

Fig. 10.11 Ciclo de trabajo variable

Ejemplo 10.3 Generador de seal programable


En este ejemplo se debe controlar la frecuencia de trabajo de un generador de seal realizado
mediante un oscilador controlado por tensin, VCO, y el mdulo 0 del PCA trabajando en
modo PWM. El VCO genera en su salida un seal cuya frecuencia es proporcional a la tensin
de entrada, en concreto:

f o Vi

256
(kHz)
5

donde fo es la frecuencia de salida y Vi la tensin de entrada en voltios.

Los autores, 2001; Edicions UPC, 2001.

(10.2)

Microcontroladores MCS-51 y MCS-251

292

En la figura 10.12 se muestra el esquema de esta aplicacin: se observa que se ha conectado la


entrada de tensin del VCO a la salida CEX0 del mdulo 0 a travs de un filtro paso-bajo.
8XC251Sx
VCO

Vi

CEX0

fo

Fig. 10.12 Esquema del generador de seal controlado por microcontrolador

La tensin de entrada del VCO es el resultado de filtrar la seal de salida PWM generada por el
mdulo 0. Si la seal PWM tiene una frecuencia suficientemente alta respecto a la frecuencia
de corte del filtro paso-bajo, la tensin de salida del filtro, Vi, ser prcticamente constante, y
su valor igual a la componente continua de la seal PWM generada (figura 10.13).
T
Ta

Vi=Va Ta/T

Va
C
Fig. 10.13 Seal PWM filtrada

Si se considera que el margen dinmico de la salida CEX0 est entre 0 y 5V, y teniendo en
cuenta que el ciclo de trabajo de la seal PWM oscila entre 0.004 y 1, la frecuencia generada
por el VCO estar comprendida entre 1kHz, para un ciclo de trabajo de 0.004, y 256kHz, para
un ciclo de trabajo de 1, con una resolucin de 1kHz.
El programa asociado a la aplicacin debe incluir instrucciones que configuren adecuadamente
el registro CCAPM0 para que el mdulo 0 del PCA trabaje en modo PWM, que programen el
registro CMOD para seleccionar la entrada FOSC/4 como reloj del Timer del PCA, e
instrucciones que inicialicen los registros CCAP0H y CCAP0L para obtener el ciclo de trabajo
deseado. Teniendo en cuenta la expresin 10.2, el valor cargado en el registro CCAP0H es,
directamente, el valor de frecuencia en kHz, que se obtendr a la salida del VCO. Finalmente,
se pone en marcha el Timer del PCA activando el bit CR del registro CCON.
A continuacin se detallan las instrucciones del programa principal de esta aplicacin.
;---------------------------------------------------------------------------------------------------------;
PROGRAMA DEL GENERADOR DE FRECUENCIA
;---------------------------------------------------------------------------------------------------------ORG FF:0000H
; El programa comienza en la direccin FF:0000H
JMP FF:2000H
; Se salta a la direccin FF:2000H donde hay espacio de memoria
; suficiente para colocar el resto de instrucciones del programa.
ORG FF:2000H
;
SETB ECCM0
; Se programan adecuadamente los bits del registro CCAPM0
SETB PWM0
; para que el mdulo cero trabaje en modo PWM.
CLR CAPP0
;

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

293

CLR CAPN0
;
CLR MAT0
;
CLR TOG0
;
CLR ECCF0
;
MOV CCAP0L,#5H ; Se carga en los registros CCAP0H y CCAP0L el valor de la
MOV CCAP0H,#5H ; frecuencia que se desea generar (por ejemplo 5kHz).
MOV CL,#00H
; Se inicializa a cero el timer del PCA.
MOV CH,#00H
;
SETB CR
; Se pone en marcha el timer del PCA.

Ejemplo 10.4 Medida de frecuencia


La medida de la frecuencia de una seal digital (figura 10.14) se puede efectuar con el PCA del
microcontrolador. Para ello, es necesario medir el tiempo T de duracin de un tren de N pulsos
de la seal digital. El mdulo de captura del PCA se debe configurar para capturar los flancos
positivos, de forma que cada captura se producir con cada nuevo pulso de la seal.
T

87C51FA
P1.3/CEX0

Captura 1

Captura N

T = Tpo (Captura 1)-Tpo (Captura N)


Fig. 10.14 Medida de la frecuencia de una seal con el 87C51FA

La frecuencia de la seal se obtiene dividiendo el nmero N de capturas por el tiempo T


transcurrido:
Frecuencia

N Nmero de capturas

T
Tiempo

(10.3)

La rutina para la medida de la frecuencia se muestra a continuacin, donde se supone que la


duracin T del tren de N pulsos es menor que el tiempo de desbordamiento del temporizador
del PCA.
;************************************************************************
; Rutina para la medida de la frecuencia de una seal mediante el PCA
;************************************************************************
CAPTL
EQU 20H
;Posicin para el byte bajo de la 1 captura
CAPTH
EQU 21H
;Posicin para el byte alto de la 2 captura
PERIODOL
EQU 22H
;Byte bajo del tiempo T
PERIODOH
EQU 23H
;Byte alto del tiempo T
NUM_CAP
EQU 24H
;Determina el nmero de capturas a realizar
FLANCO
EQU 25H.0
;Bit que indica si es la primera captura en efectuarse
ORG 00H
LJMP Inicio
ORG 033H
;Vectorizacin del PCA
LJMP RSI_PCA

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

294

;************************************************************************
; Inicio
(En esta rutina slo se configura el PCA para la medida de la frecuencia)
;************************************************************************
Inicio: MOV CMOD, #0
;Inicializa el temporizador del PCA
MOV CL, #0
;Se escoge una entrada de (1/12)xFosc
MOV CH, #0
;Borra los registros CL y CH
MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo
SETB EC
;Habilita la interrupcin del PCA
SETB EA
;Activa el bit de habilitacin general
SETB CR
;Pone en marcha el temporizador del PCA
MOV NUM_CAP, #10 ;Determina el nmero de capturas a efectuar = a 10 pulsos
CLR FLANCO
;Borra el bit de indicacin de la primera captura
;************************************************************************
; Rutina de RSI del PCA
;************************************************************************
RSI_PCA:
CLR CCF0
;Borra el bit del mdulo 0 del comparacin/ captura
JB FLANCO, CAPT_SIG
;Comprueba si es la primera captura
CAPT_1:
MOV CAPTL, CCAP0L
;Guarda el byte bajo de la primera captura
MOV CAPTH, CCAP0H
;Guarda el byte alto de la primera captura
SETB FLANCO
;Pone a 1 lgico para el resto de las capturas
RETI
CAPT_SIG: DJNZ NUM_CAP, Salir
;Mientras no llegue a 10 pulsos salir
PUSH ACC
;Guarda ACC y PSW en la pila
PUSH PSW
CLR C
;Borra el bit de acarreo
MOV A, CCAP0L
;Lee el byte bajo de la captura N, para resta de 16 bits
SUBB A, CAPTL
;Resta con el byte bajo de la primera captura
MOV PERIODOL, A
;Guarda el resultado
MOV A, CCAP0H
;Lee el byte alto de la captura N
SUBB A, CAPTH
;Resta con el byte alto de la primera captura
MOV PERIODOH, A
;Guarda el resultado
MOV NUM_CAP, #10
;N de capturas a efectuar para la siguiente medida
CLR FLANCO
;Borra bit para la siguiente medida
POP PSW
;Recupera ACC y PSW
POP ACC
Salir:
RETI

En esta rutina no se incluye la divisin de N por el valor T obtenido. sta es una divisin de 16
bits que se puede realizar mediante la rutina DIV16 del apartado 5.7.
Ejemplo 10.5 Medida del ciclo de trabajo de una seal PWM
El ciclo de trabajo de una seal de modulacin de anchura de pulso, PWM, se determina por la
relacin existente entre el tiempo que la seal permanece a 1 lgico, TON, y el perodo T de la
seal. Por tanto, para calcular el ciclo de trabajo deben medirse estos tiempos, por lo que se
debe configurar el mdulo de captura del PCA para que capture tanto los flancos positivos
como los flancos negativos de la seal.
T

TON

87C51FA
P1.3/CEX0

Captura 1

Captura 3
Captura 2

Fig. 10.14 Medida del ciclo de trabajo de una seal PWM mediante el 87C51FA

Los autores, 2001; Edicions UPC, 2001.

10 El array de contadores programables (PCA)

295

La seal PWM tiene un perodo T constante que determina su frecuencia (figura 10.14). El
ciclo de trabajo de la seal viene dado por la relacin:
Ciclo de trabajo

TON
T

(10.4)

Para efectuar la medida de TON y TOFF se deben realizar tres capturas dentro de un mismo
perodo (figura 10.14). Con la diferencia entre la captura 2 y la captura 1 se mide el tiempo
TON, y con la diferencia entre la captura 3 y la captura 1 se determina el perodo T de la seal,
de forma que para calcular el ciclo de trabajo se debe realizar la siguiente divisin:
Ciclo de trabajo

TON T po (Captura 2) T po (Captura 1)

T
T po (Captura 3) T po (Captura 1)

(10.5)

;************************************************************************
; Rutina para la medida del ciclo de trabajo de una seal PWM
;************************************************************************
CAPTL
EQU 20H
;Posicin para el byte bajo de la 1 captura
CAPTH
EQU 21H
;Posicin para el byte alto de la 2 captura
ANCHOL
EQU 22H
;Byte bajo del tiempo TON
ANCHOH
EQU 23H
;Byte alto del tiempo TON
PERIODOL
EQU 24H
;Byte bajo del periodo de la seal T
PERIODOH
EQU 25H
;Byte alto del periodo de la seal T
FLANCO1
EQU 26H.0
;Bits de indicacin del tipo de captura (1, 2 o 3)
FLANCO2
EQU 26H.1
ORG 00H
LJMP Inicio
ORG 033H
;Vectorizacin del PCA
LJMP RSI_PCA
;************************************************************************
; Inicio
(En esta rutina slo se configura el PCA para la medida del ciclo de trabajo)
;************************************************************************
Inicio: MOV CMOD, #0
;Inicializa el temporizador del PCA
MOV CL, #0
;Se escoge una entrada de (1/12)xFosc
MOV CH, #0
;Borra los registros CL y CH
MOV CCAPM0, #21H ;Configura el mdulo 0 para capturar el flanco positivo
SETB EC
;Habilita la interrupcin del PCA
SETB EA
;Activa el bit de habilitacin general
SETB CR
;Pone en marcha el temporizador del PCA
CLR FLANCO0
CLR FLANCO1
;************************************************************************
; Rutina de RSI del PCA
;************************************************************************
RSI_PCA:
CLR CCF0
;Borra el bit del mdulo 0 del comparacin/ captura
JB FLANCO1, CAPT_2
;Comprueba si es el primer flanco positivo
CAPT_1:
MOV CAPTL, CCAP0L
MOV CAPTH, CCAP0H
SETB FLANCO1
MOV CCAPM0, #31H
;Bits CCAP0 y CCAPN a 1 lgico, captura
RETI
;flanco positivo y negativo
CAPT_2:
PUSH ACC
;Guarda ACC y PSW en la pila
PUSH PSW
JB FLANCO2, CAPT_3
;Comprueba si es la segunda captura
CLR C
;Si es la segunda captura pasa a hacer la resta de 16 bits
MOV A, CCAP0L
;Lee el byte bajo de la captura actual
SUBB A, CAPTL
;Resta con el byte bajo de la primera lectura
MOV ANCHOL, A
;Guarda resultado en ANCHOL

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

296

CAPT_3:

MOV A, CCAP0H
SUBB A, CAPTH
MOV ANCHOH, A
SETB FLANCO2
POP PSW
POP ACC
RETI
CLR C
MOV A, CCAP0L
SUBB A, CAPTL
MOV PERIODOL, A
MOV A, CCAP0H
SUBB A, CAPTH
MOV PERIODOH, A
MOV CCAPM0, #21H
CLR FLANCO1
CLR FLANCO2
POP PSW
POP ACC
RETI

;Lee el byte alto de la captura actual


;Resta con el byte alto de la primera lectura
;Guarda resultado en ANCHOH
;Configura para la tercera captura
;Recupera ACC y PSW de la pila

;Pasa a efectuar la resta entre la 3 y la 1 captura


;Lee el byte bajo de la captura actual (3 captura)
;Resta con el byte bajo de la primera lectura
;Guarda resultado en PERIODOL
;Lee el byte alto de la captura actual (3 captura)
;Resta con el byte alto de la primera lectura
;Guarda resultado en PERIODOH
;Configura el mdulo para captura de flanco positivo
;Borra bit
;Borra bit
;Recupera ACC y PSW de la pila

En esta rutina falta efectuar la divisin de 16 bits entre las variables ANCHO y PERIODO, que
se puede realizar mediante la rutina DIV16 del apartado 5.7.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

297

11 Entradas y salidas analgicas


11.1 Introduccin
En el control de procesos industriales se precisa tener el valor instantneo de determinadas seales
analgicas, de forma que se pueda aplicar un algoritmo de control que gestione y dote de ciertas
caractersticas al sistema que se desea controlar. De la misma forma, en el procesado de seal tambin
es necesario tener el valor instantneo de la seal analgica, sobre la que se aplican ciertos algoritmos
1
2
digitales como pueden ser filtros FIR o IIR , con el fin de extraer determinadas caractersticas de la
seal medida. En consecuencia, es habitual tener convertidores del tipo analgico/digital, A/D, y
digital/analgico, D/A, en un sistema basado en microcontrolador, para efectuar el control de sistemas,
monitorizar el estado de seales analgicas y efectuar el procesado digital de seales. Mediante los
convertidores A/D se obtiene el valor discreto de la seal analgica, mientras que con los
convertidores D/A se convierte un valor discreto en analgico, pues es necesario que un
microcontrolador intervenga de esta manera en determinados sistemas.
La familia MCS-51 de Intel no dispone de conversores A/D ni D/A, con la excepcin de la versin
87C51GB, que tiene un conversor A/D de 8 bits de resolucin con hasta 8 canales multiplexados de
entrada. De la misma forma, la familia MCS-251 tampoco tiene convertidores A/D y D/A. Por tanto,
en estas familias los convertidores A/D y D/A se deben conectar externamente al microcontrolador. En
este sentido, se pueden emplear los puertos del microcontrolador para enviar datos, recibir datos y
realizar el control de los conversores A/D y D/A. No obstante, la modulacin de anchura de pulsos,
PWM, que se puede generar con los microcontroladores que disponen de PCA, se puede utilizar como
conversor D/A para las aplicaciones donde se requiere el control de un motor, debido a que la accin
de control de un motor se suele realizar mediante el ciclo de trabajo de una seal PWM.
Hay otros fabricantes de la familia MCS-51 que proporcionan versiones con convertidor A/D, como
por ejemplo el SAB80C515A de Siemens, que incorpora un conversor A/D de 10 bits. Por tanto, el
diseador, en funcin de los costos de desarrollo, siempre puede optar por conectar conversores A/D y
D/A comerciales al microcontrolador, o bien, por emplear versiones que ya los tengan incorporados.
Este captulo se centra en la conexin de convertidores A/D y D/A al microcontrolador, vlida para la
MCS-51 y para la MCS-251, as como para otros microcontroladores del mercado. Tambin, se

1
2

Los filtros FIR son filtros digitales no recursivos, ampliamente tratados en la teora clsica del procesado de seal.
A diferencia de los FIR, los filtros IIR son recursivos, es decir, con realimentacin de la salida del filtro.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

298

expone la implementacin de varias tcnicas de conversin A/D de bajo coste, en las que se utilizan
algunos de los recursos internos del microcontrolador.

11.2 Conexin de un convertidor D/A


La figura 11.1 muestra la conexin del convertidor digital/analgico MC1408DAC de 8 bits de
Motorola, que es un convertidor sencillo y de bajo costo. El convertidor est basado en una estructura
en escalera de resistencias del tipo R-2R, que se muestra en la figura 11.2. Segn esta figura, cada una
de las entradas binarias del convertidor controla directamente el estado de un conmutador del circuito,
de manera que controla la suma de las corrientes de cada rama al nodo de la entrada negativa del
amplificador operacional. La corriente en cada una de las ramas tiene un valor proporcional a
potencias sucesivas de 2, es decir, en la rama del bit D8 la corriente es la mitad de la corriente de
entrada, en la rama del bit D7 la corriente est dividida por 4, y as sucesivamente. De esta manera, la
corriente de salida es proporcional a la palabra digital de entrada del convertidor, D0-D8. La corriente
finalmente obtenida se convierte en tensin mediante el amplificador operacional de salida (figura
11.2), cuya ganancia puede ajustarse a fondo de escala, o sea, con todas las entradas a 1 lgico, con la
resistencia RT del amplificador, para que la tensin de salida tenga un valor determinado.
+5V
+5V

MC1408

MCS-51

1k
1.25k

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

A8
A7
A6
A5
A4
A3
A2
A1

VREF (+)

+
LM336

2.5V

1.25k

5k

VREF (-)
2mA
Io
COMP

+12V
_

Vo
[0-10V]

+
100pF

VEE
RANGE

-12V

-12V

GND

Fig. 11.1 Conexin del convertidor MC1408DAC a la MCS-51

En el circuito de la figura 11.1, el diodo zener de 2.5V y las resistencias de 1.25k se emplean para
establecer una fuente de corriente precisa de 2mA. La corriente Io de salida del convertidor D/A se
convierte en tensin mediante el amplificador operacional, de manera que la tensin de salida de este
amplificador es:
Vo ] 2mA [

Entrada binaria
[ 5k
256

Con esta frmula, la corriente a fondo de escala, es decir, con la palabra binaria con todos los bits a 1
lgico, es de 2mA; por tanto, la tensin mxima a fondo de escala ser de 10V. Este valor se puede
modificar mediante la resistencia RT de realimentacin del amplificador operacional.
El tiempo de respuesta del convertidor D/A es un parmetro que determina su mxima velocidad de

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

299

conversin; el MC1408DAC tiene un tiempo de establecimiento settling time de 300ns. Y, la


resolucin del MC1408DAC, para el fondo de escala de 10V, es de 39.1mV, que equivale al
incremento de la tensin de salida que se produce cuando el bit de menor peso de entrada del DAC
cambia de valor.
+V
I
R

I/256

I/128

I/256
2R

I/128

2R
0

D0

I/4
I/4

2R

2R

D1

D7

I/2
I/2
2R
0

D8

RT

Vo ] Io [ RT

Io ] Di [
i

Io

I
28

i ] 0,1,...,7

Fig. 11.2 Estructura en escalera R-2R del convertidor MC1408DAC

Ejemplo 11.1 Generacin de una senoide mediante el MC1408DAC


En este ejemplo, se trata de realizar un programa para la MCS-51 con el circuito de la figura
11.1, que sea capaz de sintetizar una seal senoidal de 1.25kHz de frecuencia. Para ello, se
debe tener en cuenta que la tensin de salida Vo del circuito es unipolar, y que se debe
especificar un nmero de muestras de salida para que la seal tenga una forma adecuada. En
este caso, se obtienen 32 muestras de la seal (figura 11.3), es decir, 16 muestras por cada
semiperodo, para representar la seal senoidal.
V
10

7.5

2.5

0
0
0

4
45

8
90

12
135

16
180

20
225

24
270

28
315

32
360

Fig. 11.3 Seal senoidal a generar, formada por 32 muestras

La seal senoidal tiene una componente continua de 5V, de manera que su valor oscilar entre
0V y 10V, segn la siguiente expresin:
Vo ] 5V ( 5V [ sin ()
donde es el ngulo de cada muestra de la senoide. En la tabla 11.1 se presenta el valor de
cada una de las muestras de salida del convertidor D/A, en voltios, y el valor binario

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

300

correspondiente a la entrada del convertidor. En el programa de este ejemplo se debe


implementar la tabla de datos, D7-D0, que debe extraer por el puerto del microcontrolador. El
Timer 1, mediante interrupcin, determinar la base de tiempos de extraccin de los datos por
el puerto P1.
Para generar una frecuencia de 1.25kHz el peiodo de la seal debe ser de 0.8ms, y el de cada
muestra de salida de 0.8ms/32, es decir, cada muestra se debe extraer cada 25)s. Este perodo
se puede generar con el Timer 1, configurado en el modo 2 de 8 bits con autorrecarga. Con una
frecuencia de reloj de 12MHz, y con el Timer contando pulsos internos, bit C/T a 0 lgico, se
puede hacer que el Timer interrumpa cada 25)s, poniendo el registro TH1 al valor E7H, es
decir, a la diferencia entre el valor de rebasamiento del Timer y 25)s (256)s-25)s).
Tabla 11.1 Valores de las muestras para la generacin de la seal senoidal formada por 32 muestras con una
separacin de 11.25 cada una
0
11.25
22.5
33.75
45
56.25
67.5
78.75
90
101.25
111.5
123.75
135
146.25
157.5
168.75

sin( )
0
0.195
0.382
0.555
0.707
0.831
0.923
0.980
1
0.980
0.923
0.831
0.707
0.555
0.382
0.195

Vo (V)
5
5.975
6.913
7.777
8.535
9.157
9.619
9.904
10
9.904
9.619
9.157
8.535
7.777
6.913
5.975

D7-D0
80H
99H
B1H
C7H
DAH
EAH
F6H
FDH
FFH
FDH
F6H
EAH
DAH
C7H
B1H
99H

180
191.25
202.5
213.75
225
236.25
247.5
258.75
270
281.25
292.5
303.75
315
326.25
337.5
348.75

sin( )
0
-0.195
-0.382
-0.555
-0.707
-0.831
-0.923
-0.980
-1
-0.980
-0.923
-0.831
-0.707
-0.555
-0.382
-0.195

Vo (V)
5
4.024
3.086
2.222
1.464
0.842
0.380
0.096
0
0.096
0.380
0.842
1.464
2.222
3.086
4.024

D0-D7
80H
67H
4FH
39H
25H
13H
08H
02H
00H
02H
08H
13H
25H
39H
4FH
67H

El programa para generar la seal senoidal en la MCS-51 se muestra a continuacin:


;************************************************************************
; Generacin de una seal senoidal peridica de 32 muestras para la MCS-51
;************************************************************************
ORG 0H
; Tabla de vectores de salto
LJMP Inicio
ORG 01BH
LJMP RSI_Timer1
;************************************************************************
; Rutina de Inicio
;************************************************************************
Inicio: SETB ET1
;Habilita interrupcin del Timer 1
SETB PT1
;Asigna prioridad alta al Timer 1
SETB EA
;Habilita bit de interrupcin general
MOV TMOD, #20H
;Timer 1 en el Modo 2, GATE=0 y C/T=0
MOV TL1, #E7H
;(256-25) carga valor inicial para frecuencia de 1.25kHz
MOV TH1, #E7H
;Carga valor inicial para frecuencia de 1.25kHz
SETB TR1
;Pone marcha el Timer 1
;*************************************************************************
; Rutina de Principal
;*************************************************************************
Principal:
SJMP Principal
;Bucle infinito sin ninguna funcin definida

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

301

;************************************************************************
; Rutina de servicio del Timer1
;************************************************************************
RSI_Timer1:MOV A, R7
;Pone R7 en A, (1)s).
CALL Tab_Seno
;LLamada a subrutina de tabla, (2)s).
MOV P1, A
;Pone dato ledo en A, (1)s).
CJNE R7, #31, Borra
;Mira si el contador R7 supera su valor max., (2)s).
INC R7
;Incrementa contador R7, (1)s).
RETI
;Fin de rutina. El bit TF1 se borra automticamente, (2)s).
Borra:
MOV R7, #0
;Borra R7, (1)s).
RETI
;Fin de rutina. El bit TF1 se borra automticamente, (2)s).
Tab_Seno:
INC A
;Incrementa ndice de lectura de la tabla, (1)s).
MOVC A, @A+PC
;Lectura indexada de la tabla, (2)s).
RET
;Retorno de subrutina, (2)s).
DB 80H, 99H, B1H, C7H, DAH, EAH, F6H, FDH
;Tabla de datos
DB FFH, FDH, F6H, EAH, DAH, C7H, B1H, 99H
DB 80H, 67H, 4FH, 39H, 25H, 13H, 08H, 02H
DB 00H, 02H, 08H, 13H, 25H, 39H, 4FH, 67H

La rutina principal de este ejemplo consiste en un bucle infinito sin ninguna funcin definida,
puesto que la seal senoidal se genera totalmente por interrupcin. El registro R7 se utiliza
como un contador entre 0 y 31, que ndica el orden del dato a leer en la tabla definida por la
subrutina Tab_seno. Este contador se borra cada vez que se ha extrado la ltima muestra de la
seal senoidal.
Para determinar el instante preciso en el cual se extrae por el puerto P1 una muestra de la seal
senoidal, se debe tener en cuenta el tiempo en que se genera la interrupcin, el tiempo en que
tarda el microcontrolador en saltar a la rutina de RSI y el tiempo que tarda la rutina en poner el
dato correspondiente en el puerto P1. El Timer 1 causa una interrupcin cada 31)s, el tiempo
mnimo en saltar a la rutina de RSI es de 3 ciclos mquina, o sea, de 3)s para una frecuencia de
reloj de 12MHz, y la rutina, para poner el dato ledo en el puerto, debe ejecutar seis
instrucciones, lo que supone un tiempo de 8)s. En definitiva, desde que se produce la
interrupcin hasta que la muestra aparece en el puerto P1 transcurren 11)s. Por tanto, cada
muestra aparecer 11)s despus de que se produzca la interrupcin del Timer (figura 11.4).
Muestra 2

Muestra 1

11)s
16)s

Muestra n

31)s
Fin proceso int.

Int. T1

Int. T1

Int. T1

31)s
Int. Timer 1

Int. T1

Fig. 11.4 Secuencia de tiempos de la seal y de la interrupcin generada por el Timer 1

Una vez sacada la muestra por el puerto P1, la rutina de RSI puede tardar 2 3 instrucciones
ms en terminar de ejecutarse por completo, lo que, en el peor caso, supone un tiempo de 5)s
adicionales. En consecuencia, el tiempo en que se finaliza el proceso de interrupcin es de
16)s, por lo que la interrupcin del Timer 1 no puede producirse por debajo de este tiempo.
Este hecho supone que, si se quiere modificar la frecuencia de la seal senoidal, el perodo de

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

302

cada muestra de la seal no puede ser inferior al proceso de interrupcin; es posible generar,
para este caso, una seal senoidal con una frecuencia mxima de 1.953Hz. No obstante, esta
frecuencia se puede disminuir reduciendo la cantidad de muestras de la seal, o bien
aumentando la frecuencia de la seal de reloj del microcontrolador.

11.3 Convertidor A/D de bajo coste mediante aproximaciones sucesivas


El convertidor digital/analgico anterior, MC1408DAC, se puede emplear, junto con un comparador y
con el microcontrolador, para realizar un convertidor analgico/digital de bajo coste (figura 11.5),
basndose en la tcnica de aproximaciones sucesivas.
+5V
+5V

MC1408

MCS-51

1k
1.25k

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

A8
A7
A6
A5
A4
A3
A2
A1

VREF (+)

+
LM336

2.5V

1.25k

5k

VREF (-)
2mA

+12V
Io

LF355

COMP

+
100pF

VEE
RANGE

GND

-12V

-12V

Vo

+5V
+5V

P3.4
LM393

+
_

VIN

Fig. 11.5 Convertidor A/D de 8 bits de bajo coste mediante aproximaciones sucesivas

La tcnica de aproximaciones sucesivas se centra en la bsqueda binaria, por parte del


microcontrolador, de un valor de tensin de entrada Vin desconocido, comparndolo, para ello, con
valores conocidos de tensin, obtenidos a partir de un convertidor D/A y de una tensin de referencia
Vref. Como el convertidor D/A y el circuito empleado en la figura 11.5 son los mismos,
prcticamente, que en el apartado anterior, las tensiones mxima y mnima que se pueden generar en la
salida Vo son 10V y 0V, respectivamente. El valor mximo se corresponde con la palabra digital
11111111 y el valor mnimo con 00000000 del puerto P1.
La bsqueda binaria se inicia poniendo Vo a la mitad del fondo de escala, o sea, a (Vmax-Vmin)/2,
por lo que en el puerto P1 se debe poner el bit ms significativo a 1 lgico y el resto de bits a 0 lgico
(10000000)(figura 11.6). La tensin Vo generada por el D/A se compara con la seal Vin, de forma
que la salida del comparador es 0 lgico si Vin es mayor que Vo (Vin>Vo), y 1 lgico si Vin en menor
que Vo (Vin<Vo). El microcontrolador debe leer el estado de la comparacin, y si Vin es mayor que
Vo, entonces le debe sumar a la tensin actual Vo la mitad del margen superior que queda hasta llegar
al fondo de escala, es decir, (Vmax+Vo)/2, lo que se consigue poniendo a 1 lgico el bit 6 del puerto

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

303

P1 (P1=11000000). Si, al contrario, resulta que Vin es menor que Vo, entonces le debe restar a la
tensin actual Vo la mitad del margen inferior que queda hasta llegar al mnimo de tensin, 0V, es
decir, (Vo-Vmin)/2, lo que se consigue poniendo a 0 lgico el bit 7 y a 1 lgico el bit 6 del puerto P1
(P1=01000000). Este procedimiento se contina de forma sucesiva, hasta llegar a determinar el estado
del bit 0 del puerto P1. La conversin de la seal se lleva a cabo de esta manera en tan slo 8 pasos,
empezando por el bit ms significativo y terminando por el bit menos significativo.
La figura 11.6 muestra el algoritmo que hay que realizar con la tcnica de aproximaciones sucesivas.
En este algoritmo Vo(k) representa el valor de Vo actual y Vo(k+1) representa el valor de Vo futuro a
realizar. La conversin finaliza en 8 iteraciones, de forma que, partiendo del inicio, si tomamos el bit
ms significativo (MSB) como bit b(i), con i=7, se pueden dar dos situaciones en el algoritmo,
dependiendo del resultado de la comparacin entre Vin y Vo. En el caso de que Vin sea mayor que
Vo, Vin>Vo, se ejecuta la segunda ecuacin del algoritmo (ecuacin 2), que en realidad se lleva a
cabo simplemente forzando el bit b(i-1) a 1 lgico, es decir, para este caso, poniendo el bit b(6) a 1
lgico. Al contrario, si Vin es menor que Vo, Vin<Vo, se ejecuta la primera ecuacin del algoritmo
(ecuacin 1), que se lleva a cabo poniendo el bit b(i) a 0 lgico y el bit b(i-1) a 1 lgico, es decir,
poniendo en este caso el bit b(7) a 0 lgico y el bit b(6) a 1 lgico. Este algoritmo se iterar hasta
llegar a evaluar el bit b(0).
Inicio

Poner bit MSB


(bit 7) a 1 lgico

SI

Vin > Vo
NO
Vo (k ( 1) ] Vo( k )

NO

Vo (k ) V mn
2

Vo(k ( 1) ] Vo(k ) (

V mx Vo(k )
2

Es el bit
LSB (bit 0)
SI
Fin (Vo Vin)

Fig. 11.6 Flujograma del algoritmo de aproximaciones sucesivas

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

304

La subrutina que realiza la conversin para la MCS-51 se muestra a continuacin:


;****************************************************************************
; Subrutina CONV de aproximaciones sucesivas para el circuito de la figura 11.5
;****************************************************************************
CONV: MOV P1, #0
;Borra puerto P1, (2)s)
SETB P1.7
;Pone a 1 lgico el bit 7, (1)s)
JNB
P3.4, B1
;Lee el estado de la comparacin, (2)s)
CLR
P1.7
;Borra el bit 7, (1)s)
B1:
SETB P1.6
;Pone a 1 lgico el bit 6, (1)s)
JNB
P3.4, B2
;Lee el estado de la comparacin, (2)s)
CLR
P1.6
;Borra el bit 6, (1)s)
B2:
SETB P1.5
;Pone a 1 lgico el bit 5, (1)s)
JNB
P3.4, B3
;Lee el estado de la comparacin, (2)s)
CLR
P1.5
;Borra el bit 5, (1)s)
B3:
SETB P1.4
;Pone a 1 lgico el bit 4, (1)s)
JNB
P3.4, B4
;Lee el estado de la comparacin, (2)s)
CLR
P1.4
;Borra el bit 4, (1)s)
B4:
SETB P1.3
;Pone a 1 lgico el bit 3, (1)s)
JNB
P3.4, B5
;Lee el estado de la comparacin, (2)s)
CLR
P1.3
;Borra el bit 3, (1)s)
B5:
SETB P1.2
;Pone a 1 lgico el bit 2, (1)s)
JNB
P3.4, B6
;Lee el estado de la comparacin, (2)s)
CLR
P1.2
;Borra el bit 2, (1)s)
B6:
SETB P1.1
;Pone a 1 lgico el bit 1, (1)s)
JNB
P3.4, B7
;Lee el estado de la comparacin, (2)s)
CLR
P1.1
;Borra el bit 1, (1)s)
B7:
SETB P1.0
;Pone a 1 lgico el bit 0, (1)s)
JNB
P3.4, B8
;Lee el estado de la comparacin, (2)s)
CLR
P1.0
;Borra el bit 0, (1)s)
B8:
RET
;Conversin finalizada (2)s)

El tiempo de conversin de esta rutina, depender del valor de la seal analgica Vin. No obstante, se
pueden determinar el peor y mejor caso a ejecutar por la subrutina. El peor caso consistir en un valor
de Vin que obligue la ejecucin de todas las instrucciones de la subrutina. Teniendo en cuenta un reloj
de 12MHz para el microcontrolador, la subrutina tiene una primera instruccin que borra el puerto P1
y que tarda 2)s en ejecutarse. El resto de las instrucciones son una secuencia de puesta a 1 lgico,
lectura del comparador y borrado, que tarda 4)s, es decir, 1)s para la puesta a 1 lgico, 2)s para la
lectura del comparador y 1)s para el borrado. Esta secuencia se repite hasta ocho veces, por lo que el
tiempo de conversin, en el peor de los casos, es:
tpeor ] 2 ( (1 ( 2 ( 1) [ 8 ( 2 ] 44)s

El mejor de los casos consiste en una seal Vin tal que no se ejecute ninguna de las instrucciones
CLR, por lo que el tiempo de conversin es:
tmejor ] 2 ( (1 ( 2) [ 8 ( 2 ] 28)s

En consecuencia, con la subrutina mostrada y el circuito de la figura 11.5 el tiempo de conversin


estar comprendido entre 28)s y 44)s.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

305

11.4 Conexin de un convertidor A/D


La figura 11.7 muestra la conexin entre el convertidor analgico/digital ADC0809 de 8 bits de
National Instruments y un microcontrolador de la familia MCS-51. El ADC0809 puede leer la seal
procedente de hasta 8 canales de entrada, seleccionables mediante tres lneas de direccin, S2-S0, que
actan sobre un multiplexor interno. Este convertidor est basado en la tcnica de conversin por
aproximaciones sucesivas.
+5V

Bus datos

+12V

Vcc

1.8k

D0-D7

P0

+Vref
A11

S1
S2

A10
A11
A12
A13
A14
A15

Canal 0

IN0

Canal 1

IN1

Canal 2

IN2

Canal 3
Canal 4

IN3

Canal 5

IN5

Canal 6

IN6
IN7

Canal 7

IN4

-Vref

ADC0809

S0

A12

MCS-51

P2

A10

LM336-5

Inicio y lectura de conversin


74LS04
a

OE

74LS08
ALE

A15

A14

START

/INT0

74LS04

A13

EOC
GND

CLOCK
c

1k

1k

74LS04
680pF

Fig. 11.7 Conexin del convertidor ADC0809 a la MCS-51

Las salidas del convertidor A/D son triestadas, D0-D7, por lo que se pueden conectar directamente al
bus de datos de un sistema microprocesador. El convertidor precisa de una tensin de referencia
externa de 5V y de una seal de reloj comprendida entre 10kHz y 1280kHz. El tiempo de conversin
del convertidor es de 64 perodos de reloj desde el momento en que se inicia la conversin, por lo que
para una frecuencia de 640kHz el tiempo de conversin es de unos 100)s, aproximadamente, y de 50
)s para una frecuencia de 1280kHz.
La figura 11.8 muestra el diagrama de bloques del convertidor, que est compuesto por un multiplexor
analgico de 8 canales, un comparador, un registro de aproximaciones sucesivas (SAR), una escalera
de resistencias R-2R y una serie de interruptores que actan sobre la escalera de resistencias.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

306
START

CLOCK

A/D 8 bits
Control
y
sincronizacin

Multiplexor
analgico
de
8 canales

8 entradas
analgicas

EOC
Interrupcin

Registro de
aproximaciones
sucesivas (SAR)
COMPARADOR

3 bits de
direccin
ALE

Descodificador
y
latch de
direcciones

Buffer-latch
triestado
de
salida

8 bits
de
salida

Ramificacin de
interruptores

Escalera de
resistencias (256R)

Vcc

GND

+Vref

-Vref

OE

Fig. 11.8 Diagrama de bloques del ADC0809 de National Instruments

La figura 11.9 muestra el diagrama de tiempos del convertidor. El proceso de conversin del
convertidor empieza poniendo la lnea de control ALE a 1 lgico, lo que hace que se carguen las
direcciones S2-S0 en el latch interno de direcciones, seleccionando el canal analgico de entrada.
Aplicando un pulso en la seal de START se inicia la conversin de la seal, se borran los registros
internos del convertidor en el flanco de subida, y se inicia la conversin en el flanco de bajada. La
seal EOC, End of Conversion, pasa a 0 lgico en los primeros 8 perodos de reloj desde el flanco de
subida de la seal START, lo que indica el final de la conversin en el flanco de subida de EOC. Una
vez producido este flanco, se puede leer el dato obtenido por la conversin, para lo cual debe aplicarse
un pulso positivo a la seal OE, Output Enable, de forma que el dato se site en las 8 lneas del bus de
datos. Las salidas del convertidor permanecen en estado triestado hasta que se pone el dato convertido
en el bus de datos.
Segn la figura 11.7, las salidas D0-D7 del convertidor se conectan directamente al bus de direcciones
del microcontrolador, puerto P0. El inicio de la conversin se realiza aplicando un pulso en las lneas
START y ALE del convertidor. Estas entradas (figura 11.7) estn conectadas a las lneas A15, A14 y
A13 del bus de direcciones, mediante dos puertas AND, de forma que estarn a 1 lgico slo cuando
A15, A14 y A13 estn a 1 lgico. Al mismo tiempo, las lneas A12, A11 y A10 del bus de direcciones,
estn conectadas a las entradas de seleccin del canal analgico, I2, I1 y I0, respectivamente. De esta
forma, el inicio de la conversin en el convertidor y la seleccin del canal analgico pueden efectuarse
situando una direccin concreta en el bus de direcciones, que se corresponda con los rangos de
direcciones de la tabla 11.2.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

307
64 perodos de reloj

CLOCK

irecciones
S0-S2
50%

50%

ALE

Th
Ts
50%

50%

START
Entrada
analgica
IN0-IN7

ESTABLE
Tl

Teoc

EOC
Tc

OE
Th2

Salidas
D0-D7

TRIESTADO

DATO VLIDO

Fig. 11.9 Diagrama de tiempos del ADC0809.

Segn la tabla 11.2, escribiendo cualquier dato en el bus de datos por medio de la instruccin MOVX
y escogiendo el canal analgico de entrada con una de las direcciones de la tabla, puede iniciarse el
proceso de conversin del convertidor. La seal EOC est conectada mediante una puerta inversora a
la entrada de interrupcin /INT0 del microcontrolador; en consecuencia, el flanco de subida en EOC,
que indica el final de conversin del convertidor, aparece como un flanco de bajada a la entrada de
/INT0, que causar una interrupcin si /INT0 est habilitada por flanco descendente.
Tabla 11.2 Rango de direcciones del mapa de memoria para iniciar la conversin, junto con la seleccin del
canal analgico de entrada y para la lectura del dato
Rango de direcciones
Funcin
C000H-DFFFH
Lectura del dato convertido
E000H-E3FFH
Inicio conversin, seleccin canal 0
E400H-E7FFH
Inicio conversin, seleccin canal 1
E800H-EBFFH
Inicio conversin, seleccin canal 2
EC00H-EFFFH
Inicio conversin, seleccin canal 3
F000H-F3FFH
Inicio conversin, seleccin canal 4
F400H-F7FFH
Inicio conversin, seleccin canal 5
F800H-FBFFH
Inicio conversin, seleccin canal 6
FC00H-FFFFH
Inicio conversin, seleccin canal 7

La seal OE del convertidor est conectada tambin a dos puertas AND y a una puerta NOT, de
manera que OE estar a 1 lgico si se sita una direccin con la combinacin 1, 1 y 0 lgicos, en las
lneas A15, A14 y A13, respectivamente. En definitiva, el dato convertido se puede leer, en la rutina
de RSI de /INT0, ejecutando una lectura en cualquiera de las direcciones comprendidas en el rango
C000H-DFFFH, mediante la instruccin MOVX.

Los autores, 2001; Edicions UPC, 2001.

308

Microcontroladores MCS-51 y MCS-251

Ejemplo 11.2 Monitorizacin del estado de las bateras de un SAI


Los equipos de alimentacin ininterrumpida, SAI, se utilizan para mantener la tensin de la red
elctrica en los equipos informticos, en el caso de que se produzcan cortes repentinos de la
red. Estos equipos tienen una serie de bateras que, en el caso de producirse un corte, aportan la
energa necesaria para que, durante un intervalo de tiempo, sea posible cerrar los sistemas y
guardar la informacin ms importante. El estado de las bateras se debe comprobar
regularmente para poder detectar anomalas en el proceso de carga y descarga, e indicar el
momento en el cual una batera es defectuosa.
En este ejemplo se quiere utilizar un microcontrolador de la familia MCS-51 para monitorizar
el estado de las bateras, es decir, para leer su valor y proporcionrselo al sistema de control del
SAI, que suele llevarse a cabo por medio de un procesador digital de seal DSP. Segn la
figura 11.10, el equipo SAI tiene un total de ocho bateras de 12V, que forman dos ramas de
cuatro bateras cada una conectadas en paralelo, y que entrega la energa necesaria para
mantener la tensin de la red elctrica en los equipos informticos.
El microcontrolador debe leer la tensin de cada una de las bateras cuando la DSP se lo
indique mediante la transmisin del carcter ASCII 05H va RS-232C. Una vez finalizada la
lectura de todos los canales del A/D, el microcontrolador debe transmitir a la DSP la lectura
3
efectuada de cada batera va RS-232C; para ello debe transmitir el carcter 11H (XON ), que
se tomar por la DSP como carcter de inicio de la transmisin, los datos correspondientes a la
lectura efectuada en cada batera y el carcter 13H (XOFF) de final de transmisin.
En el circuito de la figura 11.10 tan slo se utiliza una memoria EPROM de 2kbytes de
capacidad para albergar el programa. No es necesario utilizar ningn circuito integrado de
memoria RAM externa, pues se usa la memoria interna del microcontrolador.
La memoria EPROM se selecciona mediante las lneas A12, A13, A14 y A15 del bus de
direcciones, que estn conectadas a una serie de puertas AND (figura 11.10), que hacen que la
memoria est seleccionada en el rango de direcciones comprendido entre 0000H y 0FFFH, o
sea, en las primeras 4kdirecciones del mapa de memoria (figura 11.11); aparece, por tanto, una
zona imagen en el rango [0800H-0FFFH] de 2kdirecciones. El convertidor A/D utiliza los
mismos rangos de direcciones para el inicio de la conversin y para la seleccin del canal que
los mostrados en la tabla 11.2.
La rutina de monitorizacin utiliza el registro R7 como indicador del final de conversin del
convertidor A/D. El tiempo de conversin del convertidor es de unos 100)s. La salida E0C del
convertidor A/D (figura 11.10) est conectada a la entrada de interrupcin /INT0 del
microcontrolador a travs de una puerta NOT. El final de la conversin se indica con un flanco

Para controlar el flujo en la comunicacin entre dos sistemas que procesan la informacin a distinta velocidad, es
frecuente emplear el protocolo XON/XOFF, en el cual se utilizan los caracteres ASCII 11H (XON) y 13H (XOFF), para
iniciar y para detener la transmisin, respectivamente. En este caso, XON y XOFF se usan para indicar el inicio y el final
de la transmisin por parte del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

309

de subida en EOC, que aparece en /INT0 como un flanco de bajada y provoca una interrupcin.
La rutina de RSI de /INT0 se limita a poner R7 al valor 01H, indicando de esta manera que la
conversin ha terminado.

EPROM
27C16
(2 kbytes)

MCS-51
P0

D74D0

Latch

RXD
TXD

74LS08

D74D0

A13
/INT0

Q74Q0

CLK

P2

A104A8
/OE

/PSEN

+5V
+
V1 _

+
V5 _

+
V2 _

+
V6 _

+
V3 _

+
V7 _

+
V4 _

+
V8 _

IN0

IN5
IN6
IN7
A10

S0

A11

S1
S2

ADC0809

IN4

LM336-5V

-Vref

74LS04

OE

e
74LS08

ALE

A15

A14

START

A13

EOC

74LS04

RS-232C

1.8k

+Vref

IN3

A12
d

D0-D7

IN2

Sensado y
acondicionamiento
de seal

SAI

+12V

Vcc

IN1

MC1488

A12

/CE

74LS373

ALE

/EA

A74A0

GND
A la DSP

CLOCK

1k

1k

74LS04
MC1489

680pF

Fig. 11.10 Convertidor ADC0809 y microcontrolador para la monitorizacin de las bateras de un equipo SAI

De la misma forma que R7, el registro R6 se emplea por la rutina de RSI del puerto serie para
indicar que se ha recibido, va RS-232C, el carcter ASCII 05H, que corresponde a la orden de
lectura del A/D. La rutina de RSI, al recibir este carcter, pone el registro R6 al valor 01H, para
que en la rutina principal se proceda a la lectura de todos los canales del convertidor A/D.
La rutina principal tiene un bucle de espera de recepcin, de la orden de lectura del convertidor
A/D, que est pendiente del valor del registro R6. Cuando la rutina detecta que R6 se ha puesto
a 01H, sta pasa a leer cada uno de los canales del convertidor A/D. Para ello, inicia la

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

310

conversin mediante la escritura con MOVX de cualquier dato en una de las direcciones de
inicio y de seleccin de canal que aparece en la tabla 11.2. Luego, la rutina pasa a la espera del
final de la conversin mediante un bucle que examina continuamente el estado del registro R7.
Finalmente, la rutina pasa a leer el dato obtenido por el convertidor efectuando una lectura en
la direccin C000H con la instruccin MOVX. Terminada la lectura de todos los canales, la
rutina principal pasa a transmitir cada uno de los datos obtenidos a la DSP va RS-232C.

b)

Memoria de datos
0000H

Sin memoria

a) Memoria de programas
0000H

EPROM
(2 kbytes)
07FFH
0800H

Imagen
(2 kbytes)
0FFFH
1000H

Sin memoria

FFFFH

BFFFH
C000H
Lectura dato (1k)
DFFFH
E000H
Ini. y Canal 0 (1k)
E3FFH
E400H
Ini. y Canal 1 (1k)
E7FFH
E800H
Ini. y Canal 2 (1k)
EBFFH
EC00H
Ini. y Canal 3 (1k)
EFFFH
F000H
Ini. y Canal 4 (1k)
F3FFH
F400H
Ini. y Canal 5 (1k)
F7FFH
F800H
Ini. y Canal 6 (1k)
FBFFH
FC00H
Ini. y Canal 7 (1k)
FFFFH

Fig. 11.11 Mapa de memoria del circuito de la figura 11.10. a) Mapa de la memoria de programas.
b) Mapa de la memoria de datos

La velocidad de transmisin de los datos es de 9.600 baudios; para ello se realiza la


comunicacin asncrona del puerto serie en el modo 1, en el que se transmiten 10 bits: 1 bit de
start, 8 bits del dato y 1 bit de stop. El Timer 1 del microcontrolador se utiliza como base de
tiempos para la transmisin, por lo que debe estar configurado en el modo 2 de 8 bits con
autorrecarga, con el bit C/T a 0 lgico, con el valor FDH de recarga en el registro TH1 y con
11.059MHz de frecuencia de reloj.
El programa que realiza la monitorizacin de las bateras para la MCS-51 se muestra a
continuacin:
;**************************************************************************
; Monitorizacin de las bateras de un SAI para la MCS-51
;**************************************************************************
; Declaracin de variables
;**************************************************************************
Conv_Canal_0
EQU #E000H
;Inicio de conversin y seleccin del canal 0
Conv_Canal_1
EQU #E400H
;Inicio de conversin y seleccin del canal 1
Conv_Canal_2
EQU #E800H
;Inicio de conversin y seleccin del canal 2
Conv_Canal_3
EQU #EC00H
;Inicio de conversin y seleccin del canal 3

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

311

Conv_Canal_4
EQU #F000H
;Inicio de conversin y seleccin del canal 4
Conv_Canal_5
EQU #F400H
;Inicio de conversin y seleccin del canal 5
Conv_Canal_6
EQU #F800H
;Inicio de conversin y seleccin del canal 6
Conv_Canal_7
EQU #FC00H
;Inicio de conversin y seleccin del canal 7
Lectura_AD
EQU #C000H
;Lectura del A/D
CA0
EQU 20H
;Direccin 20H de la memoria RAM interna
CA1
EQU 21H
;Direccin 21H de la memoria RAM interna
CA2
EQU 22H
;Direccin 22H de la memoria RAM interna
CA3
EQU 23H
;Direccin 23H de la memoria RAM interna
CA4
EQU 24H
;Direccin 24H de la memoria RAM interna
CA5
EQU 25H
;Direccin 25H de la memoria RAM interna
CA6
EQU 26H
;Direccin 26H de la memoria RAM interna
CA7
EQU 27H
;Direccin 27H de la memoria RAM interna
;**************************************************************************
; Rutina de Vectorizacin
;**************************************************************************
ORG 0H
LJMP Inicio
ORG 03H
LJMP RSI_INT0
ORG 023H
;Vectorizacin del puerto de comunicacin serie
LJMP RSI_RS
;**************************************************************************
; Rutina de Inicio
;**************************************************************************
Inicio: SETB IT0
;Interrupcin INT0 por flanco descendente
SETB EX0
;Habilita interrupcin INT0
SETB ES
;Habilita interrupcin del puerto de comunicacin serie
SETB SM1
;Configura la comunicacin serie en el modo 1
SETB REN
;Habilita la recepcin de un dato por el puerto serie
MOV TMOD, #20H
;Timer 1 en Modo 2, GATE=0 y C/T=0
MOV TL1, #0FDH
;Valor de TL1, para velocidad de 9600 baudios
MOV TH1, #0FDH
;Valor de recarga de Timer 1, para velocidad de 9600 baudios
SETB EA
;Habilita bit de interrupcin general
SETB TR1
;Pone marcha el Timer 1
;***************************************************************************
; Rutina de Principal
; R7 se emplea como indicador de final de conversin. R7=1 Conversin finalizada.
;***************************************************************************
Principal: CJNE R6, #01, Principal
;Bucle de espera a que R6 sea igual a 01H
MOV R6, #0
;Borra R6
ACALL Lectura_AD
;Realiza la lectura del A/D
SJMP Principal
;Bucle infinito
;**************************************************************************
; Rutina de servicio de INT0
;**************************************************************************
RSI_INT0: MOV R7, #01H
;Indica mediante R7 el final de la conversin
RETI
;**************************************************************************
; Rutina de servicio del puerto serie
;**************************************************************************
RSI_RS:
JNB TI, Recibe
;Si no interrumpe TI, entonces es RI
CLR TI
;Borra bit TI
RETI
Recibe:
MOV A, SBUF
;Lee puerto serie
CJNE A, #05H, Noesorden
MOV R6, #01H
;Da la orden de lectura del A/D
Noesorden: CLR RI
;Borra bit RI
RETI

Los autores, 2001; Edicions UPC, 2001.

312

Microcontroladores MCS-51 y MCS-251


;***************************************************************************
; Subrutinas
;***************************************************************************
Lectura_AD:MOV R7, #0
;Borra R7 para la lectura del canal 0
MOV DPTR, #Conv_Canal_0
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 0
Espera_C0: CJNE R7, #01H, Espera_C0
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA0, A
;Guarda en la memoria interna, pos. 20H
Canal_1:
MOV R7, #0
;Borra R7 para la lectura del canal 1
MOV DPTR, #Conv_Canal_1
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 1
Espera_C1: CJNE R7, #01H, Espera_C1
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA1, A
;Guarda en la memoria interna, pos. 21H
Canal_2:
MOV R7, #0
;Borra R7 para la lectura del canal 2
MOV DPTR, #Conv_Canal_2
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 2
Espera_C2: CJNE R7, #01H, Espera_C2
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA2, A
;Guarda en la memoria interna, pos. 22H
Canal_3:
MOV R7, #0
;Borra R7 para la lectura del canal 3
MOV DPTR, #Conv_Canal_3
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 3
Espera_C3: CJNE R7, #01H, Espera_C3
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA3, A
;Guarda en la memoria interna, pos. 23H
Canal_4:
MOV R7, #0
;Borra R7 para la lectura del canal 4
MOV DPTR, #Conv_Canal_4
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 4
Espera_C4: CJNE R7, #01H, Espera_C4
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA4, A
;Guarda en la memoria interna, pos. 24H
Canal_5:
MOV R7, #0
;Borra R7 para la lectura del canal 5
MOV DPTR, #Conv_Canal_5
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 5
Espera_C5: CJNE R7, #01H, Espera_C5
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA5, A
;Guarda en la memoria interna, pos. 25H
Canal_6:
MOV R7, #0
;Borra R7 para la lectura del canal 6
MOV DPTR, #Conv_Canal_6
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 6
Espera_C6: CJNE R7, #01H, Espera_C6
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA6, A
;Guarda en la memoria interna, pos. 26H
Canal_7:
MOV R7, #0
;Borra R7 para la lectura del canal 7
MOV DPTR, #Conv_Canal_7
;Carga direccin canal en DPTR
MOVX @DPTR, A
;Inicio conversin Canal 7
Espera_C7: CJNE R7, #01H, Espera_C7
;Bucle de espera hasta final de conversin
MOV DPTR, #Lectura_AD
;Carga direccin lectura en DPTR
MOVX A, @DPTR
;Lee dato del A/D
MOV CA7, A
;Guarda en la memoria interna, pos. 27H
ACALL Trans_datos
RET

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

313

Trans_datos: MOV SBUF, #11H


MOV SBUF, CA0
MOV SBUF, CA1
MOV SBUF, CA2
MOV SBUF, CA3
MOV SBUF, CA4
MOV SBUF, CA5
MOV SBUF, CA6
MOV SBUF, CA7
MOV SBUF, #13H
RET

;Caracter XON de inicio de transmisin


;Transmite dato canal 0
;Transmite dato canal 1
;Transmite dato canal 2
;Transmite dato canal 3
;Transmite dato canal 4
;Transmite dato canal 5
;Transmite dato canal 6
;Transmite dato canal 7
;Caracter XOFF de final de transmisin

Ejemplo 11.3 Control de la velocidad de un motor


En esta aplicacin se debe controlar, mediante un sistema basado en el microcontrolador
8XC251, la velocidad de un motor de corriente continua de pequea potencia. En la figura
11.12 aparece el esquema general del sistema de control y de la planta a controlar. El
microcontrolador 8XC251 est configurado con 16 lneas de bus de datos: RD1, RD0 = 10.

8XC251

DAC

ADC

Vo
Motor

Tacmetro

Vi

Fig. 11.12 Diagrama del sistema de control del motor DC

El objetivo del control es mantener constante la velocidad del motor, independientemente de


las condiciones de carga del mismo.
Mediante un convertidor digital/analgico, DAC, de 8 bits se fija la tensin de alimentacin del
motor. Conectado al eje del motor se encuentra otro motor que realiza funciones de tacmetro,
generando una tensin proporcional a la velocidad de giro. A travs de un convertidor
analgico/digital, ADC, de 8 bits, el microcontrolador adquiere la tensin que genera el
tacmetro, determinando de este modo la velocidad de giro real del motor. El proceso de
control que realiza el microcontrolador 8XC251 consiste en comparar la velocidad real del
motor con la deseada, y modificar convenientemente la combinacin binaria aplicada al DAC
para que ambas velocidades, la real y la deseada, se aproximen lo ms posible.
a) Conexin del DAC al microcontrolador 8XC251
El DAC utilizado es el AD557 de Analog Devices (figura 11.13). El AD557 es un DAC de 8
bits que incorpora todos los elementos necesarios para conectarlo directamente a un
microcontrolador.
El AD557 dispone de un registro donde se escribe el dato de 8 bits que se debe convertir. Para
escribir en este registro, basta aplicar el dato a las entradas de datos del convertidor (D0,...,D7),
al mismo tiempo que se activan, a 0 lgico, las entradas /CS y /CE.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

314

D0,..,D7

Vo

DAC
CE
AD557
CS
Fig. 11.13 Conversor AD557

Para ahorrar pines de entrada/salida se puede conectar el convertidor DAC al microcontrolador


como si de un integrado de memoria se tratase, adjudicndole una direccin o rango de
direcciones dentro del mapa de memoria del sistema microcontrolador. En este caso, se
direcciona el convertidor en la posicin de memoria externa 0032H. Para realizar la conversin
de un dato, basta grabarlo en la direccin de memoria XX:0032H, donde XX simboliza
cualquier regin del mapa de memoria disponible para el usuario: 00:, 01:, 02:, 03:, FC:, FD:,
FE: o FF:. Teniendo en cuenta estas consideraciones, la conexin entre el microcontrolador y el
DAC quedar como aparece en la figura 11.14.
8XC251
D0,...D7

P0

LATCH
8 BITS

ALE
P2

A0
A1
A2
A3
A4
A5
A6
A7

CS DAC
CE AC 557

WR

Fig. 11.14 Esquema elctrico de la conexin microcontrolador - DAC

En el esquema de la figura 11.14 se observa que se ha conectado la salida de escritura, /WR,


del microcontrolador 8XC251, a la entrada de habilitacin del convertidor, /CE. Esto se ha
hecho as, para que se active dicha entrada cuando el microcontrolador realice una operacin de
escritura, y no de lectura. Por otra parte, se ha conectado la entrada de seleccin de integrado,
/CS, a la salida de una puerta NAND, cuyas entradas, a su vez, estn conectadas a las lneas del
bus de direcciones del microcontrolador. Tal y como se ha realizado la conexin, la salida de
esta puerta NAND se activa, a 0 lgico, cuando en el bus de direcciones aparece la direccin
0032H, o sea, cuando el microcontrolador 8XC251 direcciona, para leer o escribir, la posicin
de memoria 0032H. En definitiva, con la conexin realizada, para que se activen las entradas
/CE y /CS del convertidor ser necesario que el microcontrolador realice una operacin de
escritura en la direccin de memoria 0032H.
Las siguientes instrucciones tienen como objetivo cargar un dato cualquiera denominado X,
de 8 bits, en el DAC, escribiendo dicho dato en la direccin 0032H:
MOV R11,#XH
MOV WR0,#0032H
MOV @WR0,R11

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

315

b) Conexin del ADC al microcontrolador 8XC251


Para realizar la conversin analgico-digital de la tensin generada por el tacmetro se utiliza
el ADC modelo AD673 de Analog Devices (figura 11.15). El AD673 es un convertidor de 8
bits que incorpora todos los elementos necesarios para conectarlo a un microcontrolador. Este
dispositivo dispone de las siguientes seales:
-

D0,..,D7: Salidas de datos triestadas. A travs de estas salidas podemos leer la


combinacin binaria resultado de realizar la conversin de la tensin de entrada Vi
procedente del tacmetro.
/OE: Habilitacin de salida. La activacin de esta seal, a 0 lgico, nos permite leer el
dato resultado de la conversin analgico-digital.
C: Entrada de inicio de conversin. Para iniciar la conversin debemos aplicar un pulso a
esta entrada, o sea, primero un 0 lgico, luego un 1 y, seguidamente, otro 0 lgico.
/DR: Salida de Data Ready o dato vlido. Esta salida se activa, a 0 lgico, cuando el ADC
finaliza la conversin. La activacin de esta salida indica al microcontrolador que ya ha
terminado el proceso de conversin y que el dato vlido est disponible para ser ledo por
el microcontrolador.
8

D0,..,D7
OE
C
DR

ADC AD673

Vi

Fig. 11.15 Convertidor AD673

En la figura 11.16 aparece el esquema elctrico simplificado de la conexin del 8XC251 al


ADC. Las lneas de datos y la lnea /OE del AD673 estn conectadas convenientemente, a las
lneas del microcontrolador 8XC251, para que la lectura del dato se realice cuando se ejecute
una instruccin de lectura de la posicin 00:0200H de la memoria externa. Para realizar el
control del ADC por interrupciones, se ha conectado la salida /DR del convertidor a la entrada
/INT0 del microcontrolador, de forma que cuando finaliza la conversin se realiza una peticin
de interrupcin al microcontrolador. En el programa principal de la aplicacin se incluyen
instrucciones que configuran la interrupcin /INT0 para que sea activa por flanco descendente
con un nivel de prioridad alto.
8XC251
P0

ADC
AD673

Latch

ALE
7

P2

OE
Vi

P2.1 1

C
DR

P1.0
INT0

Fig. 11.16 Conexin del microcontrolador 8XC251 con el AD673

Los autores, 2001; Edicions UPC, 2001.

316

Microcontroladores MCS-51 y MCS-251

En la rutina de servicio a la interrupcin /INT0 se incluyen las instrucciones que implementan


el algoritmo de control de la velocidad de giro del motor. En el diseo de esta rutina se han
considerado los siguientes aspectos:
1. El valor de la velocidad deseada est almacenado en la posicin 20H de la memoria RAM
interna del microcontrolador.
2. El dato que proporciona el convertidor ADC es la velocidad real. Ambos valores,
velocidad deseada y real, estn expresados en binario con 8 bits de precisin.
3. El valor que se graba en el convertidor DAC, y que fija la velocidad real actual del motor,
est almacenado, inicialmente, en la posicin 30H de la memoria RAM interna.
La RSI diseada debe leer el dato vlido que le proporciona el convertidor ADC, comparar ese
dato a velocidad real con el valor de la velocidad ideal que est almacenado en la posicin 20H
de la memoria RAM interna, y modificar el valor grabado en el DAC segn la siguiente
estrategia:
Si la velocidad real es mayor, como mnimo en dos unidades, que la velocidad ideal, se
decrementar en una unidad la combinacin binaria aplicada al DAC.
Si la velocidad real es menor, como mnimo en dos unidades, que la velocidad ideal, se
incrementar en una unidad la combinacin binaria aplicada al DAC.
En caso contrario no se modificar la combinacin binaria escrita en el DAC.
La RSI tambin debe generar las seales adecuadas para que el convertidor ADC comience una
nueva conversin. A continuacin se detallan las instrucciones del programa principal y de la
RSI de la interrupcin /INT0:
;********************************************************************************
;
Control de la velocidad del motor DC
;********************************************************************************
;Programa principal
ORG FF:0000H
; El programa principal comienza en la direccin FF:0000H.
JMP 0200H
; Para no interferir con la RSI de la interrupcin /INT0 se reubica a partir
ORG FF:0200H
; de la direccin FF:0200H
MOV TCON,#01H
; Configura /INT0 para que sea activa por flanco descendente.
MOV IE,#81H
; Habilita la interrupcin externa cero.
MOV IPH0,#01H
; Estas instrucciones programan la interrupcin INT0
MOV IPL0,#01H
; con nivel de prioridad mximo, nivel 3.
;********************************************************************************
;
RSI de la interrupcin /INT0
;********************************************************************************
ORG FF:0003H
; La rutina de RSI de /INT0 comienza en la direccin FF:0003H.
JMP FF:0100H
; Debido al tamao de la rutina de RSI se realiza salto a la
; direccin FF:0100H, donde se dispone de memoria libre.
MOV WR0,#0200H
; Se carga en el registro palabra WR0 la direccin 0200H.
MOV R11,@WR0
; Pone en R11 el contenido de la direccin 0200H, que es dato convertido.
CJNE A,20H,SIGUE
; Compara la velocidad real con la deseada (almacenada en dir. 20H)
JMP FIN
; Si las velocidades son iguales salta a FIN y va al programa principal.
SIGUE: JNC RESTA
; Salto a RESTA si la velocidad real es mayor que la deseada.
MOV 22H,A
; Si la velocidad real es menor que la deseada, realizo la
MOV A,20H
; diferencia entre la velocidad deseada y la velocidad real.
CLR C
;
SUB A,22H
;
CJNE A,#02H,SIGUE2 ; Se compara la diferencia de velocidades con 2.
JMP FIN
; Si la diferencia es igual a dos salta a FIN y va al programa principal.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

317

SIGUE2: JC FIN

; Si la diferencia es menor que dos salta a FIN y retorna al programa principal,


; en caso contrario se debe aumentar la combinacin binaria aplicada al DAC
; (direc. 32H) y se salta a FIN para volver al programa principal.
INC 30H
; Se incrementa la posicin de memoria 30H
JMP CARGA ; Se salta a CARGA donde se cargar el incremento en la direccin 32H

RESTA: SUB A,20H


; Se hace la resta entre la velocidad real y la deseada.
SIGUE2: CJNE A,#02H,SIGUE3 ; Se compara la diferencia con dos.
JMP FIN
; Si la diferencia es igual a 2 el programa acaba
SIGUE3 JC FIN
; Si la diferencia es menor que dos el programa acaba.
DEC 30H
; Se decrementa el contenido de la posicin 30H.
CARGA: MOV A,30H
; Se carga el resultado del decremento en el
Acumulador.
MOV DR0,#0032H
; Se carga el resultado en la posicin de memoria
MOVH DR0,#0001H ; 01:0032H.
MOV @DR0,R11
;
FIN:
RETI
; Se retorna al programa principal.

En la figura 11.17 se presenta el diagrama de flujo de la rutina de servicio a la interrupcin externa


cero, /INT0.
INICIO DE LA
ISR DE INT0

SE LEE LA
VELOCIDAD REAL

S
REAL>DESEADA?
DIFERENCIA = REAL-DESEADA
NO
DIFERENCIA = DESEADA-REAL
NO
DIFERENCIA>2 ?
NO

SI
S

DIFERENCIA>2 ?

S
SE INCREMENTA
COMBINACIN DAC
SE CARGA EL NUEVO
VALOR EN EL DAC

SE DECREMENTA
COMBINACIN DAC
SE CARGA EL NUEVO
VALOR EN EL DAC

RETI

RETI

Fig. 11.17 Organigrama de la RSI de la interrupcin /INT0

11.5 Conversin A/D utilizando los temporizadores del microcontrolador


Los temporizadores de la MCS-51 se pueden utilizar para medir el ancho de un pulso digital de forma
precisa. El valor de una seal analgica, en un momento determinado, se puede hacer proporcional al
ancho de un pulso digital, comparando la seal analgica con una seal en forma triangular o en forma
de diente de sierra (figura 11.18). En consecuencia, es posible tener una lectura digital del valor de la
seal usando los temporizadores del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

318
Vmx

Vin
Diente de sierra
k

k+1

k+2

k+3

k+4

k+5

Vo
+
Vin, seal analgica

Vo
w
T

Fig. 11.18 Obtencin de una seal discreta Vo cuyo ancho de pulso w es proporcional al valor en un momento
dado de la seal analgica Vin

Utilizando la seal en diente de sierra, la relacin entre el ancho de pulso w a medir y el valor de la
seal analgica se puede deducir, fcilmente, de la figura 11.18, y viene dado por la expresin:
w
Vin (k ) ] Vmx 1

(11.1)

donde Vin(k) es el valor de la seal analgica en el instante k, Vmx es el mximo valor de tensin
que puede tomar la seal en diente de sierra, T es el perodo de la seal de diente de sierra y w es el
ancho del pulso obtenido de la seal analgica.
El ancho del pulso de la seal Vo se puede medir de forma precisa con el Timer 0 o con el Timer 1,
debido a que la puesta en marcha y la parada de estos temporizadores puede efectuarse por medio de
las entradas de interrupcin /INT0 y /INT1, respectivamente. Por ejemplo, para el Timer 0 poniendo el
bit GATE del registro TMOD a 1 lgico y el bit TR0 del registro TCON a 1 lgico, el temporizador se
pone en marcha cuando /INT0 est a 1 lgico y se detiene cuando est a 0 lgico (figura 7.1). De la
misma forma, se puede gobernar al Timer 1 mediante la entrada /INT1, poniendo los bits GATE y
TR1 a 1 lgicos.

MCS-51
/INT0

W
Fig. 11.19 Lectura de ancho de un pulso a travs de /INT0 y del Timer 0 para la MCS-51

Las entradas /INT0 y /INT1 se pueden, adems, utilizar para generar una interrupcin que indique el
final de la conversin, activando, para ello, las interrupciones por flanco descendente. Por ejemplo,
para el Timer 0 (figura 11.19), el temporizador se pone en marcha cuando /INT0 est a 1 lgico y se
detiene cuando /INT0 pasa a 0 lgico; pero, adems, el flanco descendente de /INT0 puede generar
una interrupcin que se puede aprovechar como indicativo de final de conversin.
El Timer puede llegar a desbordamiento cuando el ancho de los pulsos a medir sea de una valor
considerable. En este caso, es conveniente que el Timer genere una interrupcin cuando llegue a
desbordamiento, que permita contabilizar el nmero de desbordamientos producidos en la rutina de

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

319

RSI del Timer. La figura 11.20 muestra un pulso cuyo ancho causa varios desbordamientos en el
Timer, hecho que determina la manera de calcular el valor medido.
Desbordamientos
interrupcin del Timer

Puesta en marcha

64 k

64 k

64 k

Parada

Interrupcin
/INT0

ltimo lectura
del Timer

Fig. 11.20 Pulso con un ancho que provoca varios desbordamientos del Timer

En este caso, considerando que el Timer tiene el bit C/T a 0 lgico, que est configurado en el modo 1
como temporizador/contador de 16 bits y que la frecuencia de reloj del microcontrolador es de
12MHz, el ancho de un pulso se puede determinar mediante la siguiente ecuacin:
W ] M [ 65536 ( V )s

(11.2)

donde M es el nmero de desbordamientos producidos en el Timer, V es el valor de la ltima lectura


del Timer y 65.536 o FFFFH es el valor de desbordamiento del Timer.
La precisin en la medida del ancho del pulso depender de la base de tiempos empleada por los
Timers. Con C/T a 0 lgico (figura 7.1), y con una frecuencia de reloj de 12MHz, la precisin del
temporizador es de un microsegundo. Con C/T a 1 lgico la precisin del Timer depender de la seal
de reloj externa (terminales T0 para el Timer 0 y T1 para el Timer 1).
Las rutinas de RSI del Timer 0 y de /INT0 se muestran a continuacin, para el caso de la figura 11.19,
donde se desea medir el ancho w de un pulso que puede causar varios desbordamientos. En la rutina
de RSI del Timer 0 se utiliza el registro R7 como contador del nmero de desbordamientos cometidos
por este.
;************************************************************************
; Rutina de Inicio
;************************************************************************
SETB IT0
;Activa /INT0 por flanco descendente
SETB EX0
;Habilita interrupcin de /INT0
SETB ET0
;Habilita interrupcin del Timer 0
SETB EA
;Habilita bit de interrupcin general
MOV TMOD, #09H
;M1=0 y M0=1 (Modo 1), GATE=1 y C/T=0, para Timer 0.
SETB TR0
;Pone marcha el Timer 0
;************************************************************************
; Rutina de servicio del Timer 0
;************************************************************************
RSI_Timer0:INC R7
;Incrementa contador del n de desbordamientos
RETI
;************************************************************************
; Rutina de servicio de /INT0
;************************************************************************
RSI_INT0: MOV R6, TH0
;Lee byte alto del Timer 0
MOV R5, TL0
;Lee byte bajo del Timer 0
MOV B, R7
;Guarda R7 en registro B

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

320
MOV TH0, #0
MOV TL0, #0
MOV R7, #0
RETI

;Pone a cero el Timer


;Borra R7

La rutina de inicio configura el Timer 0 en el modo 1 como temporizador/contador de 16 bits,


contando pulsos internos de reloj (C/T = 0), y con el bit GATE a 1 lgico. La rutina de RSI del Timer0
tan slo contabiliza el nmero de desbordamientos de ste. La rutina de RSI de /INT0 guarda la ltima
lectura del Timer en los registros R5 y R6 (figura 11.20), y a continuacin borra los registros del
Timer. El valor del ancho del pulso W se debe obtener de la ecuacin (11.2); para ello, se debe
multiplicar el registro B de 1 byte por el dato FFFFH de 2 bytes, y luego sumar al resultado el valor
ledo de los registros TH0 y TL0 del Timer. Este clculo se puede hacer en la rutina de RSI de /INT0 o
en cualquier otra parte del programa.
Ejemplo 11.4 Conversin A/D por modulacin de anchura de pulsos utilizando los Timers 0 y 1
En la figura 11.21 se muestra un circuito de conversin analgico/digital con un
microcontrolador de la familia MCS-51, que utiliza el Timer 0 para generar la forma peridica
de la seal en diente de sierra, con un perodo Tm, y el Timer 1 para medir el ancho del pulso
recibido a travs de la entrada de interrupcin /INT1.
Control
interruptor S

P1.0

Vcc

Diente de sierra
Vi

MCS-51

Rt

-Vr

Vo

/INT1

Vin

Seal
analgica

Fig. 11.21 Circuito de conversin A/D mediante modulacin de anchura de pulsos con una seal en forma de
diente de sierra, empleando un microcontrolador de la MCS-51

La seal en forma de diente de sierra se genera por medio del amplificador operacional, que
hace de circuito integrador con reset, y por medio de la patilla P1.0 del microcontrolador que
controla el cierre y la apertura del interruptor S. El integrador tiene una tensin negativa de
entrada constante, -Vr, por lo que produce a la salida una tensin Vo positiva en forma de
rampa (figura 11.22), cuya pendiente es proporcional a los valores de Vr, R, C y del tiempo de
integracin Tm.
Vo ]

m]

Vi
RC

Vi
T
RC

Vo ]

Vr [ T
RC

T
Fig. 11.22

Los autores, 2001; Edicions UPC, 2001.

(11.3)

11 Entradas y salidas analgicas

321

La seal analgica Vin de entrada proviene de un sensor de temperatura ambiente cuyo margen
de tensin est comprendido entre 0.1V, para -15C, y 5V, para 55C. El valor mximo de la
tensin de salida del integrador, para adecuarse al margen de la seal analgica, debe ser algo
mayor que 5V; en este caso se toma el valor de 5.1V. La seal analgica tiene una variacin
temporal lenta, por lo que se toma una frecuencia de muestreo de 5 muestras por segundo, que
es ms que suficiente para tener una representacin temporal adecuada de la seal. Para obtener
esta frecuencia, el perodo de muestreo Tm ha de ser de 0.2s, por lo que, teniendo en cuenta
que el Timer 0 llega a desbordamiento cada 64k pulsos de entrada, es decir, cada 65.536)s, el
nmero de desbordamientos que debe tener el Timer es de:
N desbordamientos ]

Tiempo
0,2s
]
] 3.051
65536)s 65536)s

Luego, es suficiente con hacer que el Timer 0 desborde tres veces para generar, de forma
aproximada, la frecuencia de muestreo requerida. A partir de la ecuacin (11.3) se determina
que con una tensin Vr negativa de 5V, una resistencia de 200k y un condensador de 980nF,
la tensin mxima alcanzada por la rampa en 0.2s es de 5.1V, aproximadamente.
El programa que realiza la conversin A/D por modulacin de anchura de pulsos para la MCS51 se muestra a continuacin:
;**************************************************************************
; Conversin A/D por modulacin de anchura de pulsos para la MCS-51
;**************************************************************************
; Rutina de Vectorizacin
;**************************************************************************
ORG 0H
LJMP Inicio
ORG 0BH
LJMP RSI_Timer0
ORG 013H
LJMP RSI_INT1
ORG 01BH
LJMP RSI_Timer1
;**************************************************************************
; Rutina de Inicio
;**************************************************************************
Inicio:SETB IT1
; Activa la interrupcin /INT1 por flanco descendente
SETB EX1
; Habilita interrupcin /INT1
SETB ET0
; Habilita la interrupcin del Timer 0
SETB ET1
; Habilita la interrupcin del Timer 1
SETB EA
; Habilita bit de interrupcin general
MOV TMOD, #91H
; Timer 1 (Modo 1, GATE=1, C/T=0).Timer 0 (Modo 1, GATE=0, C/T=0)
SETB TR0
; Pone en marcha el Timer 0
SETB TR1
; Pone en marcha el Timer 1
;***************************************************************************
; Rutina de Principal
;***************************************************************************
Principal: CJNE R3, #01, Principal
;Bucle de espera a que R6 sea igual a 01H
MOV R3, #0
;Borra R6
ACALL Calcula_w
;Realiza el clculo del ancho W del pulso
SJMP Principal
;Bucle infinito

Los autores, 2001; Edicions UPC, 2001.

322

Microcontroladores MCS-51 y MCS-251


;**************************************************************************
; Rutina de servicio de INT1
;**************************************************************************
RSI_INT1: MOV R6, TH1
;Pone TH1 en R6
MOV R5, TL1
;Pone TL1 en R5
MOV B, R7
;Pone R7 en B
MOV TH1, #0
;Pone a cero el Timer 1
MOV TL1, #0
MOV R7, #0
;Borra R7
MOV R3,#1
;Indica con R3 el final de la lectura
RETI
;**************************************************************************
; Rutina de servicio de Timer 0 (Cierra el interruptor S cada 3 desbordamientos del Timer 0)
;**************************************************************************
RSI_Timer0: CJNE R4, #02H, Cont_S
;Si distinto a 02H va a Cont_S
MOV R4, #0
;Pone a cerro contador de desbordamientos
SETB P1.0
;Cierra el interruptor S (reset rampa)
CLR P1.0
;Abre interruptor S
RETI
Cont_S:
INC R4
;Incrementa contador (contador de 0 a 2)
RETI
;**************************************************************************
; Rutina de servicio de Timer 1
;**************************************************************************
RSI_Timer1: INC R7
RETI
;***************************************************************************
; Subrutina de clculo del ancho del pulso
; entrada: B=N de rebasamientos del Timer 1, R6=TH1 y R5=TL1
;Salida: W= FFFFH x B + (TH1,TL1), R0=byte alto, R1=byte intermedio, R0=byte bajo
;***************************************************************************
Calcula_w: MOV A, B
;Pone B (rebasamientos Timer 1) en A
MOV B, #FFH
;Pone FFH en B
MUL AB
;Multiplica
MOV R2, A
;Guarda A en R0
CLR C
;Borra bit de acarreo
ADD A, B
;Suma A y B
MOV R1, A
;Guarda resultado en R1
CLR A
;Borra A
ADDC A, B
;Suma el acarreo anterior a B
MOV R0, A
;Resultado R0=byte alto, R1=byte intermedio y
;R2=byte bajo
CLR C
;Borra acarreo
MOV A, R5
;R6=TL1, pone TL1 en A
ADD A, R2
;Suma TL1 y R2
MOV R2, A
;Guarda resultado en R2
MOV A, R6
;R6=TH1, pone TH1 en A
ADDC A, R1
;Suma TH1 y R1 con acarreo
MOV R1, A
;Guarda resultado en R1
CLR A
;Borra A
ADDC A, R0
;Suma el acarreo a R0
MOV R0, A
;Guarda resultado en R0
RET

La rutina de RSI de /INT1 utiliza el registro R3 como indicativo de final de lectura del ancho
del pulso w. El registro R3 se pone al valor 01H cuando se ha finalizado la lectura. La rutina
principal est formada por un bucle de espera del final de la lectura. Este bucle, si detecta que
R3 es igual a 01H, borra el registro y ejecuta la subrutina Calcula_w que efecta el clculo del
ancho del pulso. La subrutina implementa la ecuacin (11.2) y tiene por entrada el nmero de

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

323

rebasamientos del Timer 1 en el registro B, el ltimo valor de TH1 en el registro R6 y el ltimo


valor de TL1 en el registro R5. Las operaciones que efecta la subrutina Calcula_w se muestran
en la figura 11.23.
La subrutina Calcula_w, de acuerdo con la ecuacin (11.2), debe multiplicar el contenido del
registro B por 65.536, o FFFFH. Esta multiplicacin se lleva a cabo en dos partes: una primera
multiplicacin de B por FFH y una suma posterior de los resultados. La instruccin MUL AB
slo se ejecuta una vez, puesto que el byte alto y el byte bajo del dato FFFFH son los mismos.
El resultado de la suma, M0, M1 y M2 (figura 11.23), se almacena en los registros R0, R1 y
R2, respectivamente.
FFFFH
xB
C1 C2
C3 C4
M0 M1 M2
+ TH1 TL1
S0

S1 S2

Fig. 11.23 Operaciones que realiza la subrutina Calcula_w

Al resultado de la multiplicacin se le suma el valor de los registros del Timer 1, que estn
almacenados en los registros R6 y R5. El resultado final de la suma, S0, S1 y S2, se sita en los
registros R0, R1 y R2, respectivamente.
Para efectuar el reset del circuito integrador es suficiente con poner a 1 lgico la patilla P1.0
con la instruccin SETB en la rutina de RSI del Timer 0, cerrando el interruptor S y forzando la
salida Vo a cero voltios. La siguiente instruccin pone a 0 lgico la patilla P1.0, abriendo el
interruptor S y dejando actuar al integrador como tal. En el programa realizado no se contempla
ningn uso posterior del valor de temperatura ledo por el microcontrolador. Este valor se
puede visualizar en una serie de dgitos de siete segmentos y se puede utilizar para realizar una
regulacin de la temperatura del sistema medido.
Ejemplo 11.5 Sistema de adquisicin de temperatura con el sensor MAX6576
En la figura 11.24 se presenta el esquema de un sistema de adquisicin de temperatura donde se
utiliza un sensor de temperatura MAX6576, de la compaa MAXIM, que suministra una seal
binaria cuyo perodo es proporcional a la temperatura absoluta:
Perodo = C T(K)

(11.1)

donde C es una constante de proporcionalidad que puede tener cuatro posibles valores entre
10s/K y 640s/K, seleccionables mediante las entradas TS0 y TS1.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

324

+2.7 a +5.5V
VDD

8XC251

MAX6576
TS0
TS1

OUT

P0.0

Fig. 11.24 Sistema de adquisicin de temperatura con el sensor MAX6576

En esta aplicacin, la funcin del microcrontrolador es la de calcular la temperatura de acuerdo


con el perodo medido de la onda cuadrada, mediante uno de los temporizadores del C. Con
las entradas TS0 y TS1 conectadas a masa, la constante de proporcionalidad perodo/
temperatura, C, adquiere el valor 10s/K, por lo que el perodo viene dado por:
Perodo = 10s/K T(K)

(11.2)

El programa que controla esta aplicacin debe configurar el Timer 0 para que trabaje como
temporizador en modo 1, e inicializar su valor a cero. Seguidamente se pone en marcha durante
el tiempo equivalente a un perodo de la onda cuadrada. A partir del valor que tiene el Timer 0,
una vez detenido su funcionamiento, se calcula la temperatura.
Si la frecuencia de la seal de reloj del microcontrolador es de 12MHz, el Timer 0 se
incrementa una vez cada microsegundo, por lo que la relacin entre la temperatura y el nmero
de incrementos sufrido por el Timer 0 vendr dado por:
Temperatura (C) = (N 2731)/10

(11.3)

donde N es el nmero de incrementos sufrido por el Timer 0.


A continuacin se detalla el programa que controla el funcionamiento del sistema de
adquisicin de temperatura del ejemplo 11.5.
;*************************************************************
; Control de la sistema de adquisin del ejemplo 11.5
;*************************************************************
;Programa principal
ORG FF:0000H
; El programa principal comienza en la direccin FF:0000H.
MOV TMOD,#01H
; Se configura el Timer 0 como temporizador en modo 1.
MOV TH0,#00H
; Se inicializa el Timer 0 con el valor 0.
MOV TL0,#00H
;
SIG1: JB P0.0,SIG1
; Se espera a que comience un perodo con un 1 lgico
SIG2: JNB P0.0,SIG2
;
SETB TR0
; Se pone en marcha el Timer 0.
SIG3: JB P0.0,SIG3
; Se espera a que pase el perodo.
SIG4: JNB P0.0,SIG4
;
CLR TR0
; Se detiene el Timer 0.

Los autores, 2001; Edicions UPC, 2001.

11 Entradas y salidas analgicas

325

MOV R2,#TH0
MOV R3,#TL0
MOV WR0,#2731D
MOV WR4,#10D
SUB WR2,WR0
DIV WR2,WR4

; Se carga en el registro WR2 el contenido del Timer 0.


;
;
;
; Se resta del contenido del Timer 0 el valor 2731 y se divide entre 10
; para obtener la temperatura en grados centgrados en el registro WR2.

Ejemplo 11.6 Adquisicin de temperatura con el sensor MAX6577


La compaa MAXIM dispone de otro sensor de temperatura, el MAX6577, que genera una
onda cuadrada cuya frecuencia es proporcional a la temperatura en K:
Frecuencia = F T(K)

(11.4)

donde F es el coeficiente de proporcionalidad, que puede adquirir uno de entre cuatro posibles
valores entre 0.0675Hz/K y 4Hz/K, seleccionables mediante las entradas TS0 y TS1.
En la figura 11.25 se muestra el esquema elctrico de un sistema de adquisicin y visualizacin
de temperatura basado en el microcontrolador 8XC251 y en el sensor MAX6577.
+5V
8XC251
P1.0
+2.7 a +5.5V

P1.1
P1.2
P1.3

VDD

MAX6577
TS0
TS1

OUT

P1.4
T0

P1.5
P1.6
P1.7

Fig. 11.25 Esquema elctrico del ejemplo 11.6

En este ejemplo la entrada TS0 del sensor MAX6577 est conectada a la tensin de
alimentacin, mientras que la entrada TS1 est conectada a masa, de modo que el factor de
escala F vale 1Hz/K. La seal de salida del sensor se introduce en la entrada de cuenta del
Timer 0. La temperatura medida se muestra en binario y en grados centgrados a travs de los
leds conectados al puerto P1. La estrategia de control de esta aplicacin consiste en medir la
frecuencia de la seal de salida del sensor de temperatura, contando los pulsos que genera
durante un segundo. Para ello se utiliza el Timer 0 para contar los pulsos, y el Timer 1,
controlado mediante interrupcin, para temporizar 1 segundo. Si se considera que la frecuencia
de funcionamiento del microcontrolador es de 12MHz, el Timer 1 se incrementa en una unidad
cada mocrosegundo. Si se incializa este Timer con el valor 3CB0H, tarda 50ms en llegar a
rebasamiento, por lo que debe rebasar 20 veces para temporizar un segundo.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

326

Una vez transcurrido 1s, se resta el nmero 273 al valor contenido en el Timer 0 para obtener la
temperatura en grados centgrados. Este valor de temperatura se carga posteriormente en el
puerto P1 para ser visualizado a travs de los leds.
A continuacin se muestra el listado del programa que controla el sistema de adquisin de
temperatura.
;*************************************************************
; Control de la sistema de adquisin del ejemplo 11.6
;*************************************************************
;Programa principal
ORG FF:0000H
; El programa principal comienza en la direccin FF:0000H., pero se
; reubica en la direccin FF:1000H para no interferir con la RSI del Timer 1.
JMP 1000H
ORG FF:1000H
; Comienzo del programa principal.
MOV TMOD,#15H
; Se programa el Timer 1 como temporizador y el Timer 0 como
; contador.
MOV TH0,#00H
; Se inicializa el Timer 0 a cero.
MOV TL0,#00H
;
MOV TH1,#3CH
; Se incializa el Timer 1 para temporizar 20ms.
MOV TL1,#B0H
;
MOV TCON,#50H
; Se pone en marcha los Timers 0 y 1.
MOV R0,#20D
; Se inicializa el contador R0 con 20.
MOV IE,#88H
; Habilita la interrupcin del Timer 1 y se activa el bit EA.
CLR F0
;
ESPERA:JNB F0,ESPERA;
; RSI del Timer 1
ORG FF:001BH
MOV TH1,#3CH
MOV TL1,#B0H
DJNZ TICKS,FIN
MOV R10,TH0
MOV R11,TL0
SUB WR10,#273D
CPL A
MOV P1,R11
MOV TH0,#00H
MOV TL0,#00H
MOV R0,#20D
FIN:
RETI

; Direccin de comienzo de la RSI del Timer 1.


;
;
;
; Se carga el valor del Timer 0 en el registro WR0
;
; Se resta 273 al valor del Timer 0 para obtener la temperatura
; en grados centgrados.
; Se complementa el valor de la temperatura para activar los leds a nivel
; bajo.
; Se inicializa de nuevo el Timer 0 a cero.
;
; Se inicializa el contador R0 con 20.

Los autores, 2001; Edicions UPC, 2001.

12 Modos especiales de funcionamiento

327

12 Modos especiales de funcionamiento


12.1 Introduccin
Los modos especiales de funcionamiento Idle y Power Down se utilizan principalmente en aquellas
aplicaciones donde el consumo es un factor crtico, como por ejemplo los equipos porttiles, los
equipos de comunicaciones mviles, etc. El modo ONCE, On-Circuit Emulation, se utiliza para
realizar el test de las aplicaciones. Estos modos se pueden encontrar en microcontroladores de las
familias MCS-51 y MCS-251.

12.2 Registro de control de potencia (PCON)


El registro de funcin especfica PCON tiene dos bits de control del puerto de comunicacin serie,
varios bits para seleccionar los modos de funcionamiento Idle y Power Down, un bit de Power Off,
que detecta fallos en la tensin de alimentacin, y dos bits de propsito general (tabla 12.1).

12.2.1 Bits de control del puerto serie


El bit SMOD1 del registro PCON permite doblar la velocidad de transmisin del puerto de
comunicacin serie. Por otra parte, el bit SMOD0 del registro PCON determina la funcin del bit 7 del
registro SCON. En el caso que SMOD0 est a 1 lgico, el bit SCON.7 permite leer o escribir el bit
Framing Error (FE). Cuando SMOD0 est a cero el bit SCON.7 trabaja como bit SM0 del puerto de
comunicacin serie.

12.2.2 Bit de Power Off (POF)


El bit de Power Off se pone automticamente a 1 lgico cuando la tensin de alimentacin del
microcontrolador, Vcc, aumenta desde Vcc<3V hasta Vcc>3V. Con la activacin de este bit se pone
de manifiesto que el contenido de la memoria RAM interna es indeterminado, circunstancia que
ocurre, por ejemplo, cuando se aplica la tensin de alimentacin al integrado. Este bit puede ser
puesto a uno o a cero por programa.
En general, este bit se verifica despus de un reset del microcontrolador, para determinar si el reset se
ha realizado por una puesta en marcha de la aplicacin, por un fallo de la alimentacin, o bien ha sido
un reset efectuado con el microcontrolador en funcionamiento normal. En los dos primeros casos, este
bit se pone a 1 para indicar que el contenido de la memoria voltil interna es indeterminado; en este

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

328

caso lo habitual es borrar el bit mediante una instruccin. En el tercer caso, este bit permanece a 0
lgico. Si se detecta que el bit POF se pone a 1 por otro motivo, por ejemplo, si se produce una deriva
en la tensin de alimentacin que provoca que Vcc baje por debajo de 3V, se deber realizar un reset
por software para reinicializar el microcontrolador.
Tabla 12.1 Registro de control de potencia

PCON
b7
SMOD1

b6
SMOD0

Bit
7

Mnemnico
SMOD1

SMOD0

--

POF

3
2
1

GF1
GF0
PD

IDL

b5
--

b4
POF

Valor de Reset: 00XX 0000b


b3
b2
b1
GF1
GF0
PD

b0
IDL

Funcin
Bit de doble velocidad de transmisin.
Cuando este bit est a uno se dobla la velocidad de transmisin de datos del
puerto de comunicacin serie, cuando se utiliza el Timer 1 y el puerto serie
est trabajando en el modo 1, 2 o 3.
Seleccin de SCON.7.
Cuando este bit est a 1 lgico, el bit SCON.7 permite leer o escribir el bit
Framing Error. Cuando este bit est a cero, el bit SCON.7 realiza la funcin
de SM0.
Reservado.
Este bit est reservado y no puede ser utilizado por el usuario.
Bit de Power Off.
Este bit se pone a uno lgico cuando la tensin de alimentacin baja por
debajo de los 3 voltios o cuando se aplica la alimentacin al
microcontrolador. Con esta activacin se indica que el contenido de la
memoria RAM interna es indeterminado. Este bit se puede borrar por
software.
Bit de propsito general.
Bit de propsito general.
Bit de modo Power Down.
Cuando este bit est a 1 lgico se activa el modo Power Down. Este bit se
pone a cero cuando se realiza un reset del microcontrolador, o bien, cuando
se realiza una peticin de interrupcin.
Bit de modo Idle.
Cuando este bit est a 1 lgico se activa el modo Idle. Este bit se pone a cero
cuando se realiza un reset del microcontrolador, o bien, cuando se realiza una
peticin de interrupcin.

12.3 Modo Idle


El modo Idle es un modo de consumo reducido que permite reducir la potencia consumida por el
microcontrolador cerca del 40% de la potencia de consumo nominal. En este modo se impide que la
seal de reloj llegue a la CPU, detenindose la ejecucin del programa (figura 12.1), aunque los
perifricos del microcontrolador siguen recibiendo la seal de reloj, lo que permite su normal
funcionamiento.

Los autores, 2001; Edicions UPC, 2001.

12 Modos especiales de funcionamiento

329

Durante el modo Idle el contenido de los registros de la CPU permanece intacto, as como el
contenido de la memoria RAM interna y de los registros del rea SFR.
Para entrar en el modo de funcionamiento Idle se debe poner a uno lgico el bit IDL del registro
PCON.
Existen dos formas de salir del modo Idle:

Generando una interrupcin que est habilitada. Cuando se activa una fuente de
interrupcin que est habilitada se pone a cero automticamente el bit IDL. Despus de
ejecutar la rutina de servicio a la interrupcin, el microcontrolador contina ejecutando el
programa principal por la instruccin siguiente a aquella que puso el bit IDL a uno lgico.

Realizando un reset del microcontrolador. Cuando se aplica un nivel alto al pin de reset del
microcontrolador, se borra automticamente el bit IDL. El microcontrolador contina
ejecutando de forma momentnea el programa principal por la instruccin siguiente a la que
activ el bit IDL, hasta que el algoritmo de reset interno toma el control e inicializa el
contador de programa con la direccin FF:0000H.

12.4 Modo Power Down


El modo Power Down coloca al microcontrolador 8XC251Sx en modo de consumo muy reducido. En
este modo de trabajo se para completamente la actividad del reloj, de forma que tanto la CPU como
los perifricos detienen su funcionamiento. El contenido de todos los registros, as como de la
memoria RAM interna, se mantienen invariables en este modo de trabajo.
Para entrar en este modo de trabajo se debe poner a 1 lgico el bit PD del registro PCON. La
instruccin que pone a 1 el bit PD es la ltima que se ejecuta antes de que el microcontrolador entre en
el modo Power Down.
XTAL2

C2

Interrupciones
Puerto serie
Timers

Clock
Gen

C1
XTAL1

OSC

CPU
IDL
PD

Fig. 12.1 Control del reloj mediante los bits Idle y Power Down

Hay dos maneras de salir del modo Power Down:


Generando una interrupcin externa. Cuando se activa una fuente de interrupcin externa
que est habilitada para interrumpir, el bit PD se pone a cero automticamente, de forma que
la CPU y los perifricos vuelven a recibir la seal de reloj. Inmediatamente despus, la CPU
ejecuta la rutina de servicio a la interrupcin y, a continuacin, sigue ejecutando el programa
principal por la instruccin siguiente a la que activ el bit PD.

Los autores, 2001; Edicions UPC, 2001.

Microcontroladores MCS-51 y MCS-251

330

Realizando un reset del microcontrolador. Cuando se aplica un nivel alto al pin de reset del
microcontrolador se pone a cero el bit PD, lo que permite a la CPU y los perifricos continuar
con su funcionamiento normal. El microcontrolador contina ejecutando de forma
momentnea el programa principal por la instruccin siguiente a la que activ el bit IDL,
hasta que el algoritmo de reset interno toma el control e inicializa el contador de programa
con la direccin FF:0000H.

12.5 Modo ONCE (On-Circuit Emulation)


El modo ONCE permite realizar el test del sistema sin extraer el microcontrolador 8XC251Sx de la
placa de circuito impreso, lo que facilita el proceso de depuracin y comprobacin del programa. En
este modo, el microcontrolador permanece aislado elctricamente del sistema.
En la MCS-251, para entrar en el modo ONCE se debe seguir la siguiente secuencia:
1.

Aplicar un nivel alto en el pin de reset (RST).

2.

Mientras se mantiene el pin de reset a 1 lgico se debe aplicar y mantener los pines /PSEN,
P0.7, P0.6, P0.5, P0.3, P0.2, P0.1 y P0.0 a nivel bajo y el pin P0.4 a nivel alto.

3.

Se deja de aplicar la seal de reset, para a continuacin dejar de aplicar los niveles lgicos
indicados en el puerto P0 y el pin /PSEN.

En la MCS-51, para entrar en el modo ONCE se debe:


1.

Poner a 0 lgico la patilla ALE mientras el microcontrolador est en la fase de reset y el


terminal /PSEN est a 1 lgico.

2.

Mantener ALE a 0 lgico mientras el reset (terminal RST) es desactivado.

Para la MCS-51, cuando el microcontrolador est en el modo ONCE, el puerto P0 permanece flotante
en estado de alta impedancia, y el resto de los puertos, junto con el terminal ALE y /PSEN, estn
conectados dbilmente a 1 lgico.
Para salir del modo ONCE basta con efectuar un reset del microcontrolador.

Los autores, 2001; Edicions UPC, 2001.

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251

331

JUEGO DE INSTRUCCIONES DE LA FAMILIA MCS-51


Mnemnico
dir8
dir16
dir11
#dato
#dato16
Rn
@Ri
bit
rel

Descripcin de los smbolos empleados


Direccin directa de 8 bits. Posiciones de memoria interna o rea de SFR.
Direccin 16 bits de memoria empleada en direccionamientos directos.
Direccin de 11 bits.
Constante de 8 bits.
Constante de 16 bits.
Registro de tipo byte, R0 a R7.
Direccionamiento indirecto a travs de R0 o R1. Se accede a las posiciones (00H-FFH) de la memoria interna.
Bit de la memoria RAM interna o de un registro del rea de SFR accesible bit a bit.
Direccin de salto. Puede ser un salto incondicional, condicional o de llamada a subrutina.

Mnemnico <dest>,<src>

MOV

MOVX

MOVC
PUSH
POP
XCH
XCHD

ADD

ADDC
SUBB

INC
DEC
INC
MUL
DIV
DA

Descripcin
Instrucciones de transferencia de datos
A, Rn
A = Rn.
Copia el valor de Rn en A
A, dir8
A = (dir8)
Copia el contenido de la direccin dir8 en A
A, @Ri
A = (@Ri)
Copia el valor direccionado por @Ri en A
A, #dato
A = #dato
Pone el dato en A
Rn, A
Rn = A
Copia el valor de A en Rn
Rn, dir8
Rn = (dir8)
Copia el contenido de la direccin dir8 en Rn
Rn, #dato
Rn = #dato
Pone el dato en Rn
dir8, A
(dir8) = A
Copia el valor de A en la direccin dir8
dir8, Rn
(dir8) = Rn
Copia el valor de Rn en la direccin dir8
dir8, dir8
(dir8) = (dir8)
Copia de la direccin src a la direccin dest
dir8, @Ri
(dir8) = (@Ri)
Copia la posicin direccionada por @Ri en la direccin dir8
dir8, #dato
(dir8) = #dato
Copia el dato en la direccin dir8
@Ri, A
(@Ri) = A
Copia A en la posicin direccionada por @Ri
@Ri, dir8
(@Ri) = (dir8)
Copia la direccin dir8 en la posicin direccionada por @Ri
@Ri, #dato
(@Ri) = #dato
Copia el dato en la posicin direccionada por @Ri
DPTR,#dato16 DPTR = #dato16 Pone el dato de 16 bits en el DPTR
A, @Ri
A = (@Ri)
Copia en A el byte de la RAM externa apuntada por @Ri
A, @DPTR
A = (@DPTR)
Copia en A el byte de la RAM externa apuntada por @DPTR
@Ri, A
(@Ri) = A
Copia A en posicin de RAM externa apuntada por @Ri
@DPTR, A
(@DPTR) = A
Copia A en posicin de RAM externa apuntada por @DPTR
A, @A+DPTR A = (A + DPTR) Pone en A el byte de cdigo apuntado por @A+DPTR
A, @A+PC
A = (A + PC)
Pone en A el byte de cdigo apuntado por @A+PC
dir8
Mete el byte de la direccin dir8 en la pila
dir8
Mete el byte de la direccin dir8 en al pila
A, Rn
Intercambia A y Rn
A, dir8
Intercambia A y el byte de la direccin dir8
A, @Ri
Intercambia A y el byte apuntado por @Ri
A, @Ri
Intercambia los cuatro bits bajos de A y del byte apuntado por @Ri
Instrucciones aritmticas
A, Rn
A=A+ Rn
Suma A con Rn, pone el resultado en A
A, dir8
A=A+ (dir8)
Suma A con el byte de la direccin dir8, pone el resultado en A
A, @Ri
A=A+ (@Ri)
Suma A con el byte apuntado por @Ri, pone el resultado en A
A, #dato
A=A+ dato
Suma A con el dato, pone el resultado en A
A, Rn
A=A Rn
Suma (+) para ADDC y resta (-) para SUBB
A, dir8
A=A (dir8) C
Suma (+) para ADDC y resta (-) para SUBB
A, @Ri
A=A (@Ri ) C
Suma (+) para ADDC y resta (-) para SUBB
A, #dato
A=A dato C
Suma (+) para ADDC y resta (-) para SUBB
A
A=A 1
Signo + para INC. Signo - para DEC
Rn
Rn=Rn 1
Signo + para INC. Signo - para DEC
dir8
(dir8) = (dir8) 1
Signo + para INC. Signo - para DEC
@Ri
(@Ri ) = (@Ri ) 1 Signo + para INC. Signo - para DEC
DPTR
DPTR = DPTR +1
Incremento del DPTR
AB
Multiplica A por B. Deja el byte alto del resultado en B y el byte bajo en A
AB
Divide A por B. Deja el cociente en A y el resto en B
A
Ajuste decimal del acumulador

Los autores, 2001; Edicions UPC, 2001.

Bytes Tpo*
1
2
1
2
1
2
2
2
2
3
2
3
1
2
2
3
1
1
1
1
1
1
2
2
1
2
1
1

1
1
1
1
1
2
1
1
2
2
2
2
1
2
1
2
2
2
2
2
2
2
2
2
1
1
1
1

1
2
1
2
1
2
1
2

1
1
1
1
1
1
1
1

1
1
2
1

1
1
1
1

1
1
1
1

2
4
4
1

Apndice 1 Juego de instrucciones de la familia MCS-51

332
Mnemnico <dest>,<src>

ANL
ORL
XRL

CLR
CPL
RL
RLC
RR
RRC
SWAP
CLR
SETB
CPL
ANL
ORL
MOV
AJMP
LJMP
SJMP
JMP
NOP
JC
JNC
JB
JNB
JBC
JZ
JNZ
CJNE

DJNZ
ACALL
LCALL
RET
RETI

Descripcin
Bytes Tpo*
Instrucciones lgicas
A, Rn
A = A AND o OR o XOR Rn
Funcin AND, OR o XOR lgica
1
1
A, dir8
A = A AND o OR o XOR (dir8)
Funcin AND, OR o XOR lgica
2
1
A, @Ri
A = A AND o OR o XOR (@Ri)
Funcin AND, OR o XOR lgica
1
1
A, #dato
A = A AND o OR o XOR #dato
Funcin AND, OR o XOR lgica
2
1
dir8, A
(dir8) = (dir8) AND o OR o XOR A
Funcin AND, OR o XOR lgica
2
dir8, #dato
(dir8) = (dir8) AND o OR o XOR #dato Funcin AND, OR o XOR lgica
2
3
A
A=0
Borra el acumulador
1
1
A
Complementa el acumulador
1
1
A
Rotacin a la izquierda del acumulador
1
1
A
Rotacin a la izquierda con acarreo del acumulador
1
1
A
Rotacin a la derecha del acumulador
1
1
A
Rotacin a la derecha con acarreo del acumulador
1
1
A
Intercambia los 4 bits bajos del acumulador con sus 4 bits altos
1
1
Instrucciones booleanas
C
Pone a cero el bit de acarreo
1
1
bit
Pone a cero el bit direccionado
2
1
C
Pone a uno el bit de acarreo
1
1
bit
Pone a uno el bit direccionado
2
1
C
Complementa el bit de acarreo
1
1
bit
Complementa el bit direccionado
2
1
C, bit
C = C AND (bit)
AND lgica entre C y el bit, resultado lo pone en C
2
2
C, /bit
C = C AND (/bit) AND lgica entre C y el bit complementado, resultado en C
2
2
C, bit
C = C OR (bit)
OR lgica entre C y el bit, resultado lo pone en C
2
2
C, /bit
C = C AND (/bit) OR lgica entre C y el bit complementado, resultado en C
2
2
C, bit
C = bit
Pone el valor del bit en el bit de acarreo C
2
1
bit, C
bit = C
Pone el valor del bit de acarreo en el bit indicado
2
2
Instrucciones de salto incondicional
dir11
Salto absoluto. Salta a una direccin de 11 bits
2
2
dir16
Salto largo. Salta a cualquier direccin del espacio de memoria
3
2
rel
Salto corto con direccionamiento relativo
2
2
@A+DPTR
Salto indirecto a la direccin A + DPTR
1
2
Salto a la siguiente instruccin
1
1
Instrucciones de salto condicional
rel
Salta si el bit de acarreo est a 1 lgico
2
2
rel
Salta si el bit de acarreo est a 0 lgico
2
2
bit, rel
Salta si el bit direccionado est a 1 lgico
3
2
bit, rel
Salta si el bit direccionado est a 0 lgico
3
2
bit, rel
Salta si el bit direccionado est a 1 lgico y luego lo pone a 0 lgico
3
2
rel
Salta si el acumulador vale cero
2
2
rel
Salta si el acumulador es distinto de cero
2
2
A, dir8, rel
Compara A con el valor de la direccin dir8 y hace un salto relativo si son distintos
3
2
A, #dato, rel Compara A con el dato y hace un salto relativo si son distintos
3
2
Rn, #dato, rel Compara Rn con el dato y hace un salto relativo si son distintos
3
2
@Ri,#dato,rel Compara el byte apuntado por @Ri y hace un salto relativo si son distintos
3
2
Rn, rel
Decrementa Rn en una unidad y hace un salto relativo si Rn es distinto de cero
2
2
dir8, rel
Decrementa el byte de dir8 y hace un salto relativo si es distinto de cero
3
2
Instrucciones de llamada y retorno a subrutinas
dir11
Llamada a subrutina de tipo absoluto, direccin de 11 bits
2
2
dir16
Llamada a subrutina tipo long, direccin de 16 bits
3
2
Retorno de subrutina
1
2
Retorno de la rutina de servicio a la interrupcin
1
2
*El tiempo de ejecucin, Tpo, viene dado en ciclos mquina

Los autores, 2001; Edicions UPC, 2001.

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251

333

JUEGO DE INSTRUCCIONES ADICIONALES DE LA FAMILIA MCS-251


Notacin de los
registros
Rm
Rms
Rmd
WRj
WRjd
WRjs
@WRj+dis16
DRk,
DRkd
DRks
@DRk+dis24
Dato inmediato
#0dato16
#1dato16
#short
Direcciones
rel
addr11
addr16
addr24

Mnemnico
ADD
SUB

CMP

INC
DEC
MUL

Descripcin
Registro tipo byte de R0 a R15
Registro fuente
Registro destino
Registro de tipo Word WR0, WR2, ., WR30
Registro destino
Registro fuente
Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente a travs de un registro de
tipo Word (WR0-WR30) ms un valor de desplazamiento comprendido entre 0 y 64 Kbytes
Registro de tipo DR (Double Word) DR0, DR4, , DR28 DR56, DR60.
Registro de destino
Registro fuente.
Direccin de memoria (00:0000H-00:FFFFH) direccionada indirectamente a travs de un registro
Double Word (DR0, DR4, , DR56, DR60) ms un valor de desplazamiento de 0 a 64 Kbytes.
Descripcin
Un valor de 32 bits que se direcciona de forma inmediata en una instruccin. Los 16 bits de mayor peso
del dato deben ser 0 (#0data16) 1 (#1data16).
Un valor igual a 1, 2 4, que es direccionado de forma inmediata en una instruccin.
Descripcin
Direccin relativa de 8 bits expresada en complemento a 2.
Direccin de 11 bits.
Direccin de 16 bits.
Direccin de 24 bits. Permite acceder a cualquier direccin de los 16 Mbyte del espacio de memoria de
la familia MCS-251.
<dest>,<src>
Rmd,Rms
WRjd,WRjs
DRkd,DRks
Rm,#data
WRj,#data16
DRk,#0data16
Rm,dir8
WRj,dir8
Rm,dir16
WRj,dir16
Rm,@WRj
Rm,@DRk
Rmd,Rms
WRjd,WRjs
DRkd,DRks
Rm,#data
WRj,#data16
DRk,#0data16
DRk,#1data16
Rm,dir8
WRj,dir8
Rm,dir16
WRj,dir16
Rm,@WRj
Rm,@DRk
Rm,#short
WRj,#short
DRj,#short
Rmd,Rms
WRjd,WRjs

Descripcin
Instrucciones aritmticas
Rmd = Rmd Rms
WRjd = WRjd WRjs
DRkd = DRkd DRks
Rm = Rm data
WRj = WRj data16
DRk = DRk 0data16
Rm = Rm (dir8)
WRj = WRj (dir8, dir8+1)
Rm = Rm (dir16)
WRj = WRj (dir16,dir16+1)
Rm = Rm (@WRj)
Rm = Rm (@DRk)
Rmd - Rms
WRjd - WRjs
DRkd - DRks
Rm - #data
WRj - #data16
DRk - #0data16
DRk - #1data16
Rm - (dir8)
WRj - (dir8, dir8+1)
Rm - (dir16)
WRj - (dir16,dir16+1)
Rm - (@WRj)
Rm - (@DRk)
Rn = Rn #short
WRj = Wrj #short
DRj = DRj #short
Multiplica Rmd y Rms
Multiplica WRjd y WRjs

Los autores, 2001; Edicions UPC, 2001.

Bytes

Tclock

2
2
2
3
4
4
3
3
4
4
3
3
2
2
2
3
4
4
4
3
3
4
4
3
3
2
2
2
2
2

2
4
8
4
6
10
4
6
4
6
4
6
2
4
8
2
6
10
10
4
6
4
6
2
6
2
2
6
10
22

Apndice 1 Juego de instrucciones de la familia MCS-51

334
Mnemnico
DIV

ANL
ORL
XRL

SLL
SRA
SRL

MOV

<dest>,<src>

Descripcin
Instrucciones aritmticas (continuacin)
Rmd,Rms
Divide Rmd por Rms
WRjd,WRjs
Divide WRjd por WRjs
Instrucciones lgicas
Rmd = Rmd AND OR XOR Rms
Rmd,Rms
WRjd = WRjd AND OR XOR WRjs
WRjd,WRjs
Rm = Rm AND OR XOR #data
Rm,#data
WRj = WRj AND OR XOR #data16
WRj,#data16
Rm,dir8
Rm = Rm AND OR XOR (dir8)
WRj,dir8
WRj = WRj AND OR XOR (dir8, dir8+1)
Rm,dir16
Rm = Rm AND OR XOR (dir16)
WRj = WRj AND OR XOR (dir16, dir16+1)
WRj,dir16
Rm = Rm AND OR XOR (@WRj)
Rm,@WRj
Rm = Rm AND OR XOR (@DRk)
Rm,@DRk
Rm
Desplazamiento lgico a la izquierda de Rm
WRj
Desplazamiento lgico a la izquierda de WRj
Rm
Desplazamiento aritmtico a la derecha de Rm
WRj
Desplazamiento aritmtico a la derecha de WRj
Rm
Desplazamiento lgico a la derecha de Rm
WRj
Desplazamiento lgico a la derecha de WRj
Instrucciones de transferencia de datos
Rmd,Rms
Rmd = Rms
WRjd,WRjs
WRjd = WRjs
DRkd,DRks
DRkd = DRks
Rm,#data
Rm = #data
WRj,#data16
WRj = #data16
DRk,#0data16
DRk = #0data16
DRk,#1data16
DRk = #1data16
DRk,dir8
DRk = (dir8, dir8+1, dir8+2, dir8+3)
DRk,dir16
DRk = (dir16, dir16+1, dir16+2, dir16+3)
Rm,dir8
Rm = dir8
WRj,dir8
Wrj = (dir8, dir8+1)
Rm,dir16
Rm = (dir16)
WRj,dir16
Wrj = (dir16, dir16+1)
Rm,@WRj
Rm = (@WRj)
Rm,@DRk
Rm = (@DRk)
WRjd,@WRjs
WRjd = (@WRjs, @WRjs+1)
WRj,@DRk
WRj = (@DRk, @DRk+1)
dir8,Rm
(dir8) = Rm
dir8,WRj
(dir8, dir8+1) = WRj
dir16,Rm
(dir16) = Rm
dir16,WRj
(dir16, dir16+1) = WRj
@WRj,Rm
(@WRj) = Rm
@DRk,Rm
(@DRk) = Rm
@WRjd,WRjs
(@WRjd , @WRjd +1) = Wrjs
@DRk,WRj
(@DRk, @Drk+1) = WRj
dir8,DRk
(dir8, dir8+1, dir8+2, dir8+3) = DRk
dir16,DRk
(dir16, dir16+1, dir16+2, dir16+3) = DRk
Rm,@WRj+dis16
Rm = (@WRj+dis16)
WRj,@WRj+dis16
WRj = (@WRj+dis16, @WRj+dis16+1)
Rm,@DRk+dis24
Rm = (@DRk+dis24)
WRj,@DRk+dis24
WRj = (@Drk+dis24, @DRk+dis24+1)

Los autores, 2001; Edicions UPC, 2001.

Bytes

Tclock

2
2

20
40

2
2
3
4
3
3
4
4
3
3
2
2
2
2
2
2

2
4
4
6
4
6
4
6
4
6
2
2
2
2
2
2

2
2
2
3
4
4
4
3
4
3
3
4
4
3
3
3
3
3
3
4
4
3
3
3
3
3
4
4
4
4
4

2
2
4
4
4
8
8
10
10
4
6
4
6
4
6
6
8
6
8
6
8
6
8
8
10
12
12
10
12
12
14

Apndice Juego de instrucciones de la familia MCS-51 y MCS-251

Mnemnico
MOV

MOVH
MOVS
MOVZ
PUSH

POP

CLR
SETB
CPL
ANL
ORL
MOV
JB
JNB
JBC
EJMP
LJMP
JE
JNE
JG
JLE
JSL
JSLE
JSG
JSGE
LCALL
ECALL
ERET

<dest>,<src>
Descripcin
Instrucciones de transferencia de datos (continuacin)
@WRj+dis16,Rm
(@WRj+dis16) = Rm
@WRj+dis16,WRj
(@WRj+dis16, @WRj+dis16+1) = Rm
@DRk+dis24,Rm
(@DRk+dis24) = Rm
@DRk+dis24,WRj
(@DRk+dis24, @DRk+dis24+1) = Rm
DRk(hi),#data16
DRk(hi) = data16
WRj,Rm
WRj = MSB, Rm
WRj,Rm
WRj = 0, Rm
Instrucciones de transferencia de datos en la pila
Mete el dato #data en la pila
#data
Mete el dato #data16 en la pila
#data16
Mete el contenido de Rm en la pila
Rm
Mete el contenido de WRj en la pila
WRj
Mete el contenido de DRk en la pila
DRk
Mete en Rm un dato de la pila
Rm
Mete en WRj un Word de la pila
WRj
Mete en DRk un Dword de la pila
DRk
Instrucciones booleanas
CY
Pone a cero el bit de acarreo
bit
Pone a cero el bit direccionado
CY
Pone a uno el bit de acarreo
bit
Pone a uno el bit direccionado
CY
Complementa el bit de acarreo
bit
Complementa el bit direccionado
CY, bit
CY = CY AND (bit)
CY, /bit
CY = CY AND (/bit)
CY, bit
CY = CY OR (bit)
CY,/bit
CY = CY AND (/bit)
CY, bit
CY = bit
bit, CY
bit = CY
bit, rel
Salta si (bit) es 1
bit, rel
Salta si (bit) no es uno
bit, rel
Salta si (bit) es uno y borran el bit
Instrucciones de salto incondicional
addr24
Salto extendido
@DRk
Salto extendido indirecto
@WRj
Salto largo indirecto
Instrucciones de salto condicional
rel
Salta si es igual (si Z=1)
rel
Salta si no es igual (si Z=0)
rel
Salta si es mayor que. (si CY=Z=0)
rel
Salta si es menor o igual que. (si Z=1 o CY=1)
rel
Salta si es menor que (con signo). (si N[OV)
rel
Salta si es menor o igual que (con signo). (si Z=1 si N[OV)
rel
Salta si es mayor que (con signo). (si Z=0 y N=OV)
rel
Salta si es mayor o igual que (con signo). (si N=OV)
Instrucciones de llamada y retorno de subrutina
@WRj
Llamada a subrutina tipo long
@DRk
Llamada a subrutina tipo extendido
dir24
Retorno extendido de subrutina

Los autores, 2001; Edicions UPC, 2001.

335
Bytes

Tclock

4
4
4
4
4
2
2

10
12
12
14
4
2
2

3
4
2
2
2
2
2
2

6
10
6
10
18
4
8
16

1
3
1
3
1
3
3
3
3
3
3
3
4
4
4

2
6
2
6
2
6
4
4
4
4
4
6
6/12
6/12
12/18

4
2
2

10
12
10

2
2
2
2
2
2
2
2

2/8
2/8
2/8
2/8
2/8
2/8
2/8
2/8

2
2
4
2

16
22
26
18

Вам также может понравиться