apostila de 8051
TRANSCRIPT
C OM P ETÊN C IA EM ED UC A ÇÃO P ÚB LIC A P R OF IS S ION A L
“Es c o la Téc nic a Es ta dua l Ge túlio Va rg a s ”
ESCOLA TÉCNICA ESTADUAL GETÚLIO VARGAS
PROFESSOR: MILTON BARREIRO JUNIOR
Microcontrolador 8051 – Teoria e Prática
São Paulo
2006
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
ii
ESCOLA TÉCNICA ESTADUAL GETÚLIO VARGAS
PROFESSOR: MILTON BARREIRO JUNIOR
Microcontrolador 8051 – Teoria e Prática
São Paulo 2006
Apostila sobre Microcontroladores família 8051, apresenta-
da aos cursos de Eletrônica, Telecomunicações e Automação In-
dustrial da Escola Técnica Estadual Getúlio Vargas, com o propósi-
to de auxiliar nas aulas teóricas e práticas.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
iii
SUMÁRIO
1 – INTRODUÇÃO........................................................................................... 1
2 – ARQUITETURA BÁSICA DE UM MICROCONTROLADOR GENÉRICO.. 2
3 – A FAMÍLIA 8051......................................................................................... 3
3.1 Organização de Memória................................................................ 4
3.2 Memória de Programa..................................................................... 6
3.3 Memória de Dados.......................................................................... 8
3.4 Conjunto de Instruções da Família 8051....................................... 10
3.5 Registrador da palavra de controle (Program Status Word)......... 10
3.6 Modos de Endereçamento............................................................ 11
3.7 Instruções Aritméticas................................................................... 12
3.8 Instruções Lógicas........................................................................ 14
3.9 Transferência de Dados Interna e Externa................................... 15
3.10 Instruções Booleanas.................................................................. 17
3.11 Instruções de Salto..................................................................... 18
3.12 Oscilador Interno......................................................................... 20
3.13 Estrutura de Interrupções............................................................ 21
4 – DESCRIÇÃO DO HARDWARE................................................................ 24
4.1 Registradores de função especial (SFR)...................................... 24
4.2 Acumulador (ACC)......................................................................... 25
4.3 Registrador B (B)............................................................................ 25
4.4 Registrador da palavra de controle (PSW).................................... 25
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
iv
4.5 Stack Pointer (SP) e Data Pointer (DPTR)..................................... 26
4.6 Buffer Serial (SBUF)....................................................................... 26
4.7 Port’s de I/O (P0, P1, P2, P3)........................................................ 28
4.8 Registradores de Timer e de Controle........................................... 29
4.9 Estrutura e operação dos ports de I/O........................................... 32
4.10 Acesso à memória externa.......................................................... 35
4.11 Temporizadores e Contadores..................................................... 35
4.12 Modos de operação..................................................................... 36
4.13 Interface Serial............................................................................. 38
4.14 Modos de Operação..................................................................... 38
4. 15 Registrador de Controle.............................................................. 43
4.16 Baud Rates................................................................................... 43
4.17 Interrupções................................................................................. 44
4.18 Estrutura de prioridades............................................................... 46
4.19 Interrupções externas.................................................................. 46
4.20 Circuitos de Controle.................................................................... 47
4.21 Reset............................................................................................ 47
4.22 Clock............................................................................................ 48
4.23 Operação passo a passo............................................................. 49
4.24 Descrição da pinagem................................................................. 50
5 – PROGRAMAÇÃO E SIMULAÇÃO............................................................ 52
5.1 “Compilação” E “Linkagem”............................................................ 52
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
v
5.2 Diretivas (Ou Pseudo-Instruções).................................................. 53
5.3 Uso Do Compilador E Do Linker (Passo A Passo)........................ 54
5.4 Simulador dos Microcontroladores da família 8051....................... 55
5.5 Operação básica do simulador...................................................... 56
6 – TABELA DE INSTRUÇÕES COMPLETA................................................. 58
7 – ESQUEMA DA CPU MÍNIMA PARA TESTE E CARREGAMENTO DE
PROGRAMA.............................................................................................................. 70
8 – PROGRAMA TESTE DO SISTEMA MÍNIMO........................................... 71
9 – REFERÊNCIAS BIBLIOGRÁFICAS......................................................... 72
APÊNDICE A............................................................................................................. 73
APÊNDICE B............................................................................................................. 80
ANEXO 1................................................................................................................... 84
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
1
1 – Introdução
Podemos considerar os microcontroladores, como sendo uma CPU dedicada
e incorporada em um só chip, ou seja, todos os periféricos que nos microprocessa-
dores se encontravam em chips independentes, assim como memórias, temporiza-
dores, portas de comunicação serial, dispositivos de entrada/saída, estão presentes
em um único componente.
Isso torna o projeto mais compacto, mais dinâmico e com o custo final reduzi-
do, devido aos dispositivos integrados em um só chip.
O chip a ser apresentado nessa apostila será o microcontrolador da família
8051, o qual será estudado com mais detalhes nos capítulos a seguir.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
2
2 – Arquitetura básica de um microcontrolador genérico
Um microcontrolador genérico é composto pelos seguintes blocos:
Unidade Central de Processamento (CPU);
Memória de Programa (ROM ou EPROM);
Memória de dados (RAM);
Linhas de I/O (PORT’s);
Controle de interrupções;
Gerador de clock;
Temporizadores (Timer’s) e Contadores (counter’s).
É representada na figura abaixo constituição clássica de um microcontrolador
contendo os blocos citados e suas respectivas interligações.
As diferenças básicas entre os diversos tipos de microcontroladores disponí-
veis no mercado são relacionadas à capacidade e tipos de memórias, na quantidade
de port’s disponíveis, velocidade de operação, e alguns recursos específicos como
por exemplo, portas seriais, maior número de contadores, opção de baixo consumo,
entre outros.
Existem também, os componentes chamados derivativos que, como o próprio
nome diz, são microcontroladores derivados dos tipos mais comuns (8048 e 8051),
ou seja, a célula básica é o microcontrolador e este é acrescido de outros compo-
nentes de acordo com as necessidades.
4 I/O Port’s BUS
Control OSC
CPU
Interrupt Control
External Interrupt
4K ROM 128 Bytes RAM
Timer 1
Timer 0
Counter Inputs
Serial Port
TXD RXD
P0 P1 P2 P3
Address / Data
BUS
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
3
3 – A Família 8051
Quando temos vários microcontroladores utilizando uma mesma célula, cha-
mamos esse conjunto de componentes de família. Desta forma temos várias famí-
lias como, por exemplo, a família do 8048, do 8051, do 8096, entre outras.
Vamos tratar aqui da família do 8051, que será utilizado em nossas aplica-
ções. A tabela abaixo descreve os principais componentes dessa família:
Nome do Chip
Versão sem ROM
Versão EPRO
M
Bytes de ROM
Bytes de RAM
Timers 16 Bits
Tipo de Circuito
8051 8031 8751 4K 128 2 NMOS
80C51 80C31 87C51 4K 128 2 HMOS
80CL51 4K 128 2 SACMOS
8052 8032 8K 256 3 NMOS
80C52 80C32 87C52 8K 256 3 CMOS
83C528 80C528 87C528 32K 512 3+1 CMOS
83C652 80C652 87C652 8K 256 2 CMOS
83C751 87C751 2K 64 1 CMOS
83C452 80C452 87C452 8K 256 2 CMOS
O elemento básico desta família é o chip 8051, cujo diagrama interno serviu
como ilustração quando falamos sobre um microcontrolador genérico. Os outros
componentes desta família estão descritos nos manuais dos fabricantes. Atualmen-
te, a tendência mundial no uso de componentes de baixo consumo, torna sensível o
desenvolvimento de projetos baseados na tecnologia CMOS, facilitando assim a in-
terligação de seus blocos. Todos os componentes que apresentarem um “C” em seu
código (80C31, 87C452, etc) pertencem a esta família, a qual representa o que exis-
te de mais avançado em microcontroladores de 8 bits, permitindo a continuidade de
sua linha de produção por um longo período.
As características desta família são:
CPU de 8 bits com conjunto de instruções otimizado para aplicações
de controle de processos;
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
4
Capacidade de processamento Booleano (manipulação de bit indivi-
dualmente);
32 linhas de I/O bidirecionais e individualmente endereçáveis;
128 bytes de RAM “on-chip” (mínimo);
Dois contadores / temporizadores programáveis de 16 bits;
Interface serial full-duplex;
Estrutura de interrupções com até 5 entradas permitindo 2 níveis de
prioridade;
Gerador de clock;
Mínimo de 4Kbytes de memória de programa (ROM ou EPROM);
Capacidade de endereçamento externo de até 64Kbytes.
3.1 – Organização de Memória
O 8051 possui intervalos de endereços separados para a memória de pro-
grama e para a memória de dados. Esta separação lógica permite que os dados
acessados pelos endereços de 8 bits sejam armazenados e manipulados mais rapi-
damente. É possível também endereçar 16 bits, utilizando para isso, o registrador
DPTR, que será estudado posteriormente.
A figura abaixo ilustra a estrutura de memória utilizada num microcontrolador
8051:
Nota: a RAM externa não é endereçada diretamente pela CPU. O endere-
ço de acesso deve estar em um registrador usado pela CPU como índice.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
5
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
6
A memória de programa é do tipo ROM e não podemos escrever dados nela.
Podemos ter até 64Kbytes de memória, e normalmente encontramos pelo menos 4K
de memória interna no chip em forma de ROM, EPROM ou OTP (One Time Pro-
gram). Os tipos OTP representam uma opção economicamente atraente, pois são
mais baratos comparados aos do modelo EPROM, e podem ser programados pelo
usuário. Nas versões ROMLESS, esta memória encontra-se externa ao microcon-
trolador. O pulso de leitura para a memória externa é o sinal PSEN (Program Store
Enable).
A memória de dados ocupa um espaço de endereçamento separado da me-
mória de programa. Até 64Kbytes de memória externa podem ser endereçados, e a
CPU gera sinais de read e write, necessários durante o acesso à memória externa.
3.2 Memória de Programa
A figura abaixo mostra o mapa da parte inferior da memória de programa.
Após o reset, a CPU começa a executar as instruções a partir do endereço 0000H.
Como pode ser visto na figura, cada interrupção é alocada num endereço fixo
da memória de programa. A interrupção direciona o contador de programa da CPU
para o seu respectivo endereço, onde se encontra a rotina de interrupção, conforme
controle proporcionado pelo vetor de interrupções.
Os primeiros 4Kbytes de memória podem estar localizados no chip, ou num
chip (ROM ou EPROM) externo. O controle de acesso interno/externo é feito pelo
(0033H)
002BH
0023H
001BH
0013H
000BH
0003H 0000H RESET
Interrupt Locations 8 Bytes
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
7
sinal EA (External Access). O sinal de “strobe” para acesso à memória externa é o
sinal PSEN, ativo apenas quando da ocorrência de acessos externos (EA ligado a
terra), não sendo, portanto utilizado quando se utiliza apenas a área de memória in-
terna.
A configuração de hardware necessária para acesso à memória externa é
ilustrada a seguir. Note que 16 linhas de I/O (port 0 e port 2) são dedicadas à transi-
ção de sinais durante buscas à memória externa. O port 0 opera como um barra-
mento de dados endereço multiplexado, emitindo o byte low do program counter co-
mo endereço e aguarda o recebimento do byte de código da memória de programa.
Durante o tempo em que o byte low está válido no port 0, o sinal ALE coloca este
byte no latch de endereços, enquanto o port 2 emite o byte alto de endereços. O si-
nal PSEN pulsa, e o código de byte é lido pelo microcontrolador.
O endereço de memória de programa sempre é de 16 bits, mesmo quando a
quantidade de memória externa é inferior à 64Kbytes. Desta forma, sempre que uti-
lizarmos memória externa, dois port’s (port 0 e port 2) serão sacrificados em função
do endereçamento das mesmas.
É possível utilizarmos também os portos que foram sacrificados, porém, não é uma operação tão confortável.
P1
P3 P2
ALE
__ EA
P0
_____ PSEN
Instr.
Address
___ OE
MCS-51 EPROM
Latch
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
8
3.3 – Memória de dados
A figura abaixo mostra o hardware necessário para o acesso à memória RAM
externa.
A CPU, neste caso está executando um programa a partir da ROM interna. O
port 0 serve como um barramento multiplexado de dados/endereço para a RAM, e 3
linhas do port 2 são utilizadas para as páginas da RAM. Os sinais de RD e WR são
gerados pela CPU para comandar as operações.
Podemos endereçar até 64Kbytes de memória RAM, em endereços de 1 ou 2
bytes. Os endereços de 1 byte são geralmente utilizados em conjunto com 1 ou
mais linhas de I/O, para definir a página que está sendo utilizada na RAM. Endere-
ços de 2 bytes, quando utilizados demandam que o port 2 gere o byte alto de ende-
reços.
A memória de dados interna está mapeada como indica a figura a seguir. O
espaço de memória está dividido em 3 blocos, normalmente denominados, Lower
128, Upper 128 e SFR (Special Function Register). A memória de dados interna
tem sempre 1 byte de endereçamento apenas, o que significa que temos um máximo
de 256 bytes de memória interna.
P1
ALE
__ EA
P0 Data
Address
MCS-51 With Intenal
ROM RAM
Latch
VCC
___ WR
___ RD
P3
P2
I/O PAGE
BITS ___ WE
___ OE
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
9
Entretanto, os modos de endereçamento permitem o uso de até 384 bytes
utilizando um truque simples. Através de endereçamento direto, acessamos um
espaço de memória e através de endereçamento indireto, acessamos um espaço de
memória diferente. Desta forma, os registradores de função especial (SFR) e os
últimos 128 bytes (Upper Space) são acessados nos mesmos endereços (de 80H
até FFH) apesar de serem fisicamente separados. Nas células básicas 8051, a área
de memória alta não existe no chip, desta forma, consideramos apenas a área de
memória baixa (Lower Space) para as nossas experiências (melhores referencias a
estas áreas altas podem ser encontradas nos manuais dos fabricantes).
Os primeiros 128 bytes de memória interna estão mapeados como indica a
figura abaixo:
Accessible By indirect Addressing
Only
Accessible By direct
And indirect
Addressing
Accessible By direct
Addressing
Only
Upper 128
Lower 128
0
7FH
80H
FFH FFH
80H
Special Function Registers
Ports, Status and Control bits Timer, Registers Stack Pointer Accumulator, etc...
07H 0
08H 0FH
10H 17H
18H 1FH
20H
2FH
30H
7FH
11
10
01
00
Bank select bits em PSW
Bit-Addressable Space (Bit Addresses 0 – 7F)
4 Banks of 8 registers R0 – R7
Reset value of stack pointer
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
10
Os primeiros 32 bytes estão agrupados em 4 bancos de 8 registradores, cha-
mados R0 até R7. Dois bits no registrador da palavra de controle (PSW) selecionam
qual o banco de registradores está em uso. Este recurso permite um uso mais efici-
ente do espaço de código.
Os próximos 16 bytes acima do banco de registradores formam o bloco co-
nhecido como memória endereçável por bit (bit addressable space). O conjunto de
instruções do 8051 inclui vários tipos de instruções de um só bit, e os 128 bits pre-
sentes nessa área podem ser diretamente endereçados por estas instruções.
Todos os bytes nos primeiros 128 bytes de memória podem ser endereçados
direta ou indiretamente. Os próximos 128 bytes só podem ser acessados indireta-
mente nos dispositivos que os possuem.
A área de memória acima de 128 bytes constitui o registrador de funções es-
peciais (SFR) cuja descrição detalhada faremos posteriormente.
3.4 – Conjunto de Instruções da família 8051
Todos os membros da família 8051 executam o mesmo conjunto de instru-
ções. Este conjunto é composto por instruções otimizadas para aplicações de con-
trole, facilitando as operações de dados através de vários modos de endereçamento.
Capacita ainda a operação de variáveis de um bit, permitindo operação em sistemas
que demandam processamento booleano. Vamos descrever rapidamente o modo
de operação de várias das instruções contidas neste conjunto. Maiores informações
podem ser encontradas nos manuais dos fabricantes, os quais descrevem detalha-
damente o conjunto de instruções.
3.5 – Registrador da palavra de controle (Program Status Word)
O registrador da palavra de controle (PSW) contém vários bits de status que
indicam o estado atual da CPU. A tabela a seguir indica a posição dos bits dentro
do registrador.
CY AC F0 RS1 RS0 OV - P
CY – (PSW7): Carry flag, indica “vai um” nas operações aritméticas. AC – (PSW6): Auxiliary carry flag, auxilia nas operações de adição.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
11
F0 – (PSW5): Flag de uso geral. RS1 – (PSW4): Seleção do banco de registradores. RS0 – (PSW3): Seleção do banco de registradores. OV – (PSW2): Overflow em operações aritméticas. - – (PSW1): Flag definível pelo usuário. P – (PSW0): Flag de paridade
O bit de carry, entre outras funções serve como “vai um” em operações arit-
méticas, e também como acumulador para um número de operação booleana. Os
bits RS0 e RS1 são utilizados para selecionar um entre quatro bancos de registrado-
res, disponíveis nos primeiros 128 bytes de RAM. O bit de paridade indica a quanti-
dade de bits em um no acumulador: se P=1, o acumulador contém um número ímpar
de uns; se P=0, o número de uns no acumulador é par. Dois bits do PSW estão dis-
poníveis e podem ser utilizados como flags de uso geral. O PSW encontra-se locali-
zado na área denominada SFR, no endereço D0H.
3.6 – Modos de endereçamento
Podemos ter seis modos distintos de endereçamento no 8051. Estes modos
são adequados às operações de controle.
Endereçamento direto: Neste modo, o operando é especificado por 8 bits de
endereço na instrução. Somente a RAM interna e os SFR’s podem ser aces-
sados diretamente.
Endereçamento indireto: No modo indireto, a instrução especifica um regis-
trador que contém o endereço do operando. Ambas as memórias, interna e
externa podem ser acessadas desta forma. O registrador de endereço, para
operações de 8 bits, pode ser R0 ou R1, ou ainda o Stack Pointer. Endereços
de 16 bits podem ser acessados somente pelo Data Pointer.
Instruções de registrador: Os bancos de registradores contêm os registra-
dores de R0 até R7, que podem ser acessados por certas instruções que le-
vam a especificação do registrador junto com o opcode da instrução. As ins-
truções que acessam os registradores dessa forma são eficientes, pois elimi-
nam o byte de endereço. Quando a instrução é executada, um dos oito regis-
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
12
tradores do banco selecionado é acessado e a seleção do banco é feita por
dois bits (RS0 e RS1) no PSW.
Instruções de registrador específico: Algumas instruções são especificadas
para certos registradores, por exemplo, as instruções que operam com acu-
mulador ou Data Pointer não necessitam um byte de endereço para apontá-
las, pois o próprio opcode faz isso.
Constantes imediatas: Podemos carregar um registrador com uma constan-
te, diretamente por um simples comando, como por exemplo, mov A, #100,
que coloca no acumulador o valor 100 (decimal).
Endereçamento indexado: Somente a memória de programa (ROM) pode
ser acessada desta forma e somente pode ser lida. Este modo de endereça-
mento é destinado à leitura de tabelas. Um registrador de 16 bits (DPTR ou
PC) indica o endereço de base da tabela e o acumulador é carregado com o
valor da tabela.
3.7 – Instruções aritméticas
O conjunto de instruções aritméticas é listado na tabela a seguir. A tabela indica
o modo de endereçamento que pode ser utilizado com cada instrução, para acessar
o byte operando. Por exemplo, a instrução Add A, <byte>; pode ser escrita como:
Add A, 7FH (endereçamento direto)
Add A, @R0 (endereçamento indireto)
Add A, R7 (endereçamento por registrador)
Add A, #127 (constante imediata)
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
13
Mnemônico Operação Modo de Endereçamento
Tempo de Execução
ADD A, <byte> A = A + <byte> Dir / Ind / Reg / Imm
1
ADDC A, <byte> A = A + <byte> + C Dir / Ind / Reg / Imm
1
SUBB A, <byte> A = A - <byte> - C Dir / Ind / Reg / Imm
1
INC A A = A + 1 Acumulador 1
INC <byte> <byte> = <byte> + 1 Dir / Ind / Reg 1
INC DPTR DPTR = DPTR + 1 Data Pointer 2
DEC A A = A - 1 Acumulador 1
DEC <byte> <byte> = <byte> - 1 Dir / Ind / Reg 1
MUL AB B e A = B x A Acumulador e B
4
DIV AB A = INT [A/B]
B = MOD [A/B]
Acumulador e B
4
DA A Ajuste decimal Acumulador 1
Os tempos de execução indicados consideram um clock de 12MHz. Todas as
instruções aritméticas são executadas num tempo de 1s com exceção da instrução
INC DPTR que consome 2s, e as instruções de multiplicação e divisão que são efe-
tuadas em 4s.
Perceba que qualquer byte no espaço de memória interno pode ser incremen-
tado ou decrementado sem o uso do acumulador. Inclusive o registrador de 16 bits
DPTR pode ser incrementado desta forma. A instrução MUL AB opera com os re-
gistradores A e B e põe o resultado (16 bits) nos registradores B (byte high) e A (byte
low) concatenados. A instrução DIV AB divide A por B e coloca o quociente (resul-
tado da divisão inteiro em 8 bits) no acumulador e o resto (8 bits) no registrador B.
Devido às suas características, a operação de divisão é mais utilizada em
conversões de radicais e operações de deslocamento programáveis, do que na divi-
são aritmética propriamente dita.
A instrução de ajuste decimal DA A é utilizada na aritmética BCD, quando uti-
lizamos esta aritmética, as operações ADD e ADDC devem, obrigatoriamente, ser
seguidas por uma operação de ajuste decimal, para que os resultados continuem em
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
14
BCD. Note que o ajuste decimal não converte o número binário em BCD, mas corri-
ge os erros de aproximação ocorridos nos registradores.
3.8 – Instruções lógicas A tabela a seguir mostra uma lista de instruções lógicas do 8051.
Mnemônico
Operação
Modos de Operação
Tempo de
Execução
ANL A, <byte> A = A and <byte> Dir / Ind / Reg / Imm
1
ANL <byte>, A <byte> = <byte> and A Direto 1
ANL <byte>,
#DATA
<byte> = <byte> and #DA-
TA
Direto 2
ORL A, <byte> A = A or <byte> Dir / Ind / Reg / Imm
1
ORL <byte>, A <byte> = <byte> or A Direto 1
ORL <byte>,
#DATA
<byte> = <byte> or #DATA Direto 2
XRL A, <byte> A = A xor <byte> Dir / Ind / Reg / Imm
1
XRL <byte>, A <byte> = <byte> xor A Direto 1
XRL <byte>,
#DATA
<byte> = <byte> xor #DA-
TA
Direto 2
CLR A A = 00H Acumulador 1
CPL A A = not A Acumulador 1
RL A Roda Acum. à esquerda 1
bit
Acumulador 1
RLC A Roda Acum. à esquerda c/
carry
Acumulador 1
RR A Roda Acum. à direita 1 bit Acumulador 1
RRC A Roda Acum. à direita c/
carry
Acumulador 1
SWAP A Swap nibbles in A Acumulador 1
Todos os modos de endereçamento podem ser utilizados e as instruções são
executadas em tempo de 1 a 2 s. Estas instruções podem ser executadas em qual-
quer byte de memória interna ou na área de SFR. O conjunto de instruções permite
que sejam realizadas todas as operações lógicas e ainda a instrução SWAP A, que
inverte os nibbles alto e baixo do acumulador, operação útil quando operamos com o
código BCD.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
15
3.9 – Transferência de dados interna e externa
A tabela a seguir mostra as instruções disponíveis para movimentação de da-
dos entre os espaços de memória interna.
Mnemônico Operação Modo de Endereçamento
Tempo de Execução
MOV A, <fonte> A = <fonte> Dir / Ind / Reg / Imm
1
MOV <dest>, A <dest> = A Dir / Ind / Reg 1
MOV <dest>,
<fonte>
<dest> = <fonte> Dir / Ind / Reg / Imm
2
MOV DPTR,
#DATA
DPTR = 16 bit Const Constante imedi-ata
2
PUSH <fonte> INC SP: MOV @SP,
<fonte>
Direto 2
POP <dest> MOV <dest>, @SP: DEC
SP
Direto 2
XCH A, <byte> Acc e <byte> trocam os
dados
Dir / Ind / Reg 1
XCHD A, @RI Acc e <byte> trocam os
nibbles
baixos
Indireto 1
A instrução MOV <dest>, <fonte> permite que os dados sejam transferidos
entre quaisquer dos registradores da RAM interna ou dos SFR, sem o uso do acu-
mulador, lembrando que os 128 bytes superiores podem ser acessados apenas por
endereçamento indireto e os SFR apenas por endereçamento direto.
A área de stack reside na própria RAM interna e as instruções de PUSH pri-
meiro incrementam o stack pointer, então copia o byte no stack. As instruções de
PUSH e POP usam apenas o endereçamento direto para identificar o byte que está
sendo manipulado, enquanto que o stack é acessado por endereçamento indireto
através do registrador SP. Isto significa que o stack vai para os 128 bytes altos (se
existirem) mas não para a área de SFR. Nos dispositivos onde não está implemen-
tado a área alta, os bytes “PUSHed” são perdidos e os bytes “POPed” são indeter-
minados.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
16
As transferências de dados incluem movimentações em 16 bits, que podem
ser utilizadas para inicializar o Data Pointer (DPTR), para o uso de tabelas na memó-
ria de programa, ou para acesso à memória de dados externa.
A instrução XCH A, <byte> resulta na troca dos dados entre o acumulador e o
byte endereçado. A instrução XCHD A, @RI é similar, com a diferença que apenas
os nibbles baixos estão envolvidos na operação. Esta instrução facilita a manipula-
ção de dados, de forma a economizar instruções nos programas.
A memória externa pode ser acessada por endereçamento indireto, utilizando
8 ou 16 bits de endereço. A escolha recai no uso de endereçamento de um byte,
através de @Ri, onde Ri pode ser R0 ou R1 do banco de registradores selecionado,
ou um endereço de 2 bytes (16 bits) colocado no Data Pointer (DPTR). A desvanta-
gem do uso do endereçamento de 16 bits está no fato de que, se utilizarmos um pe-
queno espaço de memória, ainda assim o port 2 será inteiramente indisponibilizado
para uso. No endereçamento de 8 bits, sacrificamos apenas algumas linhas do port
2.
A tabela abaixo indica as instruções de movimentação de dados em memória
externa. Todas as instruções são executadas em 2s, com um clock de 12MHz.
Largura do Endereço Mnemônico Operação
8 Bits MOVX A, @Ri Lê RAM Externa (Ri)
8 Bits MOVX @Ri, A Escreve RAM Externa (Ri)
16 Bits MOVX A, @DPTR Lê RAM Externa (DPTR)
16 Bits MOVX @DPTR, A Escreve RAM Externa (DPTR)
Em todos os acessos à RAM externa, utilizamos sempre o acumulador como
registrador intermediário. Os pulsos de READ ou WRITE são ativos somente duran-
te a execução da instrução MOVX. Normalmente estes sinais estão inativos e se
não forem utilizados, podem ser configurados como linhas de I/O extra.
Existem ainda duas instruções que estão disponíveis para leitura de tabelas
na memória de programa. Estas instruções permitem apenas a leitura de dados na
memória de programa (ROM), não permitindo a atualização dos mesmos. O mne-
mônico é MOVC (mov constant), e pode se apresentar de duas formas:
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
17
MOVC A, @A + DPTR
MOVC A, @A + PC
A diferença está no registrador auxiliar utilizado durante a leitura, que pode
ser o DPTR ou o PC. A primeira instrução permite o acesso a tabelas de até 256
itens, sendo que o DPTR indica o início da tabela, e o acumulador indica o off-set do
endereço desejado. Com a variação (incremento) do acumulador, podemos ler a ta-
bela inteira mantendo o DPTR fixo. A outra instrução, utiliza o acumulador como ba-
se de endereçamento e o PC como off-set, de forma que a leitura de tabelas deve
ser feita por sub-rotinas como a que se segue:
MOV A, valor inicial
CALL tabela
A rotina “tabela” seria:
tabela: MOVC A, @A + PC
RET
Este tipo de tabela pode conter até 255 itens, lembrando que neste caso, não
podemos utilizar o valor “0” da tabela, que variará entre 1 e 255. Um valor colocado
no off-set 0 não será lido.
3.10 – Instruções Booleanas
A família 8051 contém um processador booleano completo. Um processador
booleano consiste num elemento que permite a manipulação direta de um único bit
dentro da palavra que pode ser de 8 ou mais bits (byte). A RAM interna contém 128
bits endereçáveis e o espaço SFR contém mais 128. Todos os port’s são bits ende-
reçáveis, e cada um pode ser tratado como um port separado. As instruções que
acessam esses bits não são apenas seqüências de desvios condicionais, mas um
completo conjunto de instruções como indicado na tabela abaixo:
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
18
Mnemônico Operação Tempo de Execução
ANL C, bit C = C and bit 2
ANL C, /bit C = C and not bit 2
ORL C, bit C = C or bit 2
ORL C, /bit C = C or not bit 2
MOV C, bit C = bit 1
MOV bit, C bit = C 2
CLR C C = 0 1
CLR bit bit = 0 1
SETB C C = 1 1
SETB bit bit =1 1
CPL C C = not C 1
CPL bit bit = not bit 1
JC REL Jump If C = 1 2
JNC REL Jump If C = 0 2
JB bit, REL Jump If bit = 1 2
JNB bit, REL Jump If bit = 0 2
JBC bit, REL Jump If bit = 1 : CLR bit 2
Este tipo de operação de bit não é facilmente obtido em arquiteturas de mi-
croprocessador. Todos os bits são acessados diretamente nos endereços 00H até
7FH na área dos 128 bytes inferiores e de 80H até FFH no espaço SFR. Desta for-
ma podemos com as instruções de programa, implementar circuitos lógicos dentro
do microcontrolador, evitando o uso de circuitos discretos ou PAL’s.
3.11 – Instruções de Salto
Podemos utilizar 3 tipos de instruções de desvio, quando endereçamos um
programa no microcontrolador. Estas instruções diferem entre si no formato do en-
dereço de destino. A instrução SJMP (Short Jump) é composta por dois bytes, cons-
tituindo um byte de opcode e um byte de off-set. Este fato limita o espaço de ende-
reçamento em valores de -127 até +127 bytes em torno da instrução seguinte ao
SJMP.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
19
Quando utilizamos a instrução LJMP (Long Jump) temos um comprimento de
3 bytes, que consiste de dois bytes de endereço e um byte de opcode, permitindo o
endereçamento de 64Kbytes de memória de programa.
A instrução AJMP (Absolute Jump) é codificada em 2 bytes sendo que o en-
dereço é formado por 11 bits e os 5 bits restantes utilizados no opcode.
A tabela abaixo indica as instruções de salto disponíveis.
Mnemônico Operação Tempo de Execução
JMP end Salto para end 2
JMP @A + DPTR Salto para A + DPTR 2
CALL end Chama subrotina no endereço end 2
RET Retorno de subrotina 2
RETI Retorno de interrupção 2
NOP Sem operação 1
Em todos os casos, o programador especifica o endereço de destino para o
assembler da mesma forma, por um “label” ou uma constante de 16 bits. O assem-
bler colocará o endereço de destino no formato correto para cada instrução, e se o
formato não comportar o valor, aparecerá a mensagem “Destination out of range”.
Temos ainda as instruções LCALL, que permite a chamada de subrotinas em
qualquer posição dos 64Kbytes de memória, e ACALL, que se utiliza do mesmo
formato de endereçamento de 11 bits utilizado no AJMP. As subrotinas devem ser
finalizadas com o comando RET, e deve-se lembrar que cada chamada necessita de
um RET, sem o qual o programa se perde.
A instrução RETI é utilizada como retorno da rotina de interrupção. A única
diferença entre a instrução RET e a RETI, é que a RETI informa ao sistema de con-
trole de interrupção que a interrupção em progresso foi atendida.
Os saltos acima listados são chamados de saltos incondicionais, pois não de-
pendem de nenhuma verificação de condições anteriores. Os chamados saltos con-
dicionais, dependentes da verificação de certos bits de controle, e estão listados a
seguir:
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
20
Mnemônico Operação Modo de Endereçamento
Tempo de
Execu-ção
JZ rel Salto se A=0 Acumulador 2
JNZ rel Salto se A não 0 Acumulador 2
DJNZ <byte>, rel Decrementa e salta se não
0
Direto Registra-dor
2
CJNE A, <byte>, rel Salta se A diferente de
<byte>
Direto Imediato 2
CJNE <byte>, #DA-
TA, rel
Salta se <byte> diferente
de #DATA
Indireto Regis-trador
2
Não existe bit de zero no registrador PSW, portanto as instruções JZ e JNZ
devem testar o dado do acumulador para estas condições. A instrução DJNZ é ade-
quada para controle de loops, pois sua configuração de dupla função (decrementa e
testa) torna fácil a execução de loops.
A instrução CJNE pode ser utilizada para controle de loops ou para teste con-
dicional de bytes, na forma de “maior que” ou “menor que”, pois existe a indicação
de maior ou menor pelo bit de CARRY, localizado no PSW.
3.12 – Oscilador Interno
Todos os membros da família 8051 possuem um oscilador interno que pode
ser utilizado como fonte de clock para a CPU, bastando para isso que se implemente
a configuração abaixo:
Quartz Cristal or ceramic ressonator
C1
C2
XTAL2
XTAL1
VSS
MCS-51 HMOS or
CHMOS
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
21
Se ao invés de utilizarmos o oscilador interno, utilizamos outro gerador
qualquer (para sincronizar com outros circuitos, por exemplo) devemos ter o cuidado
de interligar a entrada no pino certo. Este fato é importante, pois este pino muda
conforme o tipo de chip utilizado, por exemplo, com chips HMOS (8051) devemos
ligar a entrada de clock ao pino XTAL2, enquanto que em circuitos CMOS (80C51),
o clock deve ser colocado no pino XTAL1. A figura abaixo indica a correta
montagem destas entradas nos diversos componentes.
3.13 – Estrutura de Interrupções
A família 8051 atende a cinco entradas de interrupções distintas, duas exter-
nas, duas relativas aos dois timers, e uma relativa ao canal serial interno. Cada in-
terrupção pode ser habilitada ou desabilitada individualmente, setando ou resetando
um bit no registrador denominado IE (Interrupt Enable) dentro do SFR. Este regis-
trador contém ainda um bit que habilita todas as interrupções, e sua estrutura com-
pleta é mostrada abaixo. O bit em 0 desabilita a interrupção e o bit em 1 habilita a
interrupção.
EA - - ES ET1 EX1 ET0 EX0
EA – (IE.7) Habilita todas as interrupções globais quando em 1;
ES – (IE.4) Interrupção do port serial;
ET1 – (IE.3) Interrupção do timer 1;
EX1 – (IE.2) Interrupção externa 1;
ET0 – (IE.1) Interrupção do timer 0;
EX0 – (IE.0) Interrupção externa 0.
XTAL2
XTAL1
VSS
MCS-51 HMOS or
CHMOS
External Clock Signal
XTAL2
XTAL1
VSS
MCS-51 HMOS
Only
External Clock
Signal XTAL2
XTAL1
VSS
MCS-51 CHMOS
Only
External Clock
Signal
(IC)
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
22
Cada fonte de interrupção pode ser programada quanto à sua prioridade de
atendimento, por um outro registrador localizado na área de SFR e denominado IP
(Interrupt Priority).
A rotina de prioridade de interrupção determina que se uma interrupção de
baixo nível estiver sendo executada, esta pode ser interrompida por uma interrupção
de alto nível, sendo continuada após o término da mesma. O contrário não é verda-
deiro, ou seja, uma interrupção de alto nível não é interrompida por uma interrupção
de nível inferior, nem igual ao dela. Se duas interrupções de mesmo nível são rece-
bidas simultaneamente, uma sequência de pool interna determina qual será atendida
em primeiro lugar. A figura abaixo ilustra o conteúdo do registrador IP. O Bit em 0
desabilita a interrupção e o bit em 1 habilita a interrupção.
- - - PS PT1 PX1 PT0 PX0
PS – (IP.4) Prioridade de interrupção do canal serial;
PT1 – (IP.3) Prioridade de interrupção timer 1;
PX1 – (IP.2) Prioridade de interrupção externa 1;
PT0 – (IP.1) Prioridade de interrupção do timer 0;
PX0 – (IP.0) Prioridade de interrupção externa 0.
Quando em operação, todos os flags de interrupção estão retidos no sistema
de controle de interrupção durante o estado de cada ciclo de máquina. As amostras
são “pooladas” durante o ciclo seguinte, e se uma delas se encontrar setada, o sis-
tema de interrupção gera um LCALL para o endereço apropriado na memória de
programa, a menos que outra condição bloqueie a interrupção.
Esta LCALL gerada por hardware resulta na transferência do conteúdo do re-
gistrador PC para o Stack e recarrega o PC com o primeiro endereço da rotina de in-
terrupção. Cada rotina de uma dada interrupção começa num endereço fixo. So-
mente o PC é transferido automaticamente para o stack, então devemos nos lembrar
de salvar os registradores importantes em cada rotina de interrupção. Salvando
apenas o PC, torna-se mais simples a aplicação destas rotinas nas funções mais
comuns de controle, onde não necessitamos grandes recursos de software, pois
precisamos apenas setar um pino, ou recarregar um timer, ou ler um canal serial, por
exemplo.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
23
A figura a seguir indica como atuam os registradores no controle do hardware
de interrupção:
0
1
IT0 IE0
____ INT0
0
1
IT1 IE1
____
INT1
TF0
TF1
RI TI
IE Register IP Register High Priority
Interrupt
Interrupt Pooling
Sequence
Low Priority Interrupt
Global Disables
Individual
Enables
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
24
4 – Descrição do Hardware
A descrição a seguir mostra as características construtivas do microcontrola-
dor 8051.
4.1 – Registradores de função especial (Special Function Register – SFR)
A figura abaixo indica a disposição do registrador de funções especiais (SFR).
Na área de SFR, nem todos os endereços estão ocupados, de forma que es-
tes endereços não estão implantados no chip. Estes espaços destinam-se a acessó-
rios que encontramos em outros componentes da família.
Vamos descrever os nomes e funções de cada registrador.
Endereço F8H F9H FAH FBH FCH FDH FEH FFH
Função
Endereço F0H F1H F2H F3H F4H F5H F6H F7H
Função B
Endereço E8H E9H EAH EBH ECH EDH EEH EFH
Função
Endereço E0H E1H E2H E3H E4H E5H E6H E7H
Função ACC
Endereço D8H D9H DAH DBH DCH DDH DEH DFH
Função
Endereço D0H D1H D2H D3H D4H D5H D6H D7H
Função PSW
Endereço C8H C9H CAH CBH CCH CDH CEH CFH
Função T2CON RCP2L RCP2H TL2 TH2
Endereço C0H C1H C2H C3H C4H C5H C6H C7H
Função
Endereço B8H B9H BAH BBH BCH BDH BEH BFH
Função IP
Endereço B0H B1H B2H B3H B4H B5H B6H B7H
Função P3
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
25
Endereço A8H A9H AAH ABH ACH ADH AEH AFH
Função IE
Endereço A0H A1H A2H A3H A4H A5H A6H A7H
Função P2
Endereço 98H 99H 9AH 9BH 9CH 9DH 9EH 9FH
Função SCON SBUF
Endereço 90H 91H 92H 93H 94H 95H 96H 97H
Função P1
Endereço 88H 89H 8AH 8BH 8CH 8DH 8EH 8FH
Função TCON TMOD TL0 TL1 TH0 TH1
Endereço 80H 81H 82H 83H 84H 85H 86H 87H
Função P0 SP DPL DPH PCON
4.2 – Acumulador (ACC) (Registrador A)
O acumulador é o registrador onde se processam a maioria das operações de
um processador, comumente encontradas num microprocessador de 8 bits.
4.3 – Registrador B (B)
É um registrador utilizado durante as operações de multiplicação e divisão,
podendo ser utilizado como registrador de uso geral em outras operações.
4.4 – Registrador da palavra de controle (PSW)
É chamado de Program Status Word e contém basicamente, os flags de con-
trole de fluxo do programa. Por isso é utilizado em desvios e saltos condicionais,
sendo também alterado na maioria das instruções. Seu conteúdo é indicado na figu-
ra abaixo.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
26
CY AC F0 RS1 RS0 OV - P
CY – (PSW7): Carry flag, indica “vai um” nas operações aritméticas.
AC – (PSW6): Auxiliary carry flag, auxilia nas operações de adição.
F0 – (PSW5): Flag de uso geral.
RS1 – (PSW4): Seleção do banco de registradores em uso.
RS0 – (PSW3): Seleção do banco de registradores em uso.
OV – (PSW2): Overflow em operações aritméticas.
- – (PSW1): Flag definível pelo usuário.
P – (PSW0): Flag de paridade, indica o número de bits em “1” no acumula-
dor.
RS0 RS1 Banco Selecionado Endereço
0 0 Banco 0 00H até 07H
0 1 Banco 1 08H até 0FH
1 0 Banco 2 10H até 17H
1 1 Banco 3 18H até 1FH
4.5 – Stack Pointer (SP) e Data Pointer (DPTR)
O Stack Pointer (ponteiro de pilha) é incrementado antes do armazenamento
dos dados em uma instrução PUSH ou CALL. Observe que o Stack pode ser aloca-
do em qualquer região da memória RAM, o ponteiro é sempre inicializado no ende-
reço 07H, e o Stack começa no endereço 08H.
O Data Pointer consiste em dois registradores de 8 bits (DPH byte alto, e DPL
byte baixo), que podem ser manipulados tanto como dois registradores separados
de 8 bits como um único de 16 bits.
4.6 – Buffer Serial (SBUF)
O Buffer de dados serial (Serial data BUFfer) consiste de dois registradores
separados, o buffer de transmissão e o buffer de recepção. Quando um dado é co-
locado no buffer serial, ele vai diretamente para o buffer de transmissão serial, e
quando ele chega ao buffer de recepção, ele é colocado diretamente no SBUF.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
27
Existe um registrador que controla todas as operações da interface serial
chamado SCON (Serial CONtrol). Seu conteúdo é descrito a seguir.
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0 – (SCON.7): Modo de operação da interface serial.
SM1 – (SCON.6): Modo de operação da interface serial.
SM2 – (SCON.5): Modo de operação da interface serial.
REN – (SCON.4): Habilitação de recepção.
TB8 – (SCON.3): É o nono bit transmitido (stop bit).
RB8 – (SCON.2): É o nono bit recebido.
TI – (SCON.1): Flag indicando fim de transmissão.
RI – (SCON.0): Flag indicando buffer de recepção cheio.
SM0 SM1 Modo Descrição Frequência
0 0 0 Shift Register Freq. Oscilador /12
0 1 1 8 bit UART Variável
1 0 2 9 bit UART Freq. Oscilador /64 ou 32
1 1 3 9 bit UART Variável
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
28
4.7 – Portos de E/S (P0, P1, P2, P3)
Os portos P0, P1, P2 e P3 são latches dos seus respectivos portos físicos. Es-
crevendo um bit “1” no SFR, o pino de saída do porto respectivo irá para “1” imediata-
mente. Quando este port for acessado para leitura, o estado do pino externo é arma-
zenado no registrador correspondente. A estrutura dos port’s é ilustrada abaixo.
Todos os 4 port’s são bidirecionais e consistem num latch (que é o próprio SFR),
num driver de saída e num driver de entrada. Os drivers de saída dos port’s P0 e P2 e
o driver de entrada do port P0, são utilizados durante o acesso à memória externa.
P0.X
PIN D
CL _
Q
Q P0.X
Latch MU
X
Read
Latc
h
Write
To
Latch Read
PIN
Addr/Data Control VCC
Int. BUS D
CL _
Q
Q P1.X
Latch
Read
Latc
h
Write
To
Latch Read
PIN
Int. BUS
P1.X
PIN
VCC
Interna
l
Pull-up
P2.X
PIN D
CL _
Q
Q P2.X
Latch MU
X
Read
Latc
h
Write
To
Latch Read PIN
Address Control VCC
Int. BUS
Interna
l
Pull-up
D
CL _ Q
Q P3.X
Latch
Read
Latc
h
Write
To
Latch
Read
PIN
Int. BUS
P3.X
PIN
VCC
Interna
l
Pull-up
Alternate Output
Function
Alternate
Input
Function
Port 0 Bit
Port 1 Bit
Port 2 Bit
Port 3 Bit
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
29
4.8 – Registradores de Timer e de Controle
Os pares de registradores (TH0, TL0, e TH1, TL1) são registradores de conta-
gem de 16 bits, nos quais programamos os valores de contagem/temporização dos
respectivos contadores.
Existem outros registradores de funções específicas de controle de alguns mó-
dulos do microcontrolador. Vamos descrever cada um desses registradores.
O registrador IP (Interrupt Priority), define um dos dois níveis possíveis para ca-
da interrupção, de acordo com a descrição abaixo.
- - PT2 PS PT1 PX1 PT0 PX0
PT2 – (IP5): Define nível de prioridade do timer 2 (somente no 8052).
PS – (IP4): Define o nível de prioridade do port serial.
PT1 – (IP3): Define o nível de prioridade do timer 1.
PX1 – (IP2): Define o nível de prioridade da interrupção externa 1.
PT0 – (IP1): Define o nível de prioridade do timer 0.
PX0 – (IP0): Define o nível de prioridade da interrupção externa 0.
Já o registrador IE (Interrupt Enable), permite a habilitação ou desabilitação indi-
vidual de cada uma das fontes de interrupção. Através de um bit neste mesmo regis-
trador podemos atuar sobre todas as interrupções de maneira global.
EA - ET2 ES ET1 EX1 ET0 EX0
EA – (IE7): Desabilita todas as interrupções quando em 0.
ET2 – (IE5): Habilita ou desabilita a interrupção do timer 2 (somente 8052).
ES – (IE4): Habilita ou desabilita a interrupção do port serial.
ET1 – (IE3): Habilita ou desabilita a interrupção do timer 1.
EX1 – (IE2): Habilita ou desabilita a interrupção externa 1.
ET0 – (IE1): Habilita ou desabilita a interrupção do timer 0.
EX0 – (IE0): Habilita ou desabilita a interrupção externa 0.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
30
O registrador TMOD (Timer MODe), permite o controle do modo de operação
dos timers existentes no microcontrolador, bem como a definição quanto à operação
como timer ou como contador.
Gate (1) C/T (1) M1 (1) M0 (1) Gate (0) C/T (0) M1 (0) M0 (0)
Gate: Permite o disparo do timer por hardware (gate=1), ou por sof-
tware (gate=0), via registrador TCON.
C/T: Em 0 opera como timer, em 1 opera como contador.
M1: Modo de operação.
M0: Modo de operação.
M1 M0 Modo de Operação
0 0 0 – Timer de 13 bits compatível com o 8048.
0 1 1 – Timer/counter de 16 bits.
1 0 2 – Timer/counter de 8 bits auto reload.
1 1 3 – No timer 0, TL0 define um contador de 8 bits e TH0 é controla-do pelos bits de controle do timer 1. O timer 1 está parado.
A operação dos timers/counters dependem também de um registrador denomi-
nado TCON (Timer CONtrol), utilizado para configurá-lo e monitorar suas condições de
funcionamento. Neste mesmo registrador encontramos os flags de interrupções exter-
nas, os quais estão ativos quando da ocorrência da interrupção.
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
TF1 – (TCON.7): Flag de overflow do timer 1. Seta quando overflow.
TR1 – (TCON.6): Bit de disparo do timer 1.
TF0 – (TCON.5): Flag de overflow do timer 0. Seta quando overflow.
TR0 – (TCON.4): Bit de disparo do timer 0.
IE1 – (TCON.3): Flag da interrupção externa 1.
IT1 – (TCON.2): Seleciona o tipo de interrupção 1 (borda ou nível).
IE0 – (TCON.1): Flag da interrupção externa 0.
IT0 – (TCON.0): Seleciona o tipo de interrupção 0 (borda ou nível).
O registrador de controle da interface serial SCON (Serial CONtrol), permite a
programação das características funcionais da interface serial do microcontrolador.
Normalmente devemos utilizar este registrador para definir que tipo de UART vamos
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
31
utilizar, e verificar o status da transmissão pelos bits de controle, presentes neste
mesmo registrador.
SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0 – (SCON.7): Modo de operação do port serial.
SM1 – (SCON.6): Modo de operação do port serial.
SM2 – (SCON.5): Usado nos modos 2 e 3 para multiprocessamento.
REN – (SCON.4): Habilita ou desabilita a recepção definido por soft.
TB8 – (SCON.3): É o nono bit transmitido (stop bit) definido por soft.
RB8 – (SCON.2): É o stop bit recebido do hardware para sinalização.
TI – (SCON.1): Setado pelo hardware no fim da transmissão.
RI – (SCON.0): Setado pelo hardware no fim da recepção.
SM0 SM1 Modo Descrição Frequência
0 0 0 Shift Register Freq. Oscilador /12
0 1 1 8 bit UART Variável
1 0 2 9 bit UART Freq. Oscilador /64 ou 32
1 1 3 9 bit UART Variável
Existe ainda um registrador para controle genérico das funções de alimentação
do microcontrolador. O registrador PCON (Power CONtrol) é bastante utilizado quando
optamos pela utilização da tecnologia CHMOS (80C51 por exemplo), para garantir bai-
xo consumo em circuitos alimentados por bateria, ou ainda que permaneçam um gran-
de período em “stand-by”.
SMOD - - - GF1 GF0 PD IDL
SMOD: Dobra o baud rate quando utilizamos o timer 1.
GF1: Flag de uso geral.
GF0: Flag de uso geral.
PD: Ativa o modo de operação Power Down (só nos CHMOS).
IDL: Ativa o modo de operação IDLE (só nos CHMOS).
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
32
4.9 – Estrutura e operação dos ports de I/O
Os quatro ports presentes no 8051 são bidirecionais, consistindo cada um de um
latch (que é o próprio registrador Px no SFR), em um driver de saída e em um buffer de
entrada. Para acessar a memória externa, utilizamos os ports P0 e P2, sendo que o
port P0 leva os dados e endereços multiplexados, enquanto que o port P2 leva à me-
mória o restante dos endereços. Fica claro que quando utilizamos os microcontrolado-
res sem memória interna (80C31 por exemplo) o port P2 tem seu uso restrito para en-
dereçamento. O port P3 é um port multifuncional, ou seja, seus pinos não são apenas
pinos de entrada e saída, mas tem diversas funções específicas, que estão listadas
abaixo:
P3.0 – RXD – entrada do port serial
P3.1 – TXD – saída do port serial
P3.2 – INT0 – entrada da interrupção externa 0
P3.3 – INT1 – entrada da interrupção externa 1
P3.4 – T0 – entrada do Timer/counter 0
P3.5 – T1 – entrada do Timer/counter 1
P3.6 – WR – sinal de escrita para memória externa
P3.7 – RD – sinal de leitura para memória externa
Os portos 1, 2 e 3 são providos de resistores pull-up internos, enquanto que o
port 0 apresenta saídas em open drain. Qualquer uma das linhas pode ser usada in-
dependentemente como entrada ou saída, uma vez que os ports são endereçáveis por
bit (bit addressable). Para utilizarmos os ports como entradas, devemos colocar nível
lógico “1” no latch de entrada, para que o pino fique em nível alto pelo resistor de pull-
up, mas possa ser colocado em nível baixo pela ação de um sinal externo.
No port 0, não existe o resistor de pull-up interno, de forma que torna-se obriga-
tório o uso de pull-up’s externos. Quando ocorre o endereçamento, a estrutura do port
permite que sejam colocados “1’s” ou “0’s” conforme a necessidade. A estrutura dos
ports está representada a seguir, ilustrando o funcionamento dos mesmos.
Para escrever um dado em um dispositivo através de um dos ports, devemos
simplesmente mover o dado para o registrador respectivo no SFR. Devemos lembrar
sempre que os valores de corrente fornecidos pelos port’s são da ordem de mili-
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
33
ampères, de forma que precisamos de drivers de corrente na maioria dos casos. Os
resistores pull-up internos fornecem baixos valores de corrente e na maioria dos proje-
tos determinamos a ativação dos dispositivos de saída em níveis baixos, pois neste ca-
so a corrente pode ser significativamente maior.
Os buffers de saída dos ports 1, 2 e 3 fornecem corrente suficiente para 4 cargas
TTL cada um, enquanto que o port 0 pode fornecer corrente para até 8 cargas TTL.
Algumas instruções de leitura no port, realizam uma leitura no latch (registrador),
enquanto outras realizam a leitura diretamente no pino do CI. As instruções que reali-
zam a leitura no latch, lêem este valor, processam, e depois se for necessário rescre-
vem-no no latch. São chamadas de “read-modify-write”, e estão listadas a seguir:
ANL – “E” lógico
ORL – “Ou” lógico
XRL – “Ou Exclusivo” lógico
JBC – Jump se bit =1 e limpa o bit
CPL – Complementa o bit
INC – Incremento
DEC – Decremento
DJNZ – Decrementa e salta se não zero
MOV, Px,y, C – Move carry bit para o bit y do port x
CLR Px,y – Limpa bit y do port x
SETB Px,y – Seta bit y do port x
A razão pela qual as instruções acima são direcionadas preferencialmente ao
latch é evitar uma má interpretação do nível lógico no pino. Um exemplo disso é quan-
do utilizamos transistores na saída dos microcontroladores, e escrevemos nível “1” na
base do mesmo. A tensão neste pino pode ser confundida com nível “0” facilmente,
enquanto que se a mesma for lida no latch, representará o valor real do sinal no pino.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
34
P0.X
PIN
D
CL
_
Q
Q P0.X
Latch
MUX
Read
Latch
Write
To Latch
Read
PIN
Addr/Data
Control VCC
Int. BUS D
CL
_
Q
Q P1.X
Latch
Read
Latch
Write
To Latch
Read
PIN
Int. BUS
P1.X
PIN
VCC
Internal
Pull-up
P2.X
PIN
D
CL
_
Q
Q P2.X
Latch
MUX
Read
Latch
Write
To Latch
Read
PIN
Address
Control VCC
Int. BUS
Internal
Pull-up
D
CL
_
Q
Q P3.X
Latch
Read
Latch
Write
To Latch
Read
PIN
Int. BUS
P3.X
PIN
VCC
Internal
Pull-up
Alternate
Output Function
Alternate
Input Function
Port 0 Bit
Port 1 Bit
Port 2 Bit
Port 3 Bit
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
35
4.10 – Acesso à memória externa
Podemos ter dois tipos de acesso à memória externa, acesso à memória de pro-
grama externa (ROM, EPROM) e acesso à memória de dados externa (RAM). Aces-
sos à ROM externa utilizam o sinal PSEN como strobe de leitura, enquanto que utiliza-
mos o sinal RD ou WR como strobe quando acessamos a memória RAM.
Buscas à memória externa de programa utilizam sempre endereços de 16 bits, e
os acessos à memória de dados podem utilizar 8 ou 16 bits de endereço.
Quando utilizamos acessos de 16 bits, o byte alto de endereço é exibido pelo
porto 2, que fica indisponível como port de I/O genérico. Quando utilizamos acessos
em 8 bits, o valor do port 2 existente no latch do seu respectivo SFR é mantido de for-
ma que podemos implementar um sistema de gerenciamento com facilidade.
Em qualquer dos casos, o port 0 contém o byte baixo de endereços multiplexado
com os dados, e nesta função utilizamos um dos FETs internos com pull-up de forma
que não se orna necessária a adição de pull-up externo (se forem realizadas apenas
operações de busca na memória, o que não é muito comum). O sinal de ALE deve ser
utilizado para capturar o endereço válido no latch externo.
Durante qualquer acesso à memória externa, é escrito o byte 0FFH no latch do
port 0 (SFR), destruindo a informação presente neste port, portanto, devemos salvar
qualquer informação útil existente no port 0 antes de acessar a memória externa.
A memória de programa externa é acessada sempre em duas condições: quan-
do o sinal EA estiver ativo (nível baixo), ou o contador de programa PC apresentar um
número maior do que 0FFFH.
4.11 – Temporizadores e Contadores
O microcontrolador 8051 tem 2 temporizadores/contadores de 16 bits, timer 0 e
timer 1. Os dois podem ser programados para operar como temporizadores ou conta-
dores independentemente.
Na função de timer, o registrador é incrementado a cada ciclo de máquina, de
forma que podemos imaginar o timer como um “contador de ciclos de máquina”. Como
um ciclo de máquina consiste de 12 períodos do oscilador, podemos calcular facilmente
a frequência do nosso timer.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
36
Na função de contador, o registrador é incrementado a cada transição de 1 para
0 no correspondente pino de entrada. Desta forma, cada leitura toma o tempo de dois
ciclos de máquina, limitando a frequência máxima de amostragem a 1/24 da frequência
de clock.
4.12 – Modos de operação
Podemos ter quatro modos distintos de operação dos timer’s selecionados pelo
registrador TMOD.
Modo 0:
No modo 0, o timer é um contador de 8 bits com um divisor por 32, executando
na realidade, um timer de 13 bits, compatível com o timer do 8048, como indicado na
figura abaixo:
Neste modo, quando o contador passa de todos os bits em 0, o flag respectivo
TFx é setado no registrador TCON. O disparo do timer é feito por outro bit no
registrador TCON, o bit TRx (Timer Run). O bit Gate, presente no registrador TMOD
permite o uso de uma interrupção conjuntamente com o timer. Devemos lembrar
sempre de programar TMOD antes de programar TCON para disparo do timer.
O registrador de 13 bits consiste nos 8 bits de THx e nos 5 bits mais baixos de
TLx, sendo os 3 bits restantes do registrador TLx ignorados.
Modo 1:
No modo 1, os timer se comportam da mesma forma que no modo 0, exceto pelo
fato de que os registradores agora utilizam a totalidade dos 16 bits disponíveis para
cada um dos contadores.
12 Osc
TL1 (5 bits)
TH1
(8 bits) TF1 Interrupt
Control
C/T = 1
C/T = 0
T1 Pin
TR1
Gate
___ Int1 Pin
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
37
Modo 2:
O modo 2 configura o registrador do timer como um contador de 8 bits (TLx) com
recarga automática, como mostrado na figura abaixo:
Quando ocorre o overflow de TLx, o flag TLx é setado e o conteúdo de TLx é re-
carregado com o valor de THx, que deve ser anteriormente carregado por software. O
valor de THx permanece inalterado.
Modo 3:
O modo 3 deve ser utilizado quando necessitamos de um outro contador no
8051. Quando ativamos o modo 3, estabelecemos dois contadores separados, um pa-
ra o THx e outro para o TLx. O timer procedente de TLx utiliza para seu controle, os
bits C/T, Gate, TR0, INTx e TFx, relativos ao timer 0, enquanto que o timer relativo ao
registrador THx, utiliza os bits de controle relativos ao timer 1. A figura abaixo ilustra a
lógica de atuação deste modo.
12 Osc
TL1
(8 bits) TF1 Interrupt
Control
C/T = 1
C/T = 0
T1 Pin
TR1
Gate
___ Int0 Pin
TH1
(8 bits)
Reload
12 Osc
TL0
(8 bits) TF0 Interrupt
Control
C/T = 1
C/T = 0
T0 Pin
TR0
Gate
___ Int0 Pin
TH0
(8 bits) TF1 Interrupt
Control
1/12 Freq. Osc
1/12 Freq. Osc
1/12 Freq. Osc
TR1
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
38
4.13 – Interface Serial
A interface serial presente no microcontrolador é do tipo full-duplex, pode trans-
mitir e receber dados simultaneamente, com buffer de recepção, ou seja, pode come-
çar a receber um segundo byte antes de ler o primeiro byte do buffer. Os buffers de
transmissão e recepção são comandados pelo registrador SBUF no SFR. Escrita no
SBUF carrega o buffer de transmissão, enquanto que leituras no SBUF acessam um
registrador de recepção separado fisicamente.
A interface serial pode operar em 4 modos distintos, e em qualquer dos modos a
transmissão é iniciada por qualquer instrução que utilize o SBUF como registrador de
destino. A recepção se dá quando chega um dado no SBUF.
4.14 – Modos de Operação
Podemos operar com a interface serial interna do microcontrolador, de quatro
modos diferentes:
Modo 0:
Neste modo, os dados manipulados entram pelo pino RXD, enquanto que o pino
TXD é utilizado como saída. Temos então a transmissão de 8 bits, sendo que o primei-
ro bit é o LSB, e a frequência de baud rate é fixa em 1/12 da frequência do oscilador.
A transmissão é iniciada por qualquer instrução que utilize o SBUF como regis-
trador de destino. Imediatamente após esta instrução, é colocado um bit “1” na nona
posição do shift register e o bloco de controle de transmissão começa a transmissão.
Os bits de dados são deslocados para a direita e são colocados zeros nas posições
desocupadas, até que se chegue no MSB. Esta condição avisa para o bloco de contro-
le que deve ser efetuado um deslocamento, e em seguida é setada a flag TI. Todo es-
te processo ocorre no tempo de 10 ciclos de máquina.
A recepção começa quando a condição REN é igual a “1” e o flag RI é igual a
“0”. Os dados recebidos são deslocados e após a chegada do último bit, o flag de re-
cepção RI é setado, indicando que existem dados no buffer de recepção. A figura
abaixo ilustra o processo.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
39
Shift Clock
8051 Internal BUS
Write to SBUF
RXD P3.0 ALT
Output Function
TXD P3.1 ALT
Output Function
RXD P3.0 ALT
Input Function
Serial Port Interrupt
Zero Detector
Load SBUF
Read SBUF
SBUF
Input Shift Register
Shift
0 1 1 1 1 1 1 1 Shift
Receive RI RX Clock
Start
RX Control
Shift
Send TX Clock
Start
TI
TX Control
S6
REN __ RI
SBUF
Shift
D
CL
Q S
8051 Internal BUS
TB8
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
40
Modo 1:
Dez bits são recebidos pelo pino RXD, ou transmitidos pelo pino TXD; um start
bit (0), 8 bits de dados (LSB primeiro), e um stop bit. Na recepção, o stop bit vai para a
posição RB8 no registrador SCON, e o baud rate é determinado pelo timer 1, na maio-
ria dos casos (podem ser utilizados também o timer 2 ou ambos no 8052).
A transmissão ocorre da mesma forma que no modo anterior, exceto ao fato de
que não existe uma linha de clock sincronizando os dois circuitos. Este sincronismo é
função de bits de start e stop, presentes em cada transmissão. Após a transmissão do
último bit (stop bit) o flag TI é setado no registrador SCON.
A recepção é iniciada com a detecção da transição de 1 para 0 na linha RXD, in-
dicando a presença do start bit na linha. Para esta função, a linha RXD é amostrada a
uma taxa de 16 vezes a frequência determinada para o baud rate. Após esta detecção,
o sinal começa a ser deslocado a partir da frequência gerada pelo timer 1. Quando for
recebido o último bit (stop bit), este é colocado em RB8, e o flag TI é setado. A figura a
seguir ilustra o diagrama de sinais da recepção do modo 1.
ALE
Write to SBUF
Send S6P2
Shift
RXD (Data In)
D0 D1 D2 D3 D4 D5 D6 D7
TXD (Shift Clock)
S3P1 S6P1
TI
Write to SCON (Clear RI)
RI
Receive
Shift
TXD (Shift Clock)
D0 D1 D2 D3 D4 D5 D6 D7
S5P2
Receive
Transmit
10 Ciclos de Máquina
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
41
Input Shift Register (9 bits)
1 to 0 Transition Detector
8051 Internal BUS
Write to SBUF
Zero Detector
Load SBUF
Read SBUF
SBUF
Shift
Shift
Load SBUF RX Clock
Start RX Control
Shift
____ Send TX Clock
Start
Serial Port Interrupt
RI
TI
TX Control
SBUF
Shift
D
CL
Q S
8051 Internal BUS
Data
Timer 2 Overflow
Timer 1 Overflow
Bit Detector
TB8
2
SMOD
0 1
0 1
0 1
TCLK
RCLK 16
16
TXD
1FFH
Sample
RXD
____ Send
Write to SBUF
S1P1
TI
Shift
D0 D1 D2 D3 D4 D5 D6 D7
D0 D1 D2 D3 D4 D5 D6 D7
Tra
nsm
it R
eceiv
e
TX Clock
Data
TXD Start bit
Stop bit
RX Clock +16 Reset
RXD Start bit
Stop bit Bit detector
sample times
Shift
RI
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
42
Modos 2 e 3:
Nestes dois modos são transmitidos 11 bits pelo pino TXD, ou recebemos 11 bits
através do pino RXD: um start bit “0”, 8 bits de dados (LSB primeiro), um nono bit pro-
gramável e um stop bit “1”. A diferença entre os modos 2 e 3 é que no modo 3 a fre-
quência de baud rate é variável, enquanto que no modo 2 a frequência é fixa em 1/32
ou 1/64 da frequência do oscilador. Os processos de transmissão e recepção dos da-
dos são semelhantes aos outros modos anteriormente mostrados. A figura abaixo ilus-
tra o processo.
Input Shift Register (9 bits)
1 to 0 Transition Detector
8051 Internal BUS
Write to SBUF
Zero Detector
Load SBUF
Read SBUF
SBUF
Shift
Shift
Load SBUF RX Clock
Start RX Control
Shift
____ Send TX Clock
Start
Serial Port Interrupt
RI
TI
TX Control
SBUF
Shift
D
CL
Q S
8051 Internal BUS
Data
Bit Detector
TB8
16
16
TXD
1FFH
Sample
RXD
Stop bit gen
2
Smod = 0
Smod = 1
(Smod is PCON.7)
Mode 2
Phase 2 Clock
(1/2 freq. osc.)
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
43
4. 15 – Registrador de Controle
O controle da interface serial é feito pelo já descrito registrador SCON, com a
atuação do registrador PCON, (utilizando o bit SMOD). Por este registrador podemos
monitorar o funcionamento da interface serial pelos bits TI, RI, TB8 e RB8, que indicam
o estado da interface serial nas operações de transmissão ou recepção.
4.16 – Baud Rates
A taxa de transmissão (baud rate), tem seus valores definidos de acordo com o
modo de operação estabelecido para o interface serial. No modo 0, o baud rate é fixo e
tem seu valor estabelecido como sendo 1/12 da frequência do oscilador.
No modo 2, a frequência pode ter dois valores distintos, dependendo do valor do
bit SMOD no registrador PCON. Se SMOD for igual a 0, o baud rate é igual a 1/64 da
frequência do oscilador, se o SMOD for igual a 1, o baud rate passa a ser 1/32 da fre-
quência do oscilador.
Quando utilizamos o timer 1 como gerador de baud rate, o baud rate nos modos
1 e 3 tem seu valor determinado pela taxa de overflow do próprio timer 1, obedecendo
a fórmula:
Baud rate = [(2Smod)/32] x (timer 1 overflow rate)
____ Send
Write to SBUF
S1P1
TI
Shift
D0 D1 D2 D3 D4 D5 D6 D7
Tra
nsm
it TX Clock
Data
TXD Start bit
Stop bit
D0 D1 D2 D3 D4 D5 D6 D7
Receiv
e
RX Clock +16 Reset
RXD Start bit
Stop bit Bit detector
sample times
Shift
RI
Stop bit gen
TB8
RB87
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
44
A interrupção do timer 1 deve ser desabilitada neste caso para evitar sinalização
indevida. O timer pode ser configurado para operação como timer ou como contador
em qualquer um dos três modos. O modo mais comumente utilizado é o modo de ope-
ração como timer de auto-recarga. A fórmula para se obter diretamente a frequência
do baud rate é a seguinte:
Baud Rate = {[(2Smod)/32] x [Fosc./[12 x (256 - TH1)]]}
A tabela abaixo indica os valores mais utilizados a partir de uma dada frequência
de cristal, e os valores de recarga dos timers para facilitar a programação.
Baud Rate Freq. Osc. SMOD Modo Valor de Recarga
19,2K 11,059 MHz
1 2 FDH
9,6K 11,059 MHz
0 2 FDH
4,8K 11,059 MHz
0 2 FAH
2,4K 11,059 MHz
0 2 F4H
1,2K 11,059 MHz
0 2 E8H
137,5 11,968 MHz
0 2 1DH
110 6 MHz 0 2 72H
110 12 MHz 0 1 FEEBH
Devemos observar os valores de máxima frequência para cada um dos modos, e
respeitá-los, pois o uso de frequências acima destes valores acarretariam perdas de in-
formação na comunicação serial. A tabela abaixo indica estas frequências:
Modo Frequência Máxima
0 1 MHz
1 e 3 62,5 KHz
2 375 KHz
4.17 – Interrupções
Os microcontroladores da família 8051 são providos de 5 fontes de interrupção,
como mostradas na figura a seguir. As interrupções externa INT0 e INT1 podem ser
ativadas por nível lógico ou por transição (borda), dependendo para isto, dos bits IT0 e
IT1 no registrador TCON. Os flags que indicam a presença da interrupção nos pinos
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
45
externos são IE0 e IE1 no mesmo registrador TCON. Quando uma interrupção externa
é recebida, o respectivo flag é limpo quando a rotina de serviço é vetorada para o en-
dereço da interrupção, somente se a interrupção for do tipo ativa por transição. Se a
interrupção for ativa por nível , o dispositivo externo que solicitou a interrupção se en-
carrega do seu controle.
As interrupções dos timers são geradas quando houver overflow dos mesmos, e
são reestabelecidas ao seu estado inativo por hardware quando a interrupção já se
encontrar devidamente vetorada.
A interrupção da interface serial é gerada por um OU lógico entre os flags de RI
e TI, e estes flags não são limpos após o vetoramento da interrupção, devendo ser feito
este procedimento por software, após o recebimento ou transmissão do dado.
Todos os bits que geram interrupção podem ser habilitados ou não pelo
registrador de habilitação de interrupção IE.
Os vetores de endereço das interrupções, ou seja, os endereços para qual o PC
é direcionado quando ocorre uma interrupção são fixos e seus valores são indicados a
seguir:
0
1
IT0 IE0
____
INT0
0
1
IT1 IE1
____
INT1
TF0
TF1
RI TI
TF2 EXF2 8052 only
Interrupt Sources
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
46
Fonte Endereço
IE0 0003H
TF0 000BH
IE1 0013H
TF1 001BH
Serial 0023H
4.18 – Estrutura de prioridades
Cada uma das fontes de interrupção pode ser individualmente programada para
atender a um dos dois possíveis níveis de interrupção, mediante um bit específico no
registrador IP. Colocando um valor 0 no bit correspondente, definimos esta interrupção
como de menor prioridade, e vice-versa.
Quando temos duas interrupções de mesma prioridade, no mesmo instante, elas
serão atendidas pelo pool select que é realizado na seguinte ordem:
IE0 – TF0 – IE1 – TF1 – Serial
4.19 – Interrupções externas
As fontes externas de interrupção podem ser programadas para serem ativadas
por nível ou por borda, desde que os pinos de interrupção externa sejam amostrados
uma vez a cada ciclo de máquina, a entrada de interrupção deve manter-se estável por
pelo menos 12 períodos do oscilador para que a interrupção seja reconhecida. No ca-
so da interrupção ser ativa por transição, deve-se manter em um nível por um ciclo de
máquina e mudar para outro nível, mantendo-se nele por outro ciclo de máquina.
Após o reconhecimento, o flag IEx é setado no registrador TCON sendo automa-
ticamente resetado pela CPU quando a rotina de serviço da interrupção é chamada.
Se a interrupção é ativa por nível, este nível deve ser mantido pelo tempo ne-
cessário para que seja reconhecida a interrupção, e depois deve ser desativada antes
que a rotina de tratamento da interrupção se complete, para evitar que outro pedido de
interrupção seja gerado.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
47
4.20 – Circuitos de Controle
Existem outros circuitos que devem ser considerados quando da elaboração do
hardware de um microcontrolador. Além dos já citados circuitos de decodificação de
dados/endereços, utilizado para acesso a memória externa, pull-ups e buffers nas li-
nhas de dados e endereços, alguns merecem especial cuidado e atenção na constru-
ção.
4.21 – Circuito de Reset
A entrada do reset se dá pelo pino RST, quando este é mantido em nível alto por
pelo menos dois ciclos de máquina, após o circuito do oscilador começar a funcionar.
Logo após o reset, os valores colocados nos registradores são os indicados abaixo:
Fonte Endereço
PC 0000H
Acc 00H
B 00H
PSW 00H
SP 07H
DPTR 0000H
P0-P3 FFH
IP XXX00000b
IE 0XX00000b
TMOD 00H
TCON 00H
TH0 00H
TL0 00H
TH1 00H
TL1 00H
SCON 00H
SBUF Indeterminado
PCON (HMOS) 0XXXXXXXb
PCON (CHMOS)
0XXX0000b
Normalmente utilizamos um circuito conhecido como Power On Reset, para que
o microcontrolador seja inicializado ao ligarmos o equipamento. O circuito abaixo ilus-
tra um exemplo típico de circuito para uma tensão de 5Vcc, e frequência de 10MHz.
Devemos notar que para os circuitos CHMOS, devido à características construtivas do
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
48
dispositivo, não se faz necessário o uso do resistor externo, simplificando ainda mais o
circuito.
4.22 – Circuito de Clock
Podemos utilizar o oscilador interno ao microcontrolador como indicado anteri-
ormente neste mesmo manual. Devemos utilizar um cristal com as seguintes caracte-
rísticas:
Co (Shunt Capacitance) – máx. 7pF
Cl (Load Capacitance) – 30 pF (10%)
Potência – 1mW
A resistência equivalente em série depende da frequência do cristal, tendo seus
valores práticos demarcados no gráfico a seguir:
0
100
200
300
400
500
600
0 4 8 12 16 20
Crystal Frequency in MHz
ES
R i
n O
hm
s
8K2
10F
Vcc
8K2 Rst
Vss
8051
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
49
4.23 – Operação passo a passo
Este modo de operação é muito útil durante a construção de programas, e de-
senvolvimento do hardware, para solucionar eventuais problemas surgidos no decorrer
destes processos.
Podemos entender esta operação, lembrando o funcionamento da já conhecida
estrutura das interrupções do microcontrolador. Quando uma interrupção está em pro-
gresso, outra interrupção de mesmo nível não pode ser ativada simultaneamente. O
fato é que a próxima interrupção só ocorre após a execução de pelo menos uma instru-
ção do programa interrompido, de forma que, colocando a interrupção INT0 (por exem-
plo) em nível baixo e acrescentando algumas linhas de programa nas rotinas de trata-
mento da interrupção. As linhas são as seguintes:
JNB P3.2,$ ; aguarda até que a interrupção vá para alto
JB P3.2,$ ; aguarda até que a interrupção vá para baixo
RETI ; volta e executa uma instrução
Desta forma, quando a INT0 é ativada em nível baixo, a CPU vai para a rotina de
tratamento da interrupção e fica até que o sinal INT0 pulse (de baixo para alto e nova-
mente para baixo). Desta forma ela executa o comando de retorno da interrupção,
executa uma instrução e imediatamente retorna a rotina de interrupção, permanecendo
nesta até que o sinal INT0 pulse novamente.
Esta é uma forma simples de acompanhar a execução das rotinas de um pro-
grama passo a passo, mas normalmente vamos executar estas rotinas através de um
software de simulação apropriado, onde serão detectadas as principais falhas na pro-
gramação.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
50
4.24 – Descrição da pinagem
A figura abaixo ilustra a pinagem do controlador 8051 nas duas formas de en-
capsulamento mais comuns:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
** T2 P1.0
** T2EX P1.1 P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
Rst
RXD P3.0
TXD P3.1
T0 P3.4
T1 P3.5
XTAL2
XTAL1
Vss
Vcc
P0.0 AD0
P0.1 AD1
P0.2 AD2
P0.3 AD3
P0.4 AD4
P0.5 AD5
P0.6 AD6
P0.7 AD7
P2.7 A15
P2.6 A14
P2.5 A13
P2.4 A12
P2.3 A11
P2.2 A10
P2.1 A9
P2.0 A8
EA / Vpp*
ALE / Prog*
PSEN
INT0 P3.2
INT1 P3.3
WR P3.6
RD P3.7
9
10
11
P1.7
Rst
RXD P3.0
13
14
15
16
17
TXD P3.1
T0 P3.4
T1 P3.5
INT0 P3.2
INT1 P3.3
7
8
P1.5
P1.6
12 NC P
1.4
6
5
4
3
2
1
44
43
42
41
40
P1.3
P1.2
P1.1
T
2E
X
**
P1.0
T
2 *
*
NC
Vcc
P0.0
A
D0
P0.1
A
D1
P0.2
A
D2
P0.3
A
D3
39
38
37
36
35
P0.4 AD4
P0.5 AD5
P0.6 AD6
P0.7 AD7
EA / Vpp*
33
32
31
30
29
P2.7 A15
P2.6 A14
P2.5 A13
ALE / Prog*
PSEN
34 NC 18
19
20
21
22
23
24
25
26
27
28
XT
AL2
XT
AL1
Vss
NC
P2.0
A
8
P2.1
A
9
P2.2
A
10
P2.3
A
11
P2.4
A
12
RD
P
3.7
WR
P3.6
Index Corner
Pin (DIP)
Pad (LCC, PLCC)
* EPROM Only
** 8052/8032 Only
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
51
A descrição da pinagem deste componente, no invólucro DIP é dada abaixo:
Pino Descrição
1 Port 1, Dado 0
2 Port 1, Dado 1
3 Port 1, Dado 2
4 Port 1, Dado 3
5 Port 1, Dado 4
6 Port 1, Dado 5
7 Port 1, Dado 6
8 Port 1, Dado 7
9 Entrada de Reset
10 Port 3, Dado 0 (RXD da interface serial interna)
11 Port 3, Dado 1 (TXD da interface serial interna)
12 Port 3, Dado 2 (Interrupção externa INT0)
13 Port 3, Dado 3 (Interrupção externa INT1)
14 Port 3, Dado 4 (Entrada do Timer 0)
15 Port 3, Dado 5 (Entrada do Timer 1)
16 Port 3, Dado 6 (Sinal de escrita para memória exemplo-terna)
17 Port 3, Dado 7 (Sinal de leitura para memória externa)
18 Entrada do cristal do oscilador
19 Entrada do cristal do oscilador
20 Alimentação Terra
21 Port 2, Bit0 (Endereço A8)
22 Port 2, Bit1 (Endereço A9)
23 Port 2, Bit2 (Endereço A10)
24 Port 2, Bit3 (Endereço A11)
25 Port 2, Bit4 (Endereço A12)
26 Port 2, Bit5 (Endereço A13)
27 Port 2, Bit6 (Endereço A14)
28 Port 2, Bit7 (Endereço A15)
29 Sinal PSEN (Program Search Enable)
30 Sinal ALE (Address Latch Enable) *Prog no 8751
31 Sinal EA (External Access) *Tensão de Prog no 8751
32 Port 0, Bit 7 (Dado 7)
33 Port 0, Bit 6 (Dado 6)
34 Port 0, Bit 5 (Dado 5)
35 Port 0, Bit 4 (Dado 4)
36 Port 0, Bit 3 (Dado 3)
37 Port 0, Bit 2 (Dado 2)
38 Port 0, Bit 1 (Dado 1)
39 Port 0, Bit 0 (Dado 0)
40 Alimentação de +5V
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
52
5 – PROGRAMAÇÃO E SIMULAÇÃO
5.1 – “COMPILAÇÃO” E “LINKAGEM”
Um programa escrito em linguagem assembly (PROGRAMA FONTE), não pode
ser diretamente processado pelo microcontrolador do sistema, devendo primeiramente
ser traduzido para a sua linguagem de máquina, com o uso de tabelas ou por meio de
um programa destinado para tal tarefa chamado de COMPILADOR, que fornece então
como saída o PROGRAMA OBJETO.
Define-se COMPILADOR como um programa aplicativo que transforma um ar-
quivo constituído por códigos ASCII (PROGRAMA FONTE: obrigatoriamente com ex-
tensão “.ASM”), gerado normalmente por um editor de textos, em um arquivo binário
que contém os bytes correspondentes às instruções (códigos de máquina) do micro-
controlador.
Como resultado da compilação são criados dois arquivos:
- Arquivo de mesmo nome, porém com a extensão “.OBJ” (PROGRAMA OBJE-
TO).
- Arquivo de mesmo nome, porém com a extensão “.LIST”, que corresponde a
um arquivo texto que mostra o resultado da compilação, contendo para cada linha de
programa, o código de máquina correspondente à instrução, sendo muito útil na depu-
ração de erros de compilação.
A “linkagem” tem a finalidade de reunir, em um único arquivo, todos as rotinas
escrita em um ou vários arquivos diferentes.
Após a “linkagem” são gerados dois arquivos:
- Arquivo de mesmo nome, sem extensão, usado pelo programa simulador.
- Arquivo de mesmo nome, porém com a extensão “.HEX”, usado por gravadores
de memórias e microcontroladores e também pelo programa simulador.
PROGRAMA COMPILADOR PROGRAMA LINKER PROGRAMA
FONTE OBJETO EXECUTÁVEL
.ASM .OBJ .HEX
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
53
O compilador, o “Linker” e o Simulador usados no laboratório são produzidos pe-
la AVOCET.
5.2 – DIRETIVAS (ou PSEUDO-INSTRUÇÕES) de Compilação
Além das instruções pertencentes ao microcontrolador em questão, a linguagem
assembly possui ainda algumas instruções especiais, pseudo-instruções ou diretivas,
que são usadas apenas para a estruturação do programa.
Estas instruções especiais, que não são traduzidas para o código de máquina
por não pertencerem ao conjunto de instruções do microcontrolador escolhido, possu-
em apenas funções especiais no programa como: definir símbolos, estabelecer o ende-
reço inicial do programa, reservar área de memória etc, não sendo, portanto, processa-
das.
PSEUDO-INSTRUÇÕES MAIS USADAS
ORG (ORIGIN)
Formato: Pseudo-instrução operando
ORG endereço
Função:
Usado para o endereço inicial de memória, no qual o programa ou um trecho de
programa será armazenado.
Exemplo: ORG 0100H
Assim o programa objeto será carregado na memória a partir do endereço
0100H
DB (DEFINE BYTE)
Formato: Pseudo-instrução operando
DB byte
Função:
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
54
O byte do operando é carregado diretamente na posição de memória escolhida
pelo ORG.
Exemplo:
ORG 0050H
DB 3FH
DB 1AH
Assim os bytes 3FH e 1AH foram armazenados nas posições de memória 0050H
e 0051H respectivamente.
END
Formato: Pseudo-instrução
END
Função:
Indica o final do programa.
5.3 – USO DO COMPILADOR E DO LINKER (PASSO A PASSO)
OBS: Comandos digitados na linha de ”prompt do DOS”.
1. Com o “NE” ou “EDIT” escrever um programa em assembly nomeado obriga-
toriamente com a extensão “.ASM” (criando assim programa fonte).
OBS: No editor de textos deve-se obrigatoriamente reservar as colunas de “1” a
“6” para os “labels” ou “tags” que representam os endereços do programa, de entrada
de “loops”, chamada de sub-rotinas etc.
2. Com o “X8051” (compilador) obter os arquivos com extensão “.OBJ” (progra-
ma objeto) e “.LST” (listagem) da seguinte forma:
X8051 [ENTER]
Listing Destination (..........): D [ENTER]
Generate cross reference [ENTER]
Input file name:.........nome do arquivo.ASM [ENTER]
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
55
Output file name: ...... nome do arquivo [ENTER]
3. Com o “LINK” ligar o arquivo “.OBJ”, gerando um arquivo “.HEX” da seguinte
forma:
LINK [ENTER]
Input file name: ........ .OBJ [ENTER]
Enter offset for ....... [ENTER]
Input file name: [ENTER]
Output file name: [ENTER]
Options (..........): H [ENTER]
4. No simulador:
Load
Avocet
.... .HEX
Simulation
F1 (total)
F10 (passo a passo)
5.4 – Simulador dos Microcontroladores da família 8051
****** TELA DE ENTRADA DO SIMULADOR: ******
Deve-se selecionar uma opção em função da cpu escolhida para o projeto.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
56
****** TELA DE SIMULAÇÃO: ******
5.5 – Operação básica do simulador
Para uma rápida ambientação com o programa simulador, é apresentada uma
seqüência de testes para as principais teclas e/ou comandos:
· Visualização geral da tela, visando reconhecer os seus principais campos (co-
loridos) e funções correspondentes.
· Teclas: ESC
CTRL C
· Comandos: Help Commands
Display
Simulation
Avocet
Registration
Load Avocet
Quit Exit
setUp Cursor Yes
No
View Memory-map
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
57
Symbols Alpha
Registers
Data
Bit
SFR
eXecute
· Seqüência para carregar um arquivo no simulador e informações sobre a simu-
lação:
Load Avocet ... .OBJ Help Simulation
· Teclas para a simulação
F1: executa o programa inteiro.
F10: executa um programa instrução por instrução.
F9: volta para a condição anterior, após a execução de uma instrução.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
58
6 – Tabela de Instruções completa
Temos na tabela a seguir o set de instruções do 8051, indicando o seu opcode,
conforme já explicado, o número de bytes da instrução, os períodos de clock necessá-
rios e os flags afetados.
Temos a seguinte codificação na tabela:
@ – significa “endereçado pelo valor de ...”;
#Dado – indica valor constante de 8 bits;
#Dado 16 – indica valor constante de 16 bits;
Direto – indica um endereçamento de memória de 8 bits (primeiras 256
posições interna ou externas)
rel – indica que o endereçamento é relativo;
? – indica “depende do resultado ou da operação”;
“-“ – indica “não afetado”;
1 – indica setado;
0 – indica zerado.
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
00 NOP Nenhuma operação 1 12 - - -
01 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
02 LJMP End16 Desvia para qualquer posição da memória de programa.
3 24 - - -
03 RR A
Desloca acumulador à direita
1 12 - - -
04 INC A Soma 1 ao acumulador 1 12 - - -
05 INC Direto Soma 1 à posição de memória 2 12 - - -
06 INC @R0 Soma 1 à RAM endereçada por R0
1 12 - - -
07 INC @R1 Soma 1 à RAM endereçada por R1
1 12 - - -
08 INC R0 Soma 1 ao conteúdo de R0 1 12 - - -
09 INC R1 Soma 1 ao conteúdo de R1 1 12 - - -
0A INC R2 Soma 1 ao conteúdo de R2 1 12 - - -
0B INC R3 Soma 1 ao conteúdo de R3 1 12 - - -
b7 b0
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
59
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
0C INC R4 Soma 1 ao conteúdo de R4 1 12 - - -
0D INC R5 Soma 1 ao conteúdo de R5 1 12 - - -
0E INC R6 Soma 1 ao conteúdo de R6 1 12 - - -
0F INC R7 Soma 1 ao conteúdo de R7 1 12 - - -
10 JBC bit, rel Desvia se o bit endereçado es-tiver setado e depois zera o bit
3 24 - - -
11 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
12 LCALL End16 Chama sub-rotina em qualquer posição da memória de pro-grama
3 24 - - -
13 RRC A
Desloca o acumulador à direita através do carry
1 12 ? - -
14 DEC A Subtrai 1 do acumulador 1 12 - - -
15 DEC Direto Subtrai 1 da posição de me-mória
2 12 - - -
16 DEC @R0 Subtrai 1 da RAM endereçada por R0
1 12 - - -
17 DEC @R1 Subtrai 1 da RAM endereçada por R1
1 12 - - -
18 DEC R0 Subtrai 1 do conteúdo de R0 1 12 - - -
19 DEC R1 Subtrai 1 do conteúdo de R1 1 12 - - -
1A DEC R2 Subtrai 1 do conteúdo de R2 1 12 - - -
1B DEC R3 Subtrai 1 do conteúdo de R3 1 12 - - -
1C DEC R4 Subtrai 1 do conteúdo de R4 1 12 - - -
1D DEC R5 Subtrai 1 do conteúdo de R5 1 12 - - -
1E DEC R6 Subtrai 1 do conteúdo de R6 1 12 - - -
1F DEC R7 Subtrai 1 do conteúdo de R7 1 12 - - -
20 JB bit, rel Desvio se o bit endereçado es-tiver setado
3 24 - - -
21 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
22 RET Retorne da sub-rotina 1 24 - - -
23 RL A
Desloca o acumulador à es-querda
1 12 - - -
24 ADD A, #Dado Soma o dado ao acumulador 2 12 ? ? ?
25 ADD A, Direto Soma o conteúdo da posição de memória ao acumulador
2 12 ? ? ?
b7 b0
b7 b0 Cy
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
60
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
26 ADD A, @R0 Soma o conteúdo da RAM en-dereçada por R0 ao acumula-dor
1 12 ? ? ?
27 ADD A, @R1 Soma o conteúdo da RAM en-dereçada por R1 ao acumula-dor
1 12 ? ? ?
28 ADD A, R0 Soma o conteúdo de R0 ao acumulador
1 12 ? ? ?
29 ADD A, R1 Soma o conteúdo de R1 ao acumulador
1 12 ? ? ?
2A ADD A, R2 Soma o conteúdo de R2 ao acumulador
1 12 ? ? ?
2B ADD A, R3 Soma o conteúdo de R3 ao acumulador
1 12 ? ? ?
2C ADD A, R4 Soma o conteúdo de R4 ao acumulador
1 12 ? ? ?
2D ADD A, R5 Soma o conteúdo de R5 ao acumulador
1 12 ? ? ?
2E ADD A, R6 Soma o conteúdo de R6 ao acumulador
1 12 ? ? ?
2F ADD A, R7 Soma o conteúdo de R7 ao acumulador
1 12 ? ? ?
30 JNB bit, rel Desvia se o bit endereçado es-tiver zerado
3 24 - - -
31 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
32 RETI Retorne da interrupção 1 24 - - -
33 RLC A
Desloca o acumulador à es-querda através do carry
1 12 ? - -
34 ADDC A, #Dado Soma o dado e o carry ao acumulador
2 12 ? ? ?
35 ADDC A, Direto Soma o conteúdo da posição de memória e o carry ao acu-mulador
2 12 ? ? ?
36 ADDC A, @R0 Soma o conteúdo da RAM en-dereçada por R0 e o carry ao acumulador
1 12 ? ? ?
37 ADDC A, @R1 Soma o conteúdo da RAM en-dereçada por R1 e o carry ao acumulador
1 12 ? ? ?
38 ADDC A, R0 Soma o conteúdo de R0 e o carry ao acumulador
1 12 ? ? ?
39 ADDC A, R1 Soma o conteúdo de R1 e o carry ao acumulador
1 12 ? ? ?
3A ADDC A, R2 Soma o conteúdo de R2 e o carry ao acumulador
1 12 ? ? ?
b7 b0 Cy
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
61
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
3B ADDC A, R3 Soma o conteúdo de R3 e o carry ao acumulador
1 12 ? ? ?
3C ADDC A, R4 Soma o conteúdo de R4 e o carry ao acumulador
1 12 ? ? ?
3D ADDC A, R5 Soma o conteúdo de R5 e o carry ao acumulador
1 12 ? ? ?
3E ADDC A, R6 Soma o conteúdo de R6 e o carry ao acumulador
1 12 ? ? ?
3F ADDC A, R7 Soma o conteúdo de R7 e o carry ao acumulador
1 12 ? ? ?
40 JC rel Desvia se o carry estiver seta-do
2 24 - - -
41 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
42 ORL Direto, A “Ou” entre acumulador e me-mória; resultado na memória
2 12 - - -
43 ORL Direto, #Da-
do “Ou” entre dado e memória 3 24 - - -
44 ORL A, #Dado “Ou” entre dado e acumulador 2 12 - - -
45 ORL A, Direto “Ou” entre memória e acumu-lador
2 12 - - -
46 ORL A, @R0 “Ou” entre a RAM endereçada por R0 e o acumulador
1 12 - - -
47 ORL A, @R1 “Ou” entre a RAM endereçada por R1 e o acumulador
1 12 - - -
48 ORL A, R0 “Ou” entre o conteúdo de R0 e o acumulador
1 12 - - -
49 ORL A, R1 “Ou” entre o conteúdo de R1 e o acumulador
1 12 - - -
4A ORL A, R2 “Ou” entre o conteúdo de R2 e o acumulador
1 12 - - -
4B ORL A, R3 “Ou” entre o conteúdo de R3 e o acumulador
1 12 - - -
4C ORL A, R4 “Ou” entre o conteúdo de R4 e o acumulador
1 12 - - -
4D ORL A, R5 “Ou” entre o conteúdo de R5 e o acumulador
1 12 - - -
4E ORL A, R6 “Ou” entre o conteúdo de R6 e o acumulador
1 12 - - -
4F ORL A, R7 “Ou” entre o conteúdo de R7 e o acumulador
1 12 - - -
50 JNC rel Desvia se o carry estiver zera-do
2 24 - - -
51 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
52 ANL Direto, A “E” entre acumulador e memó-ria; resultado na memória
2 12 - - -
53 ANL Direto, #dado “E” entre dado e memória 3 24 - - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
62
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
54 ANL A, #Dado “E” entre dado e acumulador 2 12 - - -
55 ANL A, Direto “E” entre memória e acumula-dor
2 12 - - -
56 ANL A, @R0 “E” entre RAM endereçada por R0 e acumulador
1 12 - - -
57 ANL A, @R1 “E” entre RAM endereçada por R1 e acumulador
1 12 - - -
58 ANL A, R0 “E” entre o conteúdo de R0 e o acumulador
1 12 - - -
59 ANL A, R1 “E” entre o conteúdo de R1 e o acumulador
1 12 - - -
5A ANL A, R2 “E” entre o conteúdo de R2 e o acumulador
1 12 - - -
5B ANL A, R3 “E” entre o conteúdo de R3 e o acumulador
1 12 - - -
5C ANL A, R4 “E” entre o conteúdo de R4 e o acumulador
1 12 - - -
5D ANL A, R5 “E” entre o conteúdo de R5 e o acumulador
1 12 - - -
5E ANL A, R6 “E” entre o conteúdo de R6 e o acumulador
1 12 - - -
5F ANL A, R7 “E” entre o conteúdo de R7 e o acumulador
1 12 - - -
60 JZ rel Desvia se o acumulador for zero
2 24 - - -
61 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
62 XRL Direto, A “Ou exclusivo” entre acumula-dor e memória; resultado na memória
2 12 - - -
63 XRL Direto, #Da-
do “Ou exclusivo” entre dado e memória
3 24 - - -
64 XRL A, #Dado “Ou exclusivo” entre dado e acumulador
2 12 - - -
65 XRL A, Direto “Ou exclusivo” entre memória e acumulador
2 12 - - -
66 XRL A, @R0 “Ou exclusivo” entre RAM en-dereçada por R0 e acumulador
1 12 - - -
67 XRL A, @R1 “Ou exclusivo” entre RAM en-dereçada por R1 e acumulador
1 12 - - -
68 XRL A, R0 “Ou exclusivo” entre conteúdo de R0 e acumulador
1 12 - - -
69 XRL A, R1 “Ou exclusivo” entre conteúdo de R1 e acumulador
1 12 - - -
6A XRL A, R2 “Ou exclusivo” entre conteúdo de R2 e acumulador
1 12 - - -
6B XRL A, R3 “Ou exclusivo” entre conteúdo de R3 e acumulador
1 12 - - -
6C XRL A, R4 “Ou exclusivo” entre conteúdo de R4 e acumulador
1 12 - - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
63
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
6D XRL A, R5 “Ou exclusivo” entre conteúdo de R5 e acumulador
1 12 - - -
6E XRL A, R6 “Ou exclusivo” entre conteúdo de R6 e acumulador
1 12 - - -
6F XRL A, R7 “Ou exclusivo” entre conteúdo de R7 e acumulador
1 12 - - -
70 JNZ rel Desvia se o acumulador não for zero
2 24 - - -
71 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
72 ORL C, bit “Ou” entre o bit endereçado e o carry
2 24 ? - -
73 JMP @A+DPTR Desvia para o endereço obtido da soma do acumulador e do DPTR
1 24 - - -
74 MOV A, #Dado Mova o dado para o acumula-dor
2 12 - - -
75 MOV Direto, #Da-
do Mova o dado para a memória 3 24 - - -
76 MOV @R0, #Da-
do Mova dado para RAM endere-çada indiretamente por R0
2 12 - - -
77 MOV @R1, #Da-
do Mova dado para RAM endere-çada indiretamente por R1
2 12 - - -
78 MOV R0, #Dado Mova o dado para o registro R0
2 24 - - -
79 MOV R1, #Dado Mova o dado para o registro R1
2 24 - - -
7A MOV R2, #Dado Mova o dado para o registro R2
2 24 - - -
7B MOV R3, #Dado Mova o dado para o registro R3
2 24 - - -
7C MOV R4, #Dado Mova o dado para o registro R4
2 24 - - -
7D MOV R5, #Dado Mova o dado para o registro R5
2 24 - - -
7E MOV R6, #Dado Mova o dado para o registro R6
2 24 - - -
7F MOV R7, #Dado Mova o dado para o registro R7
2 24 - - -
80 SJMP rel Desvio curto relativo 2 24 - - -
81 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
82 ANL C, bit “E” entre o bit endereçado e o carry
2 24 ? - -
83 MOVC A, @A+PC
Soma A + PC obtendo um en-dereço de 16 bits na memória de programa; carrega o acu-mulador com esta memória
1 24 - - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
64
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
84 DIV AB Divide A e B; resultado: A in-teiro e B resto
1 48 0 ? 0
85 MOV Direto1, Di-
reto2 Mova o conteúdo da memória direta2 para a memória direta1
3 24 - - -
86 MOV Direto, @R0 Mova RAM endereçada por R0 para memória
2 24 - - -
87 MOV Direto, @R1 Mova RAM endereçada por R1 para memória
2 24 - - -
88 MOV Direto, R0 Mova registro R0 para memó-ria
2 24 - - -
89 MOV Direto, R1 Mova registro R1 para memó-ria
2 24 - - -
8A MOV Direto, R2 Mova registro R2 para memó-ria
2 24 - - -
8B MOV Direto, R3 Mova registro R3 para memó-ria
2 24 - - -
8C MOV Direto, R4 Mova registro R4 para memó-ria
2 24 - - -
8D MOV Direto, R5 Mova registro R5 para memó-ria
2 24 - - -
8E MOV Direto, R6 Mova registro R6 para memó-ria
2 24 - - -
8F MOV Direto, R7 Mova registro R7 para memó-ria
2 24 - - -
90 MOV DPTR, #Da-
do 16 Mova dado de 16 bits para o DPTR
3 24 - - -
91 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
92 MOV bit, C Mova o carry para o bit ende-reçado
2 24 - - -
93 MOVC A, @A +
DPTR
Soma A + DPTR obtendo um endereço de 16 bits na memó-ria de programa; carrega o acumulador com esta memória
1 24 - - -
94 SUBB A, #Dado Subtrai o dado e o borrow do acumulador
2 12 ? ? ?
95 SUBB A, Direto Subtrai o conteúdo da posição de memória e o borrow do acumulador
2 12 ? ? ?
96 SUBB A, @R0 Subtrai o conteúdo da RAM endereçada por R0 e o borrow do acumulador
1 12 ? ? ?
97 SUBB A, @R1 Subtrai o conteúdo da RAM endereçada por R1 e o borrow do acumulador
1 12 ? ? ?
98 SUBB A, R0 Subtrai o conteúdo de R0 e o borrow do acumulador
1 12 ? ? ?
99 SUBB A, R1 Subtrai o conteúdo de R1 e o borrow do acumulador
1 12 ? ? ?
9A SUBB A, R2 Subtrai o conteúdo de R2 e o borrow do acumulador
1 12 ? ? ?
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
65
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
9B SUBB A, R3 Subtrai o conteúdo de R3 e o borrow do acumulador
1 12 ? ? ?
9C SUBB A, R4 Subtrai o conteúdo de R4 e o borrow do acumulador
1 12 ? ? ?
9D SUBB A, R5 Subtrai o conteúdo de R5 e o borrow do acumulador
1 12 ? ? ?
9E SUBB A, R6 Subtrai o conteúdo de R6 e o borrow do acumulador
1 12 ? ? ?
9F SUBB A, R7 Subtrai o conteúdo de R7 e o borrow do acumulador
1 12 ? ? ?
A0 ORL C, /bit “Ou” entre o complemento do bit endereçado e o carry
2 24 ? - -
A1 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
A2 MOV C, bit Mova o bit endereçado para o carry
2 12 ? - -
A3 INC DPTR Soma 1 ao registro DPTR 1 24 - - -
A4 MUL AB Multiplica A e B; resultado: BA 1 48 0 - ?
A5
A6 MOV @R0, Direto Mova a memória para a RAM endereçada por R0
2 24 - - -
A7 MOV @R1, Direto Mova a memória para a RAM endereçada por R1
2 24 - - -
A8 MOV R0, Direto Mova memória para o registro R0
2 24 - - -
A9 MOV R1, Direto Mova memória para o registro R1
2 24 - - -
AA MOV R2, Direto Mova memória para o registro R2
2 24 - - -
AB MOV R3, Direto Mova memória para o registro R3
2 24 - - -
AC MOV R4, Direto Mova memória para o registro R4
2 24 - - -
AD MOV R5, Direto Mova memória para o registro R5
2 24 - - -
AE MOV R6, Direto Mova memória para o registro R6
2 24 - - -
AF MOV R7, Direto Mova memória para o registro R7
2 24 - - -
B0 ANL C, /bit “E” entre o complemento do bit endereçado e o carry
2 24 ? - -
B1 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
B2 CPL bit Inverte o estado do bit endere-çado
2 12 - - -
B3 CPL C Inverte o estado do carry 1 12 ? - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
66
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
B4 CJNE A, #Dado
rel Compara e desvia se o acu-mulador for diferente do dado
3 24 ? - -
B5 CJNE A, Direto
rel
Compara e desvia se o acu-mulador for diferente da me-mória endereçada
3 24 ? - -
B6 CJNE @R0, #Da-
do rel
Compara e desvia se a RAM endereçada por R0 for diferen-te do dado
3 24 ? - -
B7 CJNE @R1, #Da-
do rel
Compara e desvia se a RAM endereçada por R1 for diferen-te do dado
3 24 ? - -
B8 CJNE R0, #Dado
rel Compara e desvia se o regis-tro R0 for diferente do dado
3 24 ? - -
B9 CJNE R1, #Dado
rel Compara e desvia se o regis-tro R1 for diferente do dado
3 24 ? - -
BA CJNE R2, #Dado
rel Compara e desvia se o regis-tro R2 for diferente do dado
3 24 ? - -
BB CJNE R3, #Dado
rel Compara e desvia se o regis-tro R3 for diferente do dado
3 24 ? - -
BC CJNE R4, #Dado
rel Compara e desvia se o regis-tro R4 for diferente do dado
3 24 ? - -
BD CJNE R5, #Dado
rel Compara e desvia se o regis-tro R5 for diferente do dado
3 24 ? - -
BE CJNE R6, #Dado
rel Compara e desvia se o regis-tro R6 for diferente do dado
3 24 ? - -
BF CJNE R7, #Dado
rel Compara e desvia se o regis-tro R7 for diferente do dado
3 24 ? - -
C0 PUSH Direto Incrementa o SP e então colo-ca a memória no Stack
2 24 - - -
C1 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
C2 CLR bit Zera o bit endereçado 2 12 - - -
C3 CLR C Zera o carry 1 12 0 - -
C4 SWAP A
Troca os nibbles do acumula-dor. Equivale a 4 RR A ou 4 RL A
1 12 - - -
C5 XCH A, Direto Troca memória com o acumu-lador
2 12 - - -
C6 XCH A, @R0 Troca a RAM indiretamente endereçada por R0 com o acumulador
1 12 - - -
C7 XCH A, @R1 Troca a RAM indiretamente endereçada por R1 com o acumulador
1 12 - - -
b7 b6 b5 b4 b3 b2 b1 b0
b3 b2 b1 b0 b7 b6 b5 b4
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
67
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
C8 XCH A, R0 Troca entre si o conteúdo do acumulador e o registro R0
1 12 - - -
C9 XCH A, R1 Troca entre si o conteúdo do acumulador e o registro R1
1 12 - - -
CA XCH A, R2 Troca entre si o conteúdo do acumulador e o registro R2
1 12 - - -
CB XCH A, R3 Troca entre si o conteúdo do acumulador e o registro R3
1 12 - - -
CC XCH A, R4 Troca entre si o conteúdo do acumulador e o registro R4
1 12 - - -
CD XCH A, R5 Troca entre si o conteúdo do acumulador e o registro R5
1 12 - - -
CE XCH A, R6 Troca entre si o conteúdo do acumulador e o registro R6
1 12 - - -
CF XCH A, R7 Troca entre si o conteúdo do acumulador e o registro R7
1 12 - - -
D0 POP Direto Retira dado do stack e coloca na memória, depois decre-menta SP
2 24 - - -
D1 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
D2 SETB bit Seta o bit endereçado 2 12 - - -
D3 SETB C Seta o carry 1 12 1 - -
D4 DA A Ajuste decimal do acumulador 1 12 ? ? -
D5 DJNZ Direto, rel Decrementa a memória e des-via se for diferente de zero
3 24 - - -
D6 XCHD A, @R0
Troca nibble menos significati-vo do acumulador com a RAM endereçada indiretamente por R0 entre si
1 12 - - -
D7 XCHD A, @R1
Troca nibble menos significati-vo do acumulador com a RAM endereçada indiretamente por R1 entre si
1 12 - - -
D8 DJNZ R0, rel Decrementa o registro R0 e desvia se for diferente de zero
2 24 - - -
D9 DJNZ R1, rel Decrementa o registro R1 e desvia se for diferente de zero
2 24 - - -
DA DJNZ R2, rel Decrementa o registro R2 e desvia se for diferente de zero
2 24 - - -
DB DJNZ R3, rel Decrementa o registro R3 e desvia se for diferente de zero
2 24 - - -
DC DJNZ R4, rel Decrementa o registro R4 e desvia se for diferente de zero
2 24 - - -
DD DJNZ R5, rel Decrementa o registro R5 e desvia se for diferente de zero
2 24 - - -
DE DJNZ R6, rel Decrementa o registro R6 e desvia se for diferente de zero
2 24 - - -
DF DJNZ R7, rel Decrementa o registro R7 e desvia se for diferente de zero
2 24 - - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
68
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
E0 MOVX A, @DPTR Mova RAM externa indireta-mente endereçada pelo DPTR (16 bits) para o acumulador
1 24 - - -
E1 AJMP End11
Desvia para outro endereço numa fai-xa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
E2 MOVX A, @R0 Mova RAM endereçada indire-tamente por R0 (8 bits) para o acumulador
1 24 - - -
E3 MOVX A, @R1 Mova RAM endereçada indire-tamente por R1 (8 bits) para o acumulador
1 24 - - -
E4 CLR A Faz o acumulador = zero 1 12 - - -
E5 MOV A, Direto Mova memória para o acumu-lador
2 12 - - -
E6 MOV A, @R0 Mova RAM endereçada indire-tamente por R0 para o acumu-lador
1 12 - - -
E7 MOV A, @R1 Mova RAM endereçada indire-tamente por R1 para o acumu-lador
1 12 - - -
E8 MOV A, R0 Mova registro R0 para o acu-mulador
1 12 - - -
E9 MOV A, R1 Mova registro R1 para o acu-mulador
1 12 - - -
EA MOV A, R2 Mova registro R2 para o acu-mulador
1 12 - - -
EB MOV A, R3 Mova registro R3 para o acu-mulador
1 12 - - -
EC MOV A, R4 Mova registro R4 para o acu-mulador
1 12 - - -
ED MOV A, R5 Mova registro R5 para o acu-mulador
1 12 - - -
EE MOV A, R6 Mova registro R6 para o acu-mulador
1 12 - - -
EF MOV A, R7 Mova registro R7 para o acu-mulador
1 12 - - -
F0 MOVX @DPTR, A
Mova o acumulador para a RAM externa indiretamente endereçada pelo DPTR (16 bits)
1 24 - - -
F1 ACALL End11
Chama sub-rotina numa faixa de 2Kbytes da atual posição (3 primeiros bits MSB do OpCode são os bits MSB do endereço)
2 24 - - -
F2 MOVX @R0, A Mova acumulador para RAM externa indiretamente endere-çada por R0 (endereço 8 bits)
1 24 - - -
F3 MOVX @R1, A Mova acumulador para RAM externa indiretamente endere-çada por R1 (endereço 8 bits)
1 24 - - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
69
Opcode Mnemônico Função Bytes Pulsos Flags afetados
CY AC 0V
F4 CPL A Inverte o estado dos bits do acumulador
1 12 - - -
F5 MOV Direto, A Mova acumulador para memó-ria
2 12 - - -
F6 MOV @R0, A Mova o acumulador para a RAM indiretamente endereça-da por R0
1 12 - - -
F7 MOV @R1, A Mova o acumulador para a RAM indiretamente endereça-da por R1
1 12 - - -
F8 MOV R0, A Mova o acumulador para o re-gistro R0
1 12 - - -
F9 MOV R1, A Mova o acumulador para o re-gistro R1
1 12 - - -
FA MOV R2, A Mova o acumulador para o re-gistro R2
1 12 - - -
FB MOV R3, A Mova o acumulador para o re-gistro R3
1 12 - - -
FC MOV R4, A Mova o acumulador para o re-gistro R4
1 12 - - -
FD MOV R5, A Mova o acumulador para o re-gistro R5
1 12 - - -
FE MOV R6, A Mova o acumulador para o re-gistro R6
1 12 - - -
FF MOV R7, A Mova o acumulador para o re-gistro R7
1 12 - - -
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
70
7 – Esquema da CPU mínima para teste e carregamento de programa
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
71
8 – Programa teste do sistema mínimo ;************************************************************** ; PROGRAMA TESTE ;************************************************************** ORG 0000H ;Define endereço de início LJMP INICIO ORG 0050H ;Define endereço de início de execução INICIO: MOV TMOD,#11H ;Configura T0 e T1 no modo 1 MOV TCON,#00H ;Configura TCON MOV A,#11111110B ;Carrega ACC com 11111110 (binário) VOLTA: MOV P0, A ;Carrega ACC nos PORTS MOV P1, A ;P0, P1, P2 e P3 MOV P2, A MOV P3, A RR A ;Rotaciona ACC para direita ACALL DELAY ;Chama rotina de tempo de 1s (PARA CLOCK DE 12MHz) LJMP VOLTA ;************************************************************** ; Rotina de Tempo de 1s ;************************************************************** DELAY: MOV R0, #20 ;Carrega valor 20 (decimal) em R0 REP: MOV TH1, #3CH ;Carrega Timer 1 MOV TL1, #0AFH ;Com 3CAF (hexa) para contagem de 50ms SETB TR1 ;Início de contagem JNB TF1, $ ;Testa se houve overflow em Timer 1 CLR TF1 ;Reseta flag de overflow DJNZ R0, REP ;Repete temporização se necessário CLR TR1 ;Desliga contagem RET END
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
72
9 – Referências Bibliográficas - Aplicações Práticas do Microcontrolador 8051 (Teoria Geral Detalhada) Vidal Pereira da Silva Junior Editora Érica - Apostila de Microcontroladores Família MCS – 51 (Conceitos, Aplicações e Projetos) Professor Wilson Ruiz Centro Federal de Educação Tecnológica de São Paulo (CEFET – SP) - Apostila CURSO de MICROCONTROLADORES 8051 KIT STATION51
(Apostila Teórica) Professor Elmo Dutra da Silveira Filho Centro Tecnológico de Mecatrônica – SENAI
- Apontamentos de aulas - Laboratório de Microcontroladores Família 8051 Denys E. C. Nicolosi Editora Érica - Manuais de Microcontoladores Família 8051 dos fabricantes: INTEL
ATMEL
- The 8051 Microcontroller – Architecture, Programming and Applications Kenneth J. Ayala Western Carolina University
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
73
APÊNDICE A
EXERCÍCIO / EXEMPLO 1
Projetar um sistema de controle de um elevador para 3 níveis, baseado no mi-
crocontrolador 8051, com as seguintes características:
Entradas do sistema: P0 e INT0
Saídas do Sistema: P1
Nota:
1 – S e desejável é possível associar-se o primeiro andar da tabela anterior ao
andar térreo de um edifício, deslocando-se também os outros níveis, sem alterações no
funcionamento da solução fornecida como exemplo a seguir.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
74
2 – Assim que o sistema é iniciado o elevador desloca-se para o primeiro andar
com a porta fechada e lá chegando abre a porta.
3 – O elevador somente desloca-se com a porta fechada.
4 – Quando a cabine está parada, sua porta conecta-se mecanicamente com a
porta do respectivo andar e assim ambas terão o mesmo movimento.
5 – Os botões de comando do elevador estão no interior da cabine, não existindo
botões externos ao lado da porta de entrada, assim o usuário só pode entrar no eleva-
dor se este estiver parado no andar, sendo o destino escolhido pelo mesmo dentro da
cabine (limitação inicialmente adotada para a simplificação do exemplo).
6 – O LED aceso indica a presença da cabine no respectivo andar.
7 – Normalmente não é recomendável uma freqüência de “clock” inferior a 3MHz
para aplicações reais, más nesse problema, onde um dos objetivos é a determinação
de um intervalo de tempo e a visualização do funcionamento de um dos TEMPORIZA-
DORES através do simulador, esta freqüência fica estabelecida em 120KHz. (valor es-
colhido em função da aplicação).
8 – O tempo gasto pela porta no movimento de abrir e fechar deve ser de 5 se-
gundos e determinado pelo TIMER0 (vide descrição do cálculo no cabeçalho do pro-
grama).
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
75
;************************************************************************************************
; Exercício / Exemplo 3: Controle Do Elevador 05/11/2002 02:45h
;Freqüência Do Timer = (Freqüência Do Clock) / 12 = 120k / 12 = 10k Hz E O Seu Período =
0,1x10-3 Segundos
; assim para um tempo de 5 segundos temos: 5 / 0,1x10-3 = valor da contagem = 50000
; 65535 – 50000 + 1 = 15536 = 3cb0h = Valor A Ser Carregado Inicialmente No Contador / Temporizador
;************************************************************************************************
ORG 0000H
LJMP INICIO
ORG 0003H
LJMP INT0
ORG 000BH
LJMP TIMER0
ORG 0050H
INICIO: MOV SP, #0030H ;estabelece o ponteiro da pilha
MOV IE, #10000011B ;habilita INT0 e TIMER0
MOV IP, #00000001B ;define prioridade alta p/ INT0 e baixa p/ TIMER0
MOV TCON, #00000000B ;INT0 ativa por nível “0” e TIMER0 desligado
MOV TMOD, #00000001B ;função de temporização com controle do TIMER0 fei-
to pelo bit TR0 ;modo 1 de operação
CLR P1.1 ;para o elevador
CLR P1.0
MOV TH0, #3CH ;valor inicial para a contagem / temporização
MOV TL0, #0B0H
CLR 00 ;inicializa um bit endereçável para ser a FLAG DO TIMER0
;**************************************************************************************************
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
76
; O sistema (elevador) está sendo iniciado
;**************************************************************************************************
JB P0.4, L25 ;verifica se o elevador já estava no 1o andar.
ACALL DESCER ;leva o elevador inicialmente para o térreo.
L1: JNB P0.4, L1 ;espera chegar no 1o andar
ACALL PARAR
L25: SETB P1.4 ;acende led indicador de 1o andar
CLR P1.5 ;apaga led indidador de 2o andar
CLR P1.6 ;apaga led indicador de 3o andar
;**************************************************************************************************
; O elevador está no 1o andar
;**************************************************************************************************
ANDAR_1: JB P0.1, L2 ;testa chamada para o 2o andar
JB P0.2, L3 ;testa chamada para o 3o andar
AJMP ANDAR_1 ;volta para esperar uma chamada
L2: ACALL SUBIR ;movimenta o elevador para o 2o andar
L4: JNB P0.5, L4 ;espera chegar no 2o andar
ACALL PARAR
SETB P1.5 ;acende o led indicador de 2o andar
LJMP ANDAR_2
L3: ACALL SUBIR ;movimenta o elevador para o 3o andar
L5: JNB P0.6, L5 ;espera chegar no 3o andar
ACALL PARAR
SETB P1.6 ;acende o led indicador de 3o andar
LJMP ANDAR_3
;************************************************************************************************
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
77
; O elevador está no 2o andar
;************************************************************************************************
ANDAR_2: JB P0.0, L6 ;testa chamada para o 1o andar
JB P0.2, L7 ;testa chamada para o 3o andar
AJMP ANDAR_2 ;volta para esperar uma chamada
L6: ACALL DESCER ;movimenta o elevador para o 1o andar
L8: JNB P0.4, L8 ;espera chegar no 1o andar
ACALL PARAR
SETB P1.4 ;acende o led indicador de 1o andar
LJMP ANDAR_1
L7: ACALL SUBIR ;movimenta o elevador para o 3o andar
L9: JNB P0.6, L9 ;espera chegar no 3o andar
ACALL PARAR
SETB P1.6 ;acende o led indicador de 3o andar
LJMP ANDAR_3
;************************************************************************************************
; O elevador está no 3o andar
;************************************************************************************************
ANDAR_3: JB P0.0, L10 ;testa chamada para o 1o andar
JB P0.1, L11 ;testa chamada para o 2o andar
AJMP ANDAR_3 ;volta para esperar uma chamada
L10: ACALL DESCER ;movimenta o elevador para o 1o andar
L12: JNB P0.4, L12 ;espera chegar no 1o andar
ACALL PARAR
SETB P1.4 ;acende o led indicador de 1o andar
LJMP ANDAR_1
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
78
L11: ACALL DESCER ;movimenta o elevador para o 2o andar
L13: JNB P0.5, L13 ;espera chegar no 2o andar
ACALL PARAR
SETB P1.5 ;acende o led indicador de 2o andar
LJMP ANDAR_2
;************************************************************************************************
; sub-rotina: SUBIR
;************************************************************************************************
SUBIR: CLR P1.4 ;apaga todos os led’s
CLR P1.5
CLR P1.6
CLR P1.2 ;fecha a porta
SETB TR0 ;liga o timer0
L20: JNB 00, L20 ;espera o término da temporização
CLR 00 ;reseta a FLAG DO TIMER0
SETB P1.1 ;sobe o elevador
CLR P1.0
RET
;************************************************************************************************
; sub-rotina: DESCER
;************************************************************************************************
DESCER: CLR P1.4 ;apaga todos os led’s
CLR P1.5
CLR P1.6
CLR P1.2 ;fecha a porta
SETB TR0 ;liga o timer0
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
79
L21: JNB 00, L21 ;espera o término da temporização
CLR 00 ;reseta a FLAG DO TIMER0
CLR P1.1 ;desce o elevador
SETB P1.0
RET
;************************************************************************************************
; sub-rotina: PARAR
;************************************************************************************************
PARAR: CLR P1.1 ;para o elevador
CLR P1.0
SETB P1.2 ;abre a porta
SETB TR0 ;liga o timer0
L22: JNB 00, L22 ;espera o término da temporização
CLR 00 ;reseta a FLAG DO TIMER0
RET
TIMER0: CLR TR0 ;desliga o timer0
MOV TH0, #3CH ;valor inicial para a contagem / temporização
MOV TL0, #0B0H
SETB 00 ;seta a FLAG DO TIMER0
RETI ;retorna para o programa
INT0: CLR P1.1 ;para o elevador
CLR P1.0
SETB P1.2 ;abre a porta
L23: JNB P3.2, L23 ;espera o término da situação de emergência
RETI
END
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
80
APÊNDICE B
PROCEDIMENTO PARA GRAVAÇÃO DO 8051
1 – C ONSIDERAÇÕES INICIAIS
Este gravador só funciona para os microcontroladores, baseados no microcon-
trolador 8051, da série AT89SXX.
Os microcontroladores suportados pelo software de gravação são:
AT89S51: 4Kbytes de memória flash
AT89S52: 8Kbytes de memória flash
AT89S53: 12Kbytes de memória flash
AT89S8252
2 – MATERIAIS NECESSÁRIOS
Placa de circuito impresso, conforme figura da página 69.
3 – OBTENÇÃO DO SOFTWARE
O software utilizado se chama AEC_ISP v3.0 e pode ser obtido gratuita-
mente (mediante cadastro) no site do fornecedor: www.aec-electronics.co.nz
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
81
4 – UTILIZAÇÃO DO SOFTWARE
Este programa é baseado no estilo dos programas DOS, mas roda perfeitamen-
te em ambiente Windows (até mesmo no XP).
Ao executar o programa AEC_ISP.EXE, a seguinte tela irá abrir:
Sua função é gravar o arquivo .hex gerado por qualquer compilador para 8051
no microcontrolador, conforme os passos descritos a seguir:
a) Após ter o programa simulado e funcionando deve-se carregar o arquivo .hex o
qual foi compilado conforme descrição em capítulo anterior;
b) Após compilar o programa, copie o arquivo .hex criado para pasta onde está lo-
calizado o programa AEC_ISP.EXE;
c) Execute o programa e selecionar a opção (J) Setup para configurá-lo. Configu-
re-o de acordo com a próxima tela. Lembre-se de modificar a opção (9)device onde
você deve selecionar o tipo de microcontrolador a ser programado. A etapa de configu-
ração só deve ser feita uma vez. Para as próximas gravações, pode-se pular este pas-
so, desde que o microcontrolador a ser programado seja o mesmo (possua o mesmo
código), e ao terminar de configurar, aperte (S) Save setup para salvar as definições;
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
82
d) Coloque o microcontrolador no soquete, conecte o gravador na porta paralela, e
ligue a fonte de alimentação;
e) Na tela de opções selecione (A) Load hex file to flash buffer;
f) Digite o nome do arquivo que você copiou para a pasta do programa;
g) Finalmente selecione (E) – Program. O software irá iniciar a gravação e verifi-
cação do programa, conforme a tela a seguir. Ao terminar saia do software e desconec-
te todos os equipamentos;
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
83
h) Pronto, o circuito já pode ser testado.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
84
ANEXO 1 – DISPLAY LCD
01 – INTRODUÇÃO
Os módulos LCD são interfaces de saída muito útil em sistemas microprocessa-
dos. Estes módulos podem ser gráficos e a caracter. Os módulos LCD gráficos são en-
contrados com resuluções de 122x32, 128x64, 240x64 e 240x128 dots pixel, e geral-
mente estão disponíveis com 20 pinos para conexão. Os LCD comuns (tipo caracter)
são especificados em número de linhas por colunas e são encontrados nas configura-
ções previstas na Tabela 1.
Tabela 1 - Módulos LCD disponíveis
Os módulos podem ser encontrados com LED backlight (com uma iluminação de
fundo) para facilitar as leituras durante a noite. Neste caso, a alimentação deste led faz-
se normalmente pelos pinos 15 e 16 para os módulos comuns e 19 e 20 para os módu-
los gráficos, sendo os pinos 15 e 19 para ligação ao anodo e os pinos 16 e 20 para o
catodo.
A corrente de alimentação deste led varia de 100 a 200mA, dependendo do mo-
delo.
Estes módulos utilizam um controlador próprio, permitindo sua interligação com
com outras placas através de seus pinos, onde deve ser alimentado o módulo e interli-
gado o barramento de dados e controle do módulo com a placa do usuário.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
85
Naturalmente que além de alimentar e conectar os pinos do módulo com a placa
do usuário deverá haver um protocolo de comunicação entre as partes, que envolve o
envio de bytes de instruções e bytes de dados pelo sistema do usuário.
A Tabela 2 descreve cada pino do módulo ou do display para conexão deste a
outras placas:
Tabela 2 - Pinagem dos Módulos LCD
Assim como em um rádio relógio todo módulo LCD permite um ajuste na intensi-
dade da luz emitida ou ajuste de contraste, isto é possível variando-se a tensão no pino
3. A Figura 1 mostra um circuito típico e recomendado pela maioria dos fabricantes pa-
ra efetuar este ajuste. Alguns fabricantes recomenda o uso de um resistor de 4K7 em
série com o potenciômetro de 10K.
Figura 1 - Detalhe do controle de contraste do módulo LCD
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
86
2 – INTERFACE COM CPU
Os módulos LCD são projetados para conectar-se com a maioria das CPU’s dis-
poníveis no mercado, bastando para isso que esta CPU atenda as temporizações de
leitura e escrita de instruções e dados, fornecido pelo fabricante do módulo. A Figura 2
mostra um exemplo de diagrama de tempos típico requeridos para operação de escrita
no módulo LCD, estes tempos variam em função do clock da CPU do usuário.
Figura 2 - (a) Escrita no LCD (b) Ciclo de Escrita da CPU 8051
A Tabela 3 a seguir mostra a relação entre a freqüência da CPU e a temporiza-
ção de leitura/escrita da maioria dos módulos LCD. Em geral, podemos conectar o bar-
ramento de dados da CPU ao barramento do módulo, mapeando-o convenientemente
na placa de usuário, e efetuarmos uma operação normal de leitura/escrita sem mais
problemas.
Tabela 3 - Relação clock da CPU x Temporização do Módulo LCD
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
87
A Figura 3 mostra um exemplo de conexão de uma placa baseada nos micro-
controladores da linha Intel de 8 bits (8051), ao módulo LCD. Neste caso como os si-
nais A0 e A1 estão conectados aos pinos 4 e 5, teremos então 04 (quatro) endereços
distintos para comunicação entre a CPU e o módulo LCD. A Tabela 4 mostra estes en-
dereços.
Endereço R / W RS Descrição
4000 0 0 Instrução – Escrita no módulo
4001 0 1 Dados – Escrita no módulo
4002 1 0 Instrução – Leitura no módulo
4003 1 1 Dados – Leitura no módulo
Tabela 4 - Endereçamento do módulo LCD para Figura 3
Figura 3 - Sistema baseado na CPU 8051 com módulo LCD
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
88
O exemplo apresentado na Figura 3 refere-se à conexão do módulo LCD com
comunicação/transmissão de 8 bits, mas podemos conectar o módulo com transmissão
a cada 4 bits, conforme é mostrado na Figura 4. Neste caso não utilizamos os pinos 7,
8, 9 e 10. Isto é muito útil quando a CPU do usuário possui poucos pinos de I/O, caso
típico da linha de microprocessadores PIC, como por exemplo o Basic Stamp. Agora
surge a dúvida, um mesmo módulo pode conectar-se com 8 ou 4 bits? como isto é pos-
sível?
Ocorre que o módulo LCD quando alimentado necessita de algumas instruções
de inicialização que identificará qual a forma de transmissão de dados que será estabe-
lecida entre a CPU e o módulo.
Figura 4 - Modulo LCD comunicando-se com 4 bits
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
89
03 – PROGRAMAÇÃO / INSTRUÇÕES
Tabela 5 - Conjunto de instruções do módulo LCD
A Tabela 5 apresenta o conjunto de instruções, levando-se em consideração que
a comunicação com o módulo seja com barramento de 8 bits (fixado durante a iniciali-
zação)
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
90
. Para o caso desta comunicação ocorrer com apenas 4 bits (nible), os 8 dados
ou instruções serão enviados por nible. sendo enviado o nible mais significativo
primeiro. Por exemplo para limpar o display, escreve-se o nible 0000 e depois 0001.
A Tabela 6 traz um resumo das instruções mais usadas na comunicação com os
módulos LCD.
Tabela 6 - Instruções mais comuns
3.1 – DESCRIÇÃO DETALHADA DAS INSTRUÇÕES
3.1.1 – Limpa Display
Esta instrução escreve o caracter ASCII 32 que corresponde ao branco ou barra
de espaço em todos os endereços da DDRAM apagando a mensagem que estiver es-
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
91
crita. O cursor retorna ao endereço “zero”, ou seja, à posição mais a esquerda da pri-
meira linha.
3.1.2 – Cursor Home
Faz retornar o cursor para a posição mais a esquerda da primeira linha e faz vol-
tar à posição original mensagens previamente deslocadas. O conteúdo da DDRAM
permanece inalterado.
3.1.3 – Fixa o modo de operação
Esta instrução tem efeito somente durante a leitura ou escrita de dados, portan-
to, deve ser ativada na inicialização.
-Estabelece o sentido de deslocamento do cursor (X=0 p/ esquerda, X=1 p/ di-
reita)
-Estabelece se a mensagem deve ou não ser deslocada com a entrada de um
novo caracter S=1 SIM, S=0 NÃO. Exemplo: X=1 e S=1 => mensagem desloca p/ direi-
ta.
3.1.4 – Controle do Display
A mensagem fica aparente quando D=1 e desaparece quando D=0, porém o
conteúdo da DDRAM fica inalterado. O cursor fica aparente quando C=1 e desaparece
quando C=0, porém as propriedades de escritas vigentes permanecem inalteradas. O
cursor quando aparente liga a última linha que compõem o caracter, exceto quando
B=1, que apresenta em alternância com uma matriz com todos os pontos negros em in-
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
92
tervalos de 0,4 segundos. Quando B=1 e C=0, obteremos a ativação intermitente de
uma matriz completa (todos os pontos da matriz).
3.1.5 – Deslocamento do Cursor ou da Mensagem
Desloca o cursor ou a mensagem sem que para isso tenha que escrever ou ler
dados do display. Utilizado para posicionamento dos dados no display.
3.1.6 – Estabelece o modo de utilização do Módulo LCD
Y estabelece o modo de comunicação. Se Y=1 estabelece 8 bits e quando Y=0
será 4 bits, enviados em duas operações, com os 4 bits (Nible) mais significativos sen-
do enviados primeiro. N fixa o número de linhas: N=0 para uma linha e N=1 para duas
ou mais linhas. F fixa o tipo da matriz: F=0 para matriz 7x5 ou 8x5 e F=1 para matriz
10x5 (somente possível quando apresentando em uma linha).
3.1.7 – Endereçamento da CGRAM
CGRAM é uma região da memória RAM destinada para criação de caracteres
especiais, como por exemplo: ç é, Ê, etc.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
93
Estabelece o endereço da CGRAM no contador de endereços (AC) como um
número binário AAAAAA e após isto os dados serão escritos ou lidos pela CPU neste
endereço. Cada caracter especial ocupa 8 endereços na CGRAM.
3.1.8 – Endereçamento da DDRAM
Estabelece o endereço da DDRAM no contador de endereços (AC) como um
número binário AAAAAAA e após isto os dados serão escritos ou lidos pela CPU neste
endereço. Para os display de uma linha AAAAAAA varia de 80H a CFH. Já para todos
os display de duas linhas varia de 80H a A7H para a primeira linha e de C0H a E7H pa-
ra a segunda linha.
3.1.9 – Busy Flag (BF)
Busy Flag ou o bit 7 indica ao sistema onde está conectado o módulo LCD, se o
controlador do módulo está ocupado com alguma operação interna (BF=1), e neste ca-
so, não aceita nenhuma instrução até que BF volte para 0.
Além disso, permite a leitura do conteúdo do contador de endereços (AC) ex-
pressa por AAAAAAA. O contador de endereços pode conter tanto endereço da
CGRAM como da DDRAM, depende neste caso, da instrução anterior.
3.1.10 – Escrita de dados na DDRAM ou CGRAM
Escreve o byte AAAAAAAA tanto na CGRAM como na DDRAM, dependendo da
instrução anterior (que define o endereço). Após a escrita, o endereço é automatica-
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
94
mente incrementado ou decrementado de uma unidade dependendo do modo escolhi-
do (ver item 3.1.3).
3.1.11 – Leitura de dados na DDRAM ou CGRAM
Faz uma leitura na CGRAM ou na DDRAM, dependendo da instrução anterior
(que define o endereço). É importante que precedendo a esta leitura seja executado a
instrução de estabelecimento do endereço da CGRAM ou DDRAM, pois caso contrário
o dado lido é inválido.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
95
3.2 – TABELAS DE ENDEREÇOS DOS CARCTERES NA DDRAM
A seguir resumiremos os endereços da DDRAM (em hexadecimal) dos caracte-
res da maioria dos módulos LCD disponíveis no mercado.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
96
OBS:
· Para os módulos de 04 linhas estamos considerando que existe um outro pino
de habilitação (como o pino 6) para as duas últimas linhas, portando outros endereços
de hardware.
· Antes de enviar uma instrução para escrita de dados no display, enviar antes
uma de endereçamento na DDRAM, com o endereço onde deve ser escrito o caracter, tipo
um gotoxy().
3.3 – TABELAS DE ENDEREÇOS DOS CARCTERES NA CGRAM
Os caracteres especiais previamente programado, durante a inicialização, po-
dem ser utilizados a qualquer tempo como se fossem caracteres normais, lembrando
que os endereços bases em hexadecimal para gravação dos caracteres especiais, na
maioria dos módulos LCD, são respectivamente: 40, 48, 50, 58, 60, 68, 70 e 78. Cada
caracter especial ocupa 8 (oito) endreços.
Tabela 7 - Caracter especial {ç} na CGRAM
Isto significa que para utilizarmos o caracter gravado no endereço base 50, du-
rante a inicialização ou reset do sistema, teremos que escrevermos 8 bytes entre os
endereços 50 e 57, para construirmos o caracter. Para ilustrar este procedimento, su-
por que queiramos construir o caracter {ç} no endereço base 50. Neste caso, devemos
construir o mapa deste caracter especial como mostrado na Tabela 7 (supondo estar
trabalhando com matriz 7x5 e com auto incremento de endereço a cada escrita). Ob-
serve que o último endereço sempre será 00, pois esta posição é sempre ocupada pelo
cursor.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
97
4 – INICIALIZAÇÃO DOS MÓDULOS LCD
Toda vez que alimentamos o módulo LCD deve ser executado o procedimento
de inicialização, que consiste no envio de uma seqüência de instruções para configurar
o modo de operação para execução de um dado programa de interfaceamento. Em
muitos display este procedimento ocorre automaticamente, dentro de condições especí-
ficas que envolve temporizações mínimas referente a transição do nível lógico 0 para 1,
ao ligarmos a fonte. Em caso de dúvidas, recomendamos o envio destas instruções
após o reset do sistema.
a) Inicialização para sistemas 8 bits de dados (5 instruções)
Entre as duas primeiras instruções recomendamos um delay de 15 mS. As de-
mais instruções podem ser escritas após checar o Busy Flag.
b) Inicialização para sistemas 4 bits de dados (5 instruções)
Entre as quatro primeiras instruções recomendamos um delay de 15 mS. As
demais instruções podem ser escritas após checar o Busy Flag. Estes bits (nible) de-
vem estar conectados aos pinos 11, 12.13 e 14.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
98
5 – ROTEIRO PARA PROGRAMAÇÃO
A seguir passaremos a descrever um resumo dos procedimentos para utilização
de um módulo ou display LCD:
1_ Ao energizar o módulo ajuste o potenciômetro de controle do brilho ou con-
traste até obter a visualização da matriciação na primeira linha para módulo de duas li-
nhas ou até a matriciação de meia linha para módulos de uma linha.
2_ Alguns módulos de uma linha só funcionam com a instrução 38 ao invés de
30, conforme instruções de inicialização.
3_ O sinal de Enable (pino 6) deverá ser gerado conforme a temporização mos-
trada na Figura 2. Os códigos de dados ou de instruções só serão processados pelo
processador do módulo após a descida do sinal do Enable.
4_ Para ajustar a velocidade de comunicação entre a CPU do usuário e o módu-
lo LCD existem duas possibilidades:
· Intercalar uma rotina de atraso de aproximadamente 15 mS entre as instru-
ções.
· Fazer a leitura do Busy Flag antes do envio de cada instrução e só enviar
quando o mesmo for 0. Neste caso, a única exceção será durante a inicialização.
1_ Durante a inicialização enviar a seqüência correta das instruções de iniciali-
zação conforme item 3.4
2_ Para programar caracteres na CGRAM, faça inicialmente o endereçamento
da mesma.
3_ Após a escrita de dados na CGRAM envie a instrução 01, para posicionar o
cursor.
4_ Para escrever os caracteres especiais previamente gravados na CGRAM, uti-
lize os códigos de 00 até 07 correspondente aos endereços bases de 40, 48 até 78 em
hexa.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
99
6 – COMANDOS ÚTEIS
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
100
Obs:
Após o endereçamento da CGRAM, o cursor se desloca para a primeira posição
da segunda linha (ou metade), portanto é recomendado enviar a instrução 01 ou “limpa
display e cursor home”.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
101
7 – CUIDADOS ESPECIAIS COM MÓDULOS LCD
a ) MANUSEIO
· Somente retire o módulo de sua embalagem protetora imediatamente antes de
sua instalação · Não guarde os módulos em recintos de alta temperatura e alta umida-
de. A temperatura de armazenamento deverá estar compreendida entre 5 e 30 oC.
· O LCD é coberto por uma lâmina plástica polarizada a qual não pode ser risca-
da. Cuidado em seu manuseio. Para a limpeza da lâmina utilize cotonetes embebido
em benzina. Não utilize outros tipos de solventes.
· Observe cuidadosamente os procedimentos de controle anti-estático quando
manusear os módulos. Eles incorporam circuitos integrados CMOS LSI os quais são
sensíveis à descarga eletrostática. Não toque nos terminais do conector, trilhas do cir-
cuito impresso e/ou terminais do CI.
b) INSTALAÇÃO
· Nunca desmonte o módulo
· Use uma estação de solda aterrada para soldagem de conectores ou terminais.
· montador deverá também ser convenientemente aterrado.
· Sempre que o projeto o permita, instale o módulo atrás de uma janela protetora
de plástico ou vidro.
· Somente retire a fita adesiva que protege a lâmina plástica frontal imediata-
mente antes de seu uso.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
102
8 – OPERAÇÃO
· Nunca instale ou desconecte o módulo com sua alimentação ligada.
· Sempre opere os módulos respeitando sua gama de temperatura de operação.
· Observe cuidadosamente os valores das tensões de alimentação e os níveis
dos sinais de controle.
· Ajuste a tensão no pino 3 (V0) para obter o contraste mais conveniente para
uma dada aplicação.
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
103
9 – Software de Teste do LCD
;****************** Programa de Escrita em LCD *******************
;* *
;* POR: MILTON BARREIRO JUNIOR *
;* DATA: JUNHO DE 2006 *
;************************************************************************
;******************** Declaração de Variáveis ***********************
;* DEFINIÇÃO DOS I/O'S DE CONEXÃO DO LCD *
;************************************************************************
DISPLAY EQU P2 ;Define port P2 como bits de dados do LCD
RS EQU P3.5 ;Define P3.5 como bit RS do LCD
RW QUE P3.6 ;Define P3.6 como bit RW do LCD
EN EQU P3.7 ;Define P3.7 como bit EN do LCD
ORG 0000H
LJMP START
ORG 0050H
START: MOV SP, #40H ;Ajusta Stack Pointer
;************************** Parâmetros do LCD **************************
;* DEFINE MODO DE OPERAÇÃOO DO LCD *
;****************************************************************************
CLR EN ;Bit EN=0
CLR RS ;Bit RS=0
CLR RW ;Bit RW=0
MOV A, #38H ;Define LCD como matriz 7x5 pixels e 8 bits de dados
LCALL CMD ;Escreve comando no LCD
MOV A, #0EH ;Liga LCD e ativa cursor
LCALL CMD ;Escreve comando no LCD
MOV A, #06H ;Cursor deslocando para a direita
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
104
LCALL CMD ;Escreve comando
MOV A, #01H ;Limpa LCD
LCALL CMD ;Escreve comando
;******************************** Escreve no LCD *******************************
;* ROTINA DE ESCRITA DE MENSAGENS NO LCD *
;***********************************************************************************
WRITE: MOV A, #80H ;Posiciona LCD no primeiro caractere na primeira linha
LCALL CMD ;Escreve comando
MOV DPTR, #MSG1 ;Movimenta inicio da tabela da primeira mensagem para o DPTR
LCALL MSG ;Escreve primeira mensagem
MOV A, #0C0H ;Posiciona LCD no primeiro caractere da segunda linha
LCALL CMD ;Escreve comando
MOV DPTR, #MSG2 ;Movimenta inicio da tabela da segunda mensagem para o DPTR
LCALL MSG ;Escreve segunda mensagem
LJMP WRITE
;************************* Escreve Comandos no LCD *************************
;* ENVIA COMANDOS DE ESCRITA NO LCD *
;***********************************************************************************
CMD: SETB EN ;Esse bloco de instruções é
CLR RS ;responsável pela escrita de
MOV DISPLAY,A ;comandos e dados no LCD
LCALL DELAY
CLR EN
LCALL DELAY
RET
MSG: MOV R1, #00H
WRCHAR: MOV A, R1
INC R1
MOVC A, @A+DPTR
CJNE A, #'$', NEXTCHAR
RET
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
105
NEXTCHAR: SETB EN
SETB RS
MOV DISPLAY,A
LCALL DELAY
CLR EN
LCALL DELAY
LJMP WRCHAR
;******************************** Rotina de Delay ********************************
;* ROTINA QUE CONTA TEMPO DE 10mS PARA ESCRITA NO LCD *
;***********************************************************************************
DELAY: MOV TMOD, #11H ;Essa rotina tem como objetivo
MOV TCON, #00H ;contar tempo de 10mS de atrazo
MOV TH0, #0D8H ;para que o LCD seja capaz de
MOV TL0, #0F0H ;ler comandos e dados
CLR TF0
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
RET
;****************************** Tabela de Mensagens **************************
;* MENSAGENS A SEREM ESCRITAS NO LCD *
;* DEVEM SER ESCRITAS NO FINAL DO PROGRAMA *
;***********************************************************************************
MSG1: DB " TESTE DO $" ;Tabela da primeira mensagem
MSG2: DB " LCD OK $" ;Tabela da segunda mensagem
END ;Fim de programa
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
106
10 – Software de teste do teclado
; ROTINA DE LEITURA DE TECLADO MATRICIAL 4X3, KIT ETE JORGE STREET
; CONFIGURAÇÃO DO TECLADO
; P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
; L4 L3 L2 L1 C3 C2 C1 -
TECLADO EQU P1 ;DEFINIR END PORT ONDE ESTÁ O TECLADO
MARCTEC EQU 23H ;MARCADOR DE MEMORIA
; OBS: ALTERA REGS A, ACC E R7
MOV SP,#40H
; ********************** EXEMPLO DE ROTINA DE LEITURA DE TECLADO ********************
VOLTA: LCALL VETEC
CJNE A, #0FH, ESC
LJMP VOLTA
ESC: MOV P3, A
LJMP VOLTA
;*********************************************************************************************************
;*********** SUBROTINAS DO TECLADO (COLOCAR NO FINAL DO PROGRAMA) **********
; RETORNO TECLA ACIONADA OU OFH SEM TECLA
VETEC: MOV TECLADO, #0FH
NOP
NOP
MOV A, TECLADO
CJNE A, #0FH, VETEC1
RET
VETEC1: LCALL DETEC
PUSH ACC
LCALL ESTEC
POP ACC
RET
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
107
DETEC: MOV MARCTEC, #7FH
DETEC1: MOV TECLADO, MARCTEC
NOP
NOP
MOV A, TECLADO
CJNE A, MARCTEC, VETEC0
MOV A, MARCTEC
RR A
MOV MARCTEC, A
CJNE A, #0F7H, DETEC1
RET
VETEC0: MOV MARCTEC, A
MOV DPTR, #TABTEC
MOV R7, #00H
VETECA: MOV A, R7
MOVC A, @A+DPTR
CJNE A, MARCTEC, VETECB
MOV A, R7
RET
VETECB: INC R7
SJMP VETECA
ESTEC: MOV R0, #02H
LCALL AT50R0
VESTEC: MOV TECLADO, #0FH
NOP
NOP
MOV A, TECLADO
CJNE A, #0FH, VESTEC
RET
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
108
;****************************** SUBROTINA DE ATRASO 50MS X R0 ******************************
AT50R0: MOV TH0, #3CH
MOV TL0, #0B0H
MOV TMOD, #11H
SETB TR0
CLR TF0
ATR1: JNB TF0, ATR1
DJNZ R0, AT50R0
CLR TF0
CLR TR0
RET
;*********************************************************************************************************
;**************** TABELA DE TECLAS (COLOCAR NO FINAL DO PROGRAMA) ***************
TABTEC: DB 7BH,0EDH,0EBH,0E7H,0DDH,0DBH,0D7H,0BDH,0BBH,0B7H,7DH,77H
;*********************************************************************************************************
END
11 – Rotina exemplo de transmissão serial
;******************************** Programa de Transmissão Serial **********************************
;* POR: MILTON BARREIRO JUNIOR *
;* DATA: OUTUBRO DE 2006 *
;*********************************************************************************************************
;************************************* Declaração de Variáveis ***************************************
;* CONFIGURAÇÃO DO CANAL SERIAL E TAXA DE TRANSMISSÃO *
;*********************************************************************************************************
ORG 0000H
LJMP START
ORG 0050H
START: MOV SP, #40H ;Ajusta Stack Pointer
MOV TCON, #00H ;Zera Flags dos Timers
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
109
MOV PCON, #00H ;Define PCON.7 como ZERO (SMOD = 0 para cálculo da Taxa)
MOV TMOD, #21H ;Configura Timer 1 no modo 2 e Timer 0 no modo 1
MOV TH1, #152 ;Carrega TH1 e TL1 com 152d
MOV TL1, #152 ;para 300bps de Taxa
MOV SCON, #40H ;Configura Canal Serial no modo 1
SETB TR1
;*************************************** Rotina de Transmissão **************************************
DENOVO: MOV DPTR, #MSG
PROXIMO: CLR A
MOVC A, @A+DPTR
CJNE A, #'$', ENVIA
LJMP DENOVO
ENVIA: MOV SBUF, A
JNB TI, $
CLR TI
INC DPTR
LJMP PROXIMO
;*********************************************************************************************************
;*********************************** Tabela de String a Transmitir ***********************************
MSG: DB " Teste de Transmissão Serial $" ;Tabela da primeira mensagem
;********************************************************************************************************
END ;Fim de programa
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
110
12 – Programa exemplo conversão BCD para 7 Segmentos
;**************** PROGRAMA CONVERSÃO BCD PARA 7 SEGMENTOS ******************
;* POR: MILTON BARREIRO JUNIOR EM: JUNHO DE 2006 *
;*****************************************************************************************************
;*****************************************************************************************************
;* ROTINA DE CONVERSÃO DE BCD PARA 7 SEGMENTOS *
;*****************************************************************************************************
CONVERTE: ANL A, #00001111B ;ACC Recebe o valor BCD
MOV DPTR, #TABDISP ;a ser convertido de
MOVC A, @A+DPTR ;para 7 Segmentos
RET
;*****************************************************************************************************
;*****************************************************************************************************
;* TABELA DE CONVERSÃO DECIMAL E HEXADECIMAL PARA 7 SEGMENTOS *
;*****************************************************************************************************
TABDISP: DB 11000000B ;Tabela
DB 11111001B ;de
DB 10100100B ;valores
DB 10110000B ;para
DB 10011001B ;display
DB 10010010B ;7 segmentos
DB 10000010B ;anodo
DB 11111000B ;comum
DB 10000000B ;que
DB 10011000B ;vai
DB 11001000B ;de
DB 10000011B ;zero a nove em decimal,
DB 11000110B ;até
DB 10100001B ;F
DB 10000110B ;em
DB 11000000B ;Hexadecimal
END ;Indica fim de programa ao compilador
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
111
13 – Exemplo didático de um frequencímetro (0 – 999Hz)
;*********************** PROGRAMA FREQUENCÍMETRO *************************
;* ESSE FREQUENCÍMETRO MEDE E INDICA VALORES ATÉ 999Hz *
;* POR: MILTON BARREIRO JUNIOR EM: NOVEMBRO DE 2006 *
;******************************************************************************************
;UFREQ EQU R1 ;Incremento de unidade
;DFREQ EQU R2 ;Incremento de dezena
;CFREQ EQU R3 ;Incremento de centena
;******************************************************************************************
;* RESERVA ENDEREÇOS DOS VETORES DE INTERRUPÇÕES *
;******************************************************************************************
ORG 0000H
LJMP INICIO ;Busca linha de inicio
ORG 000BH
LJMP INTT0 ;Vetor de Int Timer 0
ORG 0013H
LJMP INTE1 ;Vetor de Int Ext 1
;*******************************************************************************************
;* CARREGA VALORES INICIAIS DAS VARIÁVEIS *
;*******************************************************************************************
ORG 0050H
INICIO: MOV IP, #00000010B ;Prioriza Int T0
SETB ET0 ;Habilita Int T0
SETB EX1 ;Habilita Int EX1
SETB EA ;Habilita Int Global
MOV SP, #40H ;Ajusta Stack Pointer
MOV TMOD, #11H ;Configura T0 e T1 no Modo 1
MOV TCON, #00000101B ;Modo de atuação das Interrupções
MOV TH0, #3CH ;Carrega inicio de contagem para
MOV TL0, #0B0H ;timer 0 contar 50mS
SETB TR0
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
112
;*****************************************************************************************
;* ROTINA DE RESET DO FREQUENCÍMETRO *
;*****************************************************************************************
MOV R0, #00H
MOV R1, #00H
MOV R2, #00H
MOV R3, #00H
MOV R4, #00H
MOV R5, #00H
MOV R6, #00H
;*****************************************************************************************
;* ROTINA DE MULTIPLEXAÇÃO DOS DISPLAYS *
;* MOSTRA VALORES DE FREQUENCIA MEDIDA *
;*****************************************************************************************
DISPLAY: MOV A, R4 ;Carrega no ACC valor de Unidade de Segundos
LCALL CONVERTE ;Converte Decimal para 7 Segmentos
SETB P2.2 ;Desliga Displays não utilizados
MOV P0, A ;Mostra Unidade de Segundos
CLR P2.0 ;Liga Digito Unidade de Segundos
ACALL TEMPO ;Tempo Display ativo
MOV A, R5 ;Carrega no ACC valor de Dezena de Segundos
LCALL CONVERTE ;Converte Decimal para 7 Segmentos
SETB P2.0 ;Desliga Displays não utilizados
MOV P0, A ;Mostra Dezena de Segundos
CLR P2.1 ;Liga Digito Dezena de Segundos
ACALL TEMPO ;Tempo Display ativo
MOV A, R6 ;Carrega no ACC valor dos Minutos
LCALL CONVERTE ;Converte Decimal para 7 Segmentos
SETB P2.1 ;Desliga Displays não utilizados
MOV P0, A ;Mostra Minutos
CLR P2.2 ;Liga Digito Minutos
ACALL TEMPO ;Tempo Display ativo
LJMP DISPLAY
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
113
;******************************************************************************************
;* TRATAMENTO DA INTERRUPÇÃO DO TIMER 0 E CRONÔMETRO *
;******************************************************************************************
INTT0: CLR TR0 ;Trata interrupção Int T0
MOV TH0, #3CH ;para base de tempo de 1s
MOV TL0, #0B0H
SETB TR0
INC R0
CJNE R0, #20, SAI
MOV A, R1
MOV R4, A
MOV A, R2
MOV R5, A
MOV A, R3
MOV R6, A
MOV R0, #00H
MOV R1, #00H
MOV R2, #00H
MOV R3, #00H
SAI: RETI
;******************************************************************************************
;* TRATAMENTO DA INTERRUPÇÃO EXTERNA INT_1 *
;******************************************************************************************
INTE1: INC R1
CJNE R1, #10, ESC
MOV R1, #00
INC R2
CJNE R2, #10, ESC
MOV R2, #00
INC R3
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
114
CJNE R3, #10, ESC
MOV R3, #00
ESC: RETI
;******************************************************************************************
;* ROTINA DE CONVERSÃO DE BCD PARA 7 SEGMENTOS *
;******************************************************************************************
CONVERTE: ANL A, #00001111B ;Rotina de
MOV DPTR, #TABDISP ;Conversão
MOVC A, @A+DPTR ;Decimal para 7 Segmentos
RET
;******************************************************************************************
;* TEMPO DE AMOSTRAGEM DOS DÍGITOS *
;******************************************************************************************
TEMPO: MOV TH1, #0D8H ;Carrega inicio de contagem para
MOV TL1, #0F0H ;timer 1 contar 10mS
CLR TF1
SETB TR1
JNB TF1, $
RET
;******************************************************************************************
;* TABELA DE CONVERSÃO DECIMAL E HEXADECIMAL PARA 7 SEGMENTOS *
;******************************************************************************************
TABDISP: DB 11000000B ;Tabela
DB 11111001B ;de
DB 10100100B ;valores
DB 10110000B ;para
DB 10011001B ;display
DB 10010010B ;7 segmentos
DB 10000010B ;anodo
DB 11111000B ;comum
DB 10000000B ;que
DB 10011000B ;vai
DB 11001000B ;de
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
115
DB 10000011B ;zero a nove em decimal,
DB 11000110B ;até
DB 10100001B ;F
DB 10000110B ;em
DB 11000000B ;Hexadecimal
END ;Indica fim de programa ao compilador
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
116
14 – Exemplo de rotina para teclado matricial 4x4
;************************ Programa de Teclado Matricial ************************
;* POR: MILTON BARREIRO JUNIOR *
;* DATA: OUTUBRO DE 2006 *
;* FONTE: www.8052.com
;************************************************************************************
;******************** CONFIGURAÇÃO DO TECLADO (MATRIZ 4X4) *********************
;
;P1.0 ---------------------------\
; |
;P1.1 -----------------------\
; | |
;P1.2 -------------------\
; | | |
;P1.3 ---------------\
; | | | |
;
;P1.7 -------------- 1 - 2 - 3 - A ---
;
;P1.6 -------------- 4 - 5 - 6 - B ---
;
;P1.5 -------------- 7 - 8 - 9 - C ---
;
;P1.4 -------------- * - 0 - # - D ---
; | | | |
;
;*************************************************************************************
;********************** Define o Port e Memoria das Teclas *********************
KBOARD EQU P1 ;Teclado Matricial em P1
MEMKEY EQU R1 ;Memória de tecla pressionada
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
117
;*************************************************************************************
MOV SP, #40H ;Ajusta STACK POINTER
;******************* Loop de Leitura do Teclado Matricial **********************
KEY_B: LCALL BUSCA
CJNE A, #0FH, SAIDA
LJMP START
SAIDA: MOV P3, A
LJMP KEY_B
;*************************************************************************************
;************************ SUBROTINAS DO TECLADO *************************
; devem ser inserida no final do programa
; RETORNA TECLA ACIONADA OU OFH SEM TECLA ACIONADA
;*************************************************************************************
BUSCA: MOV KBOARD, #0FH ;Carrega P1 com 0FH
NOP
NOP
NOP
NOP
MOV A, KBOARD ;Le teclado e salva no Acumulador
CJNE A, #0FH, SELECT ;Se valor lido igual 0Fh, retorna para loop de lei-tura
RET
SELECT: LCALL LOOP
PUSH A
LCALL DEBOU
POP A
RET
LOOP: MOV MEMKEY, #7FH
LOOP1: MOV KBOARD, MEMKEY
NOP
NOP
NOP
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
118
NOP
MOV A, KBOARD
CJNE A, MEMKEY, PROCURA
MOV A, MEMKEY
RR A
MOV MEMKEY, A
CJNE A, #0F7H, LOOP1
RET
PROCURA: MOV MEMKEY, A
MOV DPTR, #TABKEY
MOV R7, #00H
NOVO: MOV A, R7
MOVC A, @A+DPTR
CJNE A, MEMKEY, PROXIMA
MOV A, R7
RET
PROXIMA: INC R7
LJMP NOVO
;*******************************************************************************
;************************** DEBOUNCE DE 50mS **************************
DEBOU: MOV TH0, #3CH
MOV TL0, #0B0H
MOV TMOD, #11H
SETB TR0
CLR TF0
JNB TF0, $
CLR TF0
CLR TR0
RET
;******************************************************************************
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
119
;************************** TABELA DE TECLAS ***************************
TABKEY: DB 0EBH ;Tecla 0
DB 77H ;Tecla 1
DB 7BH ;Tecla 2
DB 7DH ;Tecla 3
DB 0B7H ;Tecla 4
DB 0BBH ;Tecla 5
DB 0BDH ;Tecla 6
DB 0D7H ;Tecla 7
DB 0DBH ;Tecla 8
DB 0DDH ;Tecla 9
DB 0E7H ;Tecla *
DB 0EDH ;Tecla #
DB 7EH ;Tecla A
DB 0BEH ;Tecla B
DB 0DEH ;Tecla C
DB 0EEH ;Tecla D
;*****************************************************************************
END ;Final do Programa
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
120
15 – Programa exemplo de controle digital de temperatura
;****************************************************
; Controle digital de temperatura
; Software implementado por alunos do
; curso de Automação Industrial do CEFET (2006)
;
; Autores:
; Alessander Martins Leite
; Flávio Roberto dos Santos
; Maércio Litwin Camargo
;****************************************************
ORG 0000H ;Inicio do programa
MOV PSW, #10H
MOV R1, #3CH ;Temperatura=60 Graus Celsius
LJMP COMECO
ORG 0030H
COMECO: MOV SP, #40H
CLR P2.5
CLR P2.6
CLR P2.7
LCALL INIC_LCD
LCALL CLEAR_LCD
LCALL TEXTOS
LCALL LINHA2
LCALL TESTOC
LCALL POS0
LCALL SET_TEMP
LCALL VER_TEMP
LJMP $
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
121
;****************************************************
; Inicializa Display LCD
;****************************************************
INIC_LCD: SETB P2.5
CLR P2.7
MOV P0, #38H
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
SETB P2.5
CLR P2.7
MOV P0, #0C0H
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
SETB P2.5
CLR P2.7
MOV P0, #06H
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
RET
;****************************************************
; Rotina para limpar o LCD
;****************************************************
CLEAR_LCD: SETB P2.5
CLR P2.7
MOV P0, #01H
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
122
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
RET
;****************************************************
; Rotina para mudar para linha 2 do LCD
;****************************************************
LINHA2: SETB P2.5
CLR P2.7
MOV P0, #0C0H
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
RET
;****************************************************
; Rotina para mudar de posição para
; ajustar a temperatura
;****************************************************
POS0: PUSH A
SETB P2.5
CLR P2.7
MOV P0, #8CH
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
POP A
RET
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
123
;****************************************************
; Rotina para mudar de posição para
; controlar a temperatura
;****************************************************
POS1: PUSH A
SETB P2.5
CLR P2.7
MOV P0, #0CCH
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
POP A
RET
;****************************************************
; Rotina TEMPO0 (1 segundo)
;****************************************************
TEMPO0: MOV PSW, #18H
MOV R0, #02H
MOV TMOD, #01H
NAO_AC0: MOV TH0, #0FFH
MOV TL0, #0FAH
SETB TR0
ESP0: JNB TF0, ESP0
CLR TF0
CLR TR0
DJNZ R0, NAO_AC0
MOV PSW, #10H
RET
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
124
;****************************************************
; Rotina TEMPO1
;****************************************************
TEMPO1: MOV PSW, #18H
MOV R0, #01H
MOV TMOD, #01H
NAO_AC1: MOV TH0, #0FFH
MOV TL0, #0FAH
SETB TR0
ESP1: JNB TF0, ESP1
CLR TF0
CLR TR0
DJNZ R0, NAO_AC1
MOV PSW, #10H
RET
;****************************************************
; Rotina de texto (ajuste)
;****************************************************
TEXTOS: MOV DPTR, #TEMPERATURAS
AS: MOV A, #00H
MOVC A, @A+DPTR
JZ FIMS
LCALL ESCRT
INC DPTR
JMP AS
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
125
FIMS: RET
;****************************************************
; Rotina de texto (controle)
;****************************************************
TEXTOC: MOV DPTR, #TEMPERATURAC
AC: MOV A, #00H
MOVC A, @A+DPTR
JZ FIMC
LCALL ESCRT
INC DPTR
JMP AC
FIMC: RET
;****************************************************
; Rotina de texto
;****************************************************
AU_TS: MOV DPTR, #ATEMPERATURA
AT: MOV A, #00H
MOVC A, @A+DPTR
JZ AFIM
LCALL ESCRT
INC DPTR
JMP AT
AFIM: RET
;****************************************************
; Rotina para setar a temperatura
;****************************************************
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
126
SET_TEMP: MOV PSW, #10H
MOV R0, #11H
MOV A, @R0
LCALL ASCI
LCALL ESCR
RET
ESCR: MOV PSW, #10H
MOV R0, #17H
ESCRV: SETB P2.5
SETB P2.7
MOV A, @R0
ADD A, #30H
MOV P0, A
LCALL TEMPO0
CLR P2.5
LCALL ESPERA_LCD
DEC R0
CJNE R0, #14H, ESCRV
LCALL TEMPO0
RET
;****************************************************
; Rotina de escrita
;****************************************************
ESCRT: SETB P2.5
SETB P2.7
MOV P0, A
LCALL TEMPO0
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
127
CLR P2.5
LCALL ESPERA_LCD
RET
;****************************************************
; Rotina de espera LCD
;****************************************************
ESPERA_LCD: SETB P2.5
SETB P2.6
CLR P2.7
MOV P0, #0FFH
ESP: LCALL TEMPO1
JB P0.7, ESP
CLR P2.5
CLR P2.7
CLR P2.6
RET
;****************************************************
; Rotina que le P3 e converte para ASCII
;****************************************************
VER_TEMP: MOV A, P3
MOV PSW, #10H
LCALL VER_C
LCALL ASCI
LCALL POS1
LCALL ESCR
LCALL M_T_S
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
128
JMP VER_TEMP
;****************************************************
; Rotina para alterar a temperatura
;****************************************************
M_T_S: JNB P2.0, AU_T
RET
AU_T: LCALL INIC_LCD
LCALL CLEAR_LCD
LCALL AU_TS
LCALL POS0
LCALL I_D
;****************************************************
; Incrementa ou decrementa temperatura
;****************************************************
I_D: MOV PSW, #10H
JNB P2.0, $
V_V: JB P2.1, D_TS
JNB P2.1, $
LCALL MAI_T
LCALL SET_TEMP
LJMP I_D
MAI_T: CJNE R1, #0FFH, MAI_TN
RET
MAI_TN: INC R1
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
129
RET
D_TS: JB P2.2, S_TS
JNB P2.2, $
LCALL MEI_T
LCALL SET_TEMP
LJMP I_D
S_TS: JB P2.0, V_V
JNB P2.0, $
LCALL COMECO
MEI_T: CJNE R1, #00H, MEI_TN
RET
MEI_TN: DEC R1
RET
;****************************************************
; Converte para código ASCII
;****************************************************
ASCI: MOV PSW, #10H
MOV R5, #00H
MOV R6, #00H
MOV R7, #00H
COMPA: CJNE A, #00H, UND
RET
UND: DEC A
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
130
INC R5
CJNE R5, #0AH, COMPA
INC R6
MOV R5, #00H
CJNE R6, #0AH, COMPA
INC R7
MOV R6, #00H
LJMP COMPA
;****************************************************
; Rotina para verificar a temperatura
;****************************************************
VER_C: MOV PSW, #10H
PUSH A
PUSH 11H
CJNE A, 11H, N
CLR P1.0
POP 11H
POP A
RET
N: JZ X
CJNE R1, #00H, DIF
CLR P1.0
POP 11H
POP A
RET
X: SETB P1.0
POP 11H
Microcontrolador 8051 – Teoria e Prática
Milton Barreiro Junior – “ETE Getúlio Vargas”
131
POP A
RET
DIF: DEC A
DEC R1
JZ X
CJNE R1, #00H, DIF
CLR P1.0
POP 11H
POP A
RET
;****************************************************
; Tabelas de mensagens
;****************************************************
TEMPERATURAS: DB "Temp_Setada:",00H
TEMPERATURAC: DB "Temp_Contr.:",00H
ATEMPERATURA: DB "Mudar_Temp.:",00H
END