Você está na página 1de 42

1

1 UNIVERSIDADE FEDERAL DE GOIÁS ESCOLA DE ENGENHARIA ELÉTRICA MICROCONTROLADOR 8051 Notas de Aula Prof. José

UNIVERSIDADE FEDERAL DE GOIÁS

ESCOLA DE ENGENHARIA ELÉTRICA

MICROCONTROLADOR 8051

Notas de Aula

Prof. José Wilson Lima Nerys

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

1

ESTRUTURA DO MICROCONTROLADOR 8051

2

1.1 Microcontrolador × Microprocessador

Microcontrolador

Microprocessador (CPU)

ROM Contador de Programa (PC) Acumulador A ou ACC Outros Registradores RAM Registrador de Unidade
ROM
Contador de Programa (PC)
Acumulador
A ou ACC
Outros Registradores
RAM
Registrador de
Unidade de
Serial
Instruções (IR)
Decodificação de
Instruções
Timers
(Temporizadores)
Unidade Lógica e Aritmética (ALU)
Unidade de Controle
Portas de Entrada
e Saída (I/O)

Em termos de hardware, o esquema acima deixa claro onde acaba o microprocessador e quais as unidades adicionais presentes num microcontrolador. Assim, enquanto o microprocessador é mais freqüentemente usado no processamento de informações em computadores, onde são complementados com os drivers e periféricos que compõem o sistema, um microcontrolador é mais adequado para sistemas de controle, onde deseja-se um sistema com um mínimo de componentes periféricos e um programa gravado em ROM.

Quanto à linguagem assembly do 8051, a título de ilustração e comparação superficial (nesse momento), um mesmo problema é resolvido a seguir usando a linguagem assembly do 8085 e a linguagem assembly do 8051.

Problema:

Faça um programa onde dois pinos de uma porta de entrada pré-definida sejam usados para definir o sentido de rotação de LEDs conectados a uma porta de saída. Quando o pino 7 da porta de entrada estiver em nível alto os LEDs devem girar para a direita; quando o pino 3 estiver em nível alto os LEDs devem girar para a esquerda e quando ambas estiverem em nível alto todos os LEDs devem ligar e desligar, alternadamente.

Soluções:

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

3

(a)

(b)

Fluxograma mais adequado para o 8085

Início
Início
Configurações iniciais:

Configurações iniciais:

SP = 20C0h Habilita saída no LED B 01 h, C 00 h

SP = 20C0h Habilita saída no LED B ← 01 h, C ← 00 h
Configurações iniciais: SP = 20C0h Habilita saída no LED B ← 01 h, C ← 00
Configurações iniciais: SP = 20C0h Habilita saída no LED B ← 01 h, C ← 00
Ler chaves A ← C S OUT Porta Ch7 e Ch3 ligadas? Complementa A C
Ler chaves
A
← C
S
OUT Porta
Ch7 e Ch3
ligadas?
Complementa A
C
← A
N
N
Ch7
ligada?
N
S
Ch3
ligada?
A
← B
OUT Porta
S
Direita
A
← B
B
← A
OUT Porta
Esquerda
B
← A

Fluxograma mais adequado para o 8051

Início
Início
Configurações iniciais:

Configurações iniciais:

SP = 3F h R0 01 h R1 00 h

SP = 3F h R0 ← 01 h R1 ← 00 h
Configurações iniciais: SP = 3F h R0 ← 01 h R1 ← 00 h
Configurações iniciais: SP = 3F h R0 ← 01 h R1 ← 00 h
N N Ch3 ligada? S A ← R0 OUT Porta Esquerda R0 ← A
N
N
Ch3
ligada?
S
A ← R0
OUT Porta
Esquerda
R0 ← A
Ch7 S S

Ch7

S

Ch7 S S

S

Ch7 S S
Ch7 S S
ligada?
ligada?

A R1 OUT Porta Complementa A R1 A

Ch3 ligada? N
Ch3
ligada?
N

A R0 OUT Porta Direita R0 A

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

4

(b) Programa usando o assembly do 8085 (para o ABACUS) e o assembly do 8051. A subrotina de atraso não foi incluída.

Obs.: Para o 8051 as chaves estão conectadas à porta P1 (Ch7 = P1.7 e Ch3 = P1.3) e os LEDs à porta P2.

Label

 

Mnemônico 8085

Label

Mnemônico 8051

 

LXI

SP,20C0 h

 

$MOD51

 

MVI

A,02 h

 

ORG 00 H

 

OUT

20 h

 

LJMP INICIO

 

MVI

B,01h

   
 

MVI

C,00 h

INICIO:

ORG 50 H

     

MOV SP,#3F H

Lê chaves:

IN 21 h

 

MOV R0,#01 H

 

ANI

88 h

 

MOV R1,#00 H

 

CPI

88 h

   
 

JNZ

testa Ch7

REPETE:

JNB P1.7, PULA2

 

MOV A,C

 

JNB P1.3, PULA

 

OUT

22 h

 

MOV A,R1

 

CMA

 

MOV P2,A

 

MOV C,A

 

CPL A

 

JMP

Lê chaves

 

MOV R1,A

     

SJMP REPETE

testa Ch7:

CPI

80 h

   
 

JNZ

testa Ch3

PULA:

MOV A,R0

 

MOV A,B

 

MOV P2,A

 

RRC

 

RRC

 

OUT

22 h

 

MOV R0,A

 

MOV B,A

 

SJMP REPETE

 

JMP

Lê chaves

   
   

PULA2:

JNB P1.3, REPETE

testa Ch3:

CPI

08 h

 

MOV A,R0

 

JNZ

Lê chaves

 

MOV P2,A

 

MOV A,B

 

RLC

 

RLC

 

MOV R0,A

 

OUT

22 h

 

LJMP REPETE

 

MOV B,A

   
 

JMP

Lê chaves

 

END

1.2 Diagrama de Blocos

A figura 1 mostra o diagrama de blocos do Microcontrolador 8051, com memória ROM de 4 kbytes, memória RAM de 128 bytes, 2 temporizadores/contadores de 16 bits, 1 porta de comunicação serial, 4 portas paralelas (de entrada e saída) de 8 bits e 2 fontes de interrupção externas. A porta P0 é a única porta com coletor aberto. Isso significa que um resistor pull-up é necessário para a utilização dessa porta.

COMPONENTES DA FAMÍLIA 8051

 

ROM

RAM

Versão sem

Versão com

Versão com

CI

Interna

Interna

ROM

EPROM

Memória

Interna

Interna

Flash

8051 4k

 

128

8031 8751

 

8951

8052 8k

 

256

 

8032 8752

8952

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

5

5 Diagrama de Blocos do Microcontrolador 8051 1.3 Pinagem do 8051 A figura 2 mostra os

Diagrama de Blocos do Microcontrolador 8051

1.3 Pinagem do 8051

A figura 2 mostra os pinos do 8051 no encapsulamento DIP com 40 pinos. As portas paralelas são designadas por P0 (bits P0.0, P0.1, …, P0.7), P1 (bits P1.0, P1.1, … P1.7), P2 (P2.0, P2.1, …, P2.7) e P3 (P3.0, P3.1, … , P3.7). Destaca-se, na figura, os pinos da porta paralela P3, porque eles tem dupla função.

pinos da porta paralela P3, porque eles tem dupla função. Pinagem do Microcontrolador 8051 no encapsulamento

Pinagem do Microcontrolador 8051 no encapsulamento DIP 40

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

6

Funções especiais dos pinos da porta P3:

P3.0

RxD - Entrada serial

P3.1

TxD - Saída Serial

P3.2

INTO\ - Interrupção externa 0

P3.3

INT1\ - Interrupção externa 1

P3.4

T0

- Entrada externa para o Temporizador/Contador 0

P3.5

T1

- Entrada externa para o Temporizador/Contador 1

P3.6

WR\

- Strobe (sinalizador) de escrita na memória de dados externa

P3.7

RD\

- Strobe (sinalizador) de leitura da memória de dados externa

1.4 Organização das Memórias ROM e RAM do 8051

FFFF h FFFF h Sinal Sinal PSEN\ PSEN\ ROM externa ROM 1000 h EXTERNA 0FFF
FFFF h
FFFF h
Sinal
Sinal
PSEN\
PSEN\
ROM
externa
ROM
1000 h
EXTERNA
0FFF h
ou
ROM
INTERNA
Pino EA\ = 1
Pino EA\ = 0
0000 h
0000 h
Memórias ROM interna e externa
Pino PSEN\ = 1 - Habilita leitura da memória ROM interna
Pino PSEN\ = 0 - Habilita leitura da memória ROM externa
Pino EA\ = 1 - Seleciona a memória ROM interna
Pino EA\ = 0 - Seleciona a memória ROM externa
FF h
FF h
FFFF h
8031/8051/8751
Somente
8032/8052/8752
Enderaçamento
Somente
Direto
Enderaçamento
Indireto
Registros de
Funções
Especiais
RAM
80 h
80 h
EXTERNA
7F h
8031/8051/8751
8032/8052/8752
Enderaçamento
Direto e Indireto
00 h
0000 h
(a)
(b)

Memórias RAM (a) interna e (b) externa

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

7

RAM INTERNA (De 00h a 7F h)

byte 35h

7 RAM INTERNA (De 00h a 7F h) byte 35h 80 bytes 16 bytes 32 bytes

80

bytes

16

bytes

32

bytes

Subdivisão da Memória RAM interna

1.5 Noções de Endereçamento Direto e Indireto

Exemplos de Endereçamento Direto:

MOV A,35h

- carrega acumulador com conteúdo da posição de memória interna 35h

MOV A,#35h - carrega acumulador com valor hexadecimal 35h

MOV A,#35

- carrega acumulador com valor decimal 35, que corresponde ao valor hexadecimal 23.

MOV A,#00110101b - carrega acumulador com valor hexadecimal 35h

Exemplos de endereçamento indireto:

MOV R0,#35h - carrega registrador R0 com valor hex 35h MOV A,@R0 - carrega acumulador com conteúdo da posição de memória cujo endereço está em R0, ou seja, end. 35h.

Somente R0 e R1 de cada banco de registradores podem ser usados para endereçamento indireto

MOV R0,#20h - carrega registrador R0 com valor hex 20h MOVX @R0,A - copia conteúdo do acumulador no endereço 20h da RAM externa

Obs: A RAM externa é sempre acessada através de endereçamento indireto.

MOV é usado para a RAM interna, enquanto que MOVX é usado para a RAM externa

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

8

1.6 Banco de Registradores

A parte mais baixa da memória RAM constitui o Banco de Registradores, que está melhor detalhado na tabela a seguir. Os bits RS1 e RS0 do registrador PSW definem que Banco será usado a partir do comando que limpa ou seta RS1 e RS0. Não havendo nenhum comando especial, o Banco 0 é usado.

 

Bits do Reg. PSW RS1 RS0

Posição de

Nome do

Banco

Memória (hexa)

Registrador

   

1F

R7

1E

R6

1D

R5

3

1

1

1C

R4

 

1B

R3

1A

R2

19

R1

18

R0

   

17

R7

16

R6

15

R5

2

1

0

14

R4

 

13

R3

12

R2

11

R1

10

R0

   

0F

R7

0E

R6

0D

R5

1

0

1

0C

R4

 

0B

R3

0A

R2

09

R1

08

R0

   

07

R7

06

R6

05

R5

0

0

0

04

R4

 

03

R3

02

R2

01

R1

00

R0

Bancos de registradores (Memória RAM)

Registro Especial PSW (Program Status Word) - Endereçável por bit

CY AC FD RS1 RS0 0V P bit 4 bit 3 Carry Overflow Paridade Uso
CY
AC
FD
RS1
RS0
0V
P
bit 4
bit 3
Carry
Overflow
Paridade
Uso Geral
RS1
RS0
Banco Selecionado
Auxiliar de
0
0
0
Carry
0
1
1
1
0
2
1
1
3

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

9

O registrador (PSW) é endereçável por bit e, além de guardar as flags de carry, auxiliar de carry, de paridade, de overflow e uma flag de uso geral , ele contém o par de bits (RS1 e RS2) usados para selecionar o banco de registradores a ser utilizado.

Exemplos:

MOV PSW,#10h - seleciona o Banco 2, cujos registradores vão do endereço 10h a 17h. MOV A,R5 - carrega acumulador com conteúdo de R5 do banco de registradores 2 (endereço 15h) MOV R7,B - copia conteúdo do registrador B no registrador R7 (endereço 17h) do Banco 2. MOV A,@R1 - carrega acumulador com conteúdo do endereço apontador pelo registrador R1 do banco 2.

1.7 Região de Endereçamento por Bit e por Byte

Dentro da memória RAM e acima do banco de registradores, tem um região composta por 128 bits que podem ser usados individualmente, ou através de seus 16 bytes correspondentes. Essa região vai do byte 20h ao byte 2Fh.

Os bytes dessa região são: 20h, 21h, 22h, 23h, … 2Fh Os endereços dos bits são: 00h, 01h, 02h, … 7Fh

Os bits podem ainda ser referenciados pela posição dele em cada byte:

Bit 00h 20.0h;

bit 01h 20.1h

bit 07h 20.7h

Bit 08h 21.0h;

bit 09h 21.1h

bit 0Fh 21.7h

Bit 10h 22.0h;

bit 11h 22.1h

bit 17h 22.7h

 

bit 7Fh 2F.7h

MOV C,21.1h = MOV C,09h - carrega flag de transposrte (carry) com o conteúdo binário do bit 09h, que é o bit 1 do byte 21h. O registrador C já indica operação com bit, pois é a flag de carry.

C já indica operação com bit, pois é a flag de carry. Bits endereçáveis na RAM

Bits endereçáveis na RAM interna

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

10

1.8 Registros de Funções Especiais

A tabela a seguir mostra os registros de funções especiais. Alguns são enderaçáveis apenas por

byte e outros (os terminados em 0 e 8) são enderaçáveis por byte e por bit.

em 0 e 8 ) são enderaçáveis por byte e por bit. Os registros especiais ocupam

Os registros especiais ocupam os endereços de 80h a FFh, que coincide com os 128 bytes superiores da RAM interna do 8032, 8052 e 8752.

A diferença entre o acesso aos Registros especiais e a parte superior da RAM interna é o tipo de

endereçamento. Os registros especiais são acessados sempre por endereçamento direto, enquanto a parte superior da RAM interna é acessada somente por endereçamento indireto.

Exemplos:

MOV A,80h - carrega o acumulador com o conteúdo do registro especial 80h (Porta P0)

MOV RO,#80h

MOV A,@RO

MOV RO,#80h MOV A,@RO carrega acumulador com o conteúdo da posição de memória RAM apontada por

carrega acumulador com o conteúdo da posição de

memória RAM apontada por R0, ou seja, 80h

Endereços das portas:

Porta P0: 80h Porta P1: 90h Porta P2: A0h Porta P3: B0h

Endereço do acumulador (que também pode ser denominado de “a”, “A” ou ACC): E0h

Endereço do registrador B: F0h

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

11

11 Apontador de Pilha (Stack Pointer): SP: 81h - Como valor “ default ”, SP aponta

Apontador de Pilha (Stack Pointer): SP: 81h - Como valor “default”, SP aponta para o endereço hexadecimal 07h da memória RAM interna. Ao contrário do Microprocessador 8085, o endereço do apontador de pilha é incrementado a cada endereço guardado na pilha e o byte menos significativo é guardado primeiro.

Palavra de Status de Programa: PSW: D0h - Contém as flags do 8051 e os bits de escolha do banco de registradores.

Registradores DPH : 83h e DPL : 82h - Equivalem aos registradores H e L 8085, que juntos formam o par HL. No 8051 eles formam o registrador de 16 bits DPTR, usado principalmente no manuseio de tabelas.

Temporizadores/Contadores:

TH1 : 8Dh

Registros

de

dados

do

TH0 : 8Ch

Registros

de

dados

do

TL1 : 8Bh

temporizador 1

 

TL0 : 8Ah

temporizador 0

 

TCON : 88h

Registro

de

controle

dos

TMOD : 89h

Registro do modo de operação dos temporizadores

temporizadores

Porta Serial: SCON : 98h - Registro de controle da porta serial SBUF : 99h - Registro dos dados transmitidos e recebidos pela porta serial

Interrupções: IE : A8h - Registro para habilitação/desabilitação das interrupções IP : B8h - Registro para definir a prioridade das interrupções

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

2

RESET, CLOCK E CICLO DE MÁQUINA DO 8051

12

A colocação de um capacitor de 10µF em série com um resistor de 8,2kconectados ao pino

9 do 8051, conforme mostra a figura, garante que o pino 9 fique em nível lógico alto por pelo menos 2 ciclos de máquina (24 períodos do oscilador) na energização do sistema. Com isso, os registradores assumem os valores mostrados na tabela a seguir, e o 8051 está pronto para iniciar o processamento. O

botão em paralelo com o capacitor é usado para o Reset forçado.

5V 8051 10µF Pino 9 8,2 kΩ
5V
8051
10µF
Pino 9
8,2 kΩ

Circuito de Reset do 8051.

Obs.: Caso o Microcontrolador seja o 80C51, não é necessário o resistor de 8,2 k, por já existir um resistor interno.

Valores dos registradores especiais após o Reset

Registro

Valor

Registro

Valor

PC

0000h

TCON

00h

A

00h

TH0

00h

B

00h

TL0

00h

PSW

00h

TH1

00h

SP

07h

TL1

00h

DPTR

0000h

SCON

00h

P0 - P3

FFh

SBUF

Indeterminado

IP

xxx00000b

PCON(NMOS)

0xxxxxxxb

IE

0xx00000b

PCON(CMOS)

0xxx0000b

TMOD

00h

   

A figura abaixo ilustra a conexão do oscilador (cristal) que definirá a freqüência de clock do

microcontrolador e o ciclo de máquina. A freqüência de oscilação do cristal deve estar na faixa de 3.5

MHz a 12 MHz. Os valores recomendados para os capacitores no caso de oscilador a cristal são entre 20 µF e 40 µF.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

13

Pino XTAL1 - pino 19 12MHz Pino XTAL2 - pino 18 22pF 22pF
Pino XTAL1 - pino 19
12MHz
Pino XTAL2 - pino 18
22pF
22pF

Conexão do cristal oscilador

Um ciclo de máquina corresponde a uma seqüência de 6 estados (S1 a S6), cada um equivalente a 2 períodos do oscilador ( 1 ciclo de máquina = 12 períodos do oscilador). Se o oscilador (cristal) for de 12 MHz, 1 ciclo de clock corresponde a

T

clock

=

1

1

=

f

clock

12

MHz

E o ciclo de máquina é:

T (ciclo de máquina) = 12*T (clock) = 1 µs

S1 S2 S3 S4 S5 S6
S1
S2
S3
S4
S5
S6

Ciclo de máquina

Cada instrução é executada em pelo menos 1 ciclo de máquina. Isso significa que, com um cristal de 12 MHz, o tempo mínimo de execução de qualquer instrução do 8051 é 1 µs. Por exemplo, a instrução MOV é executada em 1 ciclo de máquina e, portanto, 1 µs. A instrução DJNZ é executada em 2 ciclos de máquina e, portanto, 2 µs.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

3

CONJUNTO DE INSTRUÇÕES DO 8051

14

Instruções do 8051 e modos de endereçamento

Classificação das Instruções

Tipo de Instrução e Endereçamento

Exemplo

Instruções de Transferência de dados

Endereçamento Imediato

MOV A,#05H

Endereçamento direto

MOV A,15H

Endereçamento por Registrador

MOV A,R1

Endereçamento Específico a Registrador

RL A

Endereçamento Indireto por Registrador

MOV R0,#20H

MOV @R0,#55H

Endereçamento Indexado por Registrador

MOV DPTR,#200H MOVC A,@A+DPTR

Transferência orientada pelo Apontador de Pilha

MOV A,#45

PUSH ACC

 

POP B

Instruções de Troca

XCH A,B

Transferência de dados orientada por Bit

MOV P1.1,C

Instruções de Processamento de Dados

Instruções Aritméticas

ADD A,R1

Instruções Lógicas

ANL A,BYTE

Instruções de Controle de Fluxo de Programa

Desvio Incondicional

SJMP desvio

Desvio Condicional

JNZ desvio

 

Chamadas de Subrotina

LCALL subrotina

INSTRUÇÕES DE TRANSFERÊNCIA DE DADOS

1. Endereçamento Imediato: Um valor constante é diretamente transferido para o registrador indicado.

2. Endereçamento Direto: Nesse modo os registradores internos e os registradores especiais são referidos pelos seus endereços hexadecimais.

3. Endereçamento por Registrador: Endereçamento que envolve um ou mais dos oito registradores R0 a R7 (bancos 0 a 3).

4. Endereçamento

o

registrador está implícito no código operacional (opcode), não havendo necessidade de especificar endereço. Normalmente é constituída de apenas 1 opcode.

Específico

a

Registrador

(Registrador

Implícito):

São

instruções

em que

5. Endereçamento Indireto por Registrador: Os registradores R0 e R1 (do banco de registradores que estiver ativo) são usados para endereçamento indireto.

6. Endereçamento Indireto por Registrador: Os registradores R0 e R1 (do banco de registradores que estiver ativo) são usados para endereçamento indireto.

7. Endereçamento Indexado por Registrador: É usada principalmente para a leitura de dados de uma tabela. Neste modo, a fonte ou o destino podem ser obtidos pela adição do valor armazenado no acumulador com um endereço base. Pode ser usado tanto o apontador de dados DPTR quanto o contador de programa PC.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

15

8. Transferência orientada pelo Apontador de Pilha: É uma outra forma de endereçamento indireto, implementada usando as instruções PUSH e POP. O conteúdo de SP é o endereço de destino da instrução PUSH e endereço fonte da instrução POP. O valor de SP é incrementado antes da transferência de dados feita por PUSH, e decrementado após a instrução POP. Os valores típicos de SP vão de 2Fh a 6Fh na inicialização do programa. O byte de endereço 2Fh é o último do grupo de bytes que são endereçados por bit e por byte.

9. Instruções de Troca: Os conteúdos do acumulador e de registradores podem ser trocados sem a necessidade de armazenagem intermediária. Há duas instruções de troca no 8051: XCH - troca entre o byte o acumulador e a de um dos registradores do banco selecionado. XCHD - troca entre nibbles do acumulador e um dos registradores.

10.Transferência de dados orientada por Bit: Vários registradores do 8051 permitem o acesso direto a cada um dos oito bits. Os registradores que são endereçáveis por bit e por byte vão do endereço 20h ao endereço 2Fh da RAM interna e os registradores especiais cujos bytes de endereços terminam com 0 ou 8h. Nas operações com bits a flag de transporte faz o papel do acumulador.

INSTRUÇÕES DE PROCESSAMENTO DE DADOS

1.

Instruções Aritméticas: São as instruções de adição e subtração, dentre outras. Elas afetam as flags. A tabela abaixo mostra a lista das instruções aritméticas do microcontrolador 8051. A flag de transporte C é setada se o resultado da operação exceder FFh. A flag auxiliar de transporte AC é setada se houver transporte do bit 3 para o bit 4, ou seja, do nibble inferior para o nibble superior. A flag de estouro (overflow) é setada se houver transporte do bit 6 para o bit 7, mas não ocorrer do bit 7, ou se houver transporte do bit 7, mas não ocorrer transporte do bit 6 para o bit 7. É útil nas operações com números com sinal representados na forma de complemento de

2.

2.

Instruções Lógicas: A tabela a seguir mostra as instruções dessa categoria. Estão incluídas instruções de rotação, complemento, zerar e outras. Elas não afetam as flags.

INSTRUÇÕES DE CONTROLE DE FLUXO DE PROGRAMA

São instruções que permitem ao microcontrolador tomar diferentes ações durante o processamento. Elas são divididas aqui em três grupos: Instruções de Desvio Incondicional, Desvio Condicional, Chamadas de Subrotina.

ALGUMAS INSTRUÇÕES COMENTADAS

Instrução

Descrição

mov a,#dado

Carrega no acumulador o valor de “dado”. O símbolo “#” é necessário para diferencia dado de registrador.

mov a,reg

Copia no acumulador o conteúdo do registrador “reg”. reg = R0, R1,

, R7.

mov reg1,reg2

Copia no registrador “reg1” o conteúdo do registrador reg2.

mov a,15h

Copia no acumulador o conteúdo do registrador cujo endereço é 15h, ou seja, corresponde ao registrador R5 do banco 2 de registradores.

mov R0,#20h

Carrega registrador R0 com valor 20h

mov @R0,#55h

Copia o valor 55h na posição apontada pelo registrador R0. Se R0 = 20h, então copia valor 55h na posição 20h, ou seja, na primeira posição acima do banco de registradores.

mov dptr,#200h

Carrega registrador de 16 bits “dptr” com valor 200h.

movc a,@a+dptr

Carrega acumulador com o conteúdo da posição apontada por “a+dptr”

rl a

Rotaciona o conteúdo do acumulador para a esquerda (rotate left)

rr a

Rotaciona o conteúdo do acumulador para a direita (rotate right)

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

16

add A,R1

Adiciona o conteúdo de R1 ao conteúdo do acumulador: A = A + R1

subb a,byte

Subtrai o conteúdo do acumulador do “byte”. A = A - byte

inc reg

Incrementa conteúdo do registrador “reg”.

dec reg

Decrementa conteúdo do registrador “reg”.

anl A,BYTE

Faz uma operação AND entre acumulador e BYTE. A = A (AND) BYTE

orl A,byte

Faz uma operação OR entre o acumulador e byte. A = A (OR) byte

sjmp desvio

Desvio curto (short jump) relativo. Pula até 127 bytes para a frente e 128 para trás

ajmp desvio

Instrução de desvio para distâncias correspondentes a até 2048 bytes. (endereço de 11 bits).

ljmp desvio

Desvia para qualquer posição da memória de programa. Endereço de 16 bits.

jnz desvio

Instrução de desvio condicional: (Jump if Not Zero). Vai para “desvio” se a operação anterior não for zero.

lcall subrotina

Chamada de subrotina. Retorna para a posição seguinte quando encontra “ret”.

djnz reg,desvio

Decrementa registrador ´reg´ e pula para ´desvio´ se o resultado não for zero. É uma combinação das instruções “DEC” e “JNZ”.

cjne a,#dado,desvio

Compara conteúdo do acumulador com ´dado´ e pula para ´desvio´ se não forem iguais

jb bit,desvio

Desvia para “desvio”, caso o “bit” esteja setado.

jnb bit,desvio

Desvia para “desvio”, caso o “bit” NÃO esteja setado.

jc desvio

Desvia para “desvio”, caso a flag de CARRY esteja setada

jnc desvio

Desvia para “desvio”, caso a flag de CARRY esteja zerada

cpl a

Complementa o conteúdo do acumulador. Se for 1 passa para zero, e vice-versa.

swap a

Faz a troca dos nibbles do acumulador, ou seja, o nibble mais significativo passa a ocupar o quatro primeiros bits do acumulador e o nibble menos significativo passa a ocupar os quatro últimos bits.

da a

Faz o ajuste decimal do acumulador

mul

ab

Multiplica o conteúdo de A pelo conteúdo de B. O resultado está em B A.

div

ab

Divide o conteúdo de A pelo conteúdo de B. A recebe o quociente e B o resto

setb

bit

Seta o “bit”

clr bit

Limpa o “bit”

PLATAFORMA DE SIMULAÇÃO E GRAVAÇÃO

A plataforma utilizada é o programa AsmEditor, cujo ambiente permite:

1. Digitar o mnemônico do programa desejado

2. Compilar o programa desejado usando o compilador ASM51

3. Verificar erros, inclusive com a listagem do programa compilado

4. Simular usando o Simulador AVSIM51

5. Gravar usando uma gravadora e o programa Ez3

6. Gravar usando o programa AEC_ISP, que permite gravar sem a necessidade de retirar o microcontrolador do sistema mínimo.

As figuras a seguir mostram o ambiente da plataforma AsmEditor e a tela principal do simulador AVSIM51.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

17

17 Acumulador A, Flag de Carry C, contador de programa PC e apontador de pilha SP

Acumulador A, Flag de Carry C, contador de programa PC e apontador de pilha SP

Temporizadores 0 e 1

programa PC e apontador de pilha SP Tem p orizadores 0 e 1 M e m

Memória RAM

Interrupções 0 e 1 e porta serial

Portas de saída

A M Interrupções 0 e 1 e porta serial Portas de saída M e m ó

Memória ROM

Registradores R0 a R7, DPTR e B

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

18

EXEMPLOS GERAIS:

Simule cada um dos programas a seguir no modo passo a passo e anote o efeito da instrução. Na execução no modo direto seria necessário incluir uma subrotina de atraso de tempo. Utilize as ferramentas oferecidas no laboratório para verificar na prática os programas a seguir. Não esquecer da subrotina de atraso de tempo.

1. Programa que faz uma contagem hexadecimal crescente ininterrupta de 00 h a FF h.

INÍCIO A ← 00 h P1 ← A A ← A + 1
INÍCIO
A ← 00 h
P1 ← A
A ← A + 1

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

Diretiva para inclusão de arquivo com variáveis pré-definidas

 

org 00h

Diretiva que indica que a próxima instrução estará no ender. 00h

 

ljmp inicio

Pula para o endereço indicado com o rótulo ´inicio´

 

org 30h

Diretiva que indica que a próxima instrução estará no ender. 30h

inicio:

mov a,#00h

Carrega acumulador com valor 00h

volta:

mov P1,a

Transfere para a porta P1 o conteúdo do acumulador

 

inc a

Incrementa o conteúdo do acumulador

 

sjmp volta

Pula para o endereço indicado pelo rótulo ´volta´

 

end

Instrução obrigatória no fim de todo programa

2. Programa que faz uma contagem hexadecimal ininterrupta na seqüência 00 30 h 00 h.

INÍCIO
INÍCIO
A ← 00 h

A 00 h

A ← 00 h
A ← 00 h
P1 ← A A ← A + 1 N A = 30 ? S P1
P1 ← A
A ← A + 1
N
A = 30 ?
S
P1 ← A
A ← A - 1
N
S
A = 00 ?

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

Diretiva para inclusão de arquivo com variáveis pré-definidas

 

org 00h

Diretiva que indica que a próxima instrução estará no endereço 00h

 

ljmp inicio

Pula para o endereço indicado com o rótulo ´inicio´

 

org 30h

Diretiva que indica que a próxima instrução estará no endereço 30h

inicio:

mov a,#00h

Carrega acumulador com valor 00h

volta:

mov P1,a

Transfere para a porta P1 o conteúdo do acumulador

 

inc a

Incrementa o conteúdo do acumulador

 

cjne a,#30h,volta

Compara conteúdo do acumulador com “30h”. Caso não seja igual, “volta”

volta2:

mov P1,a

Transfere para a porta P1 o conteúdo do acumulador

 

djnz acc,volta2

Decrementa conteúdo do acumulador e vai para “volta2” se não for “zero”

 

sjmp volta

Pula para “volta”. Não precisa usar “LJMP” porque a distância é curta.

 

end

Instrução obrigatória no fim de todo programa

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

19

3. Programa que faz uma contagem decimal crescente interrupta de 0 a 59.

INÍCIO A ← 00 h P1 ← A A ← A + 1 Corrige decimal
INÍCIO
A ← 00 h
P1 ← A
A ← A + 1
Corrige decimal
S
N A = 60 ?

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

Diretiva para inclusão de arquivo com variáveis pré-definidas

 

org 00h

Diretiva que indica que a próxima instrução estará no endereço 00h

 

ljmp inicio

Pula para o endereço indicado com o rótulo ´inicio´

 

org 30h

Diretiva que indica que a próxima instrução estará no endereço 30h

inicio:

mov sp,#2Fh

Carrega apontador de pilha “SP” com valor 2Fh

 

mov a,#00h

Carrega acumulador com valor 00h

volta:

mov P1,a

Transfere conteúdo do acumulador para a porta P1

 

add a,#01h

Adiciona 01 ao conteúdo do acumulador

 

da a

Faz o ajuste decimal do conteúdo do acumulador

 

cjne a,#60h,volta

Compara conteúdo do acumulador com 60h. Caso seja diferente, “volta”

 

sjmp inicio

Pula para “inicio”

 

End

Instrução obrigatória no fim de todo programa

Acrescente ao programa acima a subrotina de atraso de tempo dada abaixo. Inclua a chamada de subrotina ´lcall atraso´ logo após a instrução ´mov P1,a´.

Rótulo

Mnemônico

No.

No.

Comentário sobre o Efeito da Operação

ciclos

vezes

atraso:

mov R0,#10

1

1

Carrega R0 com 10 decimal

repete:

mov R1,#100

1

10

Carrega R1 com 100 decimal. Repete instrução 10 vezes.

 

djnz R1,$

2

1000

Decrementa R1 1000 vezes: 10 passagens com 100 decrementos

 

djnz R0,repete

2

10

Decrementa R0 10 vezes

 

ret

2

1

 

Supondo que a freqüência de clock seja 12 MHz e, portanto, o período do ciclo de máquina seja 1 µs, e sabendo que o número de ciclos de máquina para cada instrução é aquele dado na tabela acima, considere o número de vezes que cada instrução é executada e calcule o tempo total de atraso provocado pela subrotina acima.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

20

4. Programa que faz uma contagem decimal decrescente interrupta de 59 a 0. Acrescente a subrotina de atraso dada anteriormente.

Início A ← 60 h A ← A - 1 Corrige decimal P1 ← A
Início
A ← 60 h
A ← A - 1
Corrige decimal
P1 ← A
A = 00 ?

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

Diretiva para inclusão de símbolos usados pelo compilador

 

org 00h

Diretiva que indica que a próxima instrução será alocada no endereço 00h

 

ljmp inicio

Pula para o “início do programa”

 

org 30h

Diretiva que indica que a próxima instrução será alocada no endereço 30h

inicio:

mov sp,#2Fh

Define a pilha na posição 2Fh da memória RAM

 

mov a,#60h

Carrega acumulador com valor 60h

volta:

add a,#99

Aciona 99 ao acumulador

 

da a

Corrige para decimal

 

mov P1,a

Transfere conteúdo do acumulador para a Porta P1

 

cjne a,#00h,volta

Compara conteúdo do acumulador com 00h, se for diferente, pula para “volta”

 

sjmp inicio

Pula (Short Jump) para “inicio”

 

end

 

5. Programa que rotaciona um bit alto na porta P1 para a esquerda e para a direita de forma ininterrupta.

Início
Início
SP ← 2Fh A ← 10000000 b

SP 2Fh A 10000000 b

SP ← 2Fh A ← 10000000 b
SP ← 2Fh A ← 10000000 b
Esquerda P1 ← A Atraso de tempo N A = 80 h ? S Rotaciona
Esquerda
P1 ← A
Atraso de tempo
N
A
= 80 h ?
S
Rotaciona direita
P1 ← A
Atraso de tempo
S
N
A
= 01 h ?

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

21

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

Diretiva para inclusão de símbolos usados pelo compilador

 

org 00h

Diretiva que indica que a próxima instrução será alocada no endereço 00h

 

ljmp inicio

Pula para o “início do programa”

 

org 30h

Diretiva que indica que a próxima instrução será alocada no endereço 30h

inicio:

mov sp,#2Fh

Define a pilha na posição 2Fh da memória RAM

 

mov a,#10000000b

Carrega acumulador com valor binário “10000000b”

volta:

rl a

Rotaciona para a esquerda o conteúdo do acumulador

 

mov P1,a

Transfere para a porta P1 o conteúdo do acumulador

 

lcall atraso

Chama subrotina de atraso de tempo

 

cjne a,#80h,volta

Compara acumulador com “80h”, caso seja diferente, “volta”

volta2:

rr a

Rotaciona para a direita o conteúdo do acumulador

 

mov P1,a

Transfere para a porta P1 o conteúdo do acumulador

 

lcall atraso

Chama subrotina de atraso

 

cjne a,#01h,volta2

Compara acumulador com “01h”, caso não seja igual, “volta2”

 

sjmp volta

Pula para “volta”

 

end

 

6. Programa que lê os valores de uma tabela e mostra na porta P1 o maior desses valores. O maior valor será guardado em R0. O último elemento da tabela é FFh. DPTR aponta o início da tabela.

Início SP ← 2F h, DPTR ← início da tabela, A ← 00, R0 ←
Início
SP ← 2F h, DPTR ← início da tabela,
A ← 00, R0 ← 00h
Guarda contador A
A ← (A + DPTR)
S
A
= FF h ?
N
Mostra R0 em P1
S
A
>= R0 ?
FIM
R0 ← A
N
Retorna contador A
A ← A + 1

Obs.:

(a)

A diretiva “db” indica que o caractere a seguir é um dado e não uma instrução

(b)

A instrução MOV DPTR,#TABELA faz com que o registrador de 16 bits DPTR assuma o valor correspondente ao endereço inicial da tabela.

(c)

Antes de fazer “SUBB A,R0” fez-se necessário guardar em B o valor de A, para o caso de A ser menor que R0. Porque, nesse caso, é preciso trocar o valor de R0 pelo valor de A (que agora está em B).

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

22

Rótulo

 

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

Diretiva para inclusão de símbolos usados pelo compilador

 

org 00h

Diretiva que indica que a próxima instrução será alocada no endereço 00h

 

ljmp inicio

Pula para o “início do programa”

 

org 30h

Diretiva que indica que a próxima instrução será alocada no endereço 30h

inicio:

mov sp,#2Fh

Define a pilha na posição 2Fh da memória RAM

 

mov a,#00h

Carrega acumulador com valor 00h

 

mov R0,#00h

Carrega registrador R0 com valor 00h

 

mov dptr,#tabela

faz DPTR igual ao endereço inicial da tabela, que nesse programa é 100h

volta:

push acc

Guarda na pilha o conteúdo do acumulador

 

movc a,@a+dptr

transfere para o acumulador o conteúdo da posição (a + dptr)

 

cjne a,#0FFh,pula

Compara o conteúdo de “a” com FFh. Se for diferente “pula”

 

mov P1,R0

Transfere para a porta P1 o conteúdo de R0

 

ljmp fim

sjmp não funcionaria aqui porque o “pulo” seria maior que 127 bytes. Observe que a tabela começa na posição 100h e o “fim” é após a tabela.

pula:

mov b,a

guarda em B o conteúdo do acumulador, para recuperá-lo após SUBB A,R0

 

subb a,R0

Faz a subtração: A = A – R0

 

jc pula2

Vai para “pula2” caso a flag de carry esteja setada

 

mov R0,b

Carrega R0 com o conteúdo de b

pula2:

pop acc

Recupera da pilha o conteúdo do acumulador

 

inc a

Incrementa o conteúdo do acumulador

 

sjmp volta

Pula para “volta”

 

org 100h

Diretiva que indica que a tabela de dados começa na posição 100h

tabela:

db

05h

Primeiro valor da tabela de dados

 

db

35h

 
 

db

12h

 
 

db

98h

 
 

db

0A1h

Os dados que começam com “letra” devem ser precedidos de “0”

 

db

0B5h

Os dados que começam com “letra” devem ser precedidos de “0”

 

db

5Ah

 
 

db

09h

 
 

db

72h

 
 

db

40h

Ultimo dado de interesse da tabela

 

db

0FFh

Valor usado para indicar fim da tabela

fim:

nop

 
 

end

 

7. Adapte o programa 6 para mostrar em P1 o menor número contido na tabela.

8. Adapte o programa 6 para mostrar em P1os números ímpares da tabela.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

4

INTERRUPÇÕES

23

Interrupção é o processo pelo qual a execução de um programa é interrompida para a execução de um outro processamento que pode ser solicitado por uma das três fontes abaixo:

Interrupção por software (instrução) Interrupção pedida por periférico externo Interrupção pedida por periférico interno (temporizador/contador, porta serial…)

O microcontrolador 8051 pode ser interrompido de cinco maneiras diferentes:

Pela interrupção externa INTO\ - pino 12 (P3.2)

Pelo timer/counter (temporizador/contador) interno TIMER0

Pela interrupção externa INT1\ - pino 13 (P3.3)

Pelo timer/counter (temporizador/contador) interno TIMER1

Pelo canal de comunicação serial (Pinos 10 e 11 = P3.0 e P3.1)

O pedido de interrupção pode ou não ser atendido, de acordo com a condição de certos registradores. No 8051 os registradores que comandam a interrupção são

Registrador de Habilitação: IE (Interrupt Enable) = Reg. A8h

Registrador de Prioridades: IP (Interrupt Priority) = Reg. B8h

Registrador de Controlador: TCON (Timer Control) = Reg. 88h

Registrador IE:

Bit 7

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

(Reg. A8h)

EA

x

x

ES

ET1

EX1

ET0

EX0

EA (Enable All) - Quando está zerado (EA = 0), todos as interrupções estão desabilitadas (mascaradas), independentemente de seus bits individuais de controle. Quanto está setada (EA = 1), cada uma das interrupções pode ser habilitada ou desabilitada fazendo seus bits de controle 1 ou 0.

EX0 (Enable External Interrupt 0) - Quando está zerado (EX0 = 0) a interrupção externa, cujo pedido vem através do pino INT0\ está desabilitada. Quando está setado (EX0 = 1), a interrupção INT0\ fica habilitada.

ET0 (Enable Timer 0) - Quando ET0 = 0, a interrupção pedida pelo temporizador/contador 0 fica desabilitada. Quando ET0 = 1, a interrupção vinda do temporizador/contador 0 fica habilitada.

EX1 (Enable External Interrupt 1) - Quando está zerado (EX1 = 0) a interrupção externa, cujo pedido vem através do pino INT1\ está desabilitada. Quando está setado (EX1 = 1), a interrupção INT1\ fica habilitada.

ET1 (Enable Timer 1) - Quando ET1 = 0, a interrupção pedida pelo temporizador/contador 1 fica desabilitada. Quando ET1 = 1, a interrupção vinda do temporizador/contador 1 fica habilitada.

ES (Enable Serial) - Quando ES = 0, a interrupção pedida pela porta serial fica dasabilitada. Quando ES = 1 essa interrupção fica habilitada.

Registrador IP:

Bit 4

Bit 3

Bit 2

Bit 1

Bit 0

(Reg. B8h)

x

x

x

PS

PT1

PX1

PT0

PX0

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

24

PX0 (Priority of External Interrupt 0) - Quando PX0 = 1 a interrupção externa INT0\ recebe prioridade alta. PT0 (Priority of Timer/Counter Interrupt 0) - Quando PT0 = 1 a interrupção pedida pelo temporizador/contador 0 recebe prioridade alta. PX1 (Priority of External Interrupt 1) - Quando PX1 = 1 a interrupção externa INT1\ recebe prioridade alta. PT1 (Priority of Timer/Counter Interrupt 1) - Quando PT1 = 1 a interrupção pedida pelo temporizador/contador 1 recebe prioridade alta. PS (Priority of Serial Port Interrupt) - Quando PS = 1 a interrupção pedida através da porta serial recebe prioridade alta.

Quando PX0, PT0, PX1, PT1 e PS são zero, elas são de prioridade baixa. Caso uma interrupção de prioridade 1 seja solicitada durante a execução de uma de prioridade 0, o processamento é interrompido para o atendimento da interrupção de prioridade maior. No caso de todas as interrupções terem a mesma prioridade (0 ou 1), a ordem de atendimento das interrupções é:

Interrupção externa 0

Interrupção externa 0 Maior prioridade

Maior prioridade

Temporizador/contador 0

Interrupção externa 1

Temporizador/contador 1

Canal serial

Canal serial Menor prioridade

Menor prioridade

As interrupções externas podem ser ajustadas para serem detectadas por nível 0 ou pela transição do nível 1 para o nível 0. O ajuste é feito através o registrador TCON, dado abaixo.

Registrador TCON:

Controle do Temporizador

Bit 3

Bit 2

Bit 1

Bit 0

(Reg. 88h)

TF1

TR1

TF0

TR0

IE1

IT1

IE0

IT0

IT0 (Interrupt 0 Type) - Quando IT0 = 1 a interrupção externa 0 será reconhecida pela transição de 1 para 0 no pino INTO\. Quando IT0 = 0, a interrupção é reconhecida quando o sinal no pino INTO\ está em nível baixo (0). IE0 (Interrupt 0 Edge Flag) - É setado pelo hardware quando uma interrupção externa através de INT0\ é detectada. É zerada quando da execução da instrução RETI (retorno da subrotina de atendimento). IT1 (Interrupt 1 Type) - Quando IT1 = 1 a interrupção externa 1 será reconhecida pela transição de 1 para 0 no pino INT1\. Quando IT1 = 0, a interrupção é reconhecida quando o sinal no pino INT1\ está em nível baixo (0). IE1 (Interrupt 1 Edge Flag) - É setado pelo hardware quando uma interrupção externa através de INT1\ é detectada. É zerada quando da execução da instrução RETI (retorno da subrotina de atendimento).

ENDEREÇOS DE DESVIO DAS INTERRUPÇÕES

Quando ocorre uma das cinco interrupções do 8051 o processamento é desviado para os endereços abaixo. Como há pouco espaço em bytes nesses endereços, deve-se usar uma instrução de desvio para um outro endereço onde seja possível escrever toda a rotina de atendimento da interrupção.

Interrupção Solicitada

Endereço de desvio

Reset

0000h

INT0\

0003h

Timer/counter 0

000Bh

INT1\

0013h

Timer/counter 1

001Bh

Canal Serial

0023h

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

25

EXEMPLOS COM INTERRUPÇÃO

1. Programa com interrupção externa 0. Quando a interrupção INT0 é solicitada através do pino P3.2 o processamento é desviado para a posição 03 h da memória ROM e, em seguida, é desviado para uma subrotina que manda uma contagem crescente para a porta P1.

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

 
 

org 00h

 
 

ljmp inicio

 
 

org 03h

Endereço de desvio quando há um pedido da interrupção INT0 (pino P3.2).

 

ljmp atende

Quando há um pedido de interrupção através do pino P3.2, desvia para atende

 

org 30h

 

inicio:

mov sp, #2Fh

 
 

mov ie, #81h

Habilita a interrupção externa 0 (EA = 1 e EX0 = 1)

 

mov tcon, #01h

INT0\ reconhecida pela transição de 1 para 0 (IT0 = 1). Poderia ser SETB IT0

 

mov a, #00h

 
 

cjne a,#01h, $

Aguarda interrupção. Enquanto a 01h, fica aguardando nessa linha.

 

sjmp fim

O caractere “$” indica desvio para a mesma linha.

atende:

mov P1,a

Subrotina de atendimento da interrupção INT0. Faz P1 = a

 

inc a

Incrementa valor de “A”

 

lcall atraso

Chama subrotina de atraso

 

cjne a,#00h,atende

Compara a com 00h. Se for diferente, vai para “atende”

 

mov a,#01h

Quando a = 00h, na linha anterior, então faz A = 01h, nesta linha.

 

reti

Retorna da subrotina de interrupção

atraso:

mov r0,#10

Subrotina de atraso de tempo

repete:

mov r1,#100

 
 

djnz r1, $

Repete a instrução que decrementa r1 até zerar r1

 

djnz r0, repete

 
 

ret

 

fim:

nop

 
 

end

 

Obs.: O pedido de interrupção é atendido quando pino P3.2 do microcontrolador passa de 1 para 0.

2. Programa com as interrupções externas 0 e 1. Neste programa, quando a interrupção INT0 é acionada através do pino P3.2, o processamento é desviado para uma subrotina que faz uma contagem crescente na porta P1. Quando a interrupção INT1 é solicitada através do pino P3.3, uma contagem decrescente é enviada também para a porta P1. Lembrar de guardar o acumulador na pilha em cada atendimento de subrotina, uma vez que ele é utilizado nas duas subrotinas.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

26

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

 
 

org 00h

 
 

ljmp inicio

 
 

org 03h

 
 

ljmp atende0

Desvia para a subrotina de atendimento da interrupção INT0

 

org 13h

 
 

ljmp atende1

Desvia para a subrotina de atendimento da interrupção INT1

 

org 30h

 

inicio:

mov sp, #2Fh

 
 

mov ie, #85h

Habilita interrupções externas 0 e 1 (EA = 1, EX0 = 1 e EX1 = 1)

 

mov tcon, #05h

INT0 e INT1 por transição de 1 para 0 (IT0 = 1 e IT1 = 1).

 

mov a, #00h

 
 

sjmp $

aguarda interrupção num loop infinito nessa linha

atende0:

push acc

Subrotina de atendimento da interrupção 0. Guarda acumulador na pilha

 

mov a,#00h

 

volta:

mov P1,a

 
 

inc a

 
 

lcall atraso

 
 

cjne a,#00h,volta

Compara a com “00h”. Se for diferente “volta”

 

pop acc

Recupera da pilha o conteúdo do acumulador

 

reti

retorna de subrotina de interrupção

atende1:

push acc

Subrotina de atendimento da interrupção 1. Guarda acumulador na pilha

 

mov a,#0FFh

 

volta2:

mov P1,a

 
 

lcall atraso

 
 

dec a

Decrementa conteúdo do acumulador

 

cjne a,#0FFh,volta2

Compara A com “FFh”. Se for diferente “volta2”

 

pop acc

Recupera conteúdo do acumulador que foi guardado na pilha

 

reti

 

atraso:

mov r0,#10

 

repete:

mov r1,#100

 
 

djnz r1, $

 
 

djnz r0, repete

 
 

ret

 
 

end

 

3. Este programa funciona como o anterior, mas ao invés de uma contagem crescente e uma decrescente, ele faz um deslocamento à esquerda dos bits da porta P1 para um pedido de INT0 e um deslocamento à direita dos mesmos bits para um pedido de INT1.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

27

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

 
 

org 00h

 
 

ljmp inicio

 
 

org 03h

 
 

ljmp atende0

Desvia para a subrotina de atendimento da interrupção INT0

 

org 13h

 
 

ljmp atende1

Desvia para a subrotina de atendimento da interrupção INT1

 

org 30h

 

inicio:

mov sp, #2Fh

 
 

mov ie, #85h

Habilita interrupções externas 0 e 1 (EA = 1, EX0 = 1 e EX1 = 1)

 

mov tcon, #05h

INT0 e INT1 por transição de 1 para 0 (IT0 = 1 e IT1 = 1).

 

mov a, #00h

 
 

sjmp $

aguarda interrupção num loop infinito nessa linha

atende0:

push acc

Subrotina de atendimento da interrupção 0. Guarda acumulador na pilha

 

mov a,#01h

 

volta:

mov P1,a

 
 

lcall atraso

 
 

rl a

Rotaciona para a esquerda o conteúdo do acumulador

 

cjne a,#01h,volta

Compara a com “01h”. Se for diferente “volta”

 

pop acc

Recupera da pilha o conteúdo do acumulador

 

reti

retorna de subrotina de interrupção

atende1:

push acc

Subrotina de atendimento da interrupção 1. Guarda acumulador na pilha

 

mov a,#80h

 

volta2:

mov P1,a

 
 

lcall atraso

 
 

rr a

Rotaciona para a direita o conteúdo do acumulador

 

cjne a,#80h,volta2

Compara A com “80h”. Se for diferente “volta2”

 

pop acc

 
 

reti

 

atraso:

mov r0,#10

 

repete:

mov r1,#100

 
 

djnz r1, $

 
 

djnz r0, repete

 
 

ret

 
 

end

 

Obs.:

1. Lembrar que, na simulação, o pedido de interrupção é feito posicionando o cursor nos bits 2 e 3 da

porta P3 e digitando 0 no lugar do 1 presente. As interrupções serão atendidas sempre na transição de

1 para zero, uma vez que tcon = 05h.

2. Durante uma das contagens simule dois pedidos de interrupção simultâneos fazendo a transição de 1

para 0 nos pinos P3.2 e P3.3. Verifique então que a interrupção INT0 será atendida primeira, porque

ela tem prioridade sobre a INT1.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

5

TEMPORIZADORES / CONTADORES

28

O 8051 tem dois temporizadores/contadores de 16 bits que podem trabalhar em 4 modos distintos:

Modo 0:

Contador/Temporizador de 8 bits com divisor de freqüência de até 32 vezes (pode

Modo 1:

contar até 8192 = 32 x 255) Contador/Temporizador de 16 bits (pode contar até 65535)

Modo 2:

2 contadores/temporizadores de 8 bits com recarga automática.

Modo 3:

2 contadores/temporizadores independentes de 8 bits (Modo 3 não vale para Contador/Temporizador 1, que fica inativo)

3 não vale para Contador/T emporizador 1, que fica inativo) Diagrama de blocos simplifi cado do

Diagrama de blocos simplificado do temporizador/contador 0

O diagrama acima auxilia a análise do funcionamento do temporizador/contador. O bit C/T# do registrador TMOD, por exemplo, define se o funcionamento é como contador (C/T# = 1), ou como temporizador (C/T# = 0). Como temporizador, o clock é interno, vindo do oscilador. A freqüência é 1/12 da freqüência do cristal oscilador. Como contador, o clock é externo, vindo através de T0 (P3.4).

O pino Gate# define se o sinal de disparo do contador/temporizador vem através de software (bit

TR0), ou de um sinal externo, através do pino INT0# (P3.2). Se Gate# = 0, o comando setb tr0 dispara o contador/temporizador e clr tr0 interrompe.

Exemplos usando Temporizadores:

Exemplo 1: Subrotina de atraso usando temporizador

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

 
 

org 00h

 
 

ljmp inicio

 
 

org 30h

 

inicio:

mov sp, #2Fh

 
 

mov tmod,#01h

Temporizador 0 no modo de 16 bits (modo 1)

 

lcall atraso

Chama subrotina de atraso de tempo

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

29

 

sjmp fim

 

atraso:

mov r0,#20

Registrador R0 recebe valor 20 decimal

volta:

mov th0,#3Ch

TH0 recebe valor 3Ch

 

mov tl0,#0AFh

TL0 recebe valor AFh. Contador conta de 15535 até 65535 = 50000 pulsos

 

setb tr0

TR0 = 1 dispara o temporizador 0

espera:

jnb tf0, espera

Espera a flag de fim de contagem ser setada Espera TF0 = 1.

 

clr tf0

Limpa flag que indica fim da contagem.

 

djnz r0, volta

Decrementa R0 e “volta” se não for zero

 

clr tr0

Pára contador após o fim de 20 x 50000 contagens = 1.000.000 pulsos.

 

ret

Retorna da subrotina. Se cada pulso corresponder a 1 µs atraso 1 s

fim:

nop

 
 

end

 

Exemplo 2: Uso do temporizador 1 no modo 2, com interrupção. Nesse exemplo, a cada vez que o temporizador 1 chega ao final da contagem (FFh), há um desvio para a subrotina “atende1”, onde o pino 0 da porta P1 é complementado e valor da recarga TH1 é incrementado de 1. Deve-se observar no laboratório que o efeito de incrementar TH1 e complementar P1.0 é uma onda quadrada com período ligado e desligado variável.

Rótulo

Mnemônico

Comentário sobre o Efeito da Operação

 

$mod51

 
 

org 00h

 
 

ljmp inicio

 
 

org 1Bh

Endereço de desvio para a interrupção do temporizador 1.

 

ljmp atende1

Desvia para a subrotina que atende o temporizador 1.

 

org 30h

 

inicio:

mov sp, #2Fh

 
 

mov tmod,#20h

Temporizador 1 no modo de recarga automática (modo 2)

 

mov TH1,#00H

Carrega registrador de recarga TH1 com valor 00h

 

mov TL1,TH1

Transfere para TL1 o conteúdo do registrador TH1. TL1 é o contador no modo 2.

 

setb TR1

Dá início à contagem do temporizador 1

 

sjmp $

Fica num loop infinito, saindo a cada fim de contagem do temporizador 1

atende1:

cpl P1.0

Complementa o bit zero da porta P1 a cada fim de contagem do TEMP1

 

inc TH1

Incrementa TH1, de modo que cada contagem comece 1 unidade acima da anterior

 

reti

Retorna da subrotina que atende a interrupção do temporizador 1.

 

end

 

Tarefa 1:

Fazer um programa que executa duas seqüências distintas (uma de cada vez) na porta P1. Estas seqüências deverão ser alternadas a cada pedido de interrupção 0. Em outras palavras, a primeira seqüência é executada até o primeiro pedido de interrupção 0, a partir do qual a segunda seqüência passa a ser executada. Esta nova seqüência também é executada até um novo pedido da mesma interrupção 0. As seqüências a serem executadas são:

Seqüência 1: Imprimir 55h e AAh na porta P1, em intervalos regulares.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

30

Seqüência 2: Imprimir 00h e FFh na porta P1, em intervalos regulares.

Obs.1: Começar o programa principal no endereço 30h.

Obs.2: Sugestão para as primeiras linhas do programa:

 

org 00h

ljmp inicio

org 03h

atende_int0

org 30h

inicio:

mov sp,#2Fh

Obs.3: Use um bit de um registrador para decidir qual seqüência deve ser executada de cada vez. Assim, a cada vez que a interrupção é chamada esse bit é complementado.

Tarefa 2:

Enviar para a porta P1 as sequências abaixo (valores em binário), pelo tempo indicado.

Sequências

Tempo

0000

0111

5

s

0001

1000

2

s

1110

0000

3

s

Tarefa 3:

Alternar a rotação dos bits da porta P1 à esquerda e à direita utilizando uma das interrupções externas.

Notas de Aula sobre o Microcontrolador 8051

Prof. José Wilson Lima Nerys

6

COMUNICAÇÃO SERIAL

31

6.1 Noções Básicas da Comunicação Serial

A comunicação serial consiste em enviar ou receber pacotes de informação bit a bit. No caso do 8051 o canal de comunicação serial é do tipo “full duplex”, o que significa que ele pode, ao mesmo tempo, receber e transmitir dados.