Você está na página 1de 78

1

Faculdade de Ciência e Tecnologia


Engenharia de Elétrica
Disciplina: Microprocessadores e Microcontroladores
Professor: Vitor Leão Filardi

Apostila de Programação em 8051


2
Sumário

1 Primeira Unidade 7
1.1 Explicação Intuitiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Princı́pios Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.1 Conceitos Básicos da Computação . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.2 Blocos Básicos de microcomputadores . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 Arquitetura do Microprocessador/Microcontrolador . . . . . . . . . . . . . . . . . . . . 12
1.4 A CPU Internamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 O Microcontrolador 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.5.1 Memória . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5.2 Circuito de Reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.5.3 O Gerador de Clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
1.5.4 Interrupção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.5.5 Registro de Controle das Interrupções . . . . . . . . . . . . . . . . . . . . . . . 29
1.5.6 Tempo para Atendimento das Interrupções . . . . . . . . . . . . . . . . . . . . 32
1.5.7 Ajuste das Interrupções Externas para serem Ativas em Nı́vel ou Transição . . 32
1.5.8 Hardware para expandir as possibilidade de Interrupção Externa . . . . . . . . 33
1.5.9 Exercı́cios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.5.10 Conjunto de Instruções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

2 Segunda Unidade 41
2.1 Ciclos de Máquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2 Portas de I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.2.1 Princı́pio de Funcionamento e Utilização . . . . . . . . . . . . . . . . . . . . . . 42
2.2.2 Caracterı́sticas Gerais e de Tempo dos Ports . . . . . . . . . . . . . . . . . . . 45
2.2.3 Uso das Portas de I/O para a Expansão da Memória de Dados e Programa . . 46
2.2.4 Seleção de Programa Externo ou Interno . . . . . . . . . . . . . . . . . . . . . . 47
2.2.5 Uso dos Pinos da Porta 3 como funções Alternativas . . . . . . . . . . . . . . . 47
2.2.6 Capacidade de Corrente nos Pinos de I/O . . . . . . . . . . . . . . . . . . . . . 48
2.3 Modos de Endereçamento das Instruções . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.3.1 Endereçamento por Registrador . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.3.2 Endereçamento Direto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.3.3 Endereçamento Indireto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.3.4 Endereçamento Imediato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.3.5 Endereçamento Relativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.3.6 Endereçamento Absoluto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.3.7 Endereçamento Longo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.3.8 Endereçamento Indexado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.4 Temporizadores e Contadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.4.2 Registros Envolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.4.3 Modos de operação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.4.4 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3
4 SUMÁRIO

3 Terceira Unidade 65
3.1 Comunicação Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.1.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.1.2 Registros Envolvidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.1.3 Modos de Operação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.1.4 Cuidados com a Porta Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.1.5 Comunicação entre vários 8051 . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
3.1.6 Comunicação serial entre o 8051 e o PC . . . . . . . . . . . . . . . . . . . . . . 73
3.1.7 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.2 Programação em Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.2.1 Introdução teórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.2.2 Estratégias de elaboração de programas . . . . . . . . . . . . . . . . . . . . . . 77
3.2.3 Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Referências Bibliográficas

GIMENEZ, S. P. Microcontroladores 8051. [S.l.]: Editora Pearson Education do Brasil, 2002.

NICOLOSI, D. E. C. Microcontrolador 8051 Detalhado. [S.l.]: Editora Érica, 2000.

SILVA, V. P. da. Aplicações Práticas do Microcontrolador 8051. [S.l.]: Editora Érica, 1998.

5
Capı́tulo 1

Primeira Unidade

O que é Microcontrolador

1.1 Explicação Intuitiva


Vamos fazer de conta que somos meros aprendizes de cozinheiros, o chefe de cozinha teve que sair
e chega um pedido de uma torta de chocolate do gerente da casa. O primeiro passo que nos vamos
dar é em direção ao livro de receitas onde deverá ter impresso a rotina de como fazer uma ”Torta
de Chocolate”

Tudo bem até aqui. E agora como vamos acessar a receita da torta? De que se compõe uma receita?

Pois bem, vamos procurar a página que contém o tı́tulo ”Torta de Chocolate”, encontra-se
então a receita que é equivalente a um ”software” de construção da torta, que está gravada em um
página ”ABC” do livro de receitas. Notemos que, na página, apenas lemos; não escrevemos nada
lá, ou seja, em trocado de miúdo será a nossa futura ”ROM” - Read Only Memory - e página o nosso
endereço, pois toda vez quisermos tal informação basta acessar tal endereço e obtê-lá.

Poderı́amos ainda necessitar de uma cobertura para a torta caso fossemos mostrar serviço para
o chefe da casa, vejamos que no livro de receita exista em uma outra página a rotina ”Cobertura
para Tortas” e que esta por sua vez estava seperada por servir para mais de um tipo de torta, e
poderı́amos partir para a sua execução e depois retornar a torta, o que é chamado também como
subrotina de um programa.

Agora se fossemos complicar um pouco mais a nossa receita e fossemos fazer uma receita e meia da
torta? Precisarı́amos de uma folha de rascunho (a memória ”RAM”) para ajustarmos a receita,uma
vez que na receita da torta não devo anotar nada nela. Esta memória temporária, será utilizada para
cálculos, e depois podemos nos desfazer do seu conteúdo, ou seja, jogar no lixo.

Vejamos como ficaria esta estrutura intuitiva na figura abaixo.

Quais são as diferenças sutis e importantes entre o microprocessador e o cozinheiro e suas an-
otações?

Bem, é que o microprocessador, por ser uma máquina limitada, não atende ao rico vocabulário
do ser humano cozinheiro que, além de rico, é sofisticado, impreciso e de múltipla interpretação, que
só uma máquina inteligente como o homem entede ( vejamos o exemplo: para o homem as seguintes
palavras são equivalentes: fazer = realizar = trabalhar. Para o microprocessador, o vocabulário é bem
reduzido e especı́fico; não existem adjetivos, sinônimos, etec...).

Então vimos que o microprocessador entende apenas algumas instruções básicas e se nos quisermos
que ele faça alguma coisa precisamos estudar e compreender precisamente a sua linguagem e limitar-
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Leio Folha de Rascunho


Escrevo
C
o
z
i
Ingredientes Livro de
n
h
Receitas
+
e
Utensilios i So (Linguagem
r Leio Complexa)
o

HARDWARE SOFTWARE

READ RAM (Dados)

WRITE M
i
c
r
Perifericos: ROM
o
p
Teclado,mouse r (Programa de
Etc.... o So Linguagem
c. Leio Especifica

HARDWARE SOFTWARE

Figura 1.1: Analogia da estrutura Intuitiva

se a ela para fazer a máquina trabalhar. Este é o ASSEMBLER do microprocessador, que é o seu
conjunto de instruções.

1.2 Princı́pios Básicos


1.2.1 Conceitos Básicos da Computação
Antes de iniciarmos o estudo de microcomputadores, vamos nos familiarizar com os termos técnicos
e saber o seu significado individualmente.

1.Bit: abreviação de dı́gito binário (binary digit), que corresponde ao valor zero lógico(0) ou ao
valor um lógico(1). Podemos fazer uma analogia ao sistema numérico como sendo uma unidade
de um valor qualquer.

2.Byte: representação numérica composta de 8 bits. Pode representar números de 00h(=0 10 ) a


FFh(=25510 ). Essa representação é vastamente utilizada na representação das instruções que
o microcontrolador é capaz de executar. Novamente fazendo analogia, teremos o similaridade
como as dezenas, centenas etc..., lembrando que em eletrônica digital corresponde como sendo
uma palavra.

3.Registradores: conjunto de flip-flop, geralmente do tipo D que são interligados em paralelo


entre si. Eles são responsáveis pelo armazenamento de uma informação que pode ter 8, 16,
32, 64 ou 128 bits, dependendo de quantos flip-flops do tipo D estão interligados entre si. Os
registradores apresentam caracterı́sticas voláteis e , quando eles são desenergizados, perdem suas
informações.

Página 8
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

4.Microcomputador: equipamento compacto cujo objetivo principal é simular eletronicamente


o sistema chamado ser humano. Suas principais vantagens são: grande velocidade do proces-
samento das informações e alta confiabilidade nas atividades executadas. Ele é composto por
três blocos básicos: Unidade Central e de Processamento, Unidade de Memória e Unidade de
entrada e saı́da de informações.

5.Instrução: define uma única ação (tarefa) que o microcomputador pode executar por vez. As
ações das instruções podem corresponder a operações de leitura e escrita nos conteúdos dos reg-
istradores ou nas posições de memórias, a operação lógica e aritméticas, etc.

6.Equipamento Inteligente: equipamento com microprocessador ou com microcontrolador.


Também chamada de eletrônica embarcada

7.Programa ou software: definido por um conjunto de instruções arranjadas de maneira or-


ganizada por um programador, com o objetivo de informar ao microcomputador o que ele deve
executar, ou seja, o programa informa ao microcomputador quais as tarefas que devem ser exe-
cutadas ao longo do tempo. Existem várias classificações de programas: os programas de sistema
operacional( linux, DOS, windows e etc.), os utilitários( Anti-virus,scandisk e etc.) e os aplica-
tivos (WORD, EXCEL, Kile e etc.)

8.Firmware: programa (software) que está exclusivamente armazenado em uma memória não-
volátil(ROM/PROM/EPROM/E2PROM) de um equipamento inteligente. No mı́nimo o firmware
tem a finalidade principal de programar a forma de operação do hardware (número de portas de
entrada e saı́da, forma de comunicação serial, forma de operação dos timers/contadores etc.) e
de definir suas condições iniciais de operação.

9.Hardware: são as partes eletrônicas que compõem um microcomputador, como a mother board
(placa mãe que contém pelo menos o microprocessador ou o microcontrolador de um microcom-
putador), a placa de vı́deo de um microcomputador etc.

10.Microprocessador ou Unidade Central de Processamento(CPU):mais conhecido como


CPU. Fazendo analogia com o sistema ser humano, o microprocessador, ou CPU, de um mi-
crocomputador corresponde ao cérebro de um ser humana. Fisicamente é um dispositivo semi-
condutor (circuito integrado,CI) constituı́do por milhões de transistores que implementam uma
variedade de circuitos (registradores, máquinas seqüenciais, circuitos lógicos e etc.). Ele é re-
sponsável pela busca de um programa na memória e por sua execução.

11.Microcontrolador: dispositivo semicondutor em forma de CI, que integra todas as partes


básicas de um microcomputador - microprocessador(CPU), memórias não-voláteis (ROM /PROM
/EPROM /E2PROM), memórias voláteis(RAM, SRAM, DRAM, Flash RAM), portas de en-
trada e saı́das (portas de comunicação paralela e/ou serial, conversores analógicos/digitais,conversores
digitais/analógicos etc.). Ele é conhecido como ummicrocomputador implementado em um único
CI.

1.2.2 Blocos Básicos de microcomputadores


Qualquer computador, seja ele microcomputadores, computadores de médio porte ou ainda com-
putadores de grande porte, são constituı́dos por três blocos básicos: a unidade central de processamento
(CPU), a unidade de memória (na qual são armazenados os programas e as informações) e a unidade
de entrada e saı́da (dispositivos que fazem a comunicação com o mundo externo).

Página 9
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

CPU
A CPU é responsável pela inteligência da máquina, ou seja, é ela que tem a capacidade de tomar
decisões (ações) no sistema microcomputadorizado, por meio da execução de um programa. É ela que
executa o programa armazenado na memória do microcomputador, que foi projetado por um progra-
mador. Ao executar um programa, ela é responsável pela obtenção das informações a serem analisadas
por meio de dispositivos de entrada (teclado, canal de comunicação serial etc.), pelo processamento
(interpretação, manipulação, ordenação, modificação, cálculos lógicos ou matemáticos etc.) das in-
formações e pela resposta (ação) do sistema microcomputadorizado a uma determinada situação de
controle para a qual ele foi projetado a fim de controlar, por meio de um dispositivo de saı́da (escrita
na memória de vı́deo, transmissão de dados para outro microcomputador, acionamento de um relé,
acionamento de um bip,etc.). Assim, por exemplo, um microcomputador projetado para funcionar
como um caixa eletrônico de banco deve fazer as seguintes operações: leitura das informações conti-
das no cartão magnético (obtenção de informações), decodificação da senha digitada no teclado pelo
usuário, busca de saldo bancário nos bancos de dados do banco (processamento), disponibilização do
saldo bancário no monitor de vı́deo e a impressão em papel do referido saldo bancário (resposta do
sistema por meio da ação de gerar informações no monitor de vı́deo e também pela impressão em
papel das informações organizadas solicitadas pelo usuário).

De maneira simplificada, pode-se dizer que a unidade de processamento central (microprocessador)


apresenta duas funções básicas:

a)Leitura (busca) e interpretação do programa alocado na memória, instrução por in-


strução: como o programa fica alocado na memória do microcomputador, e não dentro do micro-
processador/CPU, em primeiro lugar, o microprocessador precisa buscar as instruções, uma por uma,
na memória. Isso é feito por meio da operação de leitura de um byte na memória que corresponde
a uma determinada instrução e depois é realizada a interpretação da instrução lida (decodificação),
pois o microprocessador tem uma determinada quantidade de instruções que ele é capaz de executar.
Dessa maneira, ele precisa verificar qual dessas instruções deve ser executada. Assim, ao finalizar
essa etapa, o microprocessador/CPU sabe o que deve fazer. O próximo passo é a execução da in-
strução.

b)Execução do programa, instrução por instrução: a palavra execução de uma instrução pode
significar a transferência de dados dos registradores internos do microprocessador/CPU para a
memória ou para os dispositivos de entrada e saı́da, e vice-versa. Pode também significar a ex-
ecução de operações lógicas e aritméticas etc.

Esse processo de buscar, interpretar e executar instrução por instrução é uma atividade contı́nua do
microprocessador e, dessa forma, um programa é processado por inteiro. A unidade de processamento
central (microprocessador) é constituı́da por três partes principais: a unidade lógica e aritmética, os
registradores internos e o bloco de temporização e controle.

a)Unidade Lógica e Aritmética (ULA): muitas vezes, também é chamada de ALU (Arithmetic
Logic Unit). Ela é responsável, principalmente, pela execução das instruções correspondentes às
operações aritméticas e lógicas. Além disso, uma caracterı́stica muitı́ssimo importante que deve
ser destacada, referente à ULA, é que, ao executar uma instrução de uma operação aritmética ou
lógica, ela também define a condição numérica do resultado por meio de alguns bits sinalizadores,
chamados de flags de sinalização, tornando-os iguais a um (setando-os) ou tornando-os iguais a
zero (resetando-os), e pela utilização de outras instruções que são ca- pazes de testar esses flags de
sinalização. Isso faz com que o sistema microcomputadorizado possa gerenciar uma determinada
situação de projeto ou desempenhar uma determinada tarefa bem-definida.

b)Registradores internos: são compostos por m registradores de n bits interligados em paralelo


entre si. Os valores m e n dependem das caracterı́sticas de cada microprocessador/microcontrolador
Página 10
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

(p. ex.: 32 registrado- res de 8 bits etc.). Como são formados por flip-flops, é possı́vel realizar
operações de leitura e escrita de informações. Quando a CPU é ”desenergizada”por apresentar car-
acterı́sticas voláteis, essas informações são perdidas. Geralmente, eles são capazes de armazenar:

•um byte se forem constituı́dos por registradores de 8 bits;


•um duplo byte ou address ou word, se forem constituı́dos por registradores de 16 bits;
•um duplo address ou duplo word, se forem constituı́dos por registradores de 32 bits etc.

Um microcomputador é chamado de microcomputador de 8 bits se ele for capaz de processar in-


formações de oito em oito bits por vez (operações de movimentação de informações e operações
aritméticas e lógicas). Analogamente, para os microcomputadores de 16 e 32 bits, quanto maior for
a quantidade de bits processados em paralelo por vez, maior será sua capacidade de processamento.
A unidade utilizada para medir a capacidade de processamento é o Mips (milhões de informações
por segundo).

c)Bloco de temporização e controle: responsável pelo controle do fluxo de informações do micro-


processador para as unidades de memória e para as unidades de entrada e saı́da. É esse bloco que
define os sinais de controle de temporização para o sincronismo do fluxo de informações no sistema
microcomputadorizado (p. ex.: liberação de informações da ULA para os registradores, memória
e unidades de entrada e saı́da etc.) por meio da definição dos sinais de leitura (read), de escrita
(write), de inicialização do sistema (reset), de liberação dos barramentos de dados e endereços, entre
outros.

Unidades de Memórias
As unidades de memórias são divididas em duas partes: memória de armazenamento de programa
e memória de armazenamento de informações (dados, bytes, bits etc.).

a)Memória de armazenamento de programa: todo microcomputador deve ter uma área de


memória na qual será armazenado o programa que definirá as tarefas que o microcomputador /
CPU deve executar. Esse programa define a função de um microcomputador e também diz ao mi-
crocomputador, instrução por instrução, o que ele deve fazer ao longo do tempo. Esse programa deve
ser implementado por um programador técnico, conhecedor do hardware do sistema microcomputa-
dorizado e das instruções do microprocessador. O microcomputador não funcionará se não existir
um programa armazenado em sua memória de programa. Assim, uma vez energizado o microcom-
putador, esse programa será buscado e executado pelo microprocessador. Esse programa define a
caracterı́stica funcional do microcomputador (p. ex.: operar como um forno de microondas, como
uma máquina de lavar roupas ou como uma injeção eletrônica de automóvel etc.). Esse programa
não pode ser perdido na ausência de energia elétrica, pois isso acarretaria a perda da funcionalidade
desse microcomputador, para a qual foi projetado. Assim, o tipo de memória em que esse programa
deve ser armazenado é a memória não-volátil.

b)Memória de armazenamento de informações: todo microcomputador deve ter uma área de


armazenamento de informações. Essa memória deve permitir a escrita e a leitura de informações.
Para entender melhor, considere um microcomputador controlando uma determinada atividade.
Caso existam informações definidas pelo mundo externo por meio de chaves, sensores, teclados etc.,
elas devem ser lidas e armazenadas na memória, para depois serem lidas novamente e analisadas
(tratadas) pelo microprocessador por meio de um programa. Como exemplo, considere o aciona-
mento das teclas do teclado de um microcomputador, ou seja, uma vez acionada uma tecla, a CPU
deverá ler a informação que foi gerada pelo hardware associado a essa tecla e executar o armaz na-
mento dessa informação na memória. Depois, deverá fazer a leitura dessa informação, a fim de
analisá-la (interpretá- la), para verificar qual tecla foi acionada. Além disso, a informação deverá
ser mostrada no monitor de vı́deo. Repare que foram necessárias, nesse exemplo, várias operações
Página 11
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

de leitura e escrita na memória, para a realização dessa tarefa. Assim, é preciso utilizar uma
memória que tenha a caracterı́stica de realizar leitura e escrita de informações. Portanto, deve-se
utilizar memórias RAM (Random Access Memory). Lembre-se de que essas memórias apresentam
a caracterı́stica de se- rem voláteis. Portanto, sempre que o microcomputador for desenergizado, as
informações contidas nesse tipo de dispositivo serão perdidas.

Unidade de Entrada e Saı́da


Unidade de entrada e saı́da (E/S): também chamada pela abreviação de I/O (Input/Output),
é responsável pelo interfaceamento das informações entre o microcomputador e o mundo externo.
Geralmente são circuitos integrados (CIs) capazes de ler e armazenar as informações vindas do mundo
externo, por exemplo, informações originárias do teclado, do canal de comunicação serial de um mi-
crocomputador etc.; e que também podem definir informações do microcomputador para o mundo
externo, por exemplo, o acionamento de bips, alto-falantes, leds indicadores, displays, interfaces de
comunicação seriais e paralelas etc.

1.3 Arquitetura do Microprocessador/Microcontrolador


Como vimos até aqui o microprocessador é um elemento eletrônico, desenvolvido para execu-
tar tarefas especı́ficas, que dependem de uma linguagem própria para cada famı́lia de micropro-
cessadores/microcontroladores. Quando falo em famı́lias estou me referindo ao tipo de linguagem
que o meu microprocessador/microcontrolador será capaz de interpretar, isto quer dizer que a lin-
guagem a qual irei utilizar no programa está diretamente relacionada ao modelo do meu micropro-
cessador/microcontrolador. Podemos ter no mesmo circuito diversos tipos de famı́lias diferentes que
trabalham entre si sem problemas, desde de que se respeite o programa individual de cada um, por
exemplo: o nosso celular não conecta no computador, um palm idem, são todos eles pertencentes a
diversas famı́lias, mas que interagem entre si.

Assim, ao programarmos a ROM com os códigos compatı́veis com a linguagem ou famı́lia perten-
centes ao microprocessador, ele será capaz de executar as tarefas por esse código designadas. Cabe ao
projetista entender perfeitamente o conjunto de instruções da máquina (o tão famoso ASSEMBLER)
e a sua estrutura fisica, e de interfaces, também conhecida como hardware.

Vejamos como os três blocos visto até aqui se comunicam entre si para dar funcionalidade ao
microprocessador. As vias de comunicação entre os blocos básicos são chamadas de barramentos ou
do inglês bus. Cada barramento é constituı́do por um número de vias (trilhas de cobre), nas quais
fluem informações em paralelo. São três os barramentos existentes: o barramento de endereços, de
temporização e controle e o de dados.

1.Barramento de endereços: A CPU utiliza esse barramento para definir os endereços das
posições de memória de programa em que ela irá buscar as instruções a serem executadas e
também para definir os endereços de memória de dados ou dos dispositivos de entrada e saida
para a troca de informações. Esse barramento é unidirecional.

2.Barramento de temporização e controle: A CPU utiliza esse barramento para definir os


sinais de temporização e controle para gerenciar o tempo e a direção do fluxo de informações
nas operações de leitura e escrita nos dispositivos (unidades de memória ou unidades de entrada
e saida). Esse barramento é unidirecional.

3.Barramento de dados: A CPU utiliza esse barramento para receber as informações vindas da
memória ou dos dispositivos de entrada e saida ou então definir as informações para a memória
ou para os dispositivos de entrada e saı́da. Esse barramento é bidirecional. Vale ressaltar que
Página 12
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

nem todos os microprocessadores/microcontroladores não trocam informações diretamente com


os dispositivos de entrada e saida.

4.Oscilador: É o elemento que gera o ”marcapasso”da CPU, que permite que o microprocessador
realize as suas tarefas internas e externas de maneira sincronizada e com velocidade predetermi-
nada.

5.Reset: É o elemento que faz a CPU iniciar suas rotinas internas e realizar também a primeira
leitura de instrução no endereço 0000h.

6.Interrupções: São pinos de acesso externo que permitem interromper o microprocessador, que
então interrompe suas tarefas atuais e atende aquelas planejadas pela interrupção solicitada.

Microprocessador Mem´oria
Oscilador
E/S
ou Nao−Volatil ou
Reset (ROM)
Unidade Cental de I/O
Processamento
Interupcao Volatil (RAM)

BUS Dados

BUS de Temp.
Controle
Bus Endereco

Figura 1.2: Arquitetura básica de um microprocessador

Como o computador só interpreta códigos binários, não existe a necessidade que nós programadores
converse no mesmo nı́vel, podemos utilizar os outros tipos de codificação Octal, Hexadecimal, Deci-
mal e por Nomes Simbólicos, que representam uma instrução, como por exemplo: ”add”= ”Soma”=
Código Hexa 24 ou 00100100 em binário (no exemplo, add=add A,#valor), para o microprocessador
8051. A CPU só entende dı́gitos binários, mas nós a memorizarmos por ”add”, que é mais fácil de
se lembrar. Assim através de um software (interpretador) irá transformar este ”add”em 00100100,
quando gravamos a ROM.

1.4 A CPU Internamente


Veremos algumas de suas funcionalidades mais importantes

a)Registradores: São equivalentes a uma RAM, só que interna à CPU. Servem para armazenamento
temporário de informações de utilidade interna e externa à CPU. Existem registradores com função
definida: por exemplo, aquele que é imagem ou espelho de uma porta de ”I/O”. O sinal na porta
de I/O pode ser lido diretamente no registrador equivalente; por exemplo, a porta P̈O”tem um reg-
istrador imagem de ”PO”, cujo conteúdo é o reflexo do que há na entrada fı́sica dessa porta. Existem
registradores de Função Geral, que podem ser acessados pelas instruções do Mp (microprocessador)
e ainda podem ser conhecidos por nomes (registradores R0, R1 etc.) ou sem nomes (registradores
20h, 21h, etc.).
Página 13
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

b)Contador de Programa (Program Counter ou PC): É o indicador de endereço de memória ex-


terna. Ele serve para endereçar a próxima instrução a ser lida pelo Mp, a fim de que ela ”saiba”onde
estava e para onde deve ir (ler nova instrução no próximo endereço).

c)Registradores de Instrução (Instruction Register ou IR): É o local para onde se dirige o


código da instrução que foi retirada da ROM por meio do endereço dado pelo PC no ciclo de busca
(fetch) da instrução da memória. O IR é necessário para que, depois da busca, um decodificador
possa decodificar, ”abrir”a instrução e enviá-la à unidade de processamento (ALU-Aritmetic Logic
Unit), a fim de que, neste local, ela seja ”executada”.

d)Unidade de Decodificação (Decode Unit): É o local em que a instrução é decodificada, e


também são gerados os controles que, junto com a Unidade de Controle, permitem executar a
instrução na ALU.

e)Unidade Lógica e Aritmética (ALU-Arithmetic Logic Unit): É o local em que são realizadas
as operações de: lógica, aritmética e decisão/comparação. É o ”cérebro”da máquina.

f)Acumulador (Accumulator): É um registrador principal e muito ”popular”, pois várias in-


struções se referem a ele para operar.

g)Unidade de Controle (Control Unit): É o local em que se processa o controle do fluxo das
informações a fim de realizar a instrução recebida.

Exemplo de Funcionamento: Suponha que o Mp foi ler uma instrução na ROM. Os seguintes
passos serão dados:

1.O endereço de PC é posto na via de endereço (que é o endereço desta próxima instrução a ser
lida).

2.O sinal de controle da ROM, é ativado (pois vamos ler a ROM e não a RAM).

3.A instrução é lida da ROM, no endereço dado pelo PC (no caso, o endereço ”n”), e é lida pela
via de dados. Estes três itens correspondem ao ciclo de busca ou fetch.

4.A instrução é carregada e armazenada no IR (Registrador de Instruções).

5.O PC é incrementado para ler a próxima instrução (apontará para ”n+1”).

6.Inicia-se outro ciclo, o de execução interna da instrução, auxiliado pela Unidade de Controle e
pelos registradores, decodificado pela Unidade de Decodificação e executado pela ALU.

1.5 O Microcontrolador 8051


O 8051 é um microcontrolador rápido com clock tı́pico de 12 MHz sendo que existem versões de até
30 MHz, fornecidas por diversos fabricantes, e suas caracterı́sticas de hardware e software permitem
usá-lo como um poderoso controlador, sobretudo em sistemas para lógica seqüencial e combinatória.
Entre as suas caracterı́sticas de hardware, podemos destacar:

1)2 Kbytes de memória de programa (Flash)

2)128 Bytes de memória RAM

3)Duas portas de I/O de 8 bits

4)Comparador de tensão on-chip

5)Controlador de interrupção de 6 entradas com estrutura Nesting*

6)Canal serial UART Full-Duplex programável


Página 14
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

7)Dois contadores/temporizadores de 16 bits

8)Modos Power-Down e Power-Idle

[*] ”Nesting”é o nome que se dá ao processo pelo qual uma interrupção pode interromper outra que
já estiver sendo atendida, desde que tenha maior prioridade.

Entre as caracterı́sticas de software podemos destacar a capacidade de executar complexas operações


aritméticas e lógicas (multiplicação, divisão, permuta, e deslocamento de bits,. . . ), trabalhar com ban-
cos de registradores nominais e inclusive trabalhar com 128 bits individualmente endereçáveis na RAM.

Há um tempo não muito distante, para realizar um projeto utilizando microcontroladores com
todas estas funcionalidades, era necessário agrupar diversas pastilhas com as funções descritas ante-
riormente. Isto tornava protótipo fisicamente maior, aumentaria o consumo de energia, diminuindo a
autonomia das baterias e inviabilizando a sua portabilidade que hoje são fundamentais para os sis-
temas embarcados.

Para compreendermos melhor o 8051 torna-se necessário conhecer a estrutura interna do micro-
controlador e estudarmos cada uma delas detalhadamente. Para isso nos dividiremos da seguinte
forma:

1)Memória

2)Circuito de Reset

3)Gerador de Clock

4)Controlador de Interrupção

5)Conjunto de Instruções

Com esta divisão ficará mais claro definirmos todas as instruções realizadas pelo 8051 e, o fun-
cionamento dos demais componentes associados ao microcontrolador.

1.5.1 Memória
Vejamos, o diagrama de blocos do 89C2051 na figura 1.3. Neste diagrama de blocos, temos uma
noção geral dos elementos internos ao 8051 e de suas ligações com o mundo externo.

A memória de programa do 8051 é do tipo Flash ROM (E2PROM), podendo sofrer um ciclo de
escrita/apagamento de 1000 vezes. Este tipo de memória de programa torna as tarefas de teste e
depuração dos programas bastante agradáveis, pois a antiga etapa de apagar a memória em luz ultra-
violeta não se faz mais necessária.

O segmento de programa da memória se inicia no endereço 0000h e pode ocupar todos os 2048
bytes da memória, a ATMEL oferece também outros modelos de microcontroladores com uma ROM
interna maior para que possamos utilizar programas maiores.

A memória RAM se divide conforme a figura 1.4


Os registradores de funções especiais incluem locações referentes às portas de I/O, ponteiros do
sistema, registros de interrupção, registros da porta serial, dos temporizadores e registros aritméticos.

A CPU trata os registros de funções especiais da mesma forma que trata a RAM, podendo ali
efetuar alterações e, o mais importante, endereçar algumas dessas posições como bit.

Esta facilidade de endereçar bits é muito interessante, pois facilita a vida do programador. Vamos
supor que temos de zerar o quinto bit de uma certa posição de memória. O método tradicional consiste
em fazer uma operação AND entre o conteúdo da memória especificada e o numero binário 11011111,
Página 15
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Figura 1.3: Organização Interna do 8051

pois 1 AND X resulta X, logo não alteramos os bits 7, 6, 4, 3, 2, 1 e 0. Mas temos que 0 AND X
resulta 0, e desta forma zeramos o quinto bit.

Quando o sistema trabalha com bits, basta dar uma instrução do tipo ”zere o bit 5 na posição N”e
teremos efetuado a operação, sem nos preocuparmos com os demais bits.

A parte baixa da memória RAM interna (daqui a diante chamaremos apenas de RAM) está di-
vidida em porções distintas, que incluem 4 bancos de registradores de 8 bytes cada, uma porção de
16 bytes cujos bits são individualmente endereçáveis pela CPU e o restante da memória, que somente
pode ser endereçado byte a byte.

Os bancos de registradores são simples posições de memória RAM que permitem seu endereçamento
pelo nome dado a cada registro, além de seu endereçamento pela posição de memória.

Página 16
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Figura 1.4: Organização da RAM Interna do 8051

A vantagem dos bancos de registradores está em seu uso pelo sistema, como ı́ndice para en-
dereçamento e pela facilidade de lembrança de seu nome, além de serem amplamente utilizados por
compiladores de linguagem de alto nı́vel.

Por exemplo, é mais fácil lembrar que um certo dado está no registro R2 do que lembrar que o
mesmo está na posição 02 de memória (Supondo Banco 0).

Página 17
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

A seleção de um certo banco de registradores se dá pelo valor dos bits RS1 e RS0 conforme a
tabela a seguir:

Posição de Memória Nome do Registrador Bit RS1 Bit RS0 BANCO


1F R7 1 1
1E R6 1 1
1D R5 1 1
1C R4 1 1
3
1B R3 1 1
1A R2 1 1
19 R1 1 1
18 R0 1 1
17 R7 1 0
16 R6 1 0
15 R5 1 0
14 R4 1 0
2
13 R3 1 0
12 R2 1 0
11 R1 1 0
10 R0 1 0
0F R7 0 1
0E R6 0 1
0D R5 0 1
0C R4 0 1
1
0B R3 0 1
0A R2 0 1
09 R1 0 1
08 R0 0 1
07 R7 0 0
06 R6 0 0
05 R5 0 0
04 R4 0 0
0
03 R3 0 0
02 R2 0 0
01 R1 0 0
00 R0 0 0

Tabela 1.1: Tabela de registradores do banco de memória

Conforme visto anteriormente, temos 16 bytes na RAM cujos bits são individualmente endereçáveis
pela CPU, conforme podemos ver pela tabela abaixo, dispostos da seguinte forma.

Página 18
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Endereços Individuais dos bits Endereços dos bytes


7F 7E 7D 7C 7B 7A 79 78 2F
77 76 75 74 73 72 71 70 2E
6F 6E 6D 6C 6B 6A 69 68 2D
67 66 65 64 63 62 61 60 2C
5F 5E 5D 5C 5B 5A 59 58 2B
57 56 55 54 53 52 51 50 2A
4F 4E 4D 4C 4B 4A 49 48 29
47 46 45 44 43 42 41 40 28
3F 3E 3D 3C 3B 3A 39 38 27
37 36 35 34 33 32 31 30 26
2F 2E 2D 2C 2B 2A 29 28 25
27 26 25 24 23 22 21 20 24
1F 1E 1D 1C 1B 1A 19 18 23
17 16 15 14 13 12 11 10 22
0F 0E 0D 0C 0B 0A 09 08 21
07 06 05 04 03 02 01 00 20

Tabela 1.2: Endereços de Memória endereçavel por byte e bit

Temos também alguns registros de funções especiais que têm seus bits endereçáveis, sendo que al-
guns deles têm, inclusive, um nome mnemônico, para maior facilidade de desenvolvimento de software
em compiladores.

Antes de estudarmos o mapa de memória dos registros de funções especiais, vamos estudar cada
um deles em separado para melhor compreensão do funcionamento interno do 89C2051.

Em seguida ao nome de cada registro, temos seu endereço em hexadecimal na RAM:

P1 (90) - Porta P1

P3 (B0) - Porta P3

São posições da RAM que contêm os dados das portas de I/O do micro, caso as mesmas sejam
usadas como tal.

Uma escrita num desses registros altera automaticamente o conteúdo presente na saı́da do chip, e
uma leitura dos mesmos coloca o estado presente nos pinos (ou nos latchs de saı́da, conforme veremos
adiante) dentro da posição desejada. Essa operação é possı́vel devido aos buffers e latchs de cada
porta, que só são ativos na leitura ou escrita das mesmas.

Página 19
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

SP (81) - Stack Pointer

É um registrador de 8 bits que contém o endereço de topo de uma ”pilha”realizada com os registradores,
em que se acumulam endereços de retorno, quando se trabalha com sub-rotinas e interrupções. Você
pode EMPURRAR (PUSH) dados para a pilha (STACK) ou TIRAR (POP) dados da pilha
(STACK).

A instrução PUSH incrementa o SP ”antes”de escrever os dados e a instrução POP lê o dado
da pilha e ”depois decrementa”o SP. A pilha é formada inicialmente dentro da RAM interna quando
se tem o RESET da máquina, e neste caso o SP é carregado com valor 07h. Isto é, qualquer dado
a ser armazenado na pilha causará primeiro o incremento do SP, isto é, irá para 08h, e depois será
gravado o dado na pilha nesta posição 08h. Isto é, ela estará ocupando a posição 08h da RAM que é
o registrador R0 do banco 1! Se você quiser utilizar esse banco e os outros seguintes, é melhor, logo
de ı́nicio, carregar o SP com outro valor de ponteiro, a partir do qual ele irá formar a pilha.

TH1 (8D) - Timer High 1

TL1 (8B) - Timer Low 1

TH0 (8C) - Timer High 0

TL0 (8A) - Timer Low 0

São os registros de dados dos temporizadores/contadores (1 e 0 respectivamente). Contem os val-


ores contados, no caso de usarmos as funções desse importante periférico do 89C2051.

TCON (88) - Timer Control Register

TMOD (89) - Timer Mode Register

Registradores de controle e de modo de operação dos temporizadores/contadores. É nestes reg-


istros que efetuamos a programação de como queremos que esses periféricos trabalhem. Vale lembrar
que o 89C2051 possui dois temporizadores/contadores internos.

PCON (87) - Power Control

Este registro permite-nos adaptar o chip para situações em que não há processamento, mas não
desejamos perder o conteúdo das memórias internas do chip, como pode ocorrer numa falha da ali-
mentação, assim podemos controlar o consumo de energia do sistema.

SCON (98) - Serial Port Control Register

SBUF (99) - Serial Buffer

No SCON, colocamos os bits que nos permitirão trabalhar com a porta de comunicação serial con-
forme desejamos, e o SBUF é o registro no qual a porta armazenará o dado recebido, ou escrevemos
o dado a ser transmitido.

IE (A8) - Interrupt Priority

IP (B8) - Interrupt Enable

Estes registros permitem-nos escolher qual ou quais interrupções serão habilitadas (ou desabili-
tadas) e qual a prioridade (maior ou menor) de cada uma.

Página 20
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

PSW (D0) - Program Status Word

O Program Status Word contém bits que indicam quais as ocorrências da ALU na ultima operação
lógica e aritmética, alem de indicar qual banco de registradores foi acessado pela ultima vez. Equivale
aos Flags dos microprocessadores de 8bits.

ACC (E0) - Accumulator

B (F0)

Equivalem ao acumulador e ao registro B dos microprocessadores de 8 bits. O interessante aqui é


que, inclusive os registros da CPU são acessı́veis como simples posições de memória.

DPH (83) - Data Pointer High

DPL (82) - Data Pointer Low

Estes dois registros de 8 bits podem ser referenciados como um registro de 16 bits, chamado DPTR
-Data Pointer. Este registro é usado quando desejamos fazer endereçamento indireto para a leitura de
constantes armazenadas na memória de programa, para ler ou escrever variáveis na memória externa
de dados e para desvio para memória de programa de até 64 Kbytes.

Não são todos os registros de funções especiais que tem seus bits individualmente endereçáveis.
Temos na tabela abaixo, os registros e seus bits com seus respectivos endereços. Assim como nos
registros endereçáveis (que são bytes), alguns destes bits também tem um nome mnemônico.

Este componente possui um poderoso conjunto de instruções que permite usar diversos modos de
endereçamento, admitindo desvios e leitura/escrita em toda a memória.

No momento oportuno, veremos como é acessada uma posição de memória, e também como a CPU
faz para acessar fisicamente essas posições.

1.5.2 Circuito de Reset


Agora, estudaremos como se processa a operação de RESET no 89C2051. É através desta função
que o chip se prepara para trabalhar, seja ao ligarmos a alimentação do sistema, ou forçosamente.

Embora o RESET não seja propriamente uma interrupção, muitas vezes é assim chamado devido
à semelhança de suas ações, já que o RESET interrompe o processamento e reinicializa o sistema.

O RESET no 89C2051 é ativo quando o pino 1 (RST/VPP) permanecer em nı́vel alto por dois ou
mais ciclos de maquina.

Neste caso, a CPU executa o que chamamos de reset interno, que consiste em preencher seus reg-
istros internos com os valores predeterminados, a saber:

a)O PC, o acumulador, o registro B, os flags, o DPTR e todos os registros dos tempo-
rizadores/contadores são ZERADOS.

b)No SP é colocado o valor 07h.

c)As portas P1 e P3 terão o valor FFh

Página 21
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Endereços Individuais dos bits Registradores


E7 E6 E5 E4 E3 E2 E1 E0 ACC
F7 F6 F5 F4 F3 F2 F1 F0 B
97 96 95 94 93 92 91 90 P1
B7 B6 B5 B4 B3 B2 B1 B0 P3

EA ES ET1 EX1 ET0 EX0


1 0 0
AF AC AB AA A9 A8 IE

PS PT1 PX1 PT0 PX0


1 0 0
BC BB BA B9 B8 IP

CY AC FD RS1 RS0 OV P
D7 D6 D5 D4 D3 D2 D0 PSW

SM1 SM2 SM3 REN TB8 RB8 T1 R1


9F 9E 9D 9C 9B 9A 99 98 SCON

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0


8F 8E 8D 8C 8B 8A 89 88 TCON

Tabela 1.3: Mnemônicos de cada bit

d)O SBUF estará com conteúdo indeterminado e o registro de controle da porta serial SCON
será zerado.

e)O registro PCON terá apenas seu bit mais significativo zerado.

f)Os registros de controle de interrupção (IE e IP) terão ambos o valor binário XXX00000,
onde X = irrelevante (pode ser 0 ou 1).

A RAM interna não é afetada pelo reset forçado, sendo que ao ligar (power-up), o seu valor é
aleatório, mas pode ser lido por software.

Geralmente, ao ligarmos o sistema, desejamos que o mesmo execute uma seqüência de funções de
inicialização, dividida em dois blocos, inicialização do sistema básico, que sempre ocorre no RESET,
e a inicialização do sistema montado, que prepara o equipamento para a operação para o qual foi
projetado, por exemplo, ajustando os contadores, as portas entre outros.

Embora estas funções sejam executadas pelo software que começa a rodar após o RESET, no en-
dereço 0000h da memória de programa, costumamos chamá-lo de rotina de inicialização.

O 89C2051 pode ser automaticamente resetado ao ligar a fonte, pela colocação de um resistor de
8,2 kΩ entre seu pino seu pino de RESET e o terra, e pela colocação de um capacitor (preferencial-
mente de tântalo) de 10 µF entre o pino e o +Vcc, o que garante que este pino estará em nı́vel alto
por mais de 2 ciclos de maquina após a ligação da alimentação, pois o capacitor comporta-se como
um curto-circuito, provocando uma circulação de corrente pelo resistor, que terá uma tensão inicial
da ordem de +Vcc.

Após algum tempo, o capacitor ”estará carregado”e não circulará mais corrente na resistência, e
desta forma a diferença de potencial sobre a mesma será nula, garantindo que o pino RST/VPP esteja
Página 22
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Figura 1.5: Mapa de Registradores e Valores de Reset do 8051

no nı́vel 0.

Na eventualidade de necessitarmos provocar o reset (reset forçado), basta então colocarmos uma
chave de contato momentâneo NA (push-botton NA) em paralelo com o capacitor, e ao pressiona-la
e soltá-la teremos provocado uma nova operação de reset.

Na entrada, o chip possui um Schmidt Trigger para garantir rejeição a ruı́do, sendo que a saı́da do
mesmo é amostrada a cada ciclo de maquina pelo hardware, para ver a ocorrência de reset.

Durante o reset, o nı́vel lógico dos pinos é indeterminado, indo a nı́vel lógico 1 ?após? a execução
da rotina interna de reset, de tal forma que devemos prever esta situação no projeto do hardware,
para evitar acionamento indesejável de qualquer periférico externo.

Página 23
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Figura 1.6: Circuito de reset

1.5.3 O Gerador de Clock


Temos duas possibilidades para excitar o sistema: clock externo ou clock interno.

O uso do clock externo ajuda a economizar componentes quando do uso do sistema junto de outros
que já possuam um sinal TTL que possa ser aproveitado, como por exemplo, para trabalho junto a
contadores e outros equipamentos seqüenciais rápidos.

Sua implementação é simples, bastando desconectar o pino 4 (XTAL2) (deixar em aberto), e inje-
tar o sinal externo no pino 5 (XTAL1), que desta forma irá diretamente para o sistema de controle e
temporização do chip (conforme a figura 1.7).

Figura 1.7: Clock Externo para o 8051

Se utilizarmos o clock gerado pelo oscilador interno, deveremos intercalar aos pinos XTAL1 e
XTAL2 um cristal ou um filtro cerâmico (o cristal e o mais indicado) na freqüência desejada, e dois
capacitores de realimentação conforme a figura 1.8

Os valores recomendados dos capacitores são os seguintes:

40 pF +/- 10 pF para filtro ressonante de cerâmica.


30 pF +/- 10 pF para cristal oscilador.
Em qualquer caso, a freqüência de oscilação mı́nima é de 3.5 MHz, é a máxima pode ser de 24
MHz conforme o modelo utilizado. Existem atualmente versões de outros fabricantes que trabalham
com freqüência de 30 MHz e superiores, sendo que o seu custo também é relativamente superior.

Página 24
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Figura 1.8: Oscilador Interno

Quanto ao layout do circuito deve-se destacar o fato de que as ligações devem ser mantidas as
mais curtas possı́veis, para evitar capacitâncias parasitas que venham a interferir no funcionamento
do circuito, assim como uma boa malha de terra deve ser providenciada em toda a placa.

Figura 1.9: Layout Recomendado para o Oscilador Interno

1.5.4 Interrupção
A interrupção é, provavelmente, uma das mais importantes ferramentas nos sistemas de controle
microprocessados, pois é o processo pelo qual a execução de um programa é interrompida (ou não),
de acordo com as necessidades de eventos externos ou internos.

Temos dessa forma, que existem três fontes de interrupção: a interrupção por Software (instrução),
a pedida por periférico externo e a interrupção pedida por periférico interno (timer/counter, porta
serial, etc. . .).

A interrupção é um sinal, gerado de uma das três formas acima descritas, que pede para a CPU
parar o processamento corrente e efetuar outro, referente à interrupção solicitada, desde que a mesma
esteja habilitada e possa ser aceita.

A vantagem da interrupção está na simplificação do Hardware, pois não precisamos fazer com que
nosso sistema fique monitorando o funcionamento de certos dispositivos periféricos. Por exemplo, nos
computadores didáticos simples, e mesmo em alguns sistemas industriais, o teclado é um periférico
que é lido constantemente pelo monitor do sistema, para verificar se alguma tecla foi ou não apertada.
Página 25
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Já nos computadores da linha IBM-PC, isso não ocorre, pois o teclado é um periférico inteligente, que
possui um microcontrolador interno que, caso uma tecla seja pressionada, pede uma interrupção ao
microprocessador para poder enviar o código da tecla pressionada para o mesmo.

Muitas vezes as entradas de interrupção são as principais entradas do sistema. Para o perfeito
entendimento das interrupções, devemos antes relembrar os seguintes conceitos:

a)Mascaramento

É a possibilidade de impedirmos, geralmente por Software, que uma certa interrupção seja atendida.
Existem sistemas que possuem interrupções não-mascaráveis, ou seja, jamais podem ser desabilitadas
por Software.

b)Prioridades

No caso do sistema poder atender mais de uma interrupção, devemos ter uma tabela de seqüência
de prioridades, para que o microprocessador saiba como agir, no caso de duas ou mais interrupções
chegarem simultaneamente.

c)Interrupção Vetorada e Não Vetorada

As interrupções vetoradas são aquelas que possuem o vetor de interrupção (endereço de inı́cio da
interrupção) fixo, e não pode ser mudado pelo usuário. É o caso do 8051, onde cada vetor de in-
terrupção já está definido pelo fabricante. As interrupções não vetoradas são aquelas nas quais os
endereços de desvios do programa são escolhidos pelo programador, como é o caso do COP 68705.U3
da Motorola, por exemplo.

d)Tipo de Ativação das Interrupções

Existem três maneiras pelas quais um sistema pode reconhecer um sinal lógico:

•Pelo nı́vel (alto ou baixo).


•Pela borda de subida ou de descida.
•Pela soma de borda (subida ou descida) e um nı́vel correspondente.

Estudo das Interupções no 8051


0 8051 pode ser interrompido de 5 maneiras:
1)Pela interrupção externa INTO\;

2)Pela interrupção externa INT1\;

3)Pelo timer/counter interno TIMER0;

4)Pelo timer/counter interno TIMER1;

5)Pelo canal de comunicação serial.

O canal serial e as interrupções externas usam alguns pinos da porta três, conforme a seguir:
1.Porta 3, pino 0 = Receptor de dados seriais (RX);
Página 26
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

2.Porta 3, pino 1 = Transmissor de dados seriais (TX);

3.Porta 3, pino 2 = Entrada da interrupção externa INTO\;.

4.Porta 3, pino 3 = Entrada da interrupção externa INT1\.

OBSERVAÇÃO: Dessa forma, se usarmos algumas dessas interrupções, devemos tratar a porta
três como porta de I/O apenas bit endereçável.

No 8051, cada interrupção pode ser individualmente habilitada ou não, e podemos também desabil-
itar todas de uma só vez.

As interrupções podem ter apenas dois nı́veis de prioridade, e dessa forma, se duas ou mais ocor-
rerem ao mesmo tempo (algo ”praticamente”impossı́vel), a de maior prioridade será atendida primeiro.

Caso uma interrupção de prioridade 0 (menor) esteja em andamento, uma interrupção de priori-
dade 1 (maior) interromperá aquela e será atendida. Ao seu fim, a CPU retorna ao atendimento da
interrupção de nı́vel 0 que foi interrompida.

Este Microcontrolador possui ainda um processo de prioridade interno, para o caso de duas inter-
rupções de mesma prioridade estarem aguardando atendimento.

Neste caso, esta é a ordem de atendimento das interrupções (IP):

1)Interrupção Externa 0 −→ Maior prioridade Timer 0

2)Interrupção Externa 1 Timer 1

Se a interrupção que chegar for de nı́vel igual ou menor da que já está sendo atendida, ficará
aguardando o fim desta para ser servida.

Quando atende uma interrupção, 0 8051 salva no Stack o valor do PC, ”mas não salva o acu-
mulador e o registro Program Status Word (PSW)”. Os mesmos devem ser salvos e devolvidos pela
rotina de interrupção, se assim for necessário, assim como qualquer outro registro importante.

Endereços de Desvio
Neste Microcontrolador, cada interrupção é desviada para um certo endereço fixo, no qual começa
a nossa rotina de interrupção.

São os seguintes os endereços de desvio:

1.INT0\ −→ 03h

2.Timer/Counter 0 −→ 0Bh

3.INT1\ −→ 13h

4.Timer/Counter 1 −→ 1Bh

Como vimos, o Reset inicia em 00h, e desta forma, por exemplo, se usarmos todas as interrupções
teremos que usar os três Bytes disponı́veis para o reset, num desvio incondicional para outra parte da
memória, onde realmente teria inı́cio o programa.

Página 27
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

As interrupções INT0\, Timer/counter 0, INT1\ e Timer/counter 1 possuem apenas 8 Bytes


disponı́veis antes de sobrepor se com a próxima, e desta forma, provavelmente, deveremos efetuar um
desvio para outra parte da memória, sendo a única exceção a interrupção do canal serial, que por ser
a última não se sobrepõe a nenhuma outra. Temos na figura 1.10, um mapa parcial da memória de
programa com destaque para os endereços de desvio de cada interrupção.

00h ←− Inicio
01h
02h
03h ←− End. de INT0\
04h
05h
06h Diferença de 8 bits
..
.
0Ah ↓
0Bh ←− End. do Timer/Counter 0
0Ch
0Dh
..
.
11h
12h
13h ←− End. de INT1\
14h
..
.
1Ah
1Bh ←− End. do Timer/Counter 1
1Ch
1Dh
..
.
22h
23h ←− End. do Canal Serial
24h
25h

Figura 1.10: Mapa parcial da memória de programa do 8051 com destaque ao inı́cio das interupções

Página 28
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

1.5.5 Registro de Controle das Interrupções


O 8051 possui dois registro de 8 bits cada um, na sua memória RAM mais alta (Registros de
Funções especiais-SFR) que servem para habilitação ou não das interrupções, e indica para a CPU a
prioridade de cada uma delas.

Sempre que uma interrupção é requisitada, um certo bit de controle dessa interrupção será setado
e assim permancerá até que essa interrupção seja atendida.

Exceção é a esta regra é a interrupção serial, que deve ter seu bit de controle resetado
pelo Software.

O primeiro de todos estes registros é o IE que tem por função indicar qual das interrupções está
ou não habilitada.Vejamos a figura 1.11

Bit 7 ... Bit 0


EA X X ES ET1 EXT1 ET0 EX0

Figura 1.11: Resgistro IE

EA - Enable All: Localizado no bit número 7, significa habilitar todos. Quando o em nı́vel 0,
desabilita todas as interrupções de forma geral, independente de qualquer outro controle. Se em nı́vel
1, permite-nos escolher qual interrupção em particular será habilitada, em função dos bits de controle
individuais a seguir.

ES: Enable Serial: Localiza-se no bit 4, significa habilitar a serial, quando em nı́vel lógico 1,
libera a interrupção pedida pelo canal serial.

ET1 - Enable Timer 1: Localiza-se no bit 3, significa habilitar a interrupção do timer 1 e quando
em nı́vel lógico 1, libera a interrupção pedida pelo Timer/Counter 1.

EX1 - Enable External 1: Localiza-se no bit 2, significa habilitar a interrupção externa (INT1\
e quando em nı́vel lógico 1, libera a interrupção pedida pelo dispositivo externo ligado a INT1\.

ET0 - Enable Timer 0: Localiza-se no bit 1, significa habilitar a interrupção do timer 0 e quando
em nı́vel lógico 1, libera a interrupção pedida pelo Timer/Counter 0.

EX1 - Enable External 0: Localiza-se no bit 0, significa habilitar a interrupção externa (INT0\
e quando em nı́vel lógico 1, libera a interrupção pedida pelo dispositivo externo ligado a INT0\.

Prioridade Natural das interrupções

1.INT0\

2.TIMER/COUNTER0

3.INT1\

4.TIMER/COUNTER1

5.Serial

Veremos agora o registro IP, nele fixaremos qual o nı́vel de prioridade de nossas interrupções. Ve-
jamos o formato deste registro.

PS: Priority Serial: Localiza-se no bit 4, significa prioridade serial, quando em nı́vel lógico 1,
indica prioridade alta à interrupção gerada pelo canal serial, se a mesma estiver habilidade. Quando
Página 29
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Bit 7 ... Bit 0


X X X PS PT1 PX1 PT0 PX0

Figura 1.12: Resgistro IP

em nı́vel 0, indica prioridade baixa.

PT1 - Priority Timer 1: Localiza-se no bit 3, significa prioridade do timer 1 e quando em


nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo Timer/Counter 1, se a mesma estiver
habilidade. Quando em nı́vel 0, indica prioridade baixa.

PX1 - Priority External 1: Localiza-se no bit 2, significa habilitar a interrupção externa (INT1\
e quando em nı́vel lógico 1, indica prioridade alta à interrupção externa 1, se a mesma estiver habili-
dade. Quando em nı́vel 0, indica prioridade baixa.

PT0 - Priority Timer 0: Localiza-se no bit 1, significa prioridade do timer 0 e quando em


nı́vel lógico 1, indica prioridade alta à interrupção gerada pelo Timer/Counter 0, se a mesma estiver
habilidade. Quando em nı́vel 0, indica prioridade baixa.

PX1 - Priority External 0: Localiza-se no bit 0, significa habilitar a interrupção externa (INT0\
e quando em nı́vel lógico 1, indica prioridade alta à interrupção externa 0, se a mesma estiver habili-
dade. Quando em nı́vel 0, indica prioridade baixa.

Página 30
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Veremos como é o registrador PSW (Program Status Word)


Lembrando que neste registrador representa o status da última operação realizada no acumulador,
vejamos a seguinte figura 1.13

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0
CY AC F0 RS1 RS0 OV - P

Figura 1.13: Resgistros bit a bit do PSW

CY - Carry É um indicador de ”vai um”em operações aritméticas: vai para 1 quando uma soma
com A ”estoura”na sua capacidade (isto é, o sétimo bit ou ACC.7 vai um para uma próxima casa que
não existe; seria um nono bit, que é um ”estouro”da conta). Vai para ”1”se existir um empréstimo do
7 bit no caso de uma subtração com o acumulador.
Por exemplo:
Se ACC=FFh e após isto aparece a instrução: acc A,#01h: A soma de FFh com 01h fará com que
o resultado de A seja 00h e ”vai 1”para o carry, isto é,”CY”é setado no registrador PSW.
O carry ”CY”também é utilizado como se fosse o ”acumulador para um só bit”. Existem várias
instruções booleanas que usam o ”C”, isto é, o carry, como operando, em que se posiciona o resultado
das operações. Por exemplo:
anl C,ACC.0: Executa um AND booleano entre o carry e o bit ACC.0. O resultado da operação
fica em ”C”(ele é equivalente ao acumulador para operação com bytes), isto é, o resultado volta para
ele mesmo.
AC - Auxiliary Carry É um indicador de ”vai um”entre os quatro primeiros bit do acumulador,
isto é, é o ”vai um”de um ”nible”para outro ”nible”do acumulador.
Isto é muito útil em aritmética BCD em que os nibbles que correspodem a 4 bits são representados
por um número codificado em binário, mas que representa um decimal de 0 a 9.

Flag 0 É um bit registrador de uso geral, não tem nenhuma função especial e não indica nada.(literalmente
”sobrou”dentro do PSW, sem função)

RS1 e RS0 São dois bits que fazem mudar o banco de registradores a que se referem os nomes
R0 a R7, utilizados nas instruções que trabalham com esses registradores (por ex.: mov A,R0 = move
para o ”A”o conteúdo de ”R0”; mas qual R0? Os bits RS0 e RS1 é que dizem a qual R0 de qual banco
está se referindo).Vejamos na tabela 1.4

RS1 RS0 BANCO


0 0 Banco 0
0 1 Banco 1
1 0 Banco 2
1 1 Banco 3

Tabela 1.4: Seleção do banco de registradores pelos bit do PSW

Quando se dá o reset da máquina, ele aponta para o banco 0, isto é, as instruções que se referirem
a R0,R1,. . .R7 estão se referindo ao ”Rn”do banco O. Podemos utilizar a mudança de bancos e usar os
mesmos apelidos de R0 a R7 para o outro banco, ou usar o endereço absoluto de cada registrador. Em
geral, deixa-se que o microcontrolador aponte para o banco 0 direto e os outros registradores utilizam
os endereços absolutos deles, só para não ter i trabalho de mudar toda hora de banco. Isto depende
do gosto do programador.Quando se ”reseta”a máquina, os bits RS1 e RS0 ficam em 00h,
isto é, estão se referindo ao banco 0.

Página 31
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

OV É um bit que vai para 1 quando, após um adição ou subtração, acontece um ”estouro”da
conta. Resultados maiores que +127 ou menores que -128 ”setarão”o bit ”OV”. Paor exemplo:

0F ⇒ +15
+7F ⇒ +127
8E e ”OV” +142

Note que 8E é -116, que não é a resposta desejada +142, por isto OV é setado.

PSW.1 Não é um bit disponı́vel ao usuário.

P - Parity Bit que é ”setado”em ”1”quando a paridade do conteúdo do acumulador é par.


Por exemplo, seja A, contendo os seguintes dados:
Observação: Paridade é o resultado par ou ı́mpar do somatório binário do acumulador.

N de ”1s” = Ímpar
A= 1001 1110 −→ P=1

N de ”1s” = Ímpar
A= 1001 1111 −→ P=0

É útil quando se trabalha com o canal serial, pois ele muitas vezes necessita desta informação. Outra
maneira de saber se P é ”1”ou ”0”, é pensar que a soma dos bits ”1”do acumulador mais o
”P”tem sempre que ser par.

1.5.6 Tempo para Atendimento das Interrupções


Um certo tempo decorrerá entre o reconhecimento da interrupção, alterações nos registros internos
e efetivo desvio para o endereço. O melhor caso ocorre quando uma interrupção chega pouco antes
dos últimos 14 perı́odos de clock, que correspondam ao final da instrução; a próxima instrução não
seja multiplicação ou divisão; e temois mais 24 perı́odos de clock para a chamada da sub-rotina. Estes
tempos incorrem em atraso de 38 perı́odos de clock ou 3.2 µs para um clock de 12 MHz.

O pior caso ocorre se a interrupção chegar após os 14 últimos perı́odos da instrução em vigor, e
se a próxima instrução for multiplicação ou divisão, que consomem 48 perı́odos de clock, que resulta
num atraso de 86 perı́odos, ou 7.2 µs para clock de 12 MHz.

1.5.7 Ajuste das Interrupções Externas para serem Ativas em Nı́vel ou Transição
Podemos ajustar as interrupções externas para serem detectadas por transição de 1 para 0, ou pelo
nı́vel 0. Os bits de controle das interrupções externas estão no registro TCON (Controle do Timer),
e os que nos interessam são os quadro bits menos significativos.

Bit 7 ... Bit 0


IE1 IT1 IE0 IT0

Figura 1.14: Resgistro TCON com os bits relevantes às interrupções

IT0 - Interrupção Externa 0 (INT0\) : Localizado no bit 0 do TCON, indica qual o processo
para a chamada da interrupção INT0\ será aceita na transição de 1 para 0 do nı́vel pino, devendo
permanecer em 0 por pelo menos 12 perı́odos de clock. Se em nı́vel 0, INT0\ será aceita apenas pelo
nı́vel 0 presente no pino.

Página 32
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

IE0 - Habilitação da Interrupção Externa 0 (INT0\): Bit para o hardware de controle da


interrupção INT0\, localiza-se no bit 1. Este bit é setado pelo Hardware interno quando for detec-
tada uma transição de 1 para 0 no pino INT0\. Tem por função sinalizar internamente o pedido da
interrupção. É resetado logo que a interrupção seja atendida.

IT1 - Interrupção Externa 1 (INT1\) : Localizado no bit 2 do TCON, indica qual o processo
para a chamada da interrupção INT1\ será aceita na transição de 1 para 0 do nı́vel pino, devendo
permanecer em 0 por pelo menos 12 perı́odos de clock. Se em nı́vel 0, INT1\ será aceita apenas pelo
nı́vel 0 presente no pino.

IE1 - Habilitação da Interrupção Externa 1 (INT1\): Bit para o hardware de controle da


interrupção INT1\, localiza-se no bit 3. Este bit é setado pelo Hardware interno quando for detec-
tada uma transição de 1 para 0 no pino INT1\. Tem por função sinalizar internamente o pedido da
interrupção. É resetado logo que a interrupção seja atendida.

Como vimos, se a interrupção for ativa pela transição, é a esta que a CPU deverá detectar para aten-
der à interrupção, por isso temos que esperar um perı́odo de 12 ciclos de clock, porque na amostragem
anterior, a CPU detectou nı́vel 1 e agora devemos esperar que a mesma detecte o nı́vel 0.

Já na detecção por nı́vel, a entrada deverá estar em nı́vel 0, apenas durante a amostragem que
ocorre ao fim de cada instrução executada. O interessante é que neste caso, o pino pode permanecer
em nı́vel 0 durante a execução da rotina de interrupção, mas deve estar em nı́vel 1 ao fim desta, senão
o sistema atenderá novamente à interrupção, visto que na amostragem da última instrução da rotina,
encontrará este pino em nı́vel adequado para a interrupção, o que não ocorre no caso anterior, pois lá
a CPU deve sentir a TRANSIÇÃO do nı́vel 1 para o O.

1.5.8 Hardware para expandir as possibilidade de Interrupção Externa


Na figura 1.15, temos uma porta AND de 8 entradas na qual todas as NOVAS 8 entradas de inter-
rupção estarão ligadas. Estas 8 entradas também estão ligadas a um lacth, por exemplo o 74LS374.

A saı́da desta porta será ligada diretamente ao pino de interrupção externa INT0\, por exemplo,
e também a um inversor, e daı́ ao ”gate”do lacth, e as saı́das do lacth estão ligadas à porta P1.

Caso ocorra uma transição de 1 para 0 na porta AND, teremos sua saı́da indo para o nı́vel 0
também, ocasionando o pedido de interrupção e ”travando”o estado dos pinos I1 a I8 no lacth.cc
No momento do atendimento da interrupção, o valor a ser lido na porta P1 conterá o estado dos
bits que geraram a interrupção, e uma rotina verificará qual bit está em 0. Este bit é responsável pelo
pedido de interrupção, e basta ao Software encarregar-se de executar a rotina apropriada.

Página 33
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi


+Vcc


     

I8 

 

7430


 

INT0\



I1

8051

D0 Q0 P1.0
D1 Q1
D2
74LS374 Q2
D3 Q3
D4 Q4
D5 Q5
D6 Q6 P1.7
D7 Q7

Figura 1.15: Detalhe do Hardware para expandir o número de interrupções.

1.5.9 Exercı́cios Resolvidos


Questão 1 No microcontrolador da famı́lia 8051, programar as palavras IE (Interrupt Enable),
IP (Interrupt Priority) e TCON (Timer Control) de modo a:
a)INT1\ seja habilitado na máxima prioridade.
b)Timer/Counter1 seja habilitado em segunda prioridade.
c)INT0\ seja habilitado na terceira prioridade.
d)Serial e Timer/Counter0 não habilitadas.
Passo a):Interrupções liberadas pela palavra IE
INT0,INT1 e Timer1 liberados
Bit EA - Enable All ligado
Timer0 e Serial desativadas

EA - - ES ET1 EX1 ET0 EX0


1 0 0 0 1 1 0 1

Assim carrega-se o valor 8Dh para a palavra IE através do seguinte comando:


MOV IE,8Dh

Pbsso b):Prioridade programadas pela palavra IP


INT1 e Timer1: alta prioridade
INT0: baixa prioridade
Página 34
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

- - - PS PT1 PX1 PT0 PX0


- - - X 1 1 X 0

Questão 2 Obter a outra representação do endereço do bit 5Dh? (Ver tabela 1.2) Solução:

•Transformar o endereço do bit de hexadecimal para decimal 5 ∗ 16 1 + 13 ∗ 160 = 9310

•Dividir o valor do endereço em decimal (93 10 ) por 8 → 93/8, obtendo o quociente q=11 10 e o
resto r=510

•Transformar o quociente (q) e o resto (r) em hexadecimal: q=11 10 =Bh e r=510 =5h.

•Aplicar a fórmula: 5Dh = [20h+Bh]h.5=2Bh.5, ou seja, o endereço do bit 5 é igual a 2Bh.5.

Para transformar o endereço de um bit da representação 2Xh.Y para ZWh(2Xh.Y−→ZWh),basta


seguir o procedimento:

•Obter o quociente e o resto. O quociente (q) é obtido subtraindo 2Xh de 20h e transformando-o
em decimal, e o resto é obtido através do número após o ponto (.) de tal representação. Multi-
plicando o quociente em decimal por 8 e somando com o resto em decimal, obtém-se o endereço
em decimal. O valor do endereço em decimal deve ser transformado para hexadecimal.

Questão 3 Obter a outra representação do endereço do bit 2Ah.3? (Ver tabela 1.2)

•Obter o quociente (q) e o resto (r): q= 2Ah - 20h = Ah e r=3h.

•Transformar q e r de hexadecimal para decimal:


q=Ah = 1010 e r 3h = 310

•Multiplicar o quociente por 8 e somar o resultado com o resto em decimal: 10*8+3=83 10

•Transformar o endereço de decimal para hexadecimal: 83 10 = 5 ∗ 161 + 3 ∗ 160 =53h

Questão 4 Defina o tipo de endereçamento de cada uma das instruções dadas a seguir:

a)ADDC A,20h
Resposta: Endereçamento direto.

b)MOV @R0,55h
Resposta: Endereçamento combinado (misto), formado pelos endereçamentos direto e indireto ou
indexados por registrador.

c)MOV R7,6Ah
Resposta: Endereçamento indireto, pois R7 (Rn) é um registrador indexado (mnemônico).

Questão 6 Crie um programa que faça a operação OR-Exclusivo entre o conteúdo do acumulador
(A) e a constante 33h. O resultado deve ser armazenado no conteúdo do registrador R5 do segundo
banco de registradores.
Resposta:
XRL A,#33h (A)←−(A)or-ex #33h
MOV PSW,#08h (PSW)←−#08h=#00001000 =⇒ (RS1)=0 e (RS0)=1=⇒ define o se-
gundo banco de registradores (B1).
MOV R5,A Armazena, no conteúdo do registrador R5 do segundo banco de reg-
istradores, o conteúdo do acumulador A.

Página 35
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

1.5.10 Conjunto de Instruções


Instruções Aritméticas
Opcode Bytes Clocks Flags Afetados
Mnemônico Função
CY AC OV
ADD A,Rn Soma o conteúdo de Rn ao acumu- 0010/1 B 1 12 ? ? ?
lador abc
ADD A,Direto Soma o conteúdo da posição de 25 H 2 12 ? ? ?
memória ao acumulador
ADD A,@Ri Soma o conteúdo da RAM en- 0010/011iB 1 12 ? ? ?
dereçada por Ri ao acumulador
ADD A,DADO Soma o dado ao acumulador 24 H 2 12 ? ? ?
ADDC A,Rn Soma o conteúdo de Rn e o carry ao 0011/1 B 1 12 ? ? ?
acumulador abc
ADDC Soma o conteúdo da posição de 35 H 2 12 ? ? ?
A,DIRETO memória e o carry o acumulador
ADDC A,@Ri Soma o conteúdo da RAM en- 0011/011iB 1 12 ? ? ?
dereçada por Ri e o carry ao acu-
mulador
ADDC Soma o dado e o carry ao acumu- 34 H 2 12 ? ? ?
A,#DADO lador
SUBB A,Rn Subtrai o conteúdo de Rn e o Bor- 1001/1 B 1 12 ? ? ?
row do acumulador abc
SUBB Subtrai o conteúdo da posição de 95 H 2 12 ? ? ?
A,DIRETO memória e o Borrow do acumulador
SUBB A,@Ri Subtrai o conteúdo da RAM en- 1001/011iB 1 12 ? ? ?
dereçada por Ri e o Borrow do acu-
mulador
SUBB Subtrai o dado e o Borrow do acu- 94 H 2 12 ? ? ?
A,#DADO mulador
INC A Soma 1 ao acumulador 04 H 1 12 - - -
INC Rn Soma 1 ao conteúdo de Rn 0000/1 B 1 12 - - -
abc
INC DIRETO Soma 1 á posição de memória 05 H 2 12 - -
INC @Ri Soma 1 á RAM endereçada por Ri 0000/011 B 1 12 - - -
i
DEC A Subtrai 1 do acumulador 14 H 1 12 - - -
DEC Rn Subtrai 1 do conteúdo de Rn 0001/1 B 1 12 - - -
abc
DEC DIRETO Subtrai 1 da posição de memória 15 H 2 12 - - -
DEC @Ri Subtrai 1 da RAM endereçada por 0001/011 B 1 12 - - -
Ri i
INC DPTR Soma 1 ao registrador DPTR A3 H 1 24 - - -
MUL AB Multiplica A e B resultado: BA A4 H 1 48 0 - ?
DIC AB Divide A e B resultado: A inteiro B 84 H 1 48 0 ? 0
resto
DA A Ajuste decimal do acumulador D4 H 1 12 ? ? -

Página 36
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Operações Lógicas
Opcode Bytes Clocks Flags Afetados
Mnemônico Função
CY AC OV
ANL A,Rn ”e”entre registro e acumulador 0101/1 B 1 12 - - -
abc
ANL A,DIRETO ”e”entre memória e acumulador 55 H 2 12 - - -
ANL A,@Ri ”e”entre RAM indireta e acumu- 0101/011iB 1 12 - - -
lador
ANL A,#DADO ”e”entre dado e acumulador 54 H 2 12 - - -
ANL DIRETO,A ”e”entre acumulador e memória. 52 H 2 12 - - -
Resultado na memória
ANL DI- ”e”entre dado e memória 53 H 3 12 - - -
RETO,#DADO
ORL A,Rn ”ou”entre registro e acumulador 0100/1 B 1 12 - - -
abc
ORL A,DIRETO ”ou”entre memória e acumulador 45 H 2 12 - - -
ORL A,@Ri ”ou”entre RAM indireta e acumu- 0100/011iB 1 12 - - -
lador
ORL A,#DADO ”ou”entre DADO e acumulador 44 H 2 12 - - -
ORL DIRETO,A ”ou”entre acumulador e memória. 42 H 2 12 - - -
Resultado na memória
ORL DI- ”ou”entre DADO e memória 43 H 3 12 - - -
RETO,#DADO
XRL A,Rn ”ou exclusivo”entre registro e acu- 0110/1 B 1 12 - - -
mulador abc
XRL A,Direto ”ou exclusivo”entre memória e acu- 65 H 2 12 - - -
mulador
XRL A,@Ri ”ou exclusivo”? entre RAM indireta 0110/011iB 1 12 - - -
e acumulador
XRL A,#DADO ”ou exclusivo”entre dado e acumu- 64 H 2 12 - - -
lador
XRL DIRETO,A ”ou exclusivo”entre acumulador e 62 H 2 12 - - -
memória. Resultado na memória
XRL DI- ”ou exclusivo”entre dado e memória 63 H 3 12 - - -
RETO,#DADO
CRL A Faz A = 0 E4 H 1 12 - - -
CPL A Inverte o estado dos bits do acumu- F4 H 1 12 - - -
lador
RL A Desloca o acumulador à esquerda 23 H 1 12 - - -
RL C Desloca o acumulador à esquerda 33 H 1 12 ? - -
através do carry
RR A Desloca acumulador à direita 03 H 1 12 - - -
RRC A Desloca acumulador à direta através 13 H 1 12 ? - -
do carry
SWAP A Troca os nibbles do acumulador. C4 H 1 12 - - -
Equivale a 4 RR A ou 4 RL A

Página 37
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Operações de Transferência de Dados

Opcode Bytes Clocks Flags Afetados


Mnemônico Função
CY AC OV
MOV A,Rn Move o registro para o acumulador 1110/1 B 1 12 - - -
abc
MOV A,Direto Move memória para o acumulador E5 H 2 12 - - -
MOV A,@Ri Move RAM endereçada por Ri ao 1110/0111B 1 12 - - -
acumulador
MOV A,#DADO Move o dado para o acumulador 74 H 2 12 - - -
MOV Rn,A Move o acumulador para o registro 1111/1 B 1 12 - - -
abc
MOV Rn,Direto Move memória para o registro 1010/1 B 2 24 - - -
abc
MOV Move o dado para o registro 0111/1 B 2 12 - - -
Rn,#DADO abc
MOV Direto,A Move acumulador para a memória F5 H 2 12 - - -
MOV Direto,Rn Move o registro para a memória 1000/1 B 2 24 - - -
abc
MOV Di- Mova o conteúdo da memória Di- 85 H 3 24 - - -
reto1,Direto2 reta2 para Direta1
MOV Direto,@Ri Move RAM endereçada por Ri para 1000/011iB 2 24 - - -
a memória
MOV Di- Move o dado para a memória 75 H 3 24 - - -
reto,#DADO
MOV @Ri,A Move o acumulador para a RAM en- 1111/011iB 1 12 - - -
dereçada por Ri
MOV @Ri,Direto Move a memória para a RAM en- 1010/011iB 2 24 - - -
dereçada por Ri
MOV Move o dado para a RAM indireta 0111/011iB 2 12 - - -
@Ri,#DADO
MOV Move dado de 16 bits para o DPTR 90 H 3 24 - - -
DPTR,#DADO16
MOVC A, @A + Soma A + DPTR obtendo um en- 93 H 1 24 - - -
DPTR dereço de 16 bits na memória de pro-
grama. Carrega acumulador com
esta memória
MOVC A, Idem ao anterior, mas soma A + PC 83 H 1 24 - - -
@A+PC
MOVX A,@Ri Move RAM externa (End. 8 bits) 1110/001iB 1 24 - - -
para o acumulador
MOVX A, Move RAM externa (End. 16 bits) E0 H 1 24 - - -
@DPTR para o acumulador
MOVX @Ri, A Move o acumulador para a RAM ex- 1111/001iB 1 24 - - -
terna (End. 8 bits)
MOVX @DPTR, Move o acumulador para a RAM ex- F0 H 1 24 - - -
A terna (End. 16 bits)

OBS: Continua na próxima página . . .

Página 38
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Opcode Bytes Clocks Flags Afetados


Mnemônico Função
CY AC OV
PUSH Direto Incrementa o SP e então coloca a C0 H 2 24 - - -
memória no stack
POP Direto Retira dado do stack e coloca na D0 H 2 24 - - -
memória, depois decrementa SP
XCH A,Rn Troca entre si o conteúdo do acumu- 1100/1 B 1 12 - - -
lador e do registro abc
XCH A,Direto Troca memória com acumulador C5 H 2 12 - - -
XCH A,@Ri Troca RAM indireta com acumu- 1100/011iB 1 12 - - -
lador
XCHD A,@Ri Troca nibble menos significativo do 1101/011iB 1 12 - - -
acumulador e da RAM indireta en-
tre si

Instruções para Variáveis Booleanas


Opcode Bytes Clocks Flags Afetados
Mnemônico Função
CY AC OV
CLR C Zera o Carry C3 H 1 12 0 - -
CLR bit Zera o bit endereçado C2 H 2 12 - - -
SETB C Seta o carry D3 H 1 12 1 - -
SETB bit Seta o bit endereçado D2 H 2 12 - - -
CPL C Inverte o estado do carry B3 H 1 12 ? - -
CPL bit Inverte o estado do bit endereçado B2 H 2 12 - - -
ANL C,bit ”e”entre o bit endereçado e o carry 82 H 2 24 ? - -
ANL C,/bit ”e”entre o complemento do bit en- B0 H 2 24 ? - -
dereçado e o carry
ORL C,bit ”ou”entre o bit endereçado e carry 72 H 2 24 ? - -
ORL C,/bit ”ou”entre o complemento do bit en- A0 H 2 24 ? - -
dereçado e o carry
MOV C,bit Move o bit endereçado para o carry A2 H 2 12 ? - -
MOV bit,C Move o carry para o bit endereçado 92 H 2 24 - - -
JC rel Desvia se o carry estiver setado 40 H 2 24 - - -
JNC rel Desvia se o carry estiver zerado 50 H 2 24 - - -
JB bit,rel Desvia se o bit endereçado estiver 20 H 3 24 - - -
setado
JNB bit,rel Desvia se o bit endereçado estiver 30 H 3 24 - - -
zerado
JBC bit,rel Desvia se o bit endereçado estiver 10 H 3 24 - - -
setado e depois zera o bit

Página 39
Microprocessadores e Microcontroladores - 1a Unidade - Prof. Vitor Leão Filardi

Instruções de Desvio
Opcode Bytes Clocks Flags Afetados
Mnemônico Função
CY AC OV
ACALL END11 Chama sub-rotina numa faixa de - - 2 24 - - -
2kbytes da atual posição
LCALL END16 Chama sub-rotina em qualquer 12 H 3 24 - - -
posição da memória de programa
RET Retorne da sub-rotina 22 H 1 24 - - -
RETI Retorne da interrupção 32 H 1 24 - - -
AJMP END11 Desvia para outro endereço numa - - 2 24 - - -
faixa de 2kbytes da atual posição
LJMP END16 Desvia para qualquer posição da 02 H 3 24 - - -
memória de programa
SJMP rel Desvio curto relativo 80 H 2 24 - - -
JMP @A + Desvia para o endereço obtido da 73 H 1 24 - - -
DPTR soma do acumulador e do DPTR
JZ rel Desvia se o acumulador for zero 60 H 2 24 - - -
JNZ rel Desvia se o acumulador não for zero 70 H 2 24 - - -
CJNE A,Direto, Compara e desvia se o acumulador B5 H 3 24 ? - -
rel for diferente da memória endereçada
CJNE Compara e desvia se o acumulador B4 H 3 24 ? - -
A,#Dado,rel for diferente do dado
CJNE Compara e desvia se o registro for 1011/1 B 3 24 ? - -
Rn,#Dado,rel diferente do dado abc
CJNE Compara e desvia se a RAM indi- 1011/011iB 3 24 ? - -
@Ri,#Dado, reta for diferente do dado
rel
DJNZ Rn, rel Decrementa o registro e desvia se for 1101/1 B 2 24 - - -
diferente de zero abc
DJNZ Direto, rel Decrementa a memória e desvia se D5 H 3 24 - - -
for diferente de zero
NOP Nenhuma Operação 00 H 1 12 - - -

Página 40
Capı́tulo 2

Segunda Unidade

Dispositivos do 8051

2.1 Ciclos de Máquina


Como vimos na unidade passada o clock é o relógio interno do microprocessador para a execução
sequencial de qualquer atividade interna ou externa à máquina, ou seja, é o elemento que gera e con-
trola os ciclos de trabalho da máquina. Cada ciclo de oscilação chamaremos de ”P”de pulso. A cada
dois pulsos ”P”caracteriza-se um estado ”S”. Uma sequência de seis estados, S1 a S6, corresponde a
um ciclo de máquina. Todas as atividades internas e externas do microprocessador são comandadas
por esses pulsos e seus seis estados.

Um ciclo de máquina se constitui de seis estados (S1 a S6) que, por sua vez, correspondem a
doze pulsos P do ”clock”.

1 Ciclo de Maquina

Estados

S1 S2 S3 S4 S5 S6

P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2

1 Estado 2 Pulsos X

Figura 2.1: Ilustração de um ciclo de máquina do MSC8051

Por exemplo, o instante marcado como ”X”na figura é o ”S6P1”. Assim podemos ter um linguagem
comum de definição de instantes de um ciclo de máquina. Cada pulso P1 depende da frequência do
clock. Por exemplo, se o circuito oscilador for a cristal de 12MHz, teremos um ciclo de máquina = 12
x (Perı́odo de Clock) = 12 x (1/12*10 6 )= 1µs.
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

2.2 Portas de I/O


Temos no 8051 quatro grupos de saı́das denominados de PORTS, são eles P0,P1,P2 3 P3, com-
forme a versãoo do 8051 utilizado. No 8051 (ROM Interna) temos todos os quatro ports disponı́veis;
no 8031 (EPROM Externa) só temos os ports P1 e P3 disponı́veis como ”I/O”. Cada port tem oito lin-
has que podem ser programadas como entrada ou como saı́da, ou trabalhar com os periféricos internos.

2.2.1 Princı́pio de Funcionamento e Utilização


O uso das linha de I/O é simples e necessita apenas de que escrevamos o valor desejado (na caso
de utilização como saı́da), ou efetuarmos a leitura (no caso de entrada). Se o dado presente numa
porta configurada como entrada variar, a variação não será sentida pelo sistema, até que efetuemos
uma nova leitura dessa entrada.

Isto ocorre porque cada linha é, na realidade, um Buffer tri-state de um bit. Já no caso da escrita,
temos associado a esta linha um flip-flop D (latch) de um bit.

Na figura 2.2, temos um esquema simplificado de um bit de I/O, que nos ajudará a compreender
o funcionamento da porta. Os circuitos reais são ligeramente diferentes para cada uma das portas, e
mais complexos do que o apresentado aqui, mas para fins ditáticos e de entendimento este diagrama
básico é suficiente.

LE LATCH

VIA DE
DADOS D Q
INTERNA +

PINO
ESCREVE CLK Q

LE PINO

Figura 2.2: Diagrama em blocos simplificado de um pino de I/O

Quando escrevemos um bit na porta, o mesmo vai pela via interna até a entrada D do flip-flop, e
então um pulso de clock em CLK coloca este bit em Q, que através da eletrônica associada leva este
nı́vel ao pino externo.

Já no caso da leitura, algumas instruções lêem o pino enquanto outras lêem o estado do latch, em Q.

As instruções que lêem o latch são aquelas que costumam ler, modificar e reescrever o bit, a saber
: INC, DEC, CPL, JBC, DJNZ, ANL, ORL, XRL, MOV Px.n,C, CLR Px.n e ainda SETB Px.n,
conforme vimos na unidade anterior.

As demais instruções de acesso aos ports lêem o estado presente nos pinos. E dai, qual a diferença
então?

Vamos supor que temos a base de um transistor NPN sendo acionada pelo pino de I/O. Quando
escrevemos 1 neste pino o transistor entrará em condução, e se a CPU ler o estado deste pino para
eventual confirmação, lerá a tensão na base do transistor e interpretará como nı́vel ZERO, então neste
Página 42
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

caso deve ser lido o valor de latch, que estará corretamente indicando nı́vel UM.

Um exemplo simples de conexão das linhas seria um sistema que em função de um certo bit, por
exemplo o bit 5 da porta 3 (escrito como P3.5), fará com que os leds colocados nos 8 pinos da porta
1 sejam acesos sequencialmente, conforme o estado daquele bit. Na figura 2.3, temos um diagrama
simples para este exemplo, e a seguir o Software simbólico para esta função.

Página 43
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

+ + +

P1.0

P1.1

8051 P1.7

P3.5

Figura 2.3: Exemplo simples de utilização

SOFTWARE SIMBÓLICO
Inicio:
Faz acu-
mulador =
00000001
binário
Lebit:
Se P3.5 = 0
então
roda acumulador à esquerda (coloca o bit D0 em D1, e assim
por diante, até colocar o bit D7 em D0).
move acumulador para a porta 1
perde um tempo
volta para ”lebit”
Senão (só pode
ser P3.5 =1)
roda acumulador à direita (coloca o bit D7 em D6, e assim
por diante, até colocar o bit D0 em D7).
move acumulador para a porta 1
perde um tempo
volta para ”lebit”

Página 44
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Port P0

O P0 é uma estrutura de port bidirecional. Um certo pino ”i”do port Po é tomado como ilus-
tração. O barramento interno do MC é utilizado para ler/escrever no latch interno, ou ler o pino fı́sico
”P0.i”em questão. Quando se utiliza uma instrução que ”escreve”um valor no Port P0.i, o dado se
apresenta na entrada D do flip-flop. Um pulso de ”escreve”(o ”CLK”do flip-flop) é imposto no fli-flop,
que transfere esse dados às saı́das ”Q”e ”Q”do latch.

O sinal de ”controle”atua para permitir que esse dado saia fisicamente no pino P0.i. Este sinal
de controle simboliza o gerenciamento que esse port tem para apresentar o dado fisicamente à saı́da.
Existem instruções que lêem o conteúdo armazenado no latch. Existem instruções que lêem o estado di-
retamente do pino. Em geral, as instruções que ”lêem o latch”são do tipo ”READ-MODIFY-WRITE”,
isto é, lê o conteúdo do latch, modifica conforme a instrução imposta e escreve de novo no latch. São
as instruções INC, DEC, CPL, JBC, DJNZ, ANL, ORL e XRL.

Quando P0 é usado como port, é como se ele fosse ”dreno aberto”, isto é, devemos utilizar resistores
de ”Pull-Up”nesses pinos para podermos excitar devidamente o ambiente externo ao MC. Quando ele
é usado apenas para controle de memória externa, esses resistores não são necessários, e neste caso o
port P0 é visto como um port ”Tri-State”.

O port P0 é multiplexado entre ”dados”e ”endereços”quando gerencia memória externa e, então,


utiliza o pino ALE para captar o endereço em um latch externo ao MC.

Port P1

Para finalizar este item, basta dizer que as possibilidades de uso destas linha de I/O são pratica-
mente ilimitadas, ficando a cargo do projestista desenvolver novas aplicações para tal.

Os ports 1,2 e 3 possuem pull-ups internos e são chamadas de quase bidirecionais. Esta carac-
terı́sticas faz com que seus pinos tenham sempre um estado definido, ou seja, 0 ou 1, de forma que
mesmo quando as usamos como entrada, podemos medir seu nı́vel como se fosse de saı́da. Os ports
P1 e P3 podem ser configurados, pino a pino (bit a bit), ou totalmente (byte) como entrada ou saı́da.
Não se pode esquecer que o port P3 é utı́lizado como meio de comunicação externa entre os periféricos
”Timers”e ”Serial”e então os pı́nos só estarão disponı́veis para I/0, dependendo de utilizar ou não os
periféricos desse Mc.

O port 0 não possui estas caracterı́sticas, e quando configurada como entrada, terá seu nı́vel flu-
tuando na ausência de nı́vel fixo no pino. Entretanto, para todos os efeitos de uso, podemos considerar
as portas como simples portas de I/O bidirecionais como veremos a seguir.

2.2.2 Caracterı́sticas Gerais e de Tempo dos Ports


Instruções que Alteram diretamente o Conteúdo dos Ports

É necessário ter cuidado com as instruções do tipo ”Read-Modify-Wrı̀te”citadas neste item, quando
são manipuladas diretamente com os ports. Por exemplo, a operação:

orl P1,#11111110b ; vai executar a leitura do Port P1 pelo ”latch”, vai operar a instrução
”OR”com o dado e devolver o resultado em P1.

Se a intenção é só realizar uma ”máscara”para ler o bit ”P1.0”, esta instrução está sendo mal apli-
cada, pois ela, além de realizar a máscara, pos valor ”1”em todos os outros bits do port P1, alterando
seus valores originais!

Página 45
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Assim, se queremos só uma ”máscara”, devemos operar ”fora de P1”, isto é:
mov A,Pi ;lê P1 e carrega em A
orl A,11111110b ;faz a ”máscara”sem alterar P1

Esta e outras instruções abaixo listadas correm este ”perigo”de utilização e precisamos saber ex-
atamente o que queremos antes de aplicá-las direto aos ports:

Instrução e Forma Básica Funçâo Exemplo


INC INC P1
DEC DEC P3
CPL CPL P1
JBC JBC P1.0,#XX
DJNZ DJNZ P1,#XX
ANL ANL PO,A
ORL ORL PO,A
XRL XRL P1,#XX

Tabela 2.1: Instruções que afetam diretamente os ports quando aplicadas junto a eles.

Condições de Tempo Envolvendo os Ports

Cada pino do port é amostrado perto da ”descida”do pulso ”ALE”no instante de leitura de in-
strução, entre o perı́odo S5 do ciclo de máquina. É possı́vel que, se o pino, neste instante, estiver em
transição, o Mc possa ler dado errado. Quando se ”escreve”um dado no latch do pino do port, ele já
aparece efetivamente na saı́da do latch durante o perı́odo S6P2 do último ciclo de máquina necessário
para finalização da referida instrução. Assim, só aparecerá fisicamente no pino, no instante S1P1 do
próximo ciclo de máquina.

Observe que só se pode ler com confiabilidade um dado no pino do port que fique presente por
tempo acima de 1 valor de ”S”(com clock de 12 MHz teremos → perı́odo S ¿ 1 µs ou genericamente,
perı́odo maior que 1 ciclo de máquina).

2.2.3 Uso das Portas de I/O para a Expansão da Memória de Dados e Programa
As portas 0 e 2 possuem como função alternativa, endereçar memória extema, para que possamos
expandir a capacidade de dados e de programas no 8051. Neste caso, a porta 2 fornece a parte alta do
endereço (A8-A15) e a porta 0 fornece, multiplexada no tempo, a parte baixa de endereço (AO-A7) e
a via de dados (DO-D7).

0 pino 30 fornece o sinal ALE, que habilitará o latch de endereços a segurar a parte baixa do
mesmo, para que os dados possam transitar peia porta 0. Os outros sinais de controle são o PSEN\,
o RD\ e o WR\.

0 sinal PSEN\ habilita a saı́da da memória de programa (permite a (eitura na Eprom externa) de
forma que é ativo quando a CPU deseja ler programa da memória externa. Neste instante, os sinaı́s
RD\ e WR\ estão em nı́vel 1.

Os sinais RD\ e WR\ somente são ativos caso a CPU execute instruções de leitura e escrita na
memória de dados externa (lembre-se de que as instruções para memória externa são diferentes das
instrúções para memória interna). Temos então, que para leitura o pino RD\ irá a nı́vel 0, mantendo
o pino WR\ = 1, e vice-versa para escrita. LEMBRETE: OS SINAIS RD\ E WR\ S ÃO GER-
ADOS ATRAVÉS DE PINOS DA PORTA 3 CONFORME VEREMOS NO ITEM 2.2.5

Página 46
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

2.2.4 Seleção de Programa Externo ou Interno


O pino 31 tem a função EA\ (extemal address) e quando em nı́vel 1 diz à CPU para procu-
raros primeiros 4 KBytes de programa intemamente, e o que exceder esta memória será procurado
extemamente. Quando em nı́vel 0, informa à CPU que deve procurar todos os passos de programa
externamente, ignorando a memória interna.

OBSERVAÇÃO:
Não confundir este pino com o bit EA, presente no registro IE.

Esta é a opção utilizada quando se usa o 8031, que é um 8051 mas que não tem a ROM interna,
ou quando não se deseja arcar com as despesas de encomendar grande quantidade de peças do 8051
gravadas em fábrica.

DEVE FICAR CLARO QUE QUANDO SE UTILIZA MEM ÓRIA EXTERNA DE PROGRA-
MAS, EM QUALQUER OPÇÃO NÃO PODEREMOS MAIS UTILIZAR OS PINOS DAS PORTAS
0 E 2 COMO I/0.

Na figura 2.4, temos um esquema de Hardware onde colocamos 8 KBytes de programa e 8 KBytes
de dados externos, sendo que neste caso, temos toda a memória de programa externa, utilizando 0 8031.

RD\ WR\ Função


1 1 Espera
0 1 Lendo na RAM
1 0 Escrevendo na RAM
0 0 Não ocorre

Tabela 2.2: Tabela de Acesso à RAM.

Figura 2.4: Seleção Externa

2.2.5 Uso dos Pinos da Porta 3 como funções Alternativas


A porta 3, conformejá foi visto, pode ter seus pinos usados de forma independente como pinos de
funções especiais. Por exemplo, para a expansão de memória de dados vista acima, são dois pinos da
porta 3 que fomecem os sinais RD\ e WR\ para controle.

Quando usamos os temporizadores internos como contadores de eventos, são outros dois pinos
desta porta que servem como entrada para o sinal de contagem. Se nosso projeto necessitar de inter-
rupção extema, será através de dois pinos desta porta que as mesmas serão sinalizadas à CPU.

E finalmente, nos dois pinos restantes, temos os que permitem a implementação do canal serial. A
maneira pela qual utilizamos ou não uma função especial da porta 3, será vista no momento em que
a estudarmos o canal serial.

Com relação aos pinos RD\ e WR\ são os únicos com os quais não precisamos nos preocupar, pois
seu controle é efetuado pela CPU, e fica claro que se desejamos utilizar memória de dados externa,
não utilizaremos estes pinos como I/0.

CASO QUALQUER UMA DAS FUNÇÕES ESPECIAIS ESTEJA SENDO UTI-


LIZADA, NÃO PODEREMOS MAIS ACESSAR A PORTA 3 COMO PORTA DE I/0
PARA BYTE, APENAS COMO BIT ENDEREÇÁVEL.

Página 47
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

2.2.6 Capacidade de Corrente nos Pinos de I/O


A porta 0, devido às suas caracterı́sticas de construção de dreno aberto (open-drain), pode fomecer
ou absorver 2 cargas TTL, e as portas 1, 2 e 3 podem absorver ou suprir uma carga TTL.

2.3 Modos de Endereçamento das Instruções


As instruções operam com dados que podem ser endereçados de várias formas, motivo pelo qual
devemos saber muito bem os modos de endereçamento que o microprocessador aceita. No caso da
famı́lia 8051/52, etc, dispõe-se dos seguintes modos:

1.Registrador

2.Direto

3.Indireto

4.Imediato

5.Relativo

6.Absoluto

7.Longo

8.Indexado

2.3.1 Endereçamento por Registrador


As instruções do 8051, quando se referem a registradores internos do microcontrolador, apresentam-
se como oito registradores com nomes R0, R1, R2, R3, R4, R5, R6 e R7. 0 nome genérico destes
registradores é Rn.
Por exemplo: add A,RO: Soma o conteúdo de ”A”com o conteúdo de ”RO”e o resultado fica em ”A”.
Não se esqueça que, neste caso, precisamos saber antes para qual banco está apontado o microcontro-
lador (nos bits PSW.4 e PSW.3).
As instruções que trabalham com registradores, acusam-no com o nome genérico ◦ Rn”, em que ”n◦ é
o registrador especı́fico (n = 0 a 7). Este tipo de instrução é codificado em apenas 1 byte.

OP CODE RN

1 BYTE

2.3.2 Endereçamento Direto


As instruções do 8051, que usam endereçamento direto, referem-se aos registradores internos da
RAM do microprocessador pelo seu ”mnemônico”(apelido) ou seu endereço absoluto. Por exemplo:
a) mov A,P3: Move para ”A◦ o conteúdo do registrador ”P3”, que é o mesmo que o port fı́sico P3. b)
mov A,30h: Move para ”A”o conteúdo do registrador. interno de endereço 30h. Este tipo de instrução
é codificado em 2 bytes.

Página 48
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

OP CODE END. DIRETO

2 BYTE

2.3.3 Endereçamento Indireto


As instruções do 8051, que usam endereçamento indireto, fazem uso de um registrador, que só
pode ser o RO ou R1, para se referir a outra posição de memória RAM. Por isto que é indireto: o
registrador RO ou R1 aponta para um endereço, isto é, ele contém o endereço de outra posição de
memória. Utiliza-se o sı́mbolo ” ◦ para indicar que a operação é de endereço indireto. O nome genérico
desse registrador indireto é Ri (i = 0 ou 1). Por exemplo: Supondo que temos na posição ”30h”da
RAM interna o valor ”05”em hexa e queremos nos referir à posição 30h indiretamente pelo registrador
”R1 ”, podemos fazer (vide figura 2.5)

RAM
INT
CONTEUDO

Posicao de Memoria

05 30h

MOV A,@R1 A=05

CONTEUDO

R1 30 01h

00h

Figura 2.5: Ilustração da operação de endereçamento indireto

•mov 30h,#05h: Carrego a posı́ção da RAM interna de endereço ”30h”, com o valor ”05”(conteúdo=05).

•mov R1,#30h: Carrego o registrador ”R1”com o valor ”30”(conteúdo=30h).

•mov A,@Rl: Carrego ou movo para ”A”o conteúdo da memória apontada por R1,que é 30h,
isto é, ele sabe que é endereço indireto. Logo, ele sabe que o valor ”30h”dentro de R1 é um
endereço e não um conteúdo. Assim, ele vai na posição de memória com endereço ”30h”, pega
Página 49
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

o conteúdo de ”30h”, que é ”05”, e carrega em A.Logo, A = 05 e não A = 30; entendeu?

Olhando a ilustração da figura 2.5 deste item para melhor compreensão e leia este texto de novo.
Este tipo de instrução é codificado em 1 byte.

OP CODE Ri

1 BYTE

2.3.4 Endereçamento Imediato


As instruções do 8051, quando se referem a endereçamento imediato, significam que o código da
instrução já é codificado junto com uma constante, chamado ”dado imediato”. Operandos do tipo
imediato são precedidos do sinal ”#”. Por exemplo:

•mov A,#25: Move para A o valor 25 em decimal.

•mov A,#25h: Move para A o valor 25 em hexadecimal.

•mov A,#00100101b: Move para A o valor 25h em binário.

•mov DPTR,#1FFFh: Move para o DPTR, o endereço ”1FFF”em hexadecimal.

As instruçôes deste tipo são de 2 bytes, ou de 3 bytes quando se usa o DPTR.

OP CODE VALOR IMEDIATO

1 BYTE 1 OU 2 BYTES

A única exceção é a ı̀nstrução [mov DPTR,#data(16)], que é de 3 bytes, pois o endereço dela é de
2 bytes (16 bits).

2.3.5 Endereçamento Relativo


As instruções do 8051, com endereçamento relativo, são utilizadas com instruções que permitem
realizar um ”pulo”direto no passo cadenciado de um programa. Este endereço relativo (chamado ”off-
set”) é um dado de 8 bı̀ts com sı̀nal, ı̀sto é, realiza um salto relatı̀vo ao endereço que está no Program
Counter, PC, de -128 a +127 posı̀ções. Este endereço relativo é lı̀gado à instrução por um outro byte.
Antes de achar o endereço fı̀nal de salto, o PC é incrementado ao endereço da próxima instrução e este
é o endereço ao qual se soma o endereço relativo: vide ilustração seguinte, pois a explicação verbal é
muito difı́cil de absorver. Vejamos o exemplo:

Página 50
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

CODIGO ROM SJMP DESVIO= Salto pequeno para ¨ DESVIO¨


NA ROM

80 Exemplo 1: 80 DESVIO = 8003h


0100
0101 03
0102 Endereco de DESVIO=03
0103 Codigo do comando
0104
0105 xx
0106 PC (Apos o inicio da instrucao SJMP 03=8003h)
0107
0108

PC+3

OBS: Em geral, não fazemos estas contas, pois o compilador, quando usamos ”la-
bels”(nomes) como desvio, calcula tudo isto sozinho automaticamente.

As instruções deste tipo são de 2 bytes

OP CODE PONTO RELATIVO

2.3.6 Endereçamento Absoluto


Instruções do 8051, que se utilizam de endereço absoluto, são as ACALL e AJMP. São instruções
de 2 bytes que permitem desvio de até 2 Kbytes relativo, em apenas 2 bytes (endereço total da
faixa teria que ser em 3 bytes; não é?).

2.3.7 Endereçamento Longo


As instruções no 8051, que usam endereçamento do tipo longo, são LCALL e LJMP. Permitem
endereçamento de 16 bits que mapeia todo o espaço disponı́vel de endereços (64 Kbytes). A única
desvantagem destas instruções é que elas consomem 3 bytes de programa, o que só será
um problema quando o processo exigir tempo de execução muito pequeno (em que 1 µs a
mais ou a menos é vital, por exemplo). Tem o problema, também, de ser um endereço absoluto que
não muda; logo, se você necessita executar esse programa em outra parte do espaço de memória, deve
repensar neste endereço absoluto, ou se utilizar sempre de ”labels”na criação do programa, para que,
na compilação, o compilador acerte os endereços absolutos para você.
Este tipo de instrução consome 3 bytes:

2.3.8 Endereçamento Indexado


As instruções do 8051, que usam endereçamento do tipo indexado, são JMP ou MOVC em uma
de suas formas. São instruções cujo endereço de destino depende não só do endereço inserido na
instrução, mas também do conteúdo de ”A”naquele instante. É melhor explicá-los com um exemplo:

jmp @A+DPTR: Salta para a posição dada pelo DPTR + conteúdo de ”A”, isto é, o ”A”pode
ser um contador de passos e o DPTR um ponteiro de faixas. Supondo que: ”DPTRH = meses do
ano e ”An = dias do mês. Logo, o DPTR aponta para a ucabeça”da tabela de cada mês, e em ”A”eu
insiro 0 ”ı́ndice”do dia do mês desejado. Assim, se vario ”An, já estou alterando o dia daquele mês
fixo, sem alterar mais o DPTR.
Página 51
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

2.4 Temporizadores e Contadores


2.4.1 Introdução
O 8051 tem dois registros contadores de 16 bits, denominados TIMER 0 e TIMER 1, dedicados
às funções de contagem e temporização (counter/timer-contador/temporizador). Há uma importante
distinção entre os conceitos de contador e temporizador.

Quando opera como temporizador, o registro é incrementado a cada ciclo de máquina (usa como
base o cristal da CPU). O sinal de contagem aparece com 1/12 da freqüência do clock.

Quando opera como contador, o registro é incrementado de acordo com o sinal que se coloca nas
entradas T1 e T0, ou seja, o contador opera a cada transição de 1 para 0 (borda de descida ↓) na
entrada T0 ou T1.

Deve-se ter um cuidado quando em operações em modo contador: já se sabe que as entradas são
amostradas durante S5P2 de cada ciclo de máquina (figura 2.1). Quando em um ciclo de máquina a
entrada é detectada em 1 e depois em 0, no próximo ciclo o contador é incrementado. O incremento
acontece em S3P1 do ciclo seguinte ao que foi detectada a transição. Para garantir que o nı́vel correto
tenha sido amostrado, é necessário que o sinal de entrada (o sinal que vai acionar os contadores) per-
maneça pelo menos um ciclo de máquina em nı́vel alto e pelo menos outro ciclo de máquina em nı́vel
baixo, quer dizer, a máxima freqüência que responderá o contador é de 1/24 da freqüência de clock. O
sinal de entrada pode ter qualquer ”duty cycle”, desde que se respeite a restrição antes mencionada.

2.4.2 Registros Envolvidos


Dois registros SFR são utilizados para controlar as funções e operações do temporizador/contador:
em TMOD especifica-se o modo de operação e em TCON controla-se a operação. A figura 2.6 ilustra
o registro TMOD e a figura 2.7 ilustra o registro TCON.

Página 52
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Figura 2.6: Descrição do Registro TMOD

GATE → especifica como será feito o controle:


se GATE = 1 → conta somente se TR1=1 e INT1=high, (idem para TR0 e INT0)
se GATE = 0 → conta somente se TR1=1 (controle somente por software)
(GATE especifica se INT1 será usado para controlar o funcionamento do conta-
dor/temporizador ⇒ pode ser usado para medir a largura de pulsos externos ligados a
INT0 ou INT1)

C/*T → seleciona modo contador ou temporizador:


se C/*T = 1 modo contador (conta usando a entrada T1)
se C/*T = 0 modo temporizador (conta a cada ciclo de máquina)

M1 M0 → seleciona o modo de operação:


0 0 → THi é temporizador/contador de 8 bits e TLi é um pre-scaler de 5 bits,
0 1 → THi e TLi formam um temporizador/contador de 16 bits,
1 0 → contador/temporizador de 8 bits com auto-recarga (TLi conta e THi valor para recarga),
1 1 → TL0 contador/temporizador de 8 bits (usando TR0, *INT0 e TF0)
→ TH0 contador/temporizador de 8 bits (usando TR1, *INT1 e TF1)
→ TH1 e TL1 parado (mas pode operar em outros modos)

Página 53
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Figura 2.7: Descrição do Registro TCON

TF1 → flag de transbordamento (overflow) do contador/temporizador 1. Ativado por hardware


quando há transbordamento no timer 1. É apagado por hardware quando o processamento
é desviado para a rotina de interrupção.
TR1 → bit de partida/parada (run/stop) do contador/temporizador 1.
TF0 → flag de transbordamento (overflow) do contador/temporizador 0. Ativado por hardware
quando há transbordamento no timer 0. É apagado por hardware quando o processamento
é desviado para a rotina de interrupção.
TR0 → bit de partida/parada (run/stop) do contador/temporizador 0.
IE1 → flag da interrupção externa 1. Ativada por hardware quando é detectada uma interrupção.
Apagado por hardware (somente se for modo borda) quando a interrupção é processada,
ou seja, quando se desvia para a rotina de interrupção.
IT1 → indica se a interrupção externa 1 opera por borda ou por nı́vel:
1 → borda de descida (↓),
0 → nı́vel baixo.
E0 → flag da interrupção externa 0. Ativada por hardware quando é detectada uma interrupção.
Apagado por hardware (somente se for modo borda) quando a interrupção é processada,
ou seja, quando se desvia para a rotina de interrupção.
IT0 → indica se a interrupção externa 0 opera por borda ou por nı́vel:
1 → borda de descida (↓),
0 → nı́vel baixo.

Página 54
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

2.4.3 Modos de operação


Os dois contadores/temporizadores (timer1 e timer0) podem trabalhar em 4 modos de operação
que são selecionados empregando os bits M1 e M0 do registro TMOD. Os modos 0, 1 e 2 são iguais
para os 2 contadores/temporizadores mas o modo 3 é diferente.

Modo 0
Este modo é idêntico para os dois contadores/temporizadores. Neste modo tem-se um contador
de 8 bits com um divisor (pre-scaler) de 5 bits. Resulta então em um contador/temporizador de 13
bits, compatı́vel com o que havia no MCS-48. Os 13 bits são formados pelos 8 bits do registro THi
e pelos 5 bits menos significativos do registro TLi. Os outros 3 bits do TLi são indeterminados. O
transbordamento (overflow) é gerador quando a contagem faz a transição de 1FFFH para 0000; neste
instante ativa-se o bit de overflow (TF1 ou TF0).
A figura 2.8 apresenta um diagrama em blocos do contador/temporizador 1 operando em modo 0. A
mesma figura é válida para o contador/temporizador 0.

O controle da contagem é simples:

•se GATE = 0, TR1 controla o contador/temporizador (controle por software)

•se GATE = 1, TR1 e INT1 controlam o contador/temporizador (permite também um controle


externo por hardware)

Figura 2.8: Diagrama de Blocos para o TIMER 1 em MODO 0

Página 55
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Modo 1
Este modo de operação é o mais simples e por isto é muito utilizado. É idêntico ao modo 0, mas
os contadores são de 16 bits. A figura 2.9 ilustra o diagrama em blocos para este modo, que é idêntico
para os dois timers.

Figura 2.9: Diagrama de Blocos para o TIMER 1 em MODO 1

Modo 2
Neste modo tem-se um contador/temporizador de 8 bits (TLi) com registro de recarga (THi) para
quando ocorre o transbordamento. Neste modo os dois contadores/temporizadores operam de forma
idêntica. O transbordamento (overflow) não somente ativa TFi como também recarrega TLi com o
valor guardado em THi (este permanece inalterado). O valor de recarga deve ser fornecido por software.

Figura 2.10: Diagrama de Blocos para o TIMER 1 em MODO 2

Página 56
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Modo 3
Este é o único modo onde os contadores/temporizadores têm um comportamento diferente. Neste
modo, o contador/temporizador 1 simplesmente suspende a contagem (é como se estivesse com
TR1=0), enquanto o contador/temporizador 0 se divide em dois contadores de 8 bits:

•TH0 → contador/temporizador de 8 bits usando C/*T, GATE, TR0, *INT0 e TF0,

•TL0 → contador/temporizador de 8 bits usando TR1 e TF1 (ou seja, provoca a interrupção do
timer 1).

É como se existem 2 contadores/temporizadores de 8 bits (TH0 e TL0) e outro de 16 bits (timer 1). O
timer 1, entretanto, pode ser usado para operar em qualquer outro modo (0, 1 ou 2) e usa-se o modo
3 para detê-lo. Não há problemas porque os modos são independentes. Também se pode usar o timer
1 (em modo 2) para gerar o ”baud rate”da porta serial.

Figura 2.11: Diagrama de Blocos para o TIMER 1 em MODO 3

Página 57
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

2.4.4 Exercı́cios
LED 10HZ
Acender os leds vermelho, amarelo e verde a uma freqüência de 10 Hz. Para solucionar esse
exercı́cio é necessário gerar um retardo equivalente ao perı́odo de 10 Hz. A figura 2.12 ilustra o cálculo
do valor do contador para gerar esse retardo.

Figura 2.12: Cálculo de N para determinar uma frequência

Se F=10 Hz e CLOCK=3,575611 Hz, então N=29797. Como este é um contador que conta para
cima, temos que subtrair este valor de 65536. Com isto, N=65536-29797=35739 ou 8B9BH. Na
realidade, a freqüência gerada não será exatamente 10 Hz mas de um valor muito próximo:
F = 3,575611 / 12*29797 = 9,99 Hz Será utilizado o timer 0 no modo 1; a cada interrupção a rotina
acende um novo led e recarrega o timer.

TMOD GATE C/*T M1 M0 GATE C/*T M1 M0


0 0 0 0 0 0 0 1
IE EA - - ES ET1 EX1 ET0 EX0
1 0 0 0 0 0 1 0

;LED_10HZ.ASM;
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
DEZ_HZ EQU 35739
;
ORG RESET
AJMP INIC
;
ORG TIMER0
AJMP TIM0
;
ORG 50H
INIC
MOV TL0,#LOW DEZ_HZ
MOV TH0,#HIGH DEZ_HZ
MOV TMOD,#1 ;TIMER 0 EM MODO 1
MOV IE,#82H
MOV P1 ,#0 ;APAGAR TODOS OS LEDS
MOV A,#01001001B
CLR C
SETB TR0
SJMP $
;
ORG 100H
TIM0 MOV TL0,#LOW DEZ_HZ ;REINICALIZAR
MOV TH0,#HIGH DEZ_HZ ;O CONTADOR
RLC A
MOV P1,A
RETI
END
Página 58
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

Notar que na rotina de interrupção está a recarga dos temporizadores que é feita com a instrução
”MOV direto,#data”mas que consome 2 ciclos de máquina, ou seja, que há um retardo que se acu-
mula. Para evitar ou corrigir isso, pode-se adicionar ao contador o retardo da instrução; é mais preciso
usar ”MOV TL0,# LOW (DEZ HZ+2)”.

Quando existem várias interrupções, não se sabe com certeza quando uma interrupção do tempo-
rizador pode ser aceita; isso implica um erro maior que se acumula. Há uma solução simples porque
depois do transbordamento o temporizador segue contando e esta contagem é exatamente o tempo
que atrasou o serviço da interrupção; basta usar esse valor na recarga.
As instruções a seguir ilustram a idéia.

MOV A,#LOW (DEZ_HZ+2)


ADD A,TL0 ;1 ciclo
MOV TL0,A ;1 ciclo
MOV TH0,#HIGH (DEZ_HZ+2)

Página 59
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

LED 1HZ
Acender os leds vermelho, amarelo e verde a uma freqüência de 1 Hz. A solução é idêntica ao
exercı́cio anterior, mas vai surgir uma dificuldade ao calcular os valores de recarga:
CLOCK=3575611 Hz e F=1 Hz
N=3575611 / 12*1 = 297968

Como se pode ver, o valor de recarga é muito grande (297 968 > 65 536) e impede a utilização do
temporizador. Uma boa saı́da é utilizar o esquema do exercı́cio anterior (com 10 Hz) e adicionar, por
software, um divisor por 10.

;LED_1HZ.ASM
;
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
DEZ_HZ EQU 32203
DIVISOR EQU 10
;
ORG RESET
AJMP INIC
;
ORG TIMER0
AJMP TIM0
;
ORG 50H
INIC MOV TL0,#LOW DEZ_HZ
MOV TH0,#HIGH DEZ_HZ
MOV R7,#DIVISOR ;PREPARAR DIVISAO POR 10
MOV TMOD,#1 ;TIMER 0 EM MODO 1
MOV IE,#82H
MOV P1,#0 ;APAGAR TODOS OS LEDS
MOV A,#01001001B
CLR C
SETB TR0
SJMP $
;
ORG 100H
TIM0 MOV TL0,#LOW DEZ_HZ ;REINICALIZAR
MOV TH0,#HIGH DEZ_HZ ;O CONTADOR
DJNZ R7,FIM ;DIVIDIR POR 10
MOV R7,#DIVISOR
RLC A
MOV P1,A
FIM RETI
END

Página 60
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

ONDA1
Gerar através de P1.7 uma onda com o seguinte formato:

Figura 2.13: Sinal a ser gerado na P1.7

Usando N = (t*CLOCK)/12, calcula-se o valor de recarga para o temporizador. Serão programados


dois retardos alternadamente de forma a gerar o sinal pedido.
Para t=1 ms → N=298 → 65536-298=65238
Para t=40 µs → N=12 → 65536-12 =65524
;ONDA1.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
SAIDA EQU P1.7
R_1MS EQU 65238 ;RETARDO DE 1 MILISEG
R_40MICRO EQU 65524 ;RETARDO DE 40 MICROSEG
;
ORG RESET
AJMP INICIO
;
ORG TIMER0
AJMP TIM0
;
ORG 50H
INICIO MOV TL0,#LOW R_1MS
MOV TH0,#HIGH R_1MS
MOV TMOD,#1 ;TIMER 0 EM MODO 1
MOV IE,#82H ;EA=1 E ET0=1
CLR SAIDA
SETB TR0 ;PARTIDA DO TIMER 0
SJMP $ ;LOOP INFINITO
;
TIM0 JB SAIDA,LB1 ;2 CICLOS
MOV TH0,#LOW (R_40MICRO+4) ;2 CICLOS
MOV TL0,#HIGH (R_40MICRO+4) ;2 CICLOS
SETB SAIDA ;1 CICLO
RETI ;2 CICLOS
LB1 MOV TH0,#LOW (R_1MS+4)
MOV TL0,#HIGH (R_1MS+4)
CLR SAIDA
RETI
END
Notar que a rotina que atualiza o temporizador para gerar o retardo de 40 µs consome 9 ciclos de
máquina, quer dizer, consome 30,2 µs. Pode parecer que se o tempo de 40 µs fosse mudado para 25
µs não haveria solução.

Página 61
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

ONDA2
Gerar através de P1.7 uma onda com o seguinte formato:

Figura 2.14: Sinal a ser gerado na P1.7

Usando N = (t*CLOCK)/12, calcula-se o valor de recarga para o temporizador. O segredo será


trabalhar com o temporizador em modo 2 (os dois valores de recarga são menores que 256) e a rotina
de interrupção apenas muda o valor da recarga (que está em TH0).
Para t=600 µseg → N=179 → 256-179=77
Para t=25 µseg → N=7 → 256-7 =249

;ONDA2.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
SAIDA EQU P1.7
R_600MICRO EQU 77 ;RETARDO DE 600 MICROSEG
R_25MICRO EQU 249 ;RETARDO DE 25 MICROSEG
;
ORG RESET
AJMP INICIO
;
ORG TIMER0
AJMP TIM0
;
ORG 50H
INICIO MOV TL0,#R_600MICRO ;PRIMEIRA CONTAGEM
MOV TH0,#R_25MICRO ;CONTAGEM SEGUINTE
MOV TMOD,#2 ;TIMER 0 EM MODO 2
MOV IE,#82H ;EA=1 E ET0=1
CLR SAIDA
SETB TR0 ;PARTIDA DO TIMER 0
SJMP $ ;LOOP INFINITO
;
TIM0 JB SAIDA,LB1 ;2 CICLOS
MOV TH0,#R_25MICRO ;2 CICLOS
SETB SAIDA ;1 CICLOS
RETI ;2 CICLOS
;
LB1 MOV TH0,#R_600MICRO
CLR SAIDA
RETI
END

Página 62
Microprocessadores e Microcontroladores - 2a Unidade - Prof. Vitor Leão Filardi

LEDS1
Acender os leds vermelho, amarelo e verde em seqüência, mudando a cada 10 pulsos em T1. Será
usado o contador/temporizador 1 como contador e programado para operar em modo 2, com um valor
de recarga igual a 246 (256-10). O acumulador e carry serão usados para acender os leds na seqüência
correta.

TMOD GATE C/*T M1 M0 GATE C/*T M1 M0


0 1 1 0 0 0 0 1

IE EA - - ES ET1 EX1 ET0 EX0


1 0 0 0 1 0 0 0
;LEDS1.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
CONTA_10 EQU 246
;
ORG RESET
AJMP INICIO
;
ORG TIMER1
AJMP TIM1
;
INICIO: ORG 50H
MOV A,#01001001B
CLR C
MOV P1,A
MOV TL1,#CONTA_10 ;CARREGAR CONTADOR
MOV TH1,#CONTA_10 ;VALOR DE RECARGA
MOV TMOD,#60H ;CONTADOR 1, MODO 2
MOV IE,#88H ;EA=1, ET1=1
SETB TR1 ;LIGAR CONTADOR
SJMP $ ;LOOP INFINITO
;
TIM1:
RLC A
MOV P1,A
RETI
END

A chave SW3 aciona diretamente a entrada T1, mas há bouncing e por isso serão notadas mu-
danças nos leds antes de 10 acionamentos. Para esse caso especı́fico o bouncing deverá ser eliminado
por hardware.

Página 63
Capı́tulo 3

Terceira Unidade

Porta Serial

3.1 Comunicação Serial


3.1.1 Introdução
A porta serial existente na famı́lia MCS-51 é ”full duplex”, quer dizer, pode transmitir e receber
dados simultaneamente. Tem um buffer que permite receber um segundo byte antes que o byte previ-
amente recebido tenha sido retirado (lido) do registro de recepção. Mas, se o primeiro byte não tiver
sido lido no tempo em que o segundo byte se completa, um dos dois será perdido.

3.1.2 Registros Envolvidos


A porta serial possui um registrador chamado SBUF, o mesmo que se usa para enviar ou receber
dados pela porta serial. Na realidade, o nome SBUF se refere a dois registros, um somente para leitura
por onde se recebem os dados que chegam pela porta serial e outro somente para escrita por onde se
transmitem dados pela porta serial.

O modo de operação da porta serial é controlado pelo registro SCON, que é ilustrado na figura
3.1. A figura 3.2 apresenta um resumo dos modos de operação.

Figura 3.1: Descrição do Registro SCON


SM0 SM1 MODO DESCRIÇÃO FREQÜÊNCIA
0 0 0 registro de deslocamento clock/12
0 1 1 UART de 8 bits variável
1 0 2 UART de 9 bits clock/12 ou clock/64
1 1 3 UART de 9 bits variável

SM2 → comunicação multiprocessador (habilitada com SM2=1):

•SM2=1 e em modo 1 ==¿ interrupção (RI=1) com o bit de parada (stop bit) igual a 1.

•SM2=1 e em modo 2 ou 3 ==¿ interrupção (RI=1) se for recebido RB8=1.

REN → habilita a recepção serial (Reception Enable)

TB8 → oitavo bit a ser transmitido nos modos 2 e 3.

RB8 → oitavo bit recebido nos modos 2 e 3.

TI → flag de interrupção por término de transmissão pela porta serial:

•MODO 0 → ativado no final do oitavo bit

•DEMAIS → ativado no começo do bit de parada

RI → flag de interrupção por recepção pela porta serial:

•MODO 0 → ativado no final do oitavo bit.

•DEMAIS → ativado na metade do bit de parada.

Observação: Os flags TI e RI não são apagados por hardware e por isso a rotina de interrupção
deve fazê-lo, ou seja, estes flags devem ser zerados por software.

O registro PCON também toma parte na geração do baud rate da porta serial. Este registro é
ilustrado na figura 3.2.

Figura 3.2: Descrição do Registro PCON


Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

3.1.3 Modos de Operação


Existem quatro modos de operação da porta serial, cada um com uma finalidade. Será apresentado
um resumo de cada modo:

Modo 0 (sı́ncrono, 8 bits)


Neste modo os dados entram e saem pelo pino RXD. O pino TXD fornece o clock para o desloca-
mento (shift). São transmitidos e recebidos dados de 8 bits (LSB primeiro). O baud rate é de 1/12
da freqüência do clock (igual a 1 ciclo de máquina).

Figura 3.3: Esquema da Porta Serial em MODO 0

Este modo pode ser utilizado para expandir as portas de I/O do microcontrolador, utilizando o
esquema a seguir:

Figura 3.4: Expansão das Portas de I/O

Página 67
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

Modo 1 (assı́ncrono, 8 bits)


No Modo 1 são operados 10 bits com um baud rate programável. Recebe-se pelo pino RXD e
transmite-se pelo pino TXD. A tabela 3.1 ilustra o frame de bits serial. O bit de partida (START) é
sempre zero e o bit de parada (STOP) é sempre um na transmissão. Na recepção o bit de parada é
colocado no bit RB8.

START Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 STOP

Tabela 3.1: Frame de bits gerado pela porta serial em MODO 1

Neste modo o baud rate é gerado pelo contador/temporizador 1. A cada 16 (SMOD=1) ou 32


(SMOD=0) transbordamentos (overflows) é enviado um pulso para o circuito serial. A figura 3.5
ilustra o esquema do gerador do baud rate e também apresenta algumas fórmulas para o cálculo do
valor a ser programado no contador/temporizador.

Figura 3.5: Esquema para a geração do Baud Rate (BR) em MODO 1

Usando o contador/temporizador 1 programa-se qualquer baud rate. Na grande maioria dos casos
tem-se o baud rate e é buscado o valor N a ser programado no contador/temporizador 1 (o mais
cômodo é usar o modo 2 - auto recarga). Um problema que sempre existe é o erro gerado pela aprox-
imação do valor a ser programado no contador/temporizador. Isto provoca a geração de baud rates
ligeiramente diferentes.

Exemplo: Usando um cristal de 3,575611 MHz, qual é o valor a ser programado no timer 1 para
operar a 9600 bauds (usar SMOD=0)?
N = 3575611 / (384*9600) = 0,9699 (aproximadamente 1)
Usando timer 1 no modo 2 tem-se: 256 - 1 = 255 (TH1=TL1=255).

Observação: a transferência do dado recebido para o registro SBUF (e RB8, que guarda o stop
bit) e a ativação do flag RI somente acontecerá se:
RI = 0 e (SM2= 0 ou o bit de parada =1).

Página 68
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

Modo 2 (assı́ncrono, 9 bits, baud rate fixo)


Este modo opera com 11 bits e o baud rate pode ser de 1/32 ou 1/64 do clock. O bit TB8/RB8
serve para transmitir a paridade ou gerar um segundo bit de parada (TB8=1). O frame de bits usado
neste modo é ilustrado na tabela 3.2.

START Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 TB8 STOP

Tabela 3.2: Frame de bits gerado pela porta serial em MODO 2

O único controle que se tem sobre o baud rate é através do uso do bit SMOD. Se SMOD=0,
trabalha-se com BR=clock/32 e se SMOD=1, trabalha-se com BR=clock/64. A figura 3.6 ilustra o
esquema para geração do baud rate no modo 2.

Figura 3.6: Esquema para a geração do Baud Rate (BR) em MODO 2

Na transmissão o bit 8 é copiado do bit TB8. Na recepção o bit 8 é copiado para o bit RB8. Os
bits TB8 e RB8 estão no registro SCON.

O dado recebido somente é carregado no SBUF (e RB8) se:


RI=0 e (SM2=0 ou bit 9 (stop bit) = 1).

Página 69
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

Modo 3 (assı́ncrono, 9bits, baud rate variável)


É idêntico ao modo 2, exceto que a geração do baud rate é idêntico ao modo1. A tabela 3.3 e
figura 3.7 ilustra o frame de bits e a geração do baud rate.

START Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 TB8 STOP

Tabela 3.3: Frame de bits gerado pela porta serial em MODO 3

Figura 3.7: Esquema para a geração do Baud Rate (BR) em MODO 3

3.1.4 Cuidados com a Porta Serial


Nos quatro modos a transmissão se inicia quando é escrito um byte em SBUF. A recepção é ha-
bilitada quando REN=1 (no MODO 0 exige-se também RI=0). Não se esqueça de que somente existe
uma única interrupção dedicada à porta serial, portanto ela é gerada por duas condições:

a)Término da transmissão de um byte → flag TI

b)Término da recepção de um byte → flag RI

Deve-se testar os flags RI e TI para determinar se a interrupção foi por transmissão ou por recepção.
Os flags RI e TI devem ser apagados por software.

Um outro cuidado muito importante é com a geração do baud rate. Muitas vezes não se consegue
a comunicação serial devido à imprecisão do baud rate. Portanto o problema a seguir é proposto:
Programar o contador/temporizador 1 para gerar 9600 bauds para a porta serial operando em modo
3, sendo que o cristal é de 4 MHz.

Solução: N = 4000000/(384*9600) = 1,085 (SMOD=0).

Na solução calculou-se que N=1,085 mas somente podem ser programados números interos; assim,
caso se aproxime para 1, o baud rate gerado será de BR=4000000/384=10416,7. Será que irá funcionar
bem com esse baud rate ?

Para responder esta pergunta é necessário compreender o que acontece com a transmissão serial.
Esta transmissão é assı́ncrona, quer dizer, pode iniciar em qualquer instante; o inicio é caracterizado
pela presença de um bit de partida (START). Uma vez iniciada, deve-se garantir a duração de cada
bit. Para cada byte é transmitido um bit de partida, os bits de dados e um ou dois bits de parada.
O que se deve buscar é garantir que não haja um erro muito grande neste frame de bits. A figura 3.8
ilustra o caso da porta serial operando em modo 3.

Página 70
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

Figura 3.8: Erros provocados pela diferença no baud rate

A fase mais critica é a recepção do último bit porque poderá apresentar uma defasagem muito
grande (rotuladas de E1 e E2 na figura). Não se pode especificar um valor limite para esses erros pois
diversos fatores, particulares para cada caso, precisam ser levados em consideração. Como um valor
prático e que funciona na grande maioria dos casos arbitra-se que o valor do erro, para o último bit,
deve ser menor que 40% da duração de um bit (usando BR exato).

11 11 40 1
| − |≤ ∗
BRp BR 100 BR
11 11 1
A equação pode ser simplificada para: | − |≤
BRp BR 27, 5 ∗ BR
Como pode ser verificado, com um cristal de 4Mhz não se conseguirá transmitir a 9600 pois o baud
rate será muito grande.

11 11 1
| − |≤
10416, 7 9600 27, 5 ∗ 9600

8,167 µs≤3,788µs→falso

Página 71
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

3.1.5 Comunicação entre vários 8051

Figura 3.9: Comunicação entre vários 8051

Os modos 2 e 3 permitem interligar vários 8051, sendo um mestre e vários escravos. Nestes modos
temos:

*1 start bit;

*8 bits de dados;

*um nono bit que vai para o bit RB8 ( na recepção) ou pode ser escolhido 0 ou 1 na transmissão
escrevendo-se em TB8;

*1 stop bit

Note que se SM2 = 1 e RB8 = 1, a interrupção da serial será atendida.

O algoritmo de comunicação consiste em:

1)No inı́cio, todos os escravos estão com SM2 = 1

2)Quando o mestre quiser enviar dados para algum escravo, ele escreverá 1 em seu bit TB8 e
então enviará serialmente o endereço do escravo desejado, e como teremos todos os bits RB8
em 1, todos escravos serão interrompidos para verificar se é seu o endereço enviado.

3)O escravo selecionado zerará o seu bit SM2 e estará preparado para receber os dados, os quais
terão agora o nono bit (RB8) em 0.

4)Os demais escravos permanecerão com SM2 em 1 e, dessa forma, não serão mais interrompidos
pois os dados têm RB8 = 0.

5)Em resumo, o mestre envia endereços com o nono bit em 1 e os dados com o nono bit em 0,
portanto, se o mestre desejar se comunicar com outro escravo basta enviar o novo endereço
com o nono bit em 1.

Página 72
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

3.1.6 Comunicação serial entre o 8051 e o PC


Devido à diferença de tensão entre os nı́veis TTL e os usados no padrão RS-232C (PC), é necessário
usar circuitos conversores para interfacear o microcontrolador com a porta serial do PC. A conversão
pode ser feita através de circuitos transistorizados discretos (veja as figuras 11.10,11.11 e 11.12 e leia
a seção 11.4) ou através de circuitos integrados como o 1488 (conversor de TTL para RS-232C) e o
1489 (conversor de RS-232C para TTL). A seguir estão os esquemas dos dois integrados e o esquema
básico de interligação entre o 8051 e a serial do PC.

Figura 3.10: Esquema de ligação entre o computador(PC) e o 8051

Página 73
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

3.1.7 Exercı́cios
TX SER
Usando um loop infinito, transmitir pela porta serial todos os caracteres ASCII de ”0”a ”Z”. Usar
9600 bauds, 8 bits de dados, 1 bit de partida e 2 bits de parada.

Para este caso o modo 3 é o mais adequado e TB8=1 será usado para gerar um bit de parada. A
transmissão será feita por interrupção, quer dizer, a cada byte transmitido haverá uma interrupção.
O contador/temporizador 1 será programado para modo 2 (auto-recarga).

SCON SM0 SM1 SM2 REN TB8 RB8 TI RI


1 1 0 0 1 0 0 0

TMOD GATE C/*T M1 M0 GATE C/*T M1 M0


0 0 1 0 0 0 0 0

IE EA - - ES ET1 EX1 ET0 EX0


1 - - 1 0 0 0 0

Cálculo do divisor formado pelo contador/temporizador 1:


N = 3575611/(384*9600) = 0,9699 ∼ = 1. (TH1 = TL1 = 256 - 1 = 255).
;TX_SER.ASM
DEFSEG PROG, CLASS=CODE, START=0
SEG PROG
;
BR_9600 EQU 255
;
ORG RESET
AJMP INIC
;
ORG SINT
AJMP SERIAL
;
ORG 50H
INIC: MOV TMOD,#20H ;TIMER 1 EM MODO 2
MOV TH1,#BR_9600 ;PROGRAMAR BAUD RATE
MOV TL1,#BR_9600
SETB TR1 ;INICIAR TIMER 1
MOV SCON,#0C8H ;MODO 3 COM TB8=1
MOV IE,#90H ;HAB INTERRUP SERIAL
MOV A,#"0" ;PRIMERO ASCII
SETB TI ;TX PRIMEIRO ASCII
SJMP $ ;LOOP INFINITO
;
ORG 100H
SERIAL: CLR TI ;APAGAR FLAG
MOV SBUF,A ;TRANSMITIR
INC A
CJNE A,#"Z"+1,SER1 ;FOI O ULTIMO ?
MOV A,#"0" ;REINICIALIZAR
;
SER1: ACALL RETARDO ;ATRASAR TRANSMISSAO
RETI
;
RETARDO: MOV R7,#0
;
AQUI: DJNZ R7,AQUI
RET
;
END
Página 74
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

RX SER
O circuito deverá responder aos seguintes comandos que chegam pela porta serial:

1 → acender todos os leds 0 → apagar todos os leds


R → acender led vermelho r → apagar led vermelho
A → acender led amarelo a → apagar led amarelo
V → acender led verde v → apagar led verde

Estes comandos vão chegar pela porta serial usando o formato: 1 bit de partida, 8 bits de dados,
2 bits de parada, com um baud rate de 9600.

;RX_SER.ASM DEFSEG PROG, CLASS=CODE, START=0SEG PROG


;
BR_9600 EQU 255
LED_VERMELHO EQU P1.0
LED_AMAR EQU P1.1
LED_VERDE EQU P1.2
CHEGOU EQU 32.0
;
ORG RESET
AJMP INIC
;
ORG SINT
AJMP SERIAL
;
ORG 50H
INIC: MOV TMOD,#20H ;TIMER 1 EM MODO 2
MOV TH1,#BR_9600 ;PROGRAMAR BAUD RATE
MOV TL1,#BR_9600
SETB TR1 ;INICIAR TIMER 1
MOV SCON,#0D0H ;MODO 3 COM REN=1
MOV IE,#90H ;HAB INTERRUP SERIAL
CLR CHEGOU ;APAGAR FLAG
;
ESPERA:
JNB CHEGOU,ESPERA ;AGUARDAR UM COMANDO
CLR CHEGOU
;
CJNE A,#"0",LB1 ;CHEGOU 0
CLR LED_VERMELHO
CLR LED_AMAR
CLR LED_VERDE
SJMP ESPERA
;
LB1:
CJNE A,#"1",LB2 ;CHEGOU 1
SETB LED_VERMELHO
SETB LED_AMAR
SETB LED_VERDE
SJMP ESPERA
;
LB2:
CJNE A,#"R",LB3 ;CHEGOU R
SETB LED_VERMELHO
SJMP ESPERA
;
LB3:
CJNE A,#"r",LB4 ;CHEGOU r
CLR LED_VERMELHO
SJMP ESPERA
;
LB4:
CJNE A,#"A",LB5 ;CHEGOU A
SETB LED_AMAR
SJMP ESPERA
Página 75
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

;
LB5:
CJNE A,#"a",LB6 ;CHEGOU a
CLR LED_AMAR
SJMP ESPERA
;
LB6:
CJNE A,#"V",LB7 ;CHEGOU V
SETB LED_VERDE
SJMP ESPERA
:
LB7:
CLR LED_AMAR ;CHEGOU v
SJMP ESPERA
;
SERIAL:
CLR RI ;APAGAR FLAG DE INTERRUP
MOV A,SBUF ;COLOCAR DADO NO Acc
SETB CHEGOU
RETI
END

3.2 Programação em Assembly


3.2.1 Introdução teórica
Este parte da apostila é de fundamental importância para quem deseja adquirir conhecimentos
básicos em programação (software). Aqui, é ensinado passo a passo o procedimento da elaboração de
programas simples e com loops; utilizando a linguagem Assembly aplicada aos microcontroladores da
famı́lia MCS-Sl da Intel.

Uma vez que nós aprendemos e praticamos as técnicas de programação ensinadas, poderemos
aplicar tal metodologia de implementação de programas a qualquer outra linguagem de programação,
seja ela de baixo, médio ou alto nı́vel.

Existem muitas linguagens de programação que podem ser utilizadas na programação de sistemas
inteligentes, utilizando mierocontroladores, além do Assembly (nı́vel baixo), tais como as linguagens
estruturadas de programação C (nı́vel médio), BASIC e PL/M (nı́vel alto). A escolha de uma delas
na elaboração de um projeto de software é muito importante é envolve o conhecimento técnico espe-
cializado.

A caracterı́stica de uma linguagem de nı́vel baixo, como o Assembly, é a de apresentar o mesmo


conjunto de instruções que aquele definido pelo fabricante da famı́lia de microprocessadores ou mi-
crocontroladores, com a qual se deseja desenvolver os projetos de programa. Isso permite um total
controle sobre os registradores intemos do dispositivo e as posições de memória e, conseqüentemente,
são gerados programas muito mais compactos em relação às outras linguagens. Assim, sempre que ex-
istirem limitações de memória (pouca memória) e limitações de velocidade de processamento (máxima
velocidade de processamento), recomenda-se a utilização da linguagem de programação de nı́vel baixo,
ou seja, o Assembly. Portanto, pelas próprias caracterı́sticas dos microcontroladores, é muito comum
a utilização do Assembly na elaboração de projetos de equipamentos inteligentes. Em contrapartida, a
única desvantagem da linguagem Assembly em relação às outras linguagens é sua caracterı́stica de ser
rica em detalhes, solicitando dos programadores um conhecimento bastante grande sobre o dispositivo
a ser programado.

A caracterı́stica de uma linguagem de nı́vel médio, como o C, é a de apresentar os aspectos de


uma linguagem de nı́vel baixo (manipulação bit a bit ou byte a byte dos registradores internos e das
posições de memória), como também as caracterı́sticas de uma linguageni de nı́vel alto, que definimos
a seguir. Atualmente, essa é uma das linguagens de programação mais utilizadas em projetos de
equipamentos inteligentes.

Página 76
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

A caracterı́stica de uma linguagem de nı́vel alto é a de ser muito mais próxima da linguagem do
ser humano. Trata-se de uma linguagem descritiva, cujas instruções são palavras escritas em inglês e
que estão muito longe das instruções em Assembly. Cada instrução de uma linguagem de nı́vel alto
é representada por muitas instruções de uma linguagem de nı́vel baixo. Programar utilizando uma
linguagem de nı́vel alto é muito mais fácil que programar com uma linguagem de nı́vel baixo ou médio.
Mas quando se utiliza uma linguagem de programação de nı́vel alto, são gerados programas maiores e
com menor velocidade de processamento. Outra desvantagem da linguagem de nı́vel alto, que muitas
vezes é interpretada como vantagem, é a de não exigir do programador o conhecimento completo e
detalhado do dispositivo que se deseja programar.

Um programa em código de máquina (código-objeto) é composto por bytes que representam as


instruções do dispositivo. É a linguagem que o microcontrolador sabe e pode executar. Assim, sem-
pre que for desenvolvido um programa em uma determinada linguagem de programação, é necessário
fazer a compilação desse programa para transformá-lo em linguagem de máquina. O programa em
linguagem de máquina deve ser simulado por meio de um simulador (AVSIM5l, Pinnacle etc.) ou
gravado em uma memória para verificar seu funcionamento por meio da utilização do próprio hard-
ware do produto. A seguir inicia-se o estudo das técnicas de programação em Assembly para a famı́lia
de microcontroladores MCS-51 da Intel.

3.2.2 Estratégias de elaboração de programas


É muito importante para um programador, antes de implementar um programa, seguir uma de-
terminada metodologia. A seguir, é descrita uma metodologia de elaboração de programas que é
independente da linguagem de programação.

Pré-requisitos do técnico que desenvolverá o projeto


a)Conhecer a estrutura interna (hardware) do dispositivo com que se deseja desenvolver o pro-
jeto;

b)Conhecer o conjunto de instruções do dispositivo.

Viabilidade do projeto
a)Obter e entender claramente as especificações do cliente (desejos do cliente, caracterı́sticas
do produto e do sistema, modo de funcionamento etc.);

b)Elaborar diferentes estratégias de soluções para o projeto. Isso pode ser feito utilizando-se
diagramas de fluxo de dados (DFD), diagramas de blocos, desenhos etc.;

c)Elaborar a viabilidade do projeto com relação ao hardware e ao software para verificar a


possibilidade de sua implementação junto ao cliente. Algumas perguntas são utilizadas para
garantir a viabilidade do projeto: Quais são as necessidades de hardware? Qual será o custo
final do produto (o cliente pagará por esse valor)? Qual será a quantidade de equipamen-
tos a ser fabricada (a fábrica comporta essa quantidade)? Como serão feitas as entregas do
produto? Existem fornecedores de componentes no Brasil? Quais componentes devem ser
importados? Existem concorrentes? etc.;

d)Escolher a melhor solução junto com o cliente, ou seja, aquela que utilizará o menor número
de componentes e a que apresenta maior velocidade de processamento. Isso afeta diretamente
o custo final do hardware e traz uma maior flexibilidade funcional do produto.

Página 77
Microprocessadores e Microcontroladores - 3a Unidade - Prof. Vitor Leão Filardi

Implementação do projeto
a)Elaborar o fluxograma do programa em Assembly: os fluxogramas devem ser implementados
desde o nı́vel de ’macrodetalhamento’ até o nı́vel de ’microdetalhamento’. Um fluxograma
representando o nı́vel de ’macrodetalhamento’ deve conter as idéias e os objetivos dentro dos
blocos representativos. Um fluxograma representando o nı́vel de ’microdetalhamento’ deve
utilizar as representações simbólicas dos mnemônicos das instruções dentro dos blocos repre-
sentativos. Exemplo: dentro de um bloco do fluxograma, representar (A) ← (B): significa
a instrução MOV A,B;

b)A partir do fluxograma, gerar o programa-fonte na linguagem de programação escolhida (ar-


quivo em código ASCII que contém as instruções que compõem o programa);

c)Compilar o programa-fonte para gerar o arquivo binário que corresponde ao programa em


códigos de máquina;

d)Fazer a linkagem dos arquivos binários para agrupar de maneira organizada, os diferentes
blocos de programa que compõem o programa final;

e)Efetuar a simulação do programa para verificar seu funcionamento e corrigir os possı́veis erros
de lógica. Nessa fase, não é necessário 0 hardware do produto;

f)Realizar a gravação da EPROM, inserção no hardware do produto e teste fı́sico de sua fun-
cionalidade;

g)Efetuar a emulação do programa (é necessário um sistema emulador) para corrigir erros de
lógica ou eventuais falhas de algum componente, utilizando o próprio hardware do produto;

h)Fazer testes rápidos de bancada para verificar o funcionamento do produto final;

i)Realizar testes de longa duração (confiabilidade), em condições de estresse’, para a ho-


mologação do produto.

3.2.3 Fluxogramas
Essa ferramenta de programação é fundamental para a implementação de qualquer rotina de um
programa de microcomputador. É por meio dessa ferramenta que se pode observar como foi imple-
mentada a estratégia de solução de uma necessidade de programação elaborada por um programador.
O fluxograma representa como o fluxo de informações será processado pelo microprocessador.

Página 78

Você também pode gostar