programando el microcontrolador 8051 en el edsim51

5
a) 01h, 02h,07h,08h,09h,0Ah,0Bh,0Fh,10h,11h,15h,63h y 13h. b) Usando el algoritmo de la suma de un listado de enteros. Realice un programa para la suma del listado de enteros dado en el punto a). Almacenar el resultado en el registro R7. En este programa utilice el programa del punto a) como una subrutina. SOLUCION: ; Programa que suma un conjunto ; de 13 números de un listado ; que empieza en la dirección de ; memoria 30h y termina en 3Ch. org 0000h lcall llenar_memoria;Llena la memoria de 30h a 3Ch con numeros mov R7,#0; Valor inicial del resultado de la suma mov R6,#13; Contador de numeros mov R0,#30h; Valor inicial de R0 loop: mov A,@R0; Obtengo el primer numero a sumar add A,R7; Sumo los numeros. mov R7,A; Muevo el resultado a R7. inc R0; Incremento R0 para pasar a la siguiente direccion djnz R6,loop; Decremento R6 que es mi contador Fin: sjmp Fin ;Subrutina que llena la memoria con numeros llenar_memoria: mov R1,#30h mov R6,#13 mov R5,#0 loop1:

Upload: mauro-jesus-zambrana-castro

Post on 27-Sep-2015

355 views

Category:

Documents


3 download

DESCRIPTION

Resolución de problemas de PROGRAMANDO EL MICROCONTROLADOR 8051 EN EL EDSIM51Dictado en el curso de ALGORITMOS en la facultad de ciencias-UNI

TRANSCRIPT

  • a) 01h, 02h,07h,08h,09h,0Ah,0Bh,0Fh,10h,11h,15h,63h y 13h. b) Usando el algoritmo de la suma de un listado de enteros. Realice un

    programa para la suma del listado de enteros dado en el punto a).

    Almacenar el resultado en el registro R7. En este programa utilice el

    programa del punto a) como una subrutina.

    SOLUCION:

    ; Programa que suma un conjunto

    ; de 13 nmeros de un listado

    ; que empieza en la direccin de

    ; memoria 30h y termina en 3Ch.

    org 0000h

    lcall llenar_memoria;Llena la memoria de 30h a 3Ch con numeros

    mov R7,#0; Valor inicial del resultado de la suma

    mov R6,#13; Contador de numeros

    mov R0,#30h; Valor inicial de R0

    loop:

    mov A,@R0; Obtengo el primer numero a sumar

    add A,R7; Sumo los numeros.

    mov R7,A; Muevo el resultado a R7.

    inc R0; Incremento R0 para pasar a la siguiente direccion

    djnz R6,loop; Decremento R6 que es mi contador

    Fin:

    sjmp Fin

    ;Subrutina que llena la memoria con numeros

    llenar_memoria:

    mov R1,#30h

    mov R6,#13

    mov R5,#0

    loop1:

  • mov A,R5

    lcall consigue_numero

    mov @R1,A

    inc R1

    inc R5

    djnz R6,loop1

    ret

    ;Subrutina que consigue el numero a colocar en la memoria

    consigue_numero:

    inc A

    movc A,@A+PC

    ret

    db 01h

    db 02h

    db 07h

    db 08h

    db 09h

    db 0Ah

    db 0Bh

    db 0Fh

    db 10h

    db 11h

    db 15h

    db 63h

    db 13h

  • En el algoritmo de ordenamiento de burbuja se recorre el listado de nmeros

    intercambiando los elementos adyacentes que estn desordenados. Se recorre

    el listado tantas veces hasta que ya no haya cambios. Usando el siguiente

    PSEUDOCODIGO del algoritmo de burbuja:

    Enteros X, Z, LISTADO(N)

    X0

    MIENTRAS(X < N)

    { Z N

    MIENTRAS (Z>=0)

    {

    SI (LISTADO (Z) < LISTADO (Z-1))

    {

    INTERCAMBIO (LISTADO (Z), LISTADO (Z-1))

    }

    Z Z - 1 }

    X X + 1 }

    FIN

    desarrolle un programa que realice el ordenamiento de burbuja del listado

    de nmeros de la pregunta 3, para N=9. Utilice las direcciones de memoria

    desde 30h hasta 38h para colocar el listado.

    SOLUCION:

    ;Programa que hace

    ;el ordenamiento por

    ;el algoritmo de burbuja

    org 0000h

    lcall llena_memoria

    mov R6,#9; R6 es contador que hace las veces

    ; de "x" en el algoritmo

    loop1:

    mov R0,#38h;Empiezo en la direccin 38h con el ordenamiento

    mov R5,#9; R5 es el que hace las veces de "z"

    loop:

  • mov A,@R0; Se mueve a A el contenido de 38h

    mov R3,A ; Se mueve a R3 el valor de A

    dec R0 ; Se decrementa R0 a 37h

    mov A,@R0 ; Se mueve a A el contenido de 37h

    Subb A,R3; Se calcula A-R3 y si es negativo no hay intercambio

    jc nohay ; Va a "nohay" si es negativo

    mov A,@R0; Empieza el intercambio, muevo a A el valor de 37h

    mov R2,A; Luego lo muevo a R2

    mov A,R3; Muevo a A el valor de R3

    mov @R0,A;lo muevo a 37h el valor de R3

    inc R0 ;incremento y llego a 38h

    mov A,R2;muevo el valor de R2 a A

    mov @R0,A; y ahora lo muevo a 38h, termina el intercambio

    dec R0 ;decremento R0 para continuar con el siguiente

    nohay:

    djnz R5,loop;decrementa R5

    djnz R6,loop1;decrementa R6

    Fin:

    sjmp Fin

    ;Subrutina para llenar la memoria de datos desde 30h hasta 38h

    llena_memoria:

    mov R0,#0

    mov R1,#30h

    mov R2,#9

    loop2:

    mov A,R0

    lcall consigue_numero

    mov @R1,A

  • inc R0

    inc R1

    djnz R2,loop2

    ret

    consigue_numero:

    inc A

    movc A,@A+PC

    ret

    db 23h

    db 78h

    db 59h

    db 8h

    db 32h

    db 56h

    db 05h

    db 12h

    db 0Ah