Está en la página 1de 198

V  



  

 
  

| 
V  
   

Cuando un sistema 8051 se inicia, restablece el PC a 0000H. A partir de


esta posición el 8051 empiezan a ejecutar instrucciones secuen- cialmente
en memoria a menos que una instrucción del programa mo- difique el PC.
Existen varias instrucciones que pueden alterar el valor del PC;
específicamente,
Ñ ènstrucciones de saltos condicionales
Ñ Saltos directos y
Ñ Llamadas o retornos desde subrutinas.

Ona aceptación de solicitud de interrupción puede a su vez bifurcar el flujo


secuencial del programa.
| 
V  
   

ÿ     


El 8051 contiene una colección de instrucciones que, como un grupo, es
llamado instrucciones de "bifurcación condicional". Estas instruc- ciones
causan que ejecución del programa tome un camino no se- cuencial si una
cierta condición se satisface.

Considere, por ejemplo, la instrucción JB. Esta instrucción causa ³Salto si


el bit es 1". On ejemplo de JB podría ser:

jb 45h,pulso ; se prueba si el bit 45H es 1


nop ; continua si es 0
pulso: .... ; salta aquí si es 1
| 
V  
   

ÿ     


comp equ P3.7
jnb comp,$ ; Espera que el bit 7 de P3 pase a nivel alto
. ; Continua cuando comp = 1
.
.

| 
V  
   

!!!ÿ     

La bifurcación condicional realmente es el elemento fundamental en la


construcción de la lógica del programa debido a que toda toma de decision
se realiza usando bifurcación condicional.

Conviene resaltar que el programa sólo puede desviar la ejecución hacia


instrucciones localizadas en los 128 bytes anteriores o los 127 bytes
siguientes a la dirección que sigue a la instrucción de salto condicional.
Esto significa para el ejemplo anterior que la etiqueta pulso debe estar
dentro de los — 128 bytes de dirección de memoria que contiene la
instrucción de salto.

|
V  
   

ÿ   
Aientras la bifurcación condicional es sumamente importante, es a
menudo necesario hacer una salto directo a una posición de memoria
dada sin basarlo en una decisión lógica dada. Esto es equivalente a salto
incondicional. Esto es cumplido en el 8051 usando instruc- ciones de Salto
Directo y Call.
Ejemplo: ljmp dirección nueva
..
.
dirección nueva: ....
Cuando el 8051 encuentra la instrucción jmp carga el PC con la dirección
indicada por el operando y continúa la ejecución desde aquí.
||
V  
   

Aparte de LJAP, hay otras dos instrucciones que causan un salto di- recto :
SJAP y AJAP. Funcionalmente, estos dos comandos realizan la misma
función que LJAP: continuar la ejecución en la dirección in- dicada por el
operando. No obstante, SJAP y AJAP difieren en algo:

SJAP, como las instrucciones de la bifurcación condicional, sólo puede


saltar a una dirección dentro de los — 128 bytes de la dirección de
localización de la instrucción..
AJAP sólo puede hacerlo a una dirección que esté en el mismo bloque de
2K de memoria donde está AJAP. Esto significa que si el comando AJAP
está en la memoria del código en la posición 650H, puede hacer un salto
sólo a las direcciones comprendidas entre 0000H y 07FFH.
|
V  
   

Si SJAP y AJAP hacen lo mismo que LJAP pero con restricciones, ¿Por
qué usarlas?.
La respuesta es directa: Las primeras instrucciones ocupan cada una de 2
bytes, mientras que LJAP es una instrucción de 3 bytes.
En aplicaciónes con limitaciones de memoria, la sustitución de todas las
LJAP por SJAP o AJAP puede liberar más de una centena de bytes.

NOTA: Algunos ensambladores de calidad realizan automáticamente la conversión


anterior para usted. Es decir, ellos cambiarán sus LJAPs automáticamente a SJAPs
siempre que sea posible. Ésta es una capacidad ingeniosa y muy poderosa que usted
puede querer buscar en un ensamblador si planea desarrollar muchos proyectos que
tienen restricciones de memoria relativamente críticas. |
V  
   

R       
Cuando el 8051 ejecuta una instrucción LCALL dirección, guarda
inmediatamente el contenido del PC en la pila y continúa ejecutando
código a partir de la dirección indicada por la instrucción LCALL.

La instrucción RET causa el retorno desde una subrutina. Cuando se


ejecuta devuelve al PC la dirección almacenada en la pila por LCALL, esta
es la dirección de instrucción siguiente a LCALL
El comando RET es directo en el sentido que siempre cambia flujo del
programa sin basarlo en una condición, pero es variable sobre donde
continúa el flujo del programa, debido a que depende donde se realizó la
llamada al subprograma. |
V  
   

è  

Ona solicitud de interrupción causa una desviación en el flujo se- cuencial


del programa.
Ona interrupción se activa siempre que un evento ocurra. En tal caso, el
8051 suspende temporalmente la ejecución del programa y ejecuta una
sección especial de código llamado rutina de servicio de interrupción. Esta
realiza funciones para manejo del evento y entonces retorna el control al
programa como si no hubiese sido interrumpido.

|
V   
   


|
V    !!!

Para entender con propiedad los modos de


funcionamiento del 8051 es necesario disponer de
alguna información concerniente a la sincronización
de señales durante las distintas opera-ciones del
dispositivo.

|
V    !!!

KR  

El 8051 opera con una señal de reloj de frecuencia precisa suminis- trada
por un oscilador realizado con un inversor operando linealmen- te, basado
en un cristal externo. Las frecuencias más comunes del reloj del 8051
estándar son 12 AHz y 11.059 AHz, aunque existen versiones con
frecuencia de hasta 60 AHz.

Existen dos formas de aplicar el reloj al 8051:


1. Osar el oscilador interno o
2. Excitarlo con una fuente externa.
|
V    !!!

V   



>    > 
 

jenerador

C = 30 — 10 pF
|
V    !!!

V è 


El tiempo que el 8051 invierte en ejecutar una instrucción se denomi- na
ciclo de instrucción. Ona subdivisión de este tiempo, la cual es de mayor
utilidad para comprender los modos de operación del 8051, es el ciclo de
máquina.
On ciclo de la máquina es la cantidad mínima de tiempo durante el cual
puede ejecutarse una instrucción.
Conviene resaltar que no todas las instrucciones se ejecutan en el mismo
tiempo. Las de ejecución más rápida requieren 1 ciclo de má- quina y otras
gastan 2 ciclos en completarse. Aientras que las dos operaciones
matemáticas más lentas usan 4 ciclos de máquina.
|
V    !!!

VèVR K !"è


Cada
Cada
Durante
estado
cicloun
de
corresponde
ciclo
máquina
de máquina
esa una
2 periodos
sucesión
se generan
de de
reloj
12
seis
(Fase
pulsos
estados
1de
y Fase
reloj
S1-6 2).
&


%

$
#

Y
S1 S2 S3 S4 S5 S6
F1 F2 F1 F2 F1 F2 F1 F2 F1 F2 F1 F2

 

Ciclo de Aáquina

R     '(  )     &*+ ||


V    !!!

Durante cada ciclo de máquina ocurren 12 pulso de reloj. Esto signi- fica
que si una instrucción se ejecuta en un ciclo y la frecuencia de reloj es de
11.059 AHz, entonces el 8051 puede ejecutar por segundo,

  *    aaaaaaaaaa


 
Como a muchas de las instrucciones del 8051 les toma un ciclo ejecutarse,
es común considerar que el µCtrl puede ejecutar 1 millón de
instrucciones por segundo. Si todas las instrucciones de un programa son
de 2 ciclos esta cantidad se reduce a 470701 inst/seg; y si son de 4 ciclos
a 230391 inst/seg. De modo que un estimado de 600000 instrucciones/seg
es una cantidad más realista.
|
V    !!!

Auchos dispositivos basados en el 8051 tienen tiempos de ejecución que


difieren de los del modelo estandar. Algunas versiones optimi- zadas
invierten sólo 4 ciclos de reloj en ejeutar una instrucción; tales modelos
son efectivamente 3 veces más rápidos que el 8051 básico cuando usan
la misma frecuencia de 11.059 Ahz.

Ona duda razonable surge: ¿Si las instrucciones tienen tiempos de


ejecución diferente: como puede mantenerse un seguimiento del
transcurso del tiempo en aplicaciones de tiempo real críticas, sin te- ner
referencia externa?
Afortunadamente, el 8051 tiene temporizadores que pueden realizar
medidas y control del tiempo con alta precisión. |
V    !!!

ÿ  K  


  Vÿ

|
V    !!!
Si la instrucción
Como se indicó, esunadeinstrucción
1 ciclo-1byte,
puedecomo
tenerinc1 A,
o más
en elciclos
primerdeestado
máquina.S1 del
Siempre
ciclo se
obtiene eldos
realizan operaciones
código de búsqueda
de operación (OP) desde
durante
la memoria
cada ciclo,
de programa
aunque lay se
instrucción
deposita no
en el
lo
exija. Si de
registro es de un sólo
éstainstrucciones byte,
(èR), unaelsegunda
µCtrl ignora
búsqueda
la segunda
ocurre búsqueda
durante ely estado
el contador
S4 y dela
ejecución es
programa (PC) completada
no se incrementa.
en el estado S6.

i a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaï  |
V    !!!

On ejemplo de una instrucción de 1 ciclo-2byte es add A,#dato. En este caso du- rante S1
se busca el código de operación (OP) y se carga en el registro èR, una se- gunda
búsqueda en el estado S4 permite obtener el byte dato del segundo operan- do. En S6 se
ejecuta la suma, y el resultado se deposita en el acumulador.

@
@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaï |
V    !!!

Ona instrucción de 2 ciclos de máquina y 1 byte es inc DPTR. La CPO realiza cuatro
operaciones de búsqueda y desecha las tres últimas.

i  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ai aï |


V    !!!

La instrucción movx es también de 2 ciclos de máquina y 1 byte. Es la única instrucción


que se realiza operación de búsqueda durante el segundo ciclo de máquina.

á
ai aï |

V    !!!

     
  ,  

    
      
|
V    !!!

1 CèCLO DE A OèNA 1 CèCLO DE A OèNA

K    -(  .



    
  ,    ÿK 
      ÿ .ÿ 
   '(  !

|
K /    !   
    èè   
     

||
KK  

|
KK  

Si el terminal RST del 8051 es mantenido en nivel


alto por 2 ó más ciclos de máquina, el dispositivo
entra en el estado de Reset.
La CPO procede a realizar una inicialización
interna que consiste en modificar el contenido de
los registros a valores predeterminados...

|
!!!KK  

M El contador de programa (PC), el acumulador (A), el registro B, las


banderas de estado, el apuntador de datos (DPTR), y todos los
registros de los temporizadores/ contadores son llevados a cero.
M El apuntador de pila (SP) es cargado con la dirección 07H.
M Las 8 líneas de cada puerto P0 a P3 son forzadas a FFH.
M El contenido del registro SBOF será indeterminado, SCON se pone a
cero, mientras que a PCON se le carga un cero en el bit más
significativo.
M Por último, los registros de control de interrupciones èP e èE seran
cargados con el valor binario XXX00000 y 0XX00000.
|
!!!KK  

V  i a a a a   a a aà

|
!!!KK  

Cuando se aplica energía a una aplicación, es deseable que se ejecu- te


una secuencia de inicio constituida por dos partes.
La responsabilidad de la primera recae en el CPO y ocurre durante el
estado de Reset.
La segunda puede consistir en preparar al sistema para la función pa- ra la
cual ha sido diseñado.Por ejemplo,configurar contadores o puer- tos. Esta
última tarea debe ser realizada por programa por medio una rutina de
inicio almacenada en la memoria de código, a partir de la posición 0000H.
Recuerde que luego de la aplicación de un pulso de Reset, el PC contiene
ésta dirección.
|
!!!KK  

La señal de reset puede ser aplicada al 8051 en forma automática durante


arranque. Para esto se recurre a un red RC como indica la figura.

El valor de la constante de tiempo RC


garantiza que RST estará a nivel alto
durante un tiempo superior al de 2 ciclos de
máquina, después de energizar el 8051.
El pulsador S permite aplicar un reset en
forma manual. La entrada RST usa un
disparador de Schmitt para garantizar el
rechazo de ruido.

|
K   .    
   Kÿ

|
 Kÿ
A las 32 líneas de E/S del 8051 se puede tener acceso como puertos de 8
bits o por bits independientes. Todas las líneas pueden programarse como
entradas o salidas.
Los cuatro puertos P0 a P3 tienen un registro latch (SFR), un buffer de
entrada y un circuito de salida realizado con transistores FETs. Los puertos
P0 y P2 incluyen un multiplexor para permitir el acceso a memoria externa.
Durante el acceso a memoria exterior, por el puerto 0 se emite el byte de
orden bajo del bus de direcciones. Si la dirección es de 16 bits, el byte de
orden alto aparece en el puerto 2.
Dos terminales de P1 y todos los de P3 tienen función dual, para activar la
función alternativa debe escribirse un 1 en el latch de la línea
correspondiente.
|
 Kÿ

K     0 


    Kÿ

|
 Kÿ

||
dir/dato

Leer latch control


+ VCC

bus interno D 
Escribir a latch CL 

Leer pin

   &

Leer latch + VCC

bus interno D 

Escribir a latch CL 

Leer pin

   Y |


 Kÿ

Cuando el CPO emite una señal escribir a latch, se carga en el flip flop D
(un bit del FSR) el estado lógico de la línea del bus interno. En respuesta a
un comando del CPO leer latch, el nivel lógico de la salida  del biestable
se deposita en la línea del bus interno.
El estado lógico del terminal físico del puerto (el pin) pasa al bus interno
como resultado de un comando leer pin generado por el CPO. Ciertas
instrucciones de lectura de puerto activan la señal leer latch, mientras que
otras usan el comando leer pin.
Ona señal interna, control, conmuta las líneas de los puertos 0 y 2 al bus
interno de direcciones o direcciones/datos para permitir el acceso a
memoria externa. En este caso el SFR P2 no es afectado mientras que
todos los bits de P0 son cargados con unos.
|
[  

dir/dato

control + VCC
Leer latch

T1

bus interno D 

Escribir a latch CL  T2

Leer pin
|
[  &

|
m resistor activo con fet
 Kÿ

Algunas instrucciones que usan un puerto o bit de entrada como ope-


rando fuente leen el estado lógico del pin, otras leen el nivel a la salida del
latch.

Para usar el pin como entrada, la salida del latch deberá estar, o ponerse a
1, y será responsabilidad de la fuente externa colocar la línea en estado
cero o uno.

De modo que el mismo puerto puede usarse como entrada y salida,


cargando unos en todos las líneas usadas como entradas en opera-
ciónes de salida, e ignorando todos los pines usados como salidas en una
operación de entrada. |
 Kÿ
Cuando el operando es un puerto, las instrucciones de un operando como:
inc, dec, cpl, y djnz, usan como dato la salida del latch en lugar del nivel en
el pin.
Las instrucciones de dos operandos: anl, orl, xrl, mov, cuando usan el
puerto como operando destino, también leen la salida del latch. Esto
asegura que las líneas usadas como entradas no sean llevadas a cero por
la ejecución de la instrucción.
La instrucción lógica jbc prueba la salida del latch antes del salto, así
mismo clr y setb operan sobre la salida del latch de la línea operando.

|
 Kÿ
Las intrucciones que leen el latch en lugar del estado del pin son:
è  K
 è  K


anl anl P2,#0FH djnz djnz P2,salto orl


orl P3,A cpl cpl P2.0
xrl xrl P1, A mov Px.y,C mov 3.2,C jbc
jbc P2.1,salto clr Px.y clr P2.2 inc
inc P1 setb Px.y setb 2.2 dec
dec P3

Estas instrucciones son del tipo leer-modificar-escribir. Cuando se ejecuta una de éstas, lee el
estado del latch, quizás lo altere y lo carga con el nuevo valor.
|
 Kÿ

La operación sobre el FSR en lugar de sobre el pin asegura que las líneas
usadas como entradas no sufran alteraciones forzadas, y ade- más evita
ambigüedades en la lectura de la tensión en el terminal.
Ona
Considere
Para lectura
activar
Leyendo el el
subsiguiente
el caso
FSR dispositivo
de una
en lugar del
BJTbit
del línea
esdel
pin necesario
se de
puerto
un detectaría
obtienepuerto
cargar
el valoruno
delcorrecto,
un8051
encero,
la línea
controlando
al estado
un re-gistrar
del puerto.
un
la
alto,
transistor
tensión
en base-emisor
la líneabipolar que, funciona
del puerto, VBEƒ0.7 como
V,del transistor
interruptor.en conducción.

|
[  

Leer latch + VCC

Rm

bus interno D 

Escribir a latch CL 

Leer pin

|
m resistor activo con fet
[  Y

||
m resistor activo con fet
 Kÿ
Las salidas de los puertos 1,2 y 3 tienen resistores activos conectados
como pull-up (llevar a alto) y realizados con transistores AOS. Para que
una línea de estos puertos sea usada como entrada es necesario cargar 1
en el latch para cortar el AOSFET de salida. Con el transistor desactivado
la línea respectiva es puesta a nivel alto por el resistor pero puede ser
llevada a cero desde el exterior.
Las líneas del puerto 0 son a drenador abierto cuando se usan como
salidas. Observe que el transistor T1 (pull-up) de P0 permanece cortado a
menos que se esté escribiendo unos en una operación de acceso a
memoria externa. Si se carga un nivel alto en el latch, ambos transistores
de salida se cortan, y las líneas pueden usarse como entradas de alta
impedancia.
|
 Kÿ

è  
V          KÿK
      /          
       !
ÿ          
   /      (  1  
           
   ! |
 Kÿ

En el caso que una línea de P3 esté a nivel alto, el estado de la salida es


fijado por la señal función alternativa de salidas. El nivel presente en el pin
está disponible para la función alternativa de entrada del terminal.

El puerto 0 se considera verdaderamente bidireccional, puesto que cuando


se configura como entrada sus líneas están flotantes.

En contraposición los puertos 1,2 y 3 se califican de cuasi bidi- reccionales.


Estos permanecen en nivel alto cuando actúan como en- tradas y drenaran
cierta corriente cuando son llevados a cero por una fuente externa.

|
     
   

|
¿Como programar?

Para realizar el proceso de representar un algoritmo como un programa


capaz de realizarlo; el programador debe prestar especial atención al uso
de técnicas de programación que faciliten el desa- rrollo de diagramas de
flujo y de programas. La optimización de la escritura del código se logra
usando las técnicas de programación modular y código estructurado.

La programación modular consiste en seccionar el programa en rutinas,


las cuales pueden ser probadas por separado y pos- teriormente
integradas en un programa capaz de resolver el proble- ma propuesto
originalmente. Cada uno de los módulos en los cuales se divide el
programa debe tener una entrada y una salida, y debe realizar una función
única, la cual debe ser independiente de las que realizan los otros
módulos del programa.
|
¿Como programar?

En lenguaje ensamblador los programación se realiza usando


procedimientos, los cuales son equivalentes a las subrutinas presentes en
lenguajes de alto nivel.

El uso de código estructurado como método de desarrollo de programas


es una vía para eludir, en lo posible, el uso de instrucciones jO TO en
programación, debido a que este comando de bifurcación resulta en el
desarrollo de programas confusos y difíciles de analizar. S. Alagic (1978)
expone:
On teorema general sobre estructura afirma que cualquiera programa, sin importar que
tan complejo sea, que tenga un solo punto de entrada y otro de salida, puede ser
codificado completamente sin el uso explícito de instrucciones jO TO siempre y cuando
el lenguaje de programación empleado permita la construcción de loops y proposiciones
|
tipo CASE.
¿Como programar?

En cualquier caso, el procesamiento se inicia en la entrada de la rutina,


ejecutándose cada proceso en secuencia hasta la finalización del
programa.
Además de la estructura de programación secuencial, existen cuatro tipos
comunes de estructuras básicas, ampliamente usadas en lenguajes de
programación de alto nivel, las cuales pueden extenderse con facilidad al
lenguaje ensamblador. Estas son:

‡ èF-THEN/ELSE.
‡ CASE.
‡ WHèLE-DO
‡ REPEAT-ONTèL.
|
¿Como programar?

En estas estructuras de programación una proposición fija las condiciones


que se requieren para el control de la dirección de ejecución del
programa. Cuando se ejecuta la proposición, se prueba una condición y
se transfiere el control hacia una de dos vías alternativas, de acuerdo con
el resultado de la prueba.

Dependiendo de la estructura básica, la transferencia puede producir dos


acciones: en un caso, el resultado de la prueba produce la ejecución de
un proceso específico, o la salida del módulo; en el otro, se selecciona
uno de dos más procesos posibles. En cualquier la culminación de la
ejecución del código implica la salida de la rutina. El resultado es el
desarrollo de programas más eficientes, fáciles de entender y de
modificar.
|
¿Como programar?

K   è*KKRÿK
On elemento de decisión permite la ejecución de un proceso o la selección
entre la ejecución de dos procesos. En el primer caso la estructura se reduce
a èF-THEN.

|
¿Como programar?

è Then è Then/Else

entrada entrada

¿condición? ¿condición?

proceso proceso 1 proceso 2

salida salida
||
¿Como programar?

K   VÿK
En el caso que se deba probar una condición para ejecutar más de dos
procesos deben utilizarse varias estructuras èF-THEN/ELSE, lo cual puede
complicar innecesariamente un programa. La estructura CASE es más
adecuada para este caso. La acción de CASE es evaluar un dato de un
grupo posible, y ejecutar el proceso asignado al dato.
Para garantizar que la estructura CASE tenga una entrada y una salida, cada
rutina de proceso debe finalizar con una instrucción de salto incondicional a la
misma dirección de memoria.

|
¿Como programar?

Case entrada

¿condición?

proceso 1 proceso 1 proceso 2 proceso 1

salida
|
¿Como programar?

K   2*èRK  
Las instrucciones de salto permiten el establecimiento de lazos de
programación, en los cuales un grupo de instrucciones se ejecuta
repetidamente, una instrucción de salto condicional es la encargada de
controlar la repetición y salida.
En esta estructura la condición al inicio del lazo es evaluada repetidamente, y
el resultado de la prueba indicará si se debe ejecutar el lazo o salir de este.

|
¿Como programar?

Èhile-Do
entrada

¿condición?

proceso 1

salida

|
¿Como programar?

K   K K"èR
En este caso el control entra al lazo y el proceso es ejecutado, pos-
teriormente se prueba la condición y dependiendo del resultado se repite el
lazo o se abandona este. A diferencia de la estructura DO-WHèLE en la cual
es posible que el lazo nunca se ejecute, en REPEAT-ONTèL se ejecu- ta al
menos una vez.

|
¿Como programar?

>epeat-Until entrada

proceso 1

¿condición?

salida

|
¿Como programar?

      -          


               
  +           + /  
            
                 
          !

|
¿Como programar?

Aunque para desarrollar un programa ejecutable por un microprocesador


existen tres opciones, usar: lenguaje de máquina, lenguaje ensamblador o
lenguaje de alto nivel; son los programas en lenguaje de máquina los que
puede ejecutar directamente el microprocesador. Los escritos en
ensamblador, C o Pascal deben ser traducidos a código de máquina antes de
ser ejecutados.
On programa en lenguaje de máquina es una secuencia de instrucciones y
datos en binario, y es el código que la máquina entiende y ejecuta.

|
   


   

La arquitectura del conjunto de instrucciones del


8051 fue diseñada con orientación a las apli-
caciones de control de baja y media compleji- dad,
haciendo posible un fácil y rápido acceso a la
memoria RAA interna, y con capacidad de
procesamiento Booleano.

|
   

Las instrucciones se agrupan en:

1 
R  
    
[   
ÿ  


   

´  

 Registro acumulador 


Dirección del acumulador!
 Registro R0, R1, R2, R3, R4, R5, R6, R7.
  dirección de la RAA interna (8 bits)
3  constante de 8 bits (byte)
3  # constante de 16 bits (palabra)
# dirección de 16 bits (Hasta 64 KB)
 dirección de 11 bits (hasta 2 KB)
 dirección de un bit de la RAA interna


   

El conjunto de instrucciones del µC 8051 ofrece 33 funciones


diferente, con 42 mnemónicos distintos y 6 modos de
direccionamiento para los operandos.
De todo ello resulta un conjunto de 111 instrucciones en total, que
resumimos en las siguientes tablas, en las cuales la 1ª columna
presenta el mnemónico de la instrucción y los operandos que
requiere, la 2ª columna especifica la operación que realiza la
instrucción, las columnas 3ª y 4ª indican los modos de
direccionamiento permitidos para los operandos destino y origen
respectivamente. 
   


   


   


   


   


   

|
   

||
   

|
   

|
   

|
   

|
   

ACALL:
JC:
AOL:
Salto
Llamada
Aultiplica
si acarreoabsoluta
el Acumulador
es 1 a subrutina by B
ADD,
JAP:
NOP:
ADDC:
Salto
No hacer
incondicional
Sumarnada acumulador (Con Acarreo)) JNB:
AJAP:
ORL:
Salto Salto
si OR absoluto
bit es cero
ANL:
JNC:
RETè:
Bitwise
Salto
Retorno
si
ANDacarreo
de subrutina
es cero de servicio de interrupción
CJNE:
JNZ:
RL:Comparar
Salto
Rotarsiacontenido
la and
izquierda
saltar delelsiAAcumulador
no
no es
es igual
cero RLC:

CPL:
LCALL:
RR: è   
JZ:Rotar
CLR: Salto
Cargar
A sia cero
través
Complementar
Rotar
Llamada
contenido
enderegistro
a la derecha
ladelbandera
a registro
subrutina
A es cero de acarreo
el Acumulador
dentro de 64K RRC:
DA:
LJAP:
Ajuste
Rotar Salto
Adecimal
a ladentro
derecha
deldeacumulador
a64través
K del acarreo C
DEC:
AOV:
DèV:
SETB:
POP:
SJAP:
  1
Decrementar
Aover
Dividir
Poner bitRegistro
Obtener
Salto
acumulator
Valor
a1
restringido
depor la Bpila
DJNZ:
POSH:
SOBB:
Decrementar
Cargar
Restavalordel registro
Aaconla pila
acarreo
y saltar si no es cero RET:
èNC:SWAP:
èncrementar
Retorno èntercambia
desde Registro
subrutinaNibbles del Acumulador
JB:
AOVC:
XCH:
Saltarèntercambia
Aove
si bit esbyte1 debytes
código AOVX:
JBC:
Aover
XCHD:
Saltar
byteèntercambia
sidesde
bit es 1RAA
y dígitos
ponerlo
externa a cero.
XRL: OR exclusivo |
   

ÿ è        


è  )4 &$

.
|
 Registrada Por Keil Software,èNC
   

  

La aplicación windows µVision2 es un
Esta es una
grupo
M  versión
de 
de evaluación,
programas
 que en la cualun
ofrece están
am-
ausentes
M ciertos
biente recursos
 
integrado  de  
parasumael utilidad
 para elde

desarrollo
 
desarrollo 
de aplicaciones profesionales.
sistemas microcontroladores
M     basados
 en 

èK )4 &


No 
obstante
el 8051. es    
posible desarrollary  depurar

 
proyectos didacticos con este programa, si la
Esta
extensión plataforma
M  
del código no de
 desarrollo
viola  

el límite
         
contiene
impuesto un
 por
 
el fabricante.
editor de textos, un administrador de

proyectos,
  y 
LaM literatura de herramientas
apoyo es   
  !"#   $muy de
completafácil
y uso
 
bien
para laporcompilación
presentada, lo cual se yrecomienda
M     
enlazado amplia-
de los
mentemódulos
su revisión.
fuente de la aplicación. |
   

El ensamblador ASA51 o el
compilador C51 se utilizan del
modo conocido por todos. En
lugar de describir el programa
µVision2, se presenta el desa-
rrollo de un proyecto.
uien lee debe consultar los
manuales de usuario para
aclarar dudas.
|
   

   
   

   

   

Los ensambladores modernos son diseñados para permitir el uso de


programación estructurada, pudiendo el programador:

i Diseñar, codificar, y probar en paralelo módulos distintos del


programa y;

i Limitar las modificaciones necesarias a un modulo especifico en


lugar de hacerlo al programa completo.

En procura del logro de estos objetivos la traducción del programa fuente


se ejecuta en dos pasos
|
   

Durante el primer paso el ensamblador examina el programa fuente en


lenguaje de ensamblaje y agrupa las referencias simbólicas en una tabla.

En el segundo paso, genera un código el cual no está totalmente en código


de máquina. Aás bien es un código muy cercano al lenguaje de máquina,
denominado código relocalizable, al cual llamaremos código objeto.


   

Los programas en lenguaje ensamblador contienen tres tipos de entidades:


Absolutas, las cuales incluyen códigos de operación, Constantes
Numéricas y Alfanuméricas y Direcciones Fijas.
Los valores de las entidades absolutas son independientes de las
posiciones de memoria que el código de máquina resultante del
ensamblado, pueda eventualmente ocupar.
Las entidades relativas incluyen la dirección de la instrucción , son fijas
sólo una con respecto a la otra , y son normalmente asignadas con
relación a la dirección de el inicio del módulo. Ona entidad definida como
externa es usada dentro de un módulo pero no está definida dentro de éste


   

En la etapa inicial de desarrollo de la aplicación se establecen las tareas


programa y se asigna cada una a un subprograma.
On segmento es un bloque de memoria de código o de datos, y puede ser
absoluto o relocalizable.
On segmento relocalizable tiene nombre, tipo y otros atributos. Los
segmento que tengan el mismo nombre , pero procedan de diferentes
módulos son considerados parte del mismo segmento y son llamados
segmentos parciales, estos son combinados por el enlazador/re-
localizador L51.
On segmento absoluto no tienen nombre y no pueden combinarse con
otros segmento.

   

On módulo tiene un nombre asignado por el usuario y puede contener uno


o más segmentos o segmentos parciales. On programa ejecutable
consistirá de un módulo absoluto único, el cual es una combinación de los
segmentos absolutos y relocalizables de todos los módulos de entrada

Después que el diseño del programa es completado, se escribe el código


fuente, y se traduce a código objeto usando el A51, como ilustra la
transparencia 219. El ensamblador genera: un archivo obje- to .obj y un
archivo texto .lst o listado del programa, el cual muestra el resultado del
ensamblaje.


   

Proceso de ensamblado


   

El archivo objeto contiene las instrucciones en lenguaje de máquina y los


datos a ser cargados en memoria y ejecutados, además de comandos de
control adicionales que dirigen el proceso de carga. El ensamblador puede
producir un archivo objeto en código reloca- lizable, pero si el módulo
contiene solo segmentos absolutos, el archivo objeto, producto del
ensamblaje, será código absoluto. Este puede ser cargado en memoria sin
pasar por el linker/relocalizador.

El archivo lista es un archivo texto que contiene una mezcla del programa
fuente y el código objeto, indicando las direcciones de memoria utilizadas
para almacenamiento del programa, y mensajes de posibles errores
cometidos en la escritura del texto fuente.

   

Al final del ensamblado de todos los módulos del programa , el programa


enlazador procesa el archivo de módulos objeto. La función del linker es
asignar direcciones absolutas de memoria a todos los segmentos
relocalizables , combinando segmentos del mismo nombre y tipo. Además
el enlazador resuelve todas las referencias entre módulos.

Las salidas del L51 son: On archivo objeto en código absoluto listo para
ejecutar, y un archivo lista que muestra los resultados del proceso de
enlazado y relocalización.


   

La transparencia 220 muestra que el modulo objeto en código absoluto


puede ser cargado sin modificaciones en un emulador para la depuración del
programa en tiempo real, o en el sistema integrado èDE µVisión2 para
simular la ejecución del programa.
On emulador es una herramienta especializada para el desarrollo de
sistemas basados en microprocesadores. Osualmente es un equipo
periférico de un PC al cual se conecta la tarjeta prototipo de la aplicación,
de modo que el usuario pueda aprovechar todas los recursos del PC para
la depuración del programa y del hardware sin realizar grabaciones en
EPROA.

Keil Software dispone de un emulador denominado AONèTOR-51,el cual


puede ser usado en conjunto con èDE µVisión2 
   

Aódulos Objeto Aódulo Objeto absoluto


relocalizables

Aódulos fuente
Aódulo hex

 
   

Para la grabación en EPROA del archivo en código objeto absoluto de una


aplicación desarrollada con µVision2, es necesario convertir el código
objeto a formato hexadecimal usando la herramienta OH51. Ciertos
equipos programadores de memoria EPROA, generalmente de los
fabricantes del µCtrl, aceptan directamente el archivo en código absoluto.

Algunos wC de bajo costo, FENèX-51 y SDK-51, requieren que el código


objeto absoluto esté en formato hexadecimal para proceder a su ejecución.

 |
   

ÿ   1 
El 8051 es un procesador con áreas de memoria destinadas para
almacenamiento de información específica. En un archivo fuente se usan
segmentos para asignar el código, datos y variables a estas áreas.
On segmento no es más que un bloque de memoria que el A51 crea a partir
del código o datos del archivo fuente. On segmento genérico se crea con la
directiva de ensamblador SEjAENT. La declaración :

  V

Define un segmento genérico llamado PROj de clase CODE

 
   

Ona vez definido un segmento relocalizable, se selecciona usando la


directiva RSEj
  

El segmento PROj será usado por el código y datos siguientes a la


declaración hsta cuando sea desactivado por otra RSEj o por una directiva
de segmento absoluto.


   

ÿ      
No tienen nombre y residen en un área fija de de memoria. Se crean usando
las directivas CSEj, DSEj, XSEj, èSEj y BSEj. Estas permiten localizar
código y datos o reservar un bloque de memoria en una localización fija.

Despues de una operación de RSESET el 8051 debe iniciar la ejecución del


código en la dirección 0 de memoria. Se puede usar un segmento absoluto
para forzar el código a esta dirección. CSEj define un segmento absoluto
de código y AT la dirección de inicio del segmento.

V  a  ;dirección vectorizada de reset


á i ii ;Salto al inicio del código
 
   

ÿ   5
Si la aplicación usa subrutinas debe declararse un segmento de pila para
reservar un área de memoria para el stack.

    ;define segmento de pila


   ;lo selecciona
  ;reserva 16 bytes para la pila

El apuntador de pila debe cargarse al inicio del programa


V  a  ;dirección vectoriada de reset
V  á
a i ii ;Salto al inicio
;dirección del código
vectorizada de reset
i ii á i ii ;inico de
;Salto ejecución
al inicio del código
á
aa  aaa ;se carga el apuntador de pila
 
   

K  
     
  
)    
 
è 

%%
 %
 


%%%%%%%%%%%
'

 %



 

ÿ %




&


!
%
!
%

% %
()
"


 &%%%%%%%%%%%%%%
  %%%
&   ) 



 
&
 
   

K     
    
   
èK )4 &
 
   

Paso 1
Crear un archivo de proyecto.
Paso 2
Seleccionar la versión del 8051.
Paso 3
Escribir uno o mas archivo fuente en ensamblador (nombre.a51) o en C
(nombre.c51).
Paso 4
Agregar los archivos fuentes al proyecto y configura opciones

   

Paso 5
Construir (BOèLD) la aplicación con el administrador de proyectos.
Paso 6
Corregir errores en los módulos fuente.
Paso 7
Simular y depurar la aplicación

|
   

K   /   )4 &

ÿ ! Archivo fuente genérico


 Archivo fuente a ensamblar con A51
! Archivo fuente a compilar con C51
*+ Archivo objeto por defectom
ÿ Archivo de lista por defecto
 Archivo de lista de L51y BL51


mEl usuario puede especificar otra extensión.
   

   
Ose la estructura lógica èF-THEN-ELSE en un programa para:
 Leer un dato desde el puerto 2.
 Si corresponde al código ASCèè de la letra R debe activar un indicador
luminoso conectado al bit 7 del puerto 3.
 En caso contrario, activa un led en el bit 0 del mismo puerto.


   
NAAE èF_THEN
codigo SEjAENT CODE
CSEj AT 0
OSèNj 1 ; Selecciona el banco de registros 1
JAP inicio
RSEj codigo
inicio:
dato equ P2 :El dato se obtiene de P2
ledR equ P3.7 ;El caracter R activa el Led en P3.7
ledNR equ P3.0 ;El carácter € R activa el Led en P3.0

mov P3,#0 ;Se carga cero en P3


mov a,dato ;Se transfiere el dato al acumulador
cjne a,#'R',noesr ;Salto si no es R setb
ledR ;Es R, se activa P3.7 sjmp
salir ;fin noesr: setb
ledNR ;No es R, se activa P3.0
salir: nop
end 
   

1) Se crea el proyecto ifthen.uv2.


   

2) Selección del dispositivo


   

3) Se escribe el código fuente: if_then.a51


   

4) Con el menú Project se crea el jrupo Archivo fuente.


   

El archivo ifthen .a51 se incluye en el grupo Archivo fuente


   


   

5) Osando BOèLD en el menú Project, se construye la aplicación

|
   

6) Si no hay errores se pasa al paso siguiente.


7) Osando Debug, se simula la aplicación.


   

Antes de la ejecución el carácter R está en el puerto 2


   

Después de ejecutar se activa el LED en P3.7


   

Si lo desea puede documentar la aplicación creando un nuevo gru- po, por


ejemplo documento y agregando un archivo nombre.txt


   

Observe que la instrucción en la línea 17: mov a,dato transfiere al


acumulador el estado de los terminales de P2, con independencia del
contenido del latch.

A diferencia de otros µPs, el 8051 no


tiene una instrucción para detener la
ejecución del programa.
Si la última instrucción ejecutable en un
programa es NOP (no operación),
acompañada de un punto de ruptura
(breakpoint), el procesó se detendrá.
De otra manera recibirá un mensaje de
violación de acceso a memoria.

   

"        

èntroducir puntos de parada de la ejecución facilita la


depuración del programa. En el manual del usuario del
ensamblador A51 se encuentra informa- ción detallada
sobre este tópico. Si en lugar de activar las ventanas de
los PORTS è/O, se usan los siguientes breakpoints.


   


   


   

El último (detener programa) se activa haciendo click con el ratón


sobre la línea final de código.

   

K    
  
   !!!

|
   

[ 5 


   

[ 5 


   &
Escribir un programa con estructura CASE, para seleccionar una de cuatro
opciones de acuerdo con el valor en el registro R5.

COANDO:
valor=0 Activar la bandera de acarreo.
valor=1 Cargar 1 en bit 0 de P3.
valor=2 Bandera de usuario a 1.
valor=3 Cargar cero en Puerto 2


   &

NAAE EL_CASE
menu: cjne valor,#0,menu1
setb C
codigo SEjAENT CODE sjmp salir
menu1: cjne valor,#1,menu2
CSEj AT 0
clr P3.0
JAP inicio sjmp salir
RSEj codigo menu2: cjne valor,#2,menu3
setb F0
inicio: nop sjmp salir
valor equ R5 menu3: cjne valor,#3,salir
anl P2,#0
salir: nop
end


   &
El breakpointEl0breakpoint
presenta el1menú
permite
deseleccionar
funciones enla laopción.
ventana de salida


   &
El usuario puede configura un grupo de pulsadores con comandos asociados
(Toolbox).

Con estos botones ( 1 a 4) se puede, por ejemplo, verificar la ejecución.



   &

Para generar los pulsadores, escriba un archivo el_case.inc

/m Pulsadores para el programa el_casem/


DEFèNE BOTTON "Aostrar Carry","printf(\"Acarreo=%X\\n\",C)"
DEFèNE BOTTON "Aostrar Puerto 3","printf(\"Puert3=%XH\\n\",PORT3)"
DEFèNE BOTTON "Aostrar Flag_Osuario","printf(\"F0=%X\\n\",F0)"
DEFèNE BOTTON "Aostrar Puerto 2","printf(\"Puert3=%XH\\n\",PORT2)"


   &
Con el menú Project/Options for Target Aplicación2/Debug, se carga el
archivo texto de comandos en el archivo fuente.


   &
Ejecutando con R5=1, se verifica con el pulsador 2 que P3.0=0.


   Y
Este programa copia un bloque de la memoria externa con dirección de inicio
dorg, a otra área con inicio en ddes. El número máximo de posi- ciones a
transferir es de 256. La estructura lógica es DO-WHèLE.

|
   Y
NAAE DO_WHèLE
dorg equ r0
dorgh equ r1
ddesl equ r2
ddesh equ r3
i equ 60H
tbloq equ 128
inicio:
mov i,#tbloq+1
lazo: djnz i,seguir
jmp salir
seguir: mov dpl,r0
mov dph,r1
movx a,@dptr
inc r0
mov dpl,r2
mov dph,r3
movx @dptr,a
inc r2
jmp lazo
salir: nop
end

   Y

Las direcciones de inicio de los bloques origen, dorg: 0200H (r1-r0), y


destino, ddes:0600H ( r3-r2), se introducen usando la ventana de comandos.
Ü 




El bloque inicio, 128 bytes, se carga en memoria con:


ÜaV a   a a

Otra forma de modificar la memoria es haciendo click con el botón derecho


del raton sobre la posición en la ventana de memoria


   Y

Bloque inicio


   Y

Bloque destino


   
ègual al anterior pero con estructura lógica REPEAT-ONTèL.


   
NAAE REPEAT_ONTèL
dorg equ r0
dorgh equ r1
ddesl equ r2
ddesh equ r3
con equ 60H
tbloque equ 128
inicio:
mov con,#tbloque+1

lazo: mov dpl,r0


mov dph,r1
movx a,@dptr
inc r0
mov dpl,r2
mov dph,r3
movx @dptr,a
inc r2
djnz con,lazo
jmp salir
salir: nop
end

   
Dada una tabla de 10 bytes almacenados a partir de la posición 70H de la
memoria interna de datos:

1. Ordenar los datos en forma ascendente.


2. Eliminar los dos valores menores y mayores de la tabla.
3. Calcular el promedio de los elementos restantes.


   

Se usan tres módulos llamados por el programa principal


   

  programa principal

 ordena en forma ascendente una lista de hasta 256 ele- mentos,
almacenados a partir de la posición itabl. Se usa el metodo de la burbuja
(bubble).
Esta ténica de ordenación interna es la más fácil de programar pero la
menos eficiente en términos de tiempo de CPO. Además no aprovecha la
ordenación inicial de la tabla. No obstante se usa debido a que es la más
apropiada para listas de 4 a 10 elementos.


   

Por ejemplo, para ordenar la lista 5 1 3 2 4 6 se comparan el 1er elemen- to


con el 2do, el 3ro con el 4to y asi sucesivamente. Si el elemento en posición
más baja es mayor que el siguiente, se intercambian. En este caso se
requieren tres pasos.
"%%%%%%%%%%%%"%,%%%%%%%%%%%"%-
 aaa  aaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a aa a aa a aaaaaaaaaaaaa
aa a aa a aa aaaaaaaaaaaaaaaa
aaa a aaa  aaa aaaaaaaaaaaaaaaaa
aaaa aaaa aaaa
aaaaaaaaaaaaaaa aaaaa
En el paso 3 no se realizaron cambios, de modo que la lista está ordenada |
   

Si una bandera denominada nocambio es verdad, finaliza el proceso.

 

REPèTA HASTA nocambio=verdad /mhaga un pasom/


nocambio=verdad
LAZO desde è=1 hasta ultimo(lista)-1
Sè lista(è)>lista(è+1)
intercambie cambie lista(è) con lista(è+1)
nocambio=falso
FèN
FèN
FèN


   

ÿ   calcula la suma de hasta 256 valores de 8 bits almacena-


dos en memoria.
Entradas:
ndatos: número de elementos a sumar en R2.
dinicio: Dirección del 1er dato en A.
Salida: El resultado de 16 bits es devuelto en R3-A.


   

# Divide un valor de 16 bits entre un número de 8 bits.


Entradas:
Dividendo en R1-R2
Divisor en R3
Salida: El cociente de 16 bits es almacenado en las posiciones
60H-61H de la memoria interna.


    

NAAE filtro
POBLèC itabl,nocambio,temp,temp1,temp2,num,dinicio,ndatos EXTRN
CODE (orden,sum88,div168)
codigo segment code
pila segment idata
varbit segment bit
rseg pila
ds 10h
cseg at 0
jmp inicio
rseg codigo
inicio: mov sp,#pila-1
itabl equ 70h ;dirección de inicio de la tabla
num equ 0Ah ;número de bytes en la tabla
temp1 equ 50h
temp2 equ 51H
temp equ 60h
dinicio equ 72h ;dirección nicial de datos a promedia
ndatos equ 6 ;número de datos a promediar


    

O lcall orden ;ordenar datos


mov r2,#ndatos
mov a,dinicio
lcall sum88 ;obtener suma de datos a promediar
mov r2,a ;resultado de la suma
xch a,r3 ;en r1-r2
mov r1,a ;(dividendo)
mov r3,#6 ;divisor en r3
lcall div168 ;obtener promedio
salir: nop
rseg varbit ;activa segmento de bit
nocambio: dbit 1 ;reserva una posición de bit
end


    

Se define segmento de pila y un segmento de bit: Varbit.

;Entidades definidas en filtro y usadas en otros módulos POBLèC


itabl,nocambio,temp,temp1,temp2,num,dinicio,ndatos
EXTRN CODE (orden,sum88,div168) ;codigo externo llamado por filtro
codigo segment code
pila segment idata
varbit segment bit
...
rseg varbit
nocambio: dbit 1 ;reserva una posición de bit
end



NAAE ordenar
POBLèC orden
EXTRN DATA (itabl,num,temp1,temp2)
EXTRN BèT (nocambio)
Ordenar_Bytes SEjAENT CODE
RSEj Ordenar_Bytes




orden: ;inicio de paso


mov r2,#num-1 ;contador de datos
mov r0,#itabl ;primer elemento de la tabla en
mov r1,#itabl+1 ;segundo elemento de la tabla en r1
setb nocambio ;bandera de cambio a 1
cambiar: mov a,@r0 ;comparación de los elementos
subb a,@r1
jc siga ;si (r0)<(r1), seguir comparando
mov temp1,@r0 ;en caso contario
mov temp2,@r1 ;intercambiar
mov @r0,temp2 ;el contenido de las posiciones
mov @r1,temp1 ;apuntadas por ro y r1
clr nocambio ;no cambio=falso
siga: inc r0 ;comparar
inc r1 ;nuevos datos
djnz r2,cambiar ;¿mas elementos de la lista?
jnb nocambio,orden ;no,próximo paso si nocambio=falso
ret
end


ÿ 

NAAE suma8_8
POBLèC sum88
EXTRN DATA (dinicio,ndatos)
Sumar_Bytes SEjAENT CODE
RSEj Sumar_Bytes
sum88:
mov r2,#ndatos-1
mov r3,#0
mov r0,#dinicio+1
clr c
sumar: add a,@r0
jnc proxdato inc
r3 ;puede usarse addc proxdato: inc
r0 djnz
r2,sumar salir:
nop
ret
end


#

NAAE div16_8
POBLèC div168
EXTRN DATA (temp)
Dividir SEjAENT CODE
RSEj Dividir

O |
#

div168: mov r4,#2 xch a,temp+1


mov r0,#temp mov temp+2,#0
mov a,r1 ret
mov b,r3 end
div ab
xch a,@r0
lazo: mov a,b
swap a
mov r1,a
mov a,r2
cjne r4,#2,salt
swap a
salt: anl a,#0fh
add a,r1
mov b,r3
div ab
inc r0
xch a,@r0
djnz r4,lazo
mov a,temp+1
swap a
add a,temp+2

   

Tabla en memoria sin ordenar 


   

Tabla ordenada 


   

Promedio en 60H-61H

V        

 ordena en forma ascendente una lista de hasta 256 ele- mentos,
almacenados a partir de la posición itabl. Se usa el metodo de la burbuja
(bubble).
Esta ténica de ordenación interna es la más fácil de programar pero la
menos eficiente en términos de tiempo de CPO. No obstante se usa debido a
que es la más apropiada para listas de 4 a 10 elementos.


V        

El programa 5 realiza la tarea especificada, ordena y calcula el promedio. No


obstante es un buen ejemplo de lo que no debe hacerse en aplicaciones de
control
ordena en forma ascendente una lista de hasta 256 elementos, almacenados
a partir de la posición itabl. Se usa el metodo de la burbuja (bubble).


   #
Se debe escribir un programa de control para un voltímetro DC con
convertidor A/D de pendiente doble, usando un 8051. El valor de la tensión
desconocida debe mostrarse en una pantalla de cristal líquido, con el
formato mostrado en la figura.


   #

El 8051 envía por las ocho líneas del puerto P1 los caracteres a presentar e
Por
instrucciones
las líneas P3.7,
de control.
P3.6, y P3.5 se emiten las señales de control: EN, RS y R/W.


   #


   #

|
   #


Convertidor A/D de pendiente doble    #


Convertidor A/D de pendiente doble    #

Es posible demostrar (Ver archivo anexo: Voltímetro DC.pdf) que un


convertidor A/D de pendiente doble produce una cuenta digital proporcional a
la tensión DC que está bajo medición. Esto es:

 à
* aaaaaaaaaaaaaaaaaa  *
à


donde:
Ve: voltaje DC que se mide
n: Cuenta digital correspondiente al valor medido.
Vr: Voltaje de referencia. (-2.0 V en este caso)

N: Cuenta correspondiente a Vr. 213 = 8192 en este diseño)
   #

Procedimiento de medición:
El instrumento debe medir el voltaje de entrada, presentarlo en la pantalla y
LCD y repetir la medida. On ciclo de medición consta de tres pasos:

Paso 1: ènicio
Se conecta la tensión de referencia (Vr = -2 V) a la entrada del integrador, lo
cual produce una rampa positiva. El diodo del integrador fija el valor máximo
de la rampa a su tensión de conducción. Esta situación se mantiene durante
40 ms como ilustra la figura que sigue. Este tiempo no es crítico y puede ser
menor. La salida del comparador se mantiene a una tensión negativa.

   #


   #

Paso 2: èntegración de Ve
El código conecta la tensión desconocida Ve al integrador y se genera una
rampa negativa. En t1 (47.4 ms) la rampa cruza el nivel de cero voltios y el
comparador sube a una tensión positiva. El programa debe detectar este
cruce por cero y arrancar un contador previamente cargado con cero. La
cuenta continúa hasta cuando el contador alcance N = 8192, en t2 = 96.4 ms.
El lapso t2 ± t1 de 49 ms es constante e independiente de la tensión de
entrada.


   #

Paso 3: èntegración de Vr
El µP debe conectar de nuevo la tensión de referencia al integrador, poner el
contador en cero e iniciar un nuevo conteo. La rampa, ahora positiva, se
incrementa y en t3 = 130.7 ms alcanza cero voltios y la salida rectificada del
comparador cae nivel bajo. El código debe detectar este cruce por cero y
parar el contador y almacenar la cuenta igual a n.


   #

Durante el intervalo t2 ± t1 de la fase 2, el contador alcanza N = 8192. Lo


cual significa que la velocidad de incremento es aproximadamente de uno
cada 6 µs. El programa debe garantizar que el contador de la fase 3 avance
con esta misma cadencia. El tiempo t3-t2 es igual a 34.3 ms, de modo que
bajo las condiciones establecidas, el valor registrado para n debe ser 5716.
Así se tiene:


 *  * 




   #

La cuenta n se obtiene en hexadecimal y después de aplicar la formula con


valores escalados se tiene Ve en binario y debe ser convertido a decimal. El
valor de Ve en BCD, con cuatro cifras decimales, puede ser encontrado
directamente sin aplicar la ecua-ción, usando la técnica descrita en clases.
El valor resultante debe escribirse en el LCD.

|
   #

El código del voltímetro DC está constituido por diez módulos.


fEl programa principal,
fseis rutinas para control de la pantalla de cristal líquido,
fun subprograma para la conversión a BCD, una rutina de
multiplicación
fy un código para generar retardo.
La función de cada módulo se encuentra en el código.

||
   #

Los módulos fueron ensamblados y enlazados usando un


proyecto con la herramienta µVision.
A continuación se presenta la pantalla principal del
µvision mostrando los módulos que constituyen el código
de control del voltímetro DC.

|
   #

|
2rograma principal (volt_2V.a51)    #

|
   #

|
   #

|
   #

|
mul8_16    #

|
   #

|
conv_bcd    #


   #

|
   #


retar_5ms    #


cmd    #


dat    #


es_cdn    #


es_mem    #


ini_lcd    #


   #


libre    #


   #

µVision se usa para el desarrollo del programa. Para una emulación más
real se recurre al paquete de simulación de circuitos electrónicos PROTEOS
6.9. Este software permite la simulación del voltímetro con todos sus
componentes.
Observe que se modificaron los valores:
C1 = 6.8 µf R2 = 4.7 K y se usa un diodo con menor èsat inversa que el 1N914

|
   #

La figura siguiente muestra el voltímetro midiendo una tensión de entrada de


1.7991 V. El instrumento indica 1.7993 V.
Para diferentes valores de la tensión de entrada la simulación no mostró
errores apreciables.
En la práctica, se recomienda sustituir los amplificadores operacionales por
dispositivos con entrada CAOS.


   #



,((    1%)
+, +,
| | |
 | 
|  $ 

 |$ | ;9+
 , 
2| 1 21 01  $ 
| 
21 #&!   $

01 |'()*  $ 

 $ 
14 1
#1|  $ 
. 1|  10|   
#!  $ 
.627 . 3+




||
1| | 1  .- |
  $

||
| # #  |$

 |   / 
   $|
 | |  # |,  
|  / ! "  $||
|   
 ;9+   $|
|/ |  | 
  /   $|
||

| 
(    $|


 
 (   $|


 ;9+
 (  21

 #| | 1  |
|   $#
|
/ |"|  ||
01 | |  |$
|| |
 |   $"
|  |
# 
-

|  $"|
|
 21 21 |   $
  |
01| |/ ") |   $|
 |
|   $%#
|  |
|   $#
15
. 10 | |
||

# |
|
/
|


( 

 |
( 
21
1
1!!

#%
#!


|







1
|









|
||
|

|
|

"
1

13 89 ' '+  ' :3

También podría gustarte