0% found this document useful (0 votes)
75 views6 pages

Simple Programs in 8051: Instructions

The document provides 10 statements with solutions describing simple assembly language programs for the 8051 microcontroller. The programs demonstrate various instructions and logic including: 1) exchanging the contents of internal and external memory locations, 2) duplicating and subtracting register contents, 3) dividing registers and restoring original values, 4) transferring data between internal and external memory, 5) comparing memory blocks and counting matches, 6) finding values within a range and counting them, 7) generating delays and producing a square wave, 8) counting interrupts and disabling interrupts after overflow, 9) continuously scanning a port and multiplying values.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
75 views6 pages

Simple Programs in 8051: Instructions

The document provides 10 statements with solutions describing simple assembly language programs for the 8051 microcontroller. The programs demonstrate various instructions and logic including: 1) exchanging the contents of internal and external memory locations, 2) duplicating and subtracting register contents, 3) dividing registers and restoring original values, 4) transferring data between internal and external memory, 5) comparing memory blocks and counting matches, 6) finding values within a range and counting them, 7) generating delays and producing a square wave, 8) counting interrupts and disabling interrupts after overflow, 9) continuously scanning a port and multiplying values.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Simple Programs in 8051

Here some simple assembly language programs for 8051 microcontroller are
given to understand the operation of different instructions and to understand the
logic behind particular program. First the statement of the program that describes
what should be done is given. Then the solution is given which describes the logic
how it will be done and last the code is given with necessary comments.

Statement 1: – exchange the content of FFh and FF00h

Solution: – here one is internal memory location and other is memory external

location. so first the content of ext memory location FF00h is loaded in acc. then the

content of int memory location FFh is saved first and then content of acc is transferred
to FFh. now saved content of FFh is loaded in acc and then it is transferred to FF00h.

Mov dptr, #0FF00h ; take the address in dptr

Movx a, @dptr ; get the content of 0050h in a

Mov r0, 0FFh ; save the content of 50h in r0

Mov 0FFh, a ; move a to 50h

Mov a, r0 ; get content of 50h in a

Movx @dptr, a ; move it to 0050h

Duplication and Subtraction

Statement 2: – store the higher nibble of r7 in to both nibbles of r6

Solution: –first we shall get the upper nibble of r7 in r6. Then we swap nibbles of r7
and make OR operation with r6 so the upper and lower nibbles are duplicated

Mov a, r7 ; get the content in acc

Anl a, #0F0h ; mask lower bit

Mov r6, a ; send it to r6

Swap a ; xchange upper and lower nibbles of acc


Orl a, r6 ; OR operation

Mov r6, a ; finally load content in r6


Statement 3: – treat r6-r7 and r4-r5 as two 16 bit registers. Perform subtraction

between them. Store the result in 20h (lower byte) and 21h (higher byte).

Solution: – first we shall clear the carry. Then subtract the lower bytes afterward then

subtract higher bytes.

Clr c ; clear carry

Mov a, r4 ; get first lower byte

Subb a, r6 ; subtract it with other

Mov 20h, a ; store the result

Mov a, r5 ; get the first higher byte

Subb a, r7 ; subtract from other

Mov 21h, a ; store the higher byte

Division & Data Transfer

Statement 4: – divide the content of r0 by r1. Store the result in r2 (answer) and r3

(reminder). Then restore the original content of r0.

Solution:-after getting answer to restore original content we have to multiply answer

with divider and then add reminder in that.

Mov a, r0 ; get the content of r0 and r1

Mov b, r1 ; in register A and B

Div ab ; divide A by B

Mov r2, a ; store result in r2

Mov r3, b ; and reminder in r3

Mov b, r1 ; again get content of r1 in B

Mul ab ; multiply it by answer

Add a, r3 ; add reminder in new answer

Mov r0, a ; finally restore the content of r0

Statement 5: – transfer the block of data from 20h to 30h to external location 1020h

to 1030h.
Solution: – here we have to transfer 10 data bytes from internal to external RAM. So

first, we need one counter. Then we need two pointers one for source second for

destination.

Mov r7, #0Ah ; initialize counter by 10d

Mov r0, #20h ; get initial source location

Mov dptr, #1020h ; get initial destination location

Nxt: Mov a, @r0 ; get first content in acc

Movx @dptr, a ; move it to external location

Inc r0 ; increment source location

Inc dptr ; increase destination location

Djnz r7, nxt ; decrease r7. if zero then over otherwise move next
Various Comparison Programs

Statement 6: – find out how many equal bytes between two memory blocks 10h to

20h and 20h to 30h.

Solution: – here we shall compare each byte one by one from both blocks. Increase

the count every time when equal bytes are found

Mov r7, #0Ah ; initialize counter by 10d

Mov r0, #10h ; get initial location of block1

Mov r1, #20h ; get initial location of block2

Mov r6, #00h ; equal byte counter. Starts from zero

Nxt: Mov a, @r0 ; get content of block 1 in acc

Mov b, a ; move it to B

Mov a, @r1 ; get content of block 2 in acc

Cjne a, b, nomatch ; compare both if equal

Inc r6 ; increment the counter

Nomatch: inc r0 ; otherwise go for second number

Inc r1
djnz r7, nxt ; decrease r7. if zero then over otherwise move next
Statement 7: – given block of 100h to 200h. Find out how many bytes from this block

are greater then the number in r2 and less then number in r3. Store the count in r4.

Solution: – in this program, we shall take each byte one by one from given block. Now

here two limits are given higher limit in r3 and lower limit in r2. So we check first higher

limit and then lower limit if the byte is in between these limits then count will be

incremented.

Mov dptr, #0100h ; get initial location

Mov r7, #0FFh ; counter

Mov r4, #00h ; number counter

Mov 20h, r2 ; get the upper and lower limits in

Mov 21h, r3 ; 20h and 21h

Nxt: Movx a, @dptr ; get the content in acc

Cjne a, 21h, lower ; check the upper limit first

Sjmp out ; if number is larger

Lower: jnc out ; jump out

Cjne a, 20h, limit ; check lower limit

Sjmp out ; if number is lower

Limit: jc out ; jump out

Inc r4 ; if number within limit increment count

Out: inc dptr ; get next location

Djnz r7, nxt ; repeat until block completes


Interrupt Counting, Subroutines & Scan n Mulitply

Statement 8:- the crystal frequency is given as 12 MHz. Make a subroutine that will

generate delay of exact 1 ms. Use this delay to generate square wave of 50 Hz on pin

P2.0

Solution: – 50 Hz means 20 ms. And because of square wave 10 ms ontime and 10

ms offtime. So for 10 ms we shall send 1 to port pin and for another 10 ms send 0 in
continuous loop.
<_x0021_xml:namespace prefix=”st1″ ns=”urn:schemas-microsoft-

com:office:smarttags”/>Loop: Setb p2.0 ; send 1 to port pin

Mov r6, #0Ah ; load 10d in r6

Acall delay ; call 1 ms delay ×10 = 10 ms

Clr p2.0 ; send 0 to port pin

Mov r6, #0Ah ; load 10d in r6

Acall delay ; call 1 ms delay ×10 = 10 ms

Sjmp loop ; continuous loop

Delay: ; load count 250d

Lp2: Mov r7, #0FAh

Lp1: Nop ; 1 cycle

Nop ; 1+1=2 cycles

Djnz r7, lp1 ; 1+1+2 = 4 cycles

Djnz r6, lp2 ; 4×250 = 1000 cycles = 1000 µs = 1 ms

ret

Statement 9:-count number of interrupts arriving on external interrupt pin INT1. Stop

whencounter overflows and disable the interrupt. Give the indication on pinP0.0

Solution: –as we know whenever interrupt occurs the PC jumps to one particular

location where it’s ISR is written. So we have to just write one ISR that will do the job

Movr2, #00h ; initialize the counter

Movie, #84h ; enable external interrupt 1

Here: Sjmp here ; continuous loop

Org 0013h ; interrupt 1location

Incr2 ; increment the count

Cjner2, #00h, out ; check whether it overflows

Movie, #00h ; if yes then disable interrupt


Clr p0.0 ; and give indication
Out : reti ; otherwise keep counting

Statement 10: –continuously scan port P0. If data is other then FFh write a subroutine

that will multiply it with 10d and send it to port P1

Solution: –here we have to use polling method. We shall continuously pole port P0 if

there is any data other then FFh. If there is data we shall call subroutine

Again: Mov p0, #0ffh ; initialize port P0 as input port

Loop: Mov a, p0 ; get the data in acc

Cjne a, #0FFh, dat ; compare it with FFh

Sjmp loop ; if same keep looping

Dat: acall multi; if different call subroutine

Sjmp again ; again start polling

Multi

Mov b,#10d ; load 10d in register B

Mul ab ; multiply it with received data

Mov p1, a ; send the result to P1

Ret ;return to main program

You might also like