Assembly level programs for 8051 Microcontroller

Write Assembly level program (ALP) to add two 16-bit numbers. The numbers are 3CE7H and 3B8DH. Place the sum in R7 and R6. Place LSB in R6.

Assembly Code:

 ORG 00H
    MOV R1, #0E7H //Load the LSB of 1st number in R1
    MOV A, #8DH   //Load the LSB of 2nd number in A
    ADD A, R1     //ADD them 
    MOV R6,A      //Store Result in R5, i.e. result of adding the LSBs
    MOV R2, #3CH  //Load MSB of 1st number in R2
    MOV A, #3BH   //Load MSB of 2nd number in Acc
    ADDC A,R2     //Add with carry content of Acc and R2
    MOV R7,A      // Move the result into R6, i.e. result of adding the MSBs
    END

Write ALP to find number of one’s in a given byte.

Assembly Code:

     ORG 00H
        MOV A,#55H // This is the number whose number of ones need to be counted
        MOV R2,#00H // Will Store No of Ones
        MOV R3,#08H // No of looping of the counting Subroutine
BACK:   RRC A   // Rotate Accumulator Right with Carry
        JNC L1  // Jump to L1 if No carry is detected
        INC R2  // Increment R2
L1:     DJNZ R3,BACK  // Decrement R3, Jump if not zero
        END

Write ALP to find the sum of numbers stored in RAM. Assume your own appropriate BCD numbers and RAM locations. Put the result in BCD.

Assembly Code:

 ORG 00H
    MOV R1,#99H //Store 20H in RAM Location 30H
    MOV R2,#99H //Store 22H in RAM location 32H
    MOV A,R1     //Load Acc with content from 30H
    MOV B,R2    //Load Register B with content from 32H
    ADDC A,B
    DA A
    MOV R6,A
    END

Write an ALP to illustrate Multiplication and Division instructions in 8051.

Assembly Code:

 ORG 00H
    MOV A,#0A5H // Load Accumulator with a number 05
    MOV B,#04H // Load register with a number 04
    MUL AB     // Multiply content of A with B
    MOV R3,A   // Store LSB of Result in R3
    MOV R4,B   // Store MSB of result in R4
    MOV A,#20H
    MOV B,#09H
    DIV AB
    MOV R5,A   // Store quotent in R5
    MOV R6,B   // Store Remainder in R6
    END

Write an ALP to multiply 16-bit numbers (word) in 8051. Take 8C45H and 235AH and place the product in RAM locations 50H to 54H.

Assembly Code:

 ORG 00H
    MOV A,#45H
    MOV B,#5AH
    MUL AB
    MOV 31H,A 
    MOV 30H,B

    MOV A,#5AH
    MOV B,#8CH
    MUL AB
    MOV 32H,B
    MOV 33H,A

    MOV A,#23H
    MOV B,#45H
    MUL AB
    MOV 35H,A
    MOV 34H,B

    MOV A,#23H
    MOV B,#8CH
    MUL AB  
    MOV 37H,A
    MOV 36H,B

    MOV A,31H
    MOV 54H,A //LSB of Result (1st Byte)

    MOV A,30H
    ADD A,33H
    ADDC A,35H
    MOV 53H,A //(2nd Byte)

    MOV A,32H
    ADDC A,34H
    ADDC A,37h
    MOV 52H,A //(3rd Byte)

    MOV A,36H
    ADDC A,#0h
    MOV 51H,A //(4th Byte)

    MOV A,#0H
    ADDC A,#0h
    MOV 50H,A //(5th Byte, if any)

    END

Write a program to transfer value #ABh serially via 3rd pin or PORT 2. Send the MSB first.

Assembly Code:

 ORG 00H
    MOV A,#0ABH
    MOV R0,#08H
X1: RLC A
    MOV P2.2,C
    DJNZ R0,X1
    END

Write an ALP to convert Packed BCD to two ASCII numbers.

Assembly Code:

 ORG 00h
    MOV A, #35H
    MOV R1, A 
    ANL A, #0FH 
    ORL A, #30H 
    MOV R6, A 

    MOV A, R1 
    ANL A, #0F0H 
    RR A 
    RR A 
    RR A 
    RR A 
    ORL A, #30H 
    MOV R7, A 
    END

Write an ALP to toggle the LED connected to P2.6 every 10ms. The crystal frequency is 11.0592MHz.

Assembly Code:

;If we use 11.0592MHz crystal ..
;We know 8051 takes 12 pulses for 1 machine cycle
;then period of one machine cycle would be 11.0592MHz/12 = 921.6KHz
;t = 1/f so time period of one machine cycle = 1/ 921.6KHz = 1.08506944444us
;921.6 machine cycles will produce 1 ms
;no of loops = 921.6/4=230

        ORG 000H
MAIN:   SETB P2.6
        ACALL DELAY1
        CLR P2.6
        ACALL DELAY1
        SJMP MAIN
DELAY1: MOV R2,#20D
LABEL:  ACALL DELAY
        DJNZ R2,LABEL
        RET
DELAY:  MOV R5,#248D
        MOV R6,#248D
LOOP1:  DJNZ R5,LOOP1
LOOP2:  DJNZ R6,LOOP2
        RET
        END