Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

left-side-bubbles-backgroundright-side-bubbles-background

Experimente o Premium!star struck emoji

Acesse conteúdos dessa e de diversas outras disciplinas.

Libere conteúdos
sem pagar

Ajude estudantes e ganhe conteúdos liberados!

Prévia do material em texto

1
SEL-0415 Introdução à Organização de Computadores
Profa. Luiza Maria Romeiro Codá
Departamento de Engenharia Elétrica e de Computação - EESC-USP
Aula de Exercícios 2a Prova –Parte 2
Microcontrolador 8051 
Microcontrolador 8051
2
Microcontrolador 8051
descrição dos pinos
3
Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf
Microcontrolador 8051
descrição dos pinos
4
Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf
Microcontrolador 8051
Função especial da porta P3
5Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf
Microcontrolador 8051(cont)
6
Registradores de 8 bits Registradores de 16 bits
Registradores de uso do programador
Reset da CPU
7
O reset da CPU é feito através do pino RST mantendo-se um nível alto por, no 
mínimo, 24 períodos de oscilador. A CPU responde executando um reset interno 
O reset da CPU coloca os seguintes valores nos registradores: 
Microcontrolador 8051(cont)
8
RAM Interna
RAM 
interna
8052RAM 
interna
8051
Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf
Banco de registradores é alterado alternado os bit 3 e 4 do 
registrado PSW (PSW.3 e PSW.4)
Microcontrolador 8051: RAM interna
Banco de Registradores: selecionado pelos bits RSO e RS1 do PSW 
Nº do 
banco
RS0 RS1 endereço
0 0 0 00h a 07H
1 0 1 08H a 0Fh
2 1 0 10H a 17H
3 1 1 18 a 1FH
9
Microcontrolador 8051: RAM interna
10
Endereço do Banco de Registradores 
Fonte: file:///C:/Users/CASA/Downloads/gk_mc1_a2_sw8051%20(2).pdf
Organização das memórias do Microcontrolador 8051
11
Organização das memórias do Microcontrolador 8051
12
FLUXOGRAMA
13
Nome do programa 
Processamento
Fim do programa
Definição das condições iniciais
Definição da saída do resultado
Representação típica de um fluxograma de uma rotina de um
programa simples. 
Fonte: Microcontolador 8051- Prentice Hall 
Progama de adição 
Soma de 2 números armazenados na RAM interna utilizando 
a instrução ADD A,Rn
14
SOMA
(A)  (45h)
(R0)  (5Ah)
(A)  (A) + (R0)
(6Dh)  (A)
FIM
Programa Fonte
ORG 0
MOV A,45h
MOV R0,5Ah
ADD A,R0
MOV 6Dh,A
SJMP $
END
O programa soma o conteúdo da posição 45h com o conteúdo da posição 5Ah RAM interna e 
armazena o resultado na posiçãp 6Dh da RAM interna
Endereço da 
EEPROM
Conteúdo da 
EEPROM
0000h 74h opcode
0001h 45h Endereço Ram int 
0002h A8h opcode
0003h 5Ah Endereço Ram int
0004h 28h opcode
0005h F5h opcode
0006h 6Dh Endereço Ram int 
0007h 80h Opcode
0008h FEh Endereço salto
Fonte: Microcontolador 8051- Prentice Hall 
Programa de adição de 2 números armazenados na RAM interna 
utilizando a instrução ADD A,Rn e ADD A, @R0
15
SOMA
(A)  (45h)
(R0)  #5Ah
(A)  (A) + ((R0))
(6Dh)  (A)
FIM
Programa Fonte
MOV A,45h
MOV R0,#5Ah
ADD A,@R0
MOV 6Dh,A
SJMP $
SOMA
(A)  (45h)
(R0)  (5Ah)
(A)  (A) + (5Ah)
(6Dh)  (A)
FIM
Programa Fonte
MOV A,45h
MOV R0,5Ah
ADD A,R0
MOV 6Dh,A
SJMP $
Fonte: Microcontolador 8051- Prentice Hall 
Endereço da 
EEPROM
Conteúdo da 
EEPROM
0000h 74h opcode
0001h 45h Endereço Ram int 
0002h 78h opcode
0003h 5Ah Endereço Ram int
0004h 28h opcode
0005h F5h opcode
0006h 6Dh Endereço Ram int 
0007h 80h Opcode
0008h FEh Endereço salto
Endereço da 
EEPROM
Conteúdo da 
EEPROM
0000h 74h opcode
0001h 45h Endereço Ram int 
0002h 78h opcode
0003h 5Ah Endereço Ram int
0004h 26h opcode
0005h F5h opcode
0006h 6Dh Endereço Ram int 
0007h 80h Opcode
0008h FEh Endereço salto
FLUXOGRAMA
16
Representação típica de um fluxograma de uma rotina de um programa com loop. 
Nome do programa 
Processamento
Fim do programa
Definição das condições iniciais
Definição da saída do resultado
Bloco de tomada de 
decisão (?). Teste de 
uma variável.
Se o teste for falso: processamento de 
certas informações (toma-se decisão)
não: a condição não foi satisfeita
sim: a condição foi satisfeira 
Controle do loop
Fonte: Microcontolador 8051- Prentice Hall 
Programa que calcula a quantidade de números menores que 38h de um buffer de 
memória que se encontra na posição 60H.
17
Num < 38h
(R0)#60h
(R1)#1Bh
(7BH)#00h
(C)#0b
(A)((R0))
(A)(A)-(C)-#38h
(C)=0 ?
[(A)#38h ?]
(7Bh)(7Bh)+1
(R1)(R1)-1
(R1)0 ?
N
S
S
FIM
N
(R0)(R0)+1
Fonte: Microcontolador 8051- Prentice Hall 
• R0 contém endereço (60H) inicial da 
tabela;
• R1 é o contador de números 
verificados;
• 7BH é a posição que vai conter a 
quantidade de numero <38H;
• Carry é zerado;
• O número a ser verificado é copiado 
para A;
• Verifica se número em A -38H gera 
carry
• Se carry = 1 número testado ≤ 38H
• Então o conteúdo da posição 7BH é 
incrementado;
• busca-se outro número para testar
• Verifica se todos os números foram 
estados caso através do valor de R1
• Se R1 = 0 finaliza programa
• Se R1 ≠ 0, busca-se outro número
•
• Se Carry = 0 número testado ≥ 38H
• busca-se outro número para testar
• Verifica se todos os números foram 
estados caso através do valor de R1
• Se R1 = 0 finaliza programa
• Se R1 ≠ 0, busca-se outro número
Programa que calcula a quantidade de números 
menores que 38h de um buffer de memória.
18
Fonte: Microcontolador 8051- Prentice Hall 
Programa Fonte
19
; Inicio do programa que calcula a qte de elementos < #38h 
 ORG 0 
 AJMP INICIO ;salta para o endereço inicial do programa 
 
 ORG 100h 
INICIO: MOV R0,#60h ;Endereço inicial do buffer de memória 
MOV R1,#1Bh ;Quantidades de elementos do buffer de memória 
MOV 7Bh,#00 ;Zera o contador que armazena a qte de num < #38h 
ADR2: CLR C ;Limpa o conteúdo do carry-bit 
MOV A,@R0 ;Armazena no (A) um elemento do buffer 
SUBB A,#38h ;Subtrai o (A) da constante #38h e define o flag (C) 
JNC ADR1 ;Se (C)=0 (A>=#38h) => (PC)=ADR1 [não soma um no (7Ah)] 
INC 7Bh ;Se (C)=1 (A<#38h), soma um no (7Bh) 
ADR1: INC R0 ;Aponta para a próxima posição de memória a ser analisada 
 DJNZ R1,ADR2 ;Se a qte de elementos a serem analisadas é  0, então salta para ADR2 
 SJMP $ ; Termina o programa se (R1)=0. Fica em Loop nesta posição 
END ; Fim físico do programa 
 
Programa que calcula a quantidade de números menores que 38h 
de um buffer de memória.
Fonte: Microcontolador 8051- Prentice Hall 
20
 ORG 0 
 AJMP INICIO 
ORG 0100h 
INICIO: MOV R0,#60h 
MOV R1,#1Bh 
MOV 7Bh,#00 
ADR2: CLR C 
 MOV A,@R0 
 SUBB A,#38h 
 JNC ADR1 
 INC 7Bh 
ADR1: INC R0 
 DJNZ R1,ADR2 
 SJMP $ 
END 
 
Informações sobra as instruções
Instrução OPCODE Nºbytes
AJMP pag + 01XX 21h 2
MOV R0, #data 78h 2
MOV R1, #data 79h 2
MOV data addr,data 75h 3
CLR C C3h 1
MOC A,@R0 E6h 1
SUBB A, #data 94h 2
JNC addr rel 50h 2
INC data addr 05h 2
INC R0 08h 1
DJNZ R1,end rel D9h 2
Programa que calcula a quantidade de números 
menores que 38h de um buffer de memória.
Fonte: Microcontolador 8051- Prentice Hall 
21
Conteúdo da memória de programa
Endereço da 
EEPROM
Conteúdo da 
EEPROM
0000h 21h
0001h 00h
0100h 78h
0101h 60h
0102h 79h
0103h 1Bh
0104h 75h
0105h 7Bh
0106h 00h
0107h C3h
0108h E6h
0109h 94h
010Ah 38h
010Bh 50h
010Ch 03h
010Dh 05h
010Eh 7Bh
010Fh 08h
0110h D9h
0111h F5h
 ORG 0 
 AJMP INICIO 
 ORG 0100h 
INICIO: MOV R0,#60h 
 MOV R1,#1Bh 
 MOV 7Bh,#00 
ADR2: CLR C 
 MOV A,@R0 
 SUBB A,#38h 
 JNC ADR1 
 
 INC 7Bh 
ADR1: INC R0 
 DJNZ R1,ADR2 
 SJMP $ 
 END 
 
22
ORG 0 
AJMP INICIO 
ORG 0100h 
INICIO: MOV R0,#60h 
MOV R1,#1Bh 
 
MOV 7Bh,#00 
ADR2:CLR C 
 MOV A,@R0 
 SUBB A,#38h 
 JNC ADR1 
 INC 7Bh 
ADR1: INC R0 
 DJNZ R1,ADR2 
END 
 
Cálculo do Endereço Relativo para Salto
Endereço
da EEPROM
Conteúdo
da 
EEPROM
End rel
para salto
P frente
End rel
para salto
P trás
0000H 21h
0001H 00h
0100h 78h
0101h 60h
0102h 79h
0103h 1Bh
0104h 75h
0105h 7Bh
0106h 00h
0107h C3h F5h
0108h E6h F6h
0109h 94h F7h
010Ah 38h F8h
010Bh 50h F9h
010Ch 03h 00h FAh
010Dh 05h 01h FBh
010Eh 7Bh 02h FCh
010Fh 08h 03h FDh
0110h D9h FEh
0111h F5h FFh
23
Conteúdo da memória RAM interna
MOV R0,#60h ; é armazenado 60h na RAM interna posição 01h (pois o
;bloco 0 de registradores está que está ativo)
MOV R1,#1Bh ; é armazenado 1Bh na RAM interna posição 01h (pois o
;bloco 0 de registradores está que está ativo)
MOV 7Bh,#00 ; na posição 7Bh da RAM interna é armazenado 00h
; que é a quantidade de dados menores que 38h
ADR2: CLR C ; O carry C do PSW é zerado
MOV A,@R0 ;o conteúdo da posição 60h da RAM interna é copiado para
;o registrador acumulador (primeiro dado a ser verificado)
SUBB A,#38h ; é extraído do valor do acumulador o valor 38h
JNC ADR1 ;o programa é desviado para o endereço que contém a
;instrução INC R0 no endereço 010Fh (PC = 010Fh) se o bit Carry
;do PSW for diferente de zero, caso em que A é maior que 38h
INC 7Bh ;incrementa o conteúdo do endereço7Bh (se 00h será 01h)
ADR1: INC R0 ;R0 é incrementado (de 60 para 61h) para apontar para o
; próximo dado
DJNZ R1,ADR2; decrementa o valor de R1(que inicialmente é 1Bh passando para1Ah
;e salta para a posição ADR2 no endereço 0107h (PC=0107h) se R1
;não for zero
END
24
Modo de endereçamento das instruções do 8051
Endereçamento Direto: O endereço do operando é especificado por um campo na instrução. 
Somente Os Bytes menos significativos da RAM de dados interna e região de SFR podem ser 
diretamente acessdas; (Ex; MOV 30h,A)
Endereçamento Indireto: a instrução especifica um registrador que contém o endereço do 
operando. RAM externa e RAM interna podem ser indiretamente endereçáveis.
Se o endereço for de 8 bits, seu valor é armazenado em R0 ou R1;
Se o endereço for de 16 bits, seu valor é armazenado no registrador DPTR;
(Exs: MOVX A,@DPTR e MOV @R0,A)
Endereçamento por Registrador: Instruções que acessam registradores de R0 a R7 do banco de 
registradores ou algumas instruções específicas a certos registradores.
Tais instruções são eficientes por eliminarem um byte de endereço. O próprio OPCODE já indica 
qual a tarefa a ser realizada. (Ex: MOV R0,A)
Endereçamento Imediato: quando uma constante é apresentada na instrução após o símbolo #;
(Ex : ADD R0,#30h)
Endereçamento Indexado: Sómente a memória de Programas, cuja única operação é leitura, 
pode ser acessada por esse modo. É usado para fazer leituras em tabelas na Memória de 
Programa. Um registrador de 16 bits(DPTR) aponta para o início da tabela enquanto o 
Acumulador é ajustado para a e-nesima posição da mesma. O endereço de um valor da tabela é 
formado pelo soma do valor do acumulador com o valor do DPTR. (Ex: MOVC A,@A+DPTR)
Lista nº 11
25
15. Dado o segmento de programa da Figura 1 escrito em assembly para o microcontrolador Intel 
8051. Responda: os itens de 15.1 a 15.4
Figura 1
ORG 0000h
LJMP end1
ORG end1
MOV DPTR, #end2
MOV A,#dado1
MOVC A,@A+DPTR
MOV R0,A
MOVX @DPTR,A
LCALL rot
SJMP $
ORG end3
Rot: SUBB A,R0
MOV 20h,A
RET
ORG 2010h
dados: DB 25h
END
Como ao ser energizado o 
Microcontrolador 8051 carrega 
o registrador PC com o valor 
0000h. Portanto, a 1ª instrução 
a ser executada deve estar 
armazenada nessa posição. O 
programador deve então 
incluir nesse endreço uma 
instrução de salto (LJMP ou 
SJMP) para o endereço em que 
o programa inicia ( no caso 
desse exemplo, endereço end1
Lista nº 11
26
15. Dado o segmento de programa da Figura 1 escrito em assembly para o microcontrolador Intel 8051. 
Responda:
15.1 Determine os valores de End1, End2,End3 e dado1 para que: o endereço da instrução MOV A, 
#dado1 seja 100Ch, que o endereço acessado na memória RAM seja 2009h, que o endereço acessado 
na memória EPROM seja 2010h e que a rotina chamada inicie no endereço 1100h ( então rot = 1100h).
End da
EEPROM
(hexadecimal)
Conteúdo
da EEPROM
(hexadecimal)
significado Número 
de bytes
end1 75 Opcode de MOV DPTR, #end2 3
?
?
100C 74 Opcode de MOV A,#dado1 2
? dado1 de 8 bits
93 Opcode MOVC A,@A+DPTR 1
F8 Opcode de MOV R0,A 1
F0 MOVX @DPTR,A 1
12 Opcode LCALL rot 3
11
00
80 Opcode da SJMP $ 2
Figura 1
ORG 0000h
LJMP end1
ORG end1
MOV DPTR, 
#end2
MOV A,#dado1
MOVC 
A,@A+DPTR
MOV R0,A
MOVX @DPTR,A
LCALL rot
SJMP $
ORG end3
rot: SUBB A,R0
MOV 20h,A
RET
ORG 2010h
dados: DB 25h
END
Lista nº 11
27
15.1 MOV A, #dado1 está no endereço 100Ch, endereço acessado na memória RAM = 
2009h; o endereço acessado na memória EPROM =2010h e rot=1100h 
Resposta: End3 = rot = 1100h
End da
EEPROM 
Hexadecimal
Conteúdo
da EEPROM
(hexadecimal)
significado Numero
De 
Bytes
rot= 1100 98 Opcode de SUBB A,R0 1
1101 E5 Opcode de MOV 20h,A 2
1202 20 20h= endereço acessado
da RAM interna cujo 
conteúdo é copiada em A
1103 22 Opcode de RET 1
Figura 1
ORG 0000h
LJMP end1
ORG end1
MOV DPTR, #end2
MOV A,#dado1
MOVC A,@A+DPTR
MOV R0,A
MOVX @DPTR,A
LCALL rot
SJMP $
ORG end3
rot: SUBB A,R0
MOV 20h,A
RET
ORG 2010h
dados: DB 25h
END
Tabela referente à subrotina rot
28
Lista 11. 15.1 Resposta: MOV A, #dado1 esta no 100Ch,colocando os endereços anteriores 
a 100Ch verifica-se que End1 é 1009H. End2 é o valor armazenado em DPTR e como o 
enunciado diz que o endereço acessado na memória RAM = 2009h, a instrução que 
acessa é MOVX A, DPTR, portanto DPTR=End2 =2009h
End da
EEPROM
(hexadecimal)
Conteúdo
da EEPROM
significado Número 
de bytes
End1 =1009 75h Opcode de MOV DPTR, #End2 3
100A MSB End2
100B LSB End2
100C 74h Opcode de MOV A,#dado1 3
100D dado1 dado1 de 8 bits que é movido 
para o Ac.
100E 93h Opcode MOVC A,@A+DPTR 1
100F F8h Opcode de MOV R0,A 1
1010 F0h Opcode de MOVX A,@DPTR 1
1011 12h Opcode de LCALL rot 3
1012 MSB rot MSB do Endereço da
subrotina
1013 LSB rot LSB do Endereço da subrotina
1014 80h Opcode da SJMP $ 2
Figura 1
ORG end1
MOV DPTR, #end2
MOV A,#dado1
MOVC A,@A+DPTR
MOV R0,A
MOVX @DPTR,A
LCALL rot
SJMP $
ORG end3
rot: SUBB A,R0
MOV 20h,A
RET
ORG 2010h
dados: DB 25h
END
29
Lista11. 15.1 Resposta: O enunciado diz que o endereço acessado na memória EPROM 
seja 2010h, e a EEPROM é acessada pela instrução MOVC A,@A+DPTR, então A+DPTR = 
2010h, e o valor de A é = dado1. Como já se sabe que DPTR = 2009h, ou seja, dado1+ 
DPTR= 2010h, então dado1 = 2010h – 2009h = 07h
End da
EEPROM
Conteúdo
da EEPROM
significado Número de bytes
1009h 75h Opcode de MOV DPTR, #end2 3
100Ah MSB end2
100Bh LSB end2
100Ch 74h Opcode de MOV A,#dado1 3
100Dh dado1 dado1 de 8 bits que é 
movido para o Ac.
100Eh 93h Opcode MOVC A,@A+DPTR 1
100Fh F8h Opcode de MOV R0,A 1
1010h F0h Opcode de MOVX A,@DPTR 1
1011h 12h Opcode de LCALL rot 3
1012h MSB rot MSB do Endereço da
subrotina ( endereço 1100h)
1013h LSB rot LSB do Endereço da subrotina
( endereço 1100h)
1014h 80h Opcode da SJMP $ 2
1015h FEh Endereço relativo do opcode
SJMP 
Figura 1
ORG end1
MOV DPTR, #end2
MOV A,#dado1
MOVC A,@A+DPTR
MOV R0,A
MOVX @DPTR,A
LCALL rot
SJMP $
ORG end3
rot: SUBB A,R0
MOV 20h,A
RET
ORG 2010h
dados: DB 25h
END
30
Lista11. 15.1 Resposta: Colocando os valores obtidos no programa em assembly e completando o 
conteúdo da memória de programa fica: End da EEPROM Conteúdo EEPROM
0000h 02h
0001h 10h
0002h 09h
: :
: :
1009h 75h
100Ah 20h
100Bh 09h
100Ch 74h
100Dh 07h
100Eh 93h
100Fh F8h
1010h F0h
1011h 12h
1012h 11h
1013h 00h
1014h 80h
1015h FEh
ORG 0000h
LJMP 1009h
ORG 1009h
MOV DPTR, #2009h
MOV A,# 07H
MOVC A, @A+DPTR; posição 2010h (A) = 25h
MOV R0,A
MOVX @DPTR, A
LCALL rot; o endereço rot = 1100h
SJMP $
ORG 1100h
rot: SUBB A,R0
MOV 20h,ARET
ORG 2010h
Dado: DB 25h
END
Figura 1
Obs: na RAM externa na posição 2009h 
será armazenado o valor de A = 22h
31
Lista11. 15.1 Resposta: continuação do preenchimento do conteúdo da memória
End da 
EEPROM
Conteúdo EEPROM
: :
: :
1100h 98h
1101h F5h
1102h 22h
: :
: :
: :
: :
: :
: :
2010h 25h
ORG 0000h
LJMP 1009h
ORG 1009h
MOV DPTR, #2009h
MOV A,# 07H
MOVC A, @A+DPTR; posição 2010h (A) = 25h
MOV R0,A
MOVX @DPTR, A
LCALL rot; o endereço rot = 1100h
SJMP $
ORG 1100h
rot: SUBB A,R0
MOV 20h,A
RET
ORG 2010h
Dado: DB 25h
END
Figura 1
Obs: na RAM externa na posição 2009h 
será armazenado o valor de A = 25h
A diretiva DB 
reserva bytes com 
os valores indicados 
no programa, no 
exemplo = 25h
32
15.2 Dado um “reset” no microcontrolador 80C51, em função das características 
do registrador SP (stack pointer ou ponteiro de pilha) responda qual o valor do 
SP, da pilha e do PC (Program Counter), após a instrução (LCALL) de chamada de 
subrotina ter sido executada, e quais esses valores após a instrução RET da 
subrotina ter sido executada? End da
EEPROM
Conteúdo
da EEPROM
1009H 75H
100AH 20H
100BH 09H
100CH 74H
100DH 07H
100EH 93H
100FH F8H
1010H F0H
1011H 12H
1012H 11H
1013H 00H
1014H 80H
1015H FEH
ORG 0000h
LJMP 1009h
ORG 1009H
MOV DPTR, #2009H
MOV A,# 07H
MOVC A, @A+DPTR
MOV R0,A
MOVX A,@DPTR
LCALL ROTINA; o endereço ROTINA = 1100H
SJMP $
ORG 1100H
ROTINA: SUBB A,R0
MOV 20H,A
RET
ORG 2010h
Dado: DB 25h
END
Figura 1
Opcode LCALL
Endereço
da subrotina
1100H
Lista nº 11
33
15.2 Resposta: Dado um “reset” no microcontrolador 80C51, o registrador SP é inicializado com o valor 07H. 
Enquanto a instrução LCALL ROT é executada o PC contém o endereço da instrução seguinte à ela, que neste 
caso do programa é a instrução SJMP $ que está na posição 1014H por que a instrução LCALL ocupa 3 bytes ( 
os endereços 1011H, 1012H e 1013H). Porém, ao finalizar a execução da instrução LCALL o microcontrolador 
irá executar a subrotina que inicia na posição 1100H, portanto, após a execução da instrução LCALL o PC terá o 
endereço da subrotina.. 
Após execução 
da instrução 
LCALL ROT
Após execução da 
instrução 
RET
Valor de SP
Valor da Pilha
(conteúdo de SP)
Valor do PC
(Endereço da próxima instrução 
a ser executada)
1100h
End da
EEPROM
Conteúdo
da EEPROM
1009H 75H
100AH 20H
100BH 09H
100CH 74H
100DH 07H
100EH 93H
100FH F8H
1010H F0H
1011H 12H
1012H 11H
1013H 00H
1014H 80H
1015H FEH
Opcode LCALL
Endereço
da subrotina
1100H
Lista nº 11
34
15.2 Resposta ( continuação): Porém, como o PC passará a ter o endereço da subrotina, o endereço da próxima 
instrução a LCALL, que é no caso a SJMP< seria perdido. Portanto, quando a instrução LCALL é executada, o 
microcontrolador salva o endereço da próxima instrução(SJMP) na pilha. O SP do 8051 é incrementável, a instrução 
LCALL ROT O microcontrolador incrementa o SP (SP <- SP + 1 = 07 +1) que passa a ter o valor 08H e salva nessa 
posição da RAM interna os bytes MENOS significativos do endereço da próxima instrução a LCALL que é a instrução 
SJUMP que está no endereço 1014H e cujos bytes menos significativos são 14H. O SP é mais uma vez incrementado 
e passa a apontar para a posição 08H da RAM interna e nessa posição o
microcontrolador armazena o 8 bytes MAIS significativos do endereço de SJMP
que é 10H. Portanto ,o valor da Pilha após a execução da instrução LCALL é 10H
End da
EEPROM
Conteúdo
da EEPROM
1009H 75H
100AH 20H
100BH 09H
100CH 74H
100DH 07H
100EH 93H
100FH F8H
1010H F0H
1011H 12H
1012H 11H
1013H 00H
1014H 80H
1015H FEH
Opcode LCALL
Endereço
da subrotina
1100H
7FH
07H
08H
00H
09H 10H
14H
Valor desconhecido
Endereço
ram interna 128 bytes inferiores
SP
Valor Antes da 
execução de 
LCALL
SP
Valor após 
a execução 
de LCALL
35
Após
execução da 
instrução 
LCALL ROT
Após execução da 
instrução 
RET
Valor de SP 09H
Valor da Pilha
(conteúdo de SP)
10H
Valor do PC
(Endereço da próxima 
instrução a ser 
executada)
1100H
End da
EEPROM
Conteúdo
da EEPROM
1009H 75H
100AH 20H
100BH 09H
100CH 74H
100DH 07H
100EH 93H
100FH F8H
1010H F0H
1011H 12H
1012H 11H
1013H 00H
1014H 80H
1015H FEH
Opcode LCALL
Endereço
da subrotina
1100H
36
15.2 Resposta ( continuação): Quando o microcontrolador finaliza a execução da subrotina encontra a instrução RET. 
Essa instrução faz com que o conteúdo da pilha = 10H (que é o conteúdo da posição 09H apontada por SP) seja 
armazenada em PCH ( que é o registrador que guarda os bytes mais significativos do PC). Então o ponteiro SP é 
decrementado (SP<-SP-1 =08H) e o conteúdo dessa posição ( 14H) é armazenado em PCL (que é o registrador que 
guarda os bytes menos significativos do PC). O PC passa então a ter o endereço 1014H que é o endereço da instrução 
SJMP $, que é a instrução seguinte à instrução LCALL ROT no programa principal, recuperando assim o endereço., 
passando a executar o programa a partir dessa posição. O ponteiro SP é decrementado mais uma vez 
(SP<-SP-2 =07H), voltando a apontar para a posição inicial, posição 07H da RAM 
interna cujo conteúdo não foi modificado nesse programa. End da
EEPROM
Conteúdo
da EEPROM
1009H 75H
100AH 20H
100BH 09H
100CH 74H
100DH 07H
100EH 93H
100FH F8H
1010H F0H
1011H 12H
1012H 11H
1013H 00H
1014H 80H
1015H FEH
Opcode LCALL
Endereço
da subrotina
1100H
7FH
07H
08H
00H
09H 10H
14H
Valor desconhecido
Endereço
ram interna 128 bytes inferiores
SP
Valor Após a 
execução da 
instrução RET
SP
Valor após 
a execução 
de LCALL
37
Após
execução da 
instrução 
LCALL ROT
Após execução da 
instrução 
RET
Valor de SP 09H 07H
Valor da Pilha
(conteúdo de SP)
10H Desconhecido pois 
não foi usado nesse 
programa
Valor do PC
(Endereço da próxima 
instrução a ser 
executada)
1100H 1014H
15.2 Resposta
Exemplo de exercício sobre Pilha:
38
Supondo que um microcontrolador estava executando um programa onde o banco 1 de 
registradores tenha sido ativado e o ponteiro SP tenha sido carregado com o valor 0FH. Em 
uma linha do programa, no endereço 0104H tinha uma instrução de chamada de subrotina
LCALL 2010H., responda: 
a) Qual o valor do SP, valor da Pilha e valor do PC após a instrução LCALL ser executada
b) Qual o valor do SP, valor da Pilha e valor do PC após a instrução RET ser executada
Após execução da instrução 
LCALL 
Após execução da instrução 
RET
Valor de SP 11H
SP <- SP+2 o ponteiro SP é incrementado duas vezes da 
posição inicial(0Fh):
Em (SP+1) é armazenado o LSB do endereço de 
retorno ao programa principal 
Em (SP+2) é armazenado o MSB do endereço de 
retorno ao programa principal)
0FH
(recuperado endereço 
inicial de SP)
Valor da Pilha
(conteúdo de 
SP)
01H
( MSB do endereço de retorno ao programa principal 
(Instrução SJMP $ endereço 1014Hl)
Valor da posição 0FH
(não conhecido neste 
exercicio)
Valor do PC
(Endereço da 
próxima 
instrução a ser 
executada)
2010H
(endereço da subrotina)
0107H
(endereço da instrução 
seguinte a instrução LCALL 
que ocupa3 bytes (0104H, 
0105H 0106H
Lista nº 11
39
15.3 Considerando o valor do ponteiro de pilha do ítem 15.2, quais os bancos 
de registradores que estão liberados?
Resposta: Se SP = 07H, então o banco 0 é que está liberado para utilização do 
programador, pois o banco 0 tem endereço de R0 a R7 de 00H a 07H, 
respecticamente
Banco 0
40
15.4 Qual (ou quais) instrução(s) da Figura 1 apresenta(m)
modo de endereçamento imediato. Explique porque?
Resposta:
Lista nº 11
41
16. Baseado na estrutura do processador 8051, onde o fluxograma e o assembly do programa 
que será executado, é mostrado na Figura 2, o qual executa a soma do valor 1Ah com o valor 5Ah 
e o resultado é armazenado na RAM externa. Responda as questões abaixo, lembrando que:
• AC: acumulador de 8 bits;
• DPTR de 16 bits;
• Ocorre um reset na CPU após a energização do microcontrolador;
16.1 Mostre quais os passos necessários para executar uma instruçãolocalizada no endereço 
0105h.
Lista nº 11
Figura 2
42
Lista 11. 16.1 Mostre quais os passos necessários para executar uma instrução 
localizada no endereço 0105h.
End da
EEPROM
Conteúdo
da EEPROM
significado Nº 
bytes
0000H Opcode AJMP Salta para outro endereço numa 
faixa de 2Kbytes referentes à atual 
posição da memória de programa.( 
salta p endereço INICIO)
2
2ª byte AJMP Define o endereço de salto 0100H
0100H Opcode de
MOV A, 45H
Copia o conteúdo da posição 45H 
da RAM interna no acumulador
2
0101H 45H
0102H Opcode de
MOV R0, #5AH
Copia o valor do 2º byte da 
instrução(5AH) em R0
2
0103H 5AH Valor
0104H Opcode de ADD A,RO Soma o conteúdo de R0 ao 
conteúdo do acumulador e salva 
resultado no acumulador
1
0105H Opcode do MOV DPTR, #1000H Opcode LCALL ROT 3
0106H 10H MSB do valor da instrução
0107H 00H LSB do valor da instrução
Opcode de MOVX @DPTR,A Copia no endereço da RAM externa 
contido em DPTR o valor do
acumulador(soma de r0 com A)
1
Opcode do SJMP $ Salta p o endereço relativo ao
endereço da instrução -128 a 128
2
Endereço relativo do opcode de 
SJUMP a esta posição
Figura 2
43
Lista 11. 16.1 Mostre quais os passos necessários para executar uma instrução localizada no endereço 0105h.
Resp:
O PC é carregado com endereço da instrução que será executada (0105H). 
No chip do microprocessador o pino /PSEN é colocado em nível baixo, sinalizando que será acessada memória de 
Programa(EEPROM), e o pino ALE é colocado em nível alto, indicando a presença de endereço no duto multiplexado 
(P0) . O microprocessador coloca então os valores do 8 bits LSB (05H) do endereço na porta paralela P0 e dos MSBs
na porta paralela P2.
Os 8 bits menos significativos do endereço são armazenado em um latch, para que esse endereço esteja presente 
na entrada de endereços da memória de programa (EEPROM) durante todo o tempo de acesso à memória e 
possibilite seu conteúdo ser acessado.
Então, o microprocessador coloca o pino ALE em nível baixo indicando que a porta multiplexada P0 foi 
transformada em duto de dados e está apta a receber os dados da memória.
O conteúdo da posição cujo endereço está presente nas entradas de endereço da memória é acessado e 
apresentada nas saídas de dados da memória. O conteúdo dessa posição que corresponde ao OPCODE da instrução 
MOV DPTR,#1000H ( cujo valor é 90H), transita agora pelo duto multiplexado da porta P0, sendo esse valor 
carregado no registrador de instrução(RI) na CPU. O valor desse OPCODE é armazenado no registrador RI e então é 
decodificado pelo processador e este processo define se a instrução tem apenas 1 ou mais bytes. No caso desta 
instrução, são 3 bytes, então o PC é incrementado de uma vez, a porta P0 passa a conter esse valor que é o 
endereço do próximo byte onde está o valor 10H que será armazenado em DPH. O PC é novamente incrementado e 
para acessar o próximo byte que contém o valor 00H que será armazenado em DPL
Após finalizada a busca dos dois próximos bytes, a execução da instrução é finalizada armazenando o valor desses 
dois bytes em DPL e DPH, e portanto DPTR = 1000H
0105H 90H Opcode MOV DPTR, #1000H 3 bytes
0106H 00H LSB do valor da instrução
0107H 10H MSB do valor da instrução
44
Para entender melhor os passos listador no slide 37 
observar o diagrama de tempo de acesso às memórias 
45
diagrama de tempo de acesso às memórias 
46
End da
EEPROM
Conteúdo
da EEPROM
significado Nº 
bytes
0000H 21H Pula para a posição INICIO e o opcode depende do tamanho do 
saltoAJMP ( 01H, 21H, 41H, 61H, 81H, A1H, C1H ou E1H)
2
0001H 00H O valor depende do endereço INICIO em relação à instrução
0100H E5H Opcode de
MOV A, 45H
2
0101H 45H 45H
0102H 78H Opcode de
MOV R0, #5AH
2
0103H 5AH Valor do 2º byte da instruçao
0104H 28H Opcode de ADD A,RO 1
0105H 90H Opcode do MOV DPTR, #1000H 3
0106H 00H 00H
0107H 10H 10H
0108H F0H Opcode de MOVX @DPTR,A 1
0109H 80H Opcode do SJMP $ 2
010AH FEH Endereço relativo desta posição até opcode SJUMP
Lista 11. 16.2 Qual o conteúdo da memória principal após a execução programa (memória de 
programa )?
Figura 2
47
Lista 11. 16.3 Qual o conteúdo da RAM interna após execução deste programa ?
16.4 Ao final da execução do programa qual o valor da posição 1000H da 
RAM externa?
16.3 Resp: A = 74H, DPL = 00H, DPH= 10H, R0 = 5AH 
conteúdo da posição 45H = 1AH e SP= 07H
16.4 Resp: o conteúdo da posição 1000H da RAM externa é 
74H
RAM interna SFRs
48
Como funciona a instrução SJUMP $ ou SJUMP end rel 8?
aqui: Sjump aqui = sjump $; salta para o endereço onde 
; está o OPCODE da SJUMP
Como fica na memória de programa?
Endereço Conteúdo Significado (comentários)
0105H 90H Opcode do MOV DPTR, #1000H
0106H 10H MSB do endereço 1000H
0107H 00H LSB do endereço 1000H
0108H F0H Opcode de MOVX @DPTR,A
0109H 80H Opcode do SJMP $
010AH FEH Endereço relativo desta posição até opcode SJUMP
Analisando parte 
do programa anterior:
.
.
.
MOV DPTR, #1000H
MOVX @DPTR,A
SJUMP $
END
49
Como funciona a instrução SJUMP end rel 8 ?
Como é calculado o valor FEH que fica na memória de programa?
Ender
eço
Conteú
do
Posição relativa ao 
endereço 010AH
0105H 90H FAH
0106H 10H FBH
0107H 00H FCH
0108H F0H FDH
0109H 80H FEH
010AH FEH Posição considerada FFH
Analisando parte 
do programa 
anterior:
.
.
.
MOV DPTR, #1000H
MOVX @DPTR,A
SJUMP $
END
O valor FEH é o endereço para o qual o PC vai saltar, que é calculado pelo compilador. 
Neste caso é o endereço do OPCODE da instrução SJUMP. O compilador considera que 
essa posição onde está FEH é a posição referência na qual o salto será 
calculado´.Portanto, esta posição é considerada posição FFH, como irá saltar para uma 
anterior onde está o opcode do SJUMP o valor do endereço relativo seria FEH e se fosse 
saltar para a instrução MOVX @DPTR,A, então seria FDH
Analisando parte 
do programa anterior:
.
.
.
MOV DPTR, #1000H
MOVX @DPTR,A
aqui: SJUMP aqui
END
Saltos incondicionais do 8051
50
Existem quatro tipos no 8051:
• SJUMP rótulo : Desvio curto relativo. Usa um offset de oito bits, podendo ser 
negativo ou positivo, ou seja o endereço de desvio pode ser de até 128 bytes a 
menos ou 127 bytes a mais, respectivamente, em relação à posição atual da 
memória. 
• O formato da instrução é: opcode Offset relativo Exemplo: SJMP 00h; ;desvia 
para a próxima instrução (offset = 0) NEXT: SJMP 0FEH; ;retorna para a instrução 
anterior (offset = -1) 
• SJUMP 
• AJUMP
• LJUMP
• JUMP @A+DPTR
Saltos incondicionais do 8051
51
• SJUMP end rel: Desvio curto relativo. Usa um offset de oito bits, podendo ser 
negativo ou positivo, ou seja o endereço de desvio pode ser de até 128 bytes a 
menos ou 127 bytes a mais, respectivamente, em relação à posição atual da 
memória; 
É uma instrução de 2 bytes, o primeiro byte é o OPCODE e o segundo byte é o 
endereço da localidade de memória (00H a FFH). ;
Exemplos: 
SJMP 00h ;desvia para a próxima instrução (offset = 0) 
aqui: SJMP FEH ;retorna para a instrução anterior (offset = -1) 
Ou
aqui: SJMP aqui ;retorna para a instrução anterior (offset = -1) 
Saltos incondicionais do 8051
52
• AJUMP end rel: Desvio Absoluto. Esta instrução desvia o fluxo do programa para 
outro endereço numa faixa de 2Kbytes referentes à atual posição da memória 
de programa. Dependendo do salto que será dado o valor do OPCODE muda:
OPCODE Instrução
01H AJUMP Pagina +00XX Salto até 255 posições
21H AJUMP Pagina +01XX Salta de 256 a 511 posições
41H AJUMP Pagina +02XX Salta de 511 a 766 posições
61H AJUMP Pagina +03XX Salta de 767 a 1023 posições
81H AJUMP Pagina +04XX Salta de 1024 a 1278 posições
A1H AJUMP Pagina +05XX Salta de 1279 a 1534 posições
C1H AJUMP Pagina +06XX Salta de 1525 a 1790 posições
E1H AJUMP Pagina +07XX Salta de 1791 até 2k posições
Exemplo:
AJMP pula ;desvia para a instrução que tem o rótulo pula 
MOV A, #01H; 
pula: MOV A, #020H;
Saltos incondicionais do 8051
53
• LJUMP end 16bits:Esta é a instrução de desvio longo que usa endereços de 16 bits 
como parte da instrução. Possibilita acessar qualquer localização no espaço de 64Kb de 
memória de programa. 
é uma instrução de 3 bytes, o primeiro é o OPCODE o segundo é o 8 bits mais 
significativos do endereço de salto e o 3º byte contém os 8 bits menos significativos do 
endereço de salto
Exemplo: 
ORG 1000H 
temp: LJMP rotulo
CLR A;
Rotulo: LJMP temp
Endereço 
EEPROM
conteúdo comentários
1000H 02H Salta para o endereço que estão nos 2 bytes 
seguintes a esta instrução (rotulo)
1001H 04H Byte mais significativo do endereço do salto 1004H
1002H 10H Byte menos significativo do endereço do salto 1004H
1003H E4H CLR A ( instrução de 1 byte)
1004H 02H Salta para o endereço que estão nos 2 bytes 
seguintes a esta instrução (temp)
1005H 10H Byte mais significativo do endereço do salto 1000H
1006H 00H Byte menos significativo do endereço do salto 1000H
Saltos incondicionais do 8051
54
• JMP @A+DPTR : O conteúdo do PC é armazenado com o valor 
da soma dos conteúdos dos registradores DPTR e 
acumulador, prosseguindo portanto a execução do 
programa a partir deste ponto
Saltos condicionais do 8051
Instruções Ação Nº de 
bytes
JZ Salta se A = 0 2
JNZ Salta se A ≠0 2
DJNZ Decrementa e Salta se A ≠0 3
CJNE A,byte Salta se A ≠ byte 3
CJNE reg,#dado Salta se byte ≠ #dado 3
JC Salta se CY = 1 2
JNC Salta se CY = 0 2
JB Salta se bit = 1 3
JNB Salta se bit = 0 3
JBC Salta se bit = 1 e reseta o bit (clear bit) 3
55
Saltos condicionais do 8051
56
• Exemplo: Escrever um programa para determinar se R5 contém o valor 0. Se 
for verdadeiro, armazene 55H, se for falso finalize o programa.
ORG 0000H
MOV A, R5 ; copia R5 para A
JNZ SALTO ; salta se A não é zero (A ≠0) 
MOV R5, #55H 
SALTO: SJMP SALTO
END
Endereço 
da EEPROM
Conteúdo significado
0000H EDH Opcode de MOV A,R5 (1 byte) copia o valor de R5 
para A
0001H 70H Opcode de JNZ salto (2 Bytes)
0002H
0003H 7DH Opcode de MOV R5, #55H (2 bytes)
0004H 55H Valor do segundo byte da instrução MOV R5, #55H
0005H 80H Opcode do SJMP salto (2 bytes)
0006H FEH Endereço relativo do salto
Exercício Resolvido Aplicações de microcontroladores:
Prentice Hall Microcontroladores 8051 57
Programa Fonte:
58
Exercício Resolvido Aplicações de microcontroladores:
59
Exercício Resolvido Aplicações de microcontroladores:
60
17. Baseado na estrutura do processador 8051, onde o fluxograma e o assembly do 
programa que será executado, é mostrado na Figura 3, o qual executa a soma do valor 
1Ah com o valor 7Fh e o resultado é armazenado na posição 6Dh da RAM interna. 
Responda as questões abaixo, lembrando que:
• AC: acumulador de 8 bits;
• DPTR de 16 bits;
• Ocorre um reset na CPU após a energização do microcontrolador;
17.1 Qual o conteúdo da memória principal para esse programa (memória de 
programa)?
17.2 Qual o conteúdo da RAM interna para esse programa ?
17.3 Qual o valor do PC (Counter Program) quando a instrução ADD A,@R0 está 
sendo executada?
Lista 11.
61
FIM

Mais conteúdos dessa disciplina