Introducción a la programación del 8051 en lenguaje ensamblador

El lenguaje ensamblador es un lenguaje de programación de bajo nivel que se utiliza para escribir código de programa en términos de mnemotecnia. Aunque hay muchos lenguajes de alto nivel que se demandan actualmente, el lenguaje de programación en ensamblador se utiliza popularmente en muchas aplicaciones. También se utiliza para escribir el código de programación del 8051 de forma eficiente con menos número de ciclos de reloj, consumiendo menos memoria en comparación con los otros lenguajes de alto nivel.


programación del 8051
Índice de Contenido
  1. programación del 8051 en lenguaje ensamblador
  2. arquitectura del microcontrolador 8051
    1. programas de microcontroladores 8051 en lenguaje ensamblador
    2. Programas básicos en C embebidos:

programación del 8051 en lenguaje ensamblador

El lenguaje ensamblador es un lenguaje de programación totalmente relacionado con el hardware. Los diseñadores de sistemas embebidos deben tener conocimientos suficientes sobre el hardware de un determinado procesador o controlador antes de escribir el programa. El lenguaje ensamblador se desarrolla mediante mnemotecnias, por lo que los usuarios no pueden entenderlo fácilmente para modificar el programa.

programación del 8051 en lenguaje ensamblador
programación del 8051 en lenguaje ensamblador

El lenguaje de programación en ensamblador es desarrollado por varios compiladores y el "keiluvison" es el más adecuado para microcontrolador programación desarrollo. Microcontroladores o procesadores sólo pueden entender el lenguaje binario en forma de "0s o 1s"; Un ensamblador convierte el lenguaje ensamblador en lenguaje binario, y luego lo almacena en el microcontrolador memoria para realizar la tarea específica.

arquitectura del microcontrolador 8051

El 8051 microcontrolador es la arquitectura Harvard basada en CISC, y tiene periféricos como 32 E/S, temporizadores/contadores, comunicación en serie y memorias. El microcontrolador requiere un programa para realizar las operaciones que requieren una memoria para guardar y leer las funciones. El 8051 microcontrolador consta de memorias RAM y ROM para almacenar instrucciones.

microcontrolador 8051 Arctitecuture
arquitectura del microcontrolador 8051

Un Registro es la parte principal en los procesadores y microcontroladores que está contenida en la memoria que proporciona una forma más rápida de recoger y almacenar los datos. La programación en lenguaje ensamblador del 8051 se basa en los registros de memoria. Si queremos manipular los datos a un procesador o controlador realizando una resta, una suma, etc., no podemos hacerlo directamente en la memoria, sino que se necesitan registros para procesar y almacenar los datos Microcontroladores contienen varios tipos de registros que pueden clasificarse según las instrucciones o el contenido que operan en ellos.

programas de microcontroladores 8051 en lenguaje ensamblador

El lenguaje ensamblador se compone de elementos que se utilizan para escribir el programa en forma secuencial. Sigue las reglas dadas para escribir la programación en lenguaje ensamblador.

Reglas del lenguaje ensamblador

  • El código ensamblador debe escribirse en mayúsculas
  • Las etiquetas deben ir seguidas de dos puntos (label:)
  • Todos los símbolos y etiquetas deben comenzar con una letra
  • Todos los comentarios se escriben en minúsculas
  • La última línea del programa debe ser la directiva END

Los mnemónicos del lenguaje ensamblador tienen forma de código de operación, como MOV, ADD, JMP, etc., que se utilizan para realizar las operaciones.

Código de operación El op-code es una única instrucción que puede ser ejecutada por la CPU. Aquí el op-code es una instrucción MOV.

Operandos: Los operandos son un único dato que puede ser operado por el código de operación. Por ejemplo, la operación de multiplicación se realiza mediante los operandos que se multiplican por el operando.

Sintaxis: MUL a,b;

Los elementos de una programación en lenguaje ensamblador:

  • Directivas del ensamblador
  • Conjunto de instrucciones
  • Modos de direccionamiento

Directivas del ensamblador:

Las directivas de ensamblador dan las indicaciones a la CPU. El 8051 microcontrolador consiste en varios tipos de directivas de ensamblaje para dar la dirección a la unidad de control. Las directivas más útiles para la programación del 8051 son las siguientes

ORG(origen): Esta directiva indica el inicio del programa. Se utiliza para establecer la dirección del registro durante el montaje. Por ejemplo, ORG 0000h indica al compilador que todo el código posterior comienza en la dirección 0000h.

Sintaxis ORG 0000h

DB(definir byte): El byte de definición se utiliza para permitir una cadena de bytes. Por ejemplo, imprime la "EDGEFX" en la que cada carácter es tomado por la dirección y finalmente imprime la "cadena" por la BD directamente con comillas dobles.

Sintaxis

ORG 0000h

MOV a, #00h
-----
-----
DB "EDGEFX"

EQU (equivalente) La directiva equivalent se utiliza para equiparar la dirección de la variable.

Sintaxis:

reg equ,09h
------
------
MOV reg,#2h

FIN:La directiva END se utiliza para indicar el final del programa.

Sintaxis

reg equ,09h

------
------
MOV reg,#2h
FIN

Modos de direccionamiento:

La forma de acceder a los datos se llama modo de direccionamiento. La CPU puede acceder a los datos de diferentes maneras utilizando los modos de direccionamiento. El 8051 microcontrolador consta de cinco modos de direccionamiento como

  • Modo de direccionamiento inmediato
  • Modo de direccionamiento del registro
  • Modo de direccionamiento directo
  • Modo de direccionamiento indirecto
  • Modo de direccionamiento de índice base

Modo de direccionamiento inmediato:

En este modo de direccionamiento, el origen debe ser un valor que pueda ir seguido de "#" y el destino debe ser los registros SFR, los registros de propósito general y la dirección. Se utiliza para almacenar inmediatamente el valor en los registros de memoria.

Sintaxis:

MOV A, #20h //A es un registro acumulador, 20 se almacena en el A//
MOV R0,#15 // R0 es un registro de propósito general; 15 se almacena en el registro R0//
MOV P0, #07h //P0 es un registro SFR;07 se almacena en el P0//
MOV 20h,#05h //20h es la dirección del registro; 05 almacenado en la 20h//

Ej:

MOV R0, #1
MOV R0, #20 //R0 <-R0[15]+20, el valor final se almacena en R0//

Modo de direccionamiento del registro:

En este modo de direccionamiento, el origen y el destino deben ser un registro, pero no registros de propósito general. Por tanto, los datos no se mueven dentro de los registros del banco de propósito general.

Sintaxis:

MOV A, B; // A es un registro SFR, B es un registro de propósito general//
MOV R0, R1 //Instrucción no válida, no es posible el paso de GPR a GPR//

EX

MOV R0, #02h
MOV A, #30h
ADD R0, A //R0<-R0+A, el valor final se almacena en el registro R0//

Modo de direccionamiento directo

En este modo de direccionamiento, el origen o el destino (o ambos, origen y destino) deben ser una dirección, pero no un valor.

Sintaxis

MOV A,20h // 20h es una dirección; A es un registro//
MOV 00h, 07h // ambas son direcciones de los registros GPS//

Ej:

MOV 07h,#01h
MOV A, #08h
ADD A,07h //A<-A+07h el valor final se almacena en A//

Modo de direccionamiento indirecto:

En este modo de direccionamiento, el origen o el destino (o el destino o la fuente) deben ser a dirección indirecta, pero no un valor. Este modo de direccionamiento admite el concepto de puntero. El puntero es una variable que se utiliza para almacenar la dirección de la otra variable. Este concepto de puntero sólo se utiliza para los registros R0 y R1.

Sintaxis:

MOVR0, #01h /El valor 01 se almacena en el registro R0, la dirección R0 es 08h//
MOV R1, #08h//R1 es la variable puntero que almacena dirección (08h) de R0 //
MOV 20h,@R1 /El valor 01 se almacena en la dirección 20h del registro GP//

Modo de direccionamiento indirecto
Modo de direccionamiento indirecto

Modo de direccionamiento de índice base:

Este modo de direccionamiento se utiliza para leer los datos de la memoria externa o de la memoria ROM. Todos los modos de direccionamiento no pueden leer los datos de la memoria de código. El código debe leer a través del registro DPTR. El DPTR se utiliza para señalar los datos en la memoria de código o externa.

Sintaxis:

MOVC A, @A+DPTR //C indica la memoria del código//
MOCX A, @A+DPTR // X indica memoria externa//
EX: MOV A, #00H //00H se almacena en el registro A//
MOV DPTR, #0500H //DPTR señala la dirección 0500h en la memoria//
MOVC A, @A+DPTR //Enviar el valor a el registro A//
MOV P0, A //fecha de envío de A al registro PO//

Conjunto de instrucciones:

El conjunto de instrucciones es la estructura del controlador o procesador que proporciona órdenes al controlador para guiarlo en el procesamiento de datos. El conjunto de instrucciones consta de instrucciones, tipos de datos nativos, modos de direccionamiento, registros de interrupción, manejo excepcional y arquitectura de memoria. El 8051 microcontrolador puede seguir instrucciones CISC con arquitectura Harvard. En el caso de la programación del 8051 se incluyen diferentes tipos de instrucciones CISC:

  • Conjunto de instrucciones de transferencia de datos
  • Conjunto de instrucciones secuenciales
  • Conjunto de instrucciones aritméticas
  • Bifurcación Instrucción establecer
  • Conjunto de instrumentos de bucle
  • Conjunto de instrucciones condicionales
  • Conjunto de instrucciones incondicionales
  • Conjunto de instrucciones lógicas
  • Conjunto de instrucciones booleanas

Conjunto de instrucciones aritméticas:

Las instrucciones aritméticas realizan las operaciones básicas como

  • Suma
  • Multiplicación
  • Sustracción
  • División

Adición:

ORG 0000h
MOV R0, #03H // mueve el valor 3 al registro R0//
MOV A, #05H // mueve el valor 5 al acumulador A//
Suma A, 00H // addA con el valor R0 y almacena el resultado enA//
FIN

Multiplicación:

ORG 0000h
MOV R0, #03H // mueve el valor 3 al registro R0//
MOV A, #05H // mueve el valor 5 al acumulador A//
MUL A, 03H // Multiplicado el resultado se almacena en el Acumulador A //
FIN

La sustracción:

ORG 0000h
MOV R0, #03H // mueve el valor 3 al registro R0//
MOV A, #05H // mueve el valor 5 al acumulador A//
SUBB A, 03H // El valor resultante se almacena en el Acumulador A //
FIN

División:

ORG 0000h
MOV R0, #03H // mueve el valor 3 al registro R0//
MOV A, #15H // mueve el valor 5 al acumulador A//
DIV A, 03H // el valor final se almacena en el Acumulador A //
FIN

Instrucciones condicionales

La CPU ejecuta las instrucciones en función de la condición comprobando el estado de un solo bit o del byte. El 8051 microcontrolador consta de varias instrucciones condicionales como

  • JB ->Saltar abajo
  • JNB -> Saltar si no está por debajo
  • JC -> Saltar si se lleva
  • JNC -> Saltar si no Llevar
  • JZ ->Salto si Cero
  • JNZ -> Saltar si no Cero
Instrucciones condicionales
Instrucciones condicionales

1. Sintaxis:

JB P1.0, etiqueta
- - - - - - - -
- - - - - - - -
Etiqueta: - - - - - - -
- - - - - - - -
FIN

2. Sintaxis:

JNB P1.0, etiqueta
- - - - - - - -
- - - - - - - -
Etiqueta: - - - - - - -
- - - - - - - -
FIN

3. Sintaxis:

JC, etiqueta
- - - - - - - -
- - - - - - - -
Etiqueta: - - - - - - -
- - - - - - - -
FIN

4. Sintaxis:

JNC, etiqueta
- - - - - - - -
- - - - - - - -
Etiqueta: - - - - - - -
- - - - - - - -
FIN
5. Sintaxis:

JZ, etiqueta
- - - - - - - -
- - - - - - - -
Etiqueta: - - - - - - -
- - - - - - - -
FIN

6. Sintaxis:

JNZ, etiqueta
- - - - - - - -
- - - - - - - -
Etiqueta: - - - - - - -
- - - - - - - -
FIN

Instrucciones de llamada y salto:

Las instrucciones de llamada y salto se utilizan para evitar la repetición del código del programa. Cuando algún código específico se utiliza más de una vez en diferentes lugares del programa, si mencionamos nombre específico a código entonces podríamos utilizar ese nombre en cualquier parte del programa sin tener que introducir un código para cada vez. Esto reduce la complejidad del programa. La programación del 8051 consiste en instrucciones de llamada y salto como LCALL, SJMP.

1. Sintaxis:

ORG 0000h
- - - - - - - -
- - - - - - - -
ACALL, etiqueta
- - - - - - - -
- - - - - - - -
SJMP STOP
Etiqueta: - - - - - - - -
- - - - - - - -
- - - - - - - -
ret
STOP:NOP

2. Sintaxis:

ORG 0000h
- - - - - - - -
- - - - - - - -
LCALL, etiqueta
- - - - - - - -
- - - - - - - -
SJMP STOP
Etiqueta: - - - - - - - -
- - - - - - - -
- - - - - - - -
ret
STOP:NOP

Instrucciones de llamada y salto
Instrucciones de llamada y salto

Instrucciones de bucle:

Las instrucciones de bucle se utilizan para repetir el bloque cada vez que se realizan las operaciones de incremento y decremento. El 8051 microcontrolador consiste en dos tipos de instrucciones de bucle:

  • CJNE -> comparar y saltar si no es igual
  • DJNZ -> decrementa y salta si no es cero

1. Sintaxis:

de CJNE
MOV A, #00H
MOV B, #10H
Etiqueta:INC A
- - - - - -
- - - - - -
CJNE A, etiqueta

2. Sintaxis:

de DJNE

MOV R0, #10H
Etiqueta:- - - - - -
- - - - - -
DJNE R0, etiqueta
- - - - - -
- - - - - -
FIN

Conjunto de instrucciones lógicas:

El conjunto de instrucciones del microcontrolador 8051 proporciona las instrucciones lógicas AND, OR, XOR, TEST, NOT y booleanas para establecer y borrar los bits en función de la necesidad del programa.

Conjunto de instrucciones lógicas
Conjunto de instrucciones lógicas

1. Sintaxis:

MOV A, #20H /00100000/
MOV R0, #03H /00000101/
ORL A, R0 //00100000/00000101=00000000//

2. Sintaxis:

MOV A, #20H /00100000/
MOV R0, #03H /00000101/
ANL A, R0

3. Sintaxis:

MOV A, #20H /00100000/
MOV R0, #03H /00000101/
XRL A, R0

Operadores de desplazamiento

Los operadores de desplazamiento se utilizan para enviar y recibir los datos de forma eficiente. El 8051 microcontrolador consta de cuatro operadores de turno:

  • RR -> Girar a la derecha
  • RRC ->Girar a la derecha a través del arrastre
  • RL -> Girar a la izquierda
  • RLC ->Girar a la izquierda a través del arrastre

Girar a la derecha (RR):

En esta operación de desplazamiento, el MSB se convierte en LSB y todos los bits se desplazan hacia la derecha bit a bit, en serie.

Sintaxis:

MOV A, #25h
RR A

Gira a la izquierda (RL):

En esta operación de desplazamiento, el MSB se convierte en LSB y todos los bits se desplazan hacia el lado izquierdo poco a poco, en serie.

Sintaxis:

MOV A, #25h
RL A

RRC Gira a la derecha a través de Carry:

En esta operación de desplazamiento, el LSB se desplaza al acarreo y el acarreo se convierte en MSB, y todos los bits se desplazan hacia la derecha posición por posición.

Sintaxis:

MOV A, #27h
RRC A

RLC Girar a la izquierda a través de la transferencia:

En esta operación de desplazamiento, el MSB se desplaza al acarreo y el acarreo se convierte en LSB y todos los bits se desplazan hacia la izquierda en una posición bit a bit.

Sintaxis:

MOV A, #27h
RLC A

Programas básicos en C embebidos:

El microcontrolador la programación difiere para cada tipo de sistema operativo. Hay muchos sistemas operativos, como Linux, Windows, RTOS, etc. Sin embargo, el RTOS tiene varias ventajas para el desarrollo de sistemas embebidos. A continuación se presentan algunos ejemplos de programación a nivel de ensamblador.

Parpadeo del LED con el 8051 microcontrolador:

  • Visualización de números en una pantalla de 7 segmentos con un microcontrolador 8051
  • Cálculo y programación de temporizadores/contadores con el 8051 microcontrolador
  • Cálculos y programa de comunicación en serie con el 8051 microcontrolador

Programas de LED con el 8051 Microcontrller

1. WAP para alternar los LEDs del PORT1

ORG 0000H
TOGLE: MOV P1, #01 //mover 00000001 al registro p1//
CALL DELAY //ejecutar el retardo//
MOV A, P1 //mover valor de p1 al acumulador//
CPL A //complementa el valor A //
MOV P1, A //mover 11111110 al registro del puerto1//
CALL DELAY //ejecutar el retraso//
SJMP TOGLE
DELAY: MOV R5, #10H //carga el registro R5 con 10//
DOS: MOV R6, #200 //carga el registro R6 con 200//
UNO: MOV R7, #200 //carga el registro R7 con 200//
DJNZ R7, $ //disminuye R7 hasta que sea cero//
DJNZ R6, UNO //disminuye R7 hasta que sea cero//
DJNZ R5, DOS //disminuye R7 hasta que sea cero//
RET //vuelve al programa principal //
FIN

Cálculos de temporizadores/contadores y programa con el 8051 Microcontrolador:

El retardo es uno de los factores importantes en el desarrollo del software de aplicación. Los temporizadores y contadores son componentes de hardware del microcontroladorque se utilizan en muchas aplicaciones para proporcionar el tiempo de retardo preciso con impulsos de conteo. Bas tareas se implementan mediante la técnica del software.

1. WAP para calcular el retardo de 500us.

MOV TMOD, #10H //selecciona el modo del temporizador mediante los registros//
MOV TH1, #0FEH //almacena el tiempo de retardo en el bit superior//
MOV TL1, #32H // almacena el tiempo de retardo en el bit inferior//
JNB TF1, $ //disminuye el valor del temporizador hasta que sea cero//
CLR TF1 //borrar la bandera del temporizador bit//
CLR TR1 //Apagar el temporizador//

2. WAP para alternar los LEDs con el 5 sec tiempo de retardo

ORG 0000H
RETORNO: MOV PO, #00H
ACALL RETRASO
MOV P0, #0FFH
ACALL RETRASO
SJUMP RETORNO
DELAY: MOV R5, #50H //carga el registro R5 con 50//
DELAY1: MOV R6, #200 //carga el registro R6 con 200//
DELAY2: MOV R7, #229 //carga el registro R7 con 200//
DJNZ R7, $ //disminuye R7 hasta que sea cero//
DJNZ R6, DELAY2//decrementa R6 hasta que sea cero//
DJNZ R5, DELAY1//decrementa R5 hasta que sea cero//
RET //vuelve al programa principal //
FIN

3. WAP para contar los 250 pulsos utilizando el modo0 count0

Sintaxis:

ORG 0000H
MOV TMOD, #50H //seleccionar el contador//
MOV TH0, #15 //mover los pulsos de conteo a un bit superior//
MOV TH1, #9FH //mover los pulsos de conteo, bit inferior//
SET TR0 //Activar el temporizador//
JNB $ //disminuye el valor de la cuenta hasta cero//
CLR TF0 //borrar el contador, bandera bit//
CLR TR0 //detener el temporizador//
FIN

Programación de la comunicación en serie con el 8051 Microcontrolador:

La comunicación en serie se utiliza habitualmente para transmitir y recibir los datos. El 8051 microcontrolador consiste en la comunicación en serie UART/USART y las señales se transmiten y reciben por Tx y Rx. La comunicación UART transfiere los datos bit a bit en serie. La UART es un protocolo semidúplex que transfiere y recibe los datos, pero no al mismo tiempo.

1. WAP para transmitir los caracteres al Hiper Terminal

MOV SCON, #50H //ajustar la comunicación serie//
MOV TMOD, #20H //selecciona el modo del temporizador//
MOV TH1, #-3 //ajustar la velocidad de transmisión//
SET TR1 //Activar el temporizador//
MOV SBUF, #'S' //transmitir S a la ventana serie //
JNB TI, $ //disminuye el valor del temporizador hasta que sea cero//
CLR RI //despeja la interrupción de recepción //
CLR TR1 //borrar temporizador//

2. WAP para transmitir el Recibir el carácter por el Hiper Terminal

MOV SCON, #50H //ajustar la comunicación serie//
MOV TMOD, #20H //selecciona el modo del temporizador//
MOV TH1, #-6 //ajustar la velocidad de transmisión//
SET TR1 //en el temporizador//
MOV SBUF, #'S' //transmitir S a la ventana serie //
JNB RI, $ //disminuye el valor del temporizador hasta que sea cero//
CLR RI // borra la interrupción de recepción //
MOV P0, SBUF //Enviar el valor del registro SBUF al puerto0//
CLR TR1 //borrar temporizador//

Esto es todo sobre la programación del 8051 en lenguaje ensamblador en resumen con programas basados en ejemplos. Esperamos que esta información adecuada sobre el lenguaje ensamblador sea ciertamente útil para los lectores y esperamos sus valiosos comentarios en la sección de comentarios más abajo.

Si quieres conocer otros artículos parecidos a Introducción a la programación del 8051 en lenguaje ensamblador puedes visitar la categoría Generalidades.

¡Más Contenido!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir