5. Register
s
SP
A
B
R0
DPTR DPH DPL
R1
R2 PC PC
R3
R4 Some 8051 16-bit Register
R5
R6
R7
Some 8-bitt Registers of
the 8051
6. Memory mapping in 8051
• ROM memory map in 8051 family
4k 8k
0000H 0000H
0FFFH
1FFFH
8751
AT89C51
8752
AT89C52
7. • RAM memory space allocation in the 8051
7FH
Scratch pad RAM
30H
2FH
Bit-Addressable RAM
20H
1FH Register Bank 3
18H
17H
Register Bank 2
10H
0FH Stack) Register Bank 1)
08H
07H
Register Bank 0
00H
8. Addressing Modes
• Register
• Direct
• Register Indirect
• Immediate
• Relative
• Absolute
• Long
• Indexed
10. Direct Addressing Mode
Although the entire of 128 bytes of RAM can be
accessed using direct addressing mode, it is most
often used to access RAM loc. 30 – 7FH.
MOV R0, 40H
MOV 56H, A
MOV A, 4 ; ≡ MOV A, R4
MOV 6, 2 ; copy R2 to R6
; MOV R6,R2 is invalid !
11. Register Indirect Addressing Mode
• In this mode, register is used as a pointer to the
data.
MOV A,@Ri ; move content of RAM loc.
where address is held by Ri into A ( i=0 or 1 )
MOV @R1,B
In other word, the content of register R0 or R1 is
sources or target in MOV, ADD and SUBB
insructions.
13. Relative, Absolute, & Long Addressing
Used only with jump and call instructions:
SJMP
ACALL,AJMP
LCALL,LJMP
14. Indexed Addressing Mode
• This mode is widely used in accessing data
elements of look-up table entries located in the
program (code) space ROM at the 8051
MOVC A,@A+DPTR
(A,@A+PC)
A= content of address A +DPTR from ROM
Note:
Because the data elements are stored in the
program (code ) space ROM of the 8051, it uses
the instruction MOVC instead of MOV. The
“C” means code.
15. Some Simple Instructions
MOV dest,source ; dest = source
MOV A,#72H ;A=72H
MOV R4,#62H ;R4=62H
MOV B,0F9H ;B=the content of F9’th byte of RAM
MOV DPTR,#7634H
MOV DPL,#34H
MOV DPH,#76H
MOV P1,A ;mov A to port 1
Note 1:
MOV A,#72H ≠ MOV A,72H
After instruction “MOV A,72H ” the content of 72’th byte of RAM will
replace in Accumulator.
Note 2:
MOV A,R3 ≡ MOV A,3
17. MUL & DIV
• MUL AB ;B|A = A*B
MOV A,#25H
MOV B,#65H
MUL AB ;25H*65H=0E99
;B=0EH, A=99H
• DIV AB ;A = A/B, B = A mod B
MOV A,#25
MOV B,#10
DIV AB ;A=2, B=5
18. SETB bit ; bit=1
CLR bit ; bit=0
SETB C ; CY=1
SETB P0.0 ;bit 0 from port 0 =1
SETB P3.7 ;bit 7 from port 3 =1
SETB ACC.2 ;bit 2 from ACCUMULATOR =1
SETB 05 ;set high D5 of RAM loc. 20h
Note:
CLR instruction is as same as SETB
i.e.:
CLR C ;CY=0
But following instruction is only for CLR:
CLR A ;A=0
19. DEC byte ;byte=byte-1
INC byte ;byte=byte+1
INC R7
DEC A
DEC 40H ; [40]=[40]-1
20. RR – RL – RRC – RLC A
EXAMPLE:
RR A
RR:
RRC: C
RL:
RLC: C
22. Stack in the 8051
• The register used to
access the stack is called
SP (stack pointer)
register. 7FH
Scratch pad RAM
• The stack pointer in the
30H
8051 is only 8 bits wide,
which means that it can 2FH
Bit-Addressable RAM
take value 00 to FFH.
20H
When 8051 powered up, 1FH Register Bank 3
the SP register contains 18H
17H
value 07. 10H
Register Bank 2
0FH Stack) Register Bank 1)
08H
07H
Register Bank 0
00H
24. LOOP and JUMP Instructions
Conditional Jumps :
JZ Jump if A=0
JNZ Jump if A/=0
DJNZ Decrement and jump if A/=0
CJNE A,byte Jump if A/=byte
CJNE reg,#data Jump if byte/=#data
JC Jump if CY=1
JNC Jump if CY=0
JB Jump if bit=1
JNB Jump if bit=0
JBC Jump if bit=1 and clear bit
25. DJNZ:
Write a program to clear ACC, then
add 3 to the accumulator ten time
Solution:
MOV A,#0
MOV R2,#10
AGAIN: ADD A,#03
DJNZ R2,AGAIN ;repeat until R2=0 (10 times)
MOV R5,A
26. LJMP(long jump)
LJMP is an unconditional jump. It is a 3-byte instruction.
It allows a jump to any memory location from 0000 to
FFFFH.
AJMP(absolute jump)
In this 2-byte instruction, It allows a jump to any memory
location within the 2k block of program memory.
SJMP(short jump)
In this 2-byte instruction. The relative address range of 00-
FFH is divided into forward and backward jumps, that is ,
within -128 to +127 bytes of memory relative to the address
of the current PC.
27. CALL Instructions
Another control transfer instruction is the CALL
instruction, which is used to call a subroutine.
• LCALL(long call)
This 3-byte instruction can be used to call
subroutines located anywhere within the 64K
byte address space of the 8051.
• ACALL (absolute call)
ACALL is 2-byte instruction. the target
address of the subroutine must be within 2K
byte range.
28. Example:
Write a program to copy a block of 10 bytes from RAM
location starting at 37h to RAM location starting at 59h.
Solution:
MOV R0,#37h ; source pointer
MOV R1,#59h ; dest pointer
MOV R2,#10 ; counter
L1: MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R2,L1
29. Decimal Addition
156 + 248
. 100's 10's 1's
. 1 5 6
+ 2 4 8
= 4 0 4 16 Bit Addition
1A44 + 22DB = 3D1F
. 256's 16’s 1's
. 1 A 4 4
+ 2 2 D B
= 3 D 1 F
30. Performing the Addition with 8051
. 65536's 256's 1's
. R6 R7
+ R4 R5
= R1 R2 R3
1.Add the low bytes R7 and R5, leave the answer in R3.
2.Add the high bytes R6 and R4, adding any carry from step 1, and leave the answer in R2.
3.Put any carry from step 2 in the final byte, R1.
31. Steps 1, 2, 3
MOV A,R7 ;Move the low-byte into the accumulator
ADD A,R5 ;Add the second low-byte to the accumulator
MOV R3,A ;Move the answer to the low-byte of the result
MOV A,R6 ;Move the high-byte into the accumulator
ADDC A,R4 ;Add the second high-byte to the accumulator, plus carry.
MOV R2,A ;Move the answer to the high-byte of the result
MOV A,#00h ;By default, the highest byte will be zero.
ADDC A,#00h ;Add zero, plus carry from step 2.
MOV R1,A ;Move the answer to the highest byte of the result
32. The Whole Program
;Load the first value into R6 and R7
MOV R6,#1Ah
MOV R7,#44h
;Load the first value into R4 and R5
MOV R4,#22h
MOV R5,#0DBh
;Call the 16-bit addition routine LCALL ADD16_16
ADD16_16:
;Step 1 of the process
MOV A,R7 ;Move the low-byte into the accumulator
ADD A,R5 ;Add the second low-byte to the accumulator
MOV R3,A ;Move the answer to the low-byte of the result
;Step 2 of the process
MOV A,R6 ;Move the high-byte into the accumulator
ADDC A,R4 ;Add the second high-byte to the accumulator, plus carry.
MOV R2,A ;Move the answer to the high-byte of the result
;Step 3 of the process
MOV A,#00h ;By default, the highest byte will be zero.
ADDC A,#00h ;Add zero, plus carry from step 2.
MOV MOV R1,A ;Move the answer to the highest byte of the result
;Return - answer now resides in R1, R2, and R3. RET
33. Timer & Port Operations
• Example:
Write a program using Timer0 to create a 10khz square
wave on P1.0
MOV TMOD,#02H ;8-bit auto-reload mode
MOV TH0,#-50 ;-50 reload value in TH0
SETB TR0 ;start timer0
LOOP: JNB TF0, LOOP ;wait for overflow
CLR TF0 ;clear timer0 overflow flag
CPL P1.0 ;toggle port bit
SJMP LOOP ;repeat
END
34. Interrupts
1. Enabling and Disabling Interrupts
2. Interrupt Priority
3. Writing the ISR (Interrupt Service
Routine)
36. Interrupt Vectors
Interrupt Vector Address
System Reset 0000H
External 0 0003H
Timer 0 000BH
External 1 0013H
Timer 1 001BH
Serial Port 0023H
Timer 2 002BH
37. Writing the ISR
Example:
Writing the ISR for Timer0 interrupt
ORG 0000H ;reset
LJMP MAIN
ORG 000BH ;Timer0 entry point
T0ISR: . ;Timer0 ISR begins
.
RETI ;return to main program
MAIN: . ;main program
.
.
END
38. Structure of Assembly language
and Running an 8051 program
EDITOR
PROGRAM
Myfile.asm
ASSEMBLER
PROGRAM
Myfile.lst
Other obj file
Myfile.obj
LINKER
PROGRAM
OH
PROGRAM
Myfile.hex
39. Examples of Our Program Instructions
• MOV C,P1.4
JC LINE1
• SETB P1.0
CLR P1.2
40. 8051 Instruction Set
ACALL: Absolute Call JC: Jump if Carry Set PUSH: Push Value Onto Stack
ADD, ADDC: Add Acc. (With Carry) JMP: Jump to Address RET: Return From Subroutine
AJMP: Absolute Jump JNB: Jump if Bit Not Set RETI: Return From Interrupt
ANL: Bitwise AND JNC: Jump if Carry Not Set RL: Rotate Accumulator Left
CJNE: Compare & Jump if Not Equal JNZ: Jump if Acc. Not Zero RLC: Rotate Acc. Left Through Carry
CLR: Clear Register JZ: Jump if Accumulator Zero RR: Rotate Accumulator Right
CPL: Complement Register LCALL: Long Call RRC: Rotate Acc. Right Through Carry
DA: Decimal Adjust LJMP: Long Jump SETB: Set Bit
DEC: Decrement Register MOV: Move Memory SJMP: Short Jump
DIV: Divide Accumulator by B MOVC: Move Code Memory SUBB: Sub. From Acc. With Borrow
DJNZ: Dec. Reg. & Jump if Not Zero MOVX: Move Extended Memory SWAP: Swap Accumulator Nibbles
INC: Increment Register MUL: Multiply Accumulator by B XCH: Exchange Bytes
JB: Jump if Bit Set NOP: No Operation XCHD: Exchange Digits
JBC: Jump if Bit Set and Clear Bit ORL: Bitwise OR XRL: Bitwise Exclusive OR
POP: Pop Value From Stack Undefined: Undefined Instruction