Sei sulla pagina 1di 79

Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Microcontroladores
Família MCS51®
MCS51®

Colégio Técnico de Campinas – COTUCA


Disciplina – TDM II-
II- Departamento Eletroeletrônica
Janeiro/2010

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 1


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

MICROCONTROLADOR

A figura abaixo mostra a diferença entre um microprocessador e um


microcontrolador. O microprocessador (ou CPU) é o gerenciador de um sistema
microcontrolado, possui internamente a unidade lógica aritmética (ULA),
registradores e a unidade de controle (UC). O microprocessador necessita de
unidades de memórias (ROM e/ou RAM) e de dispositivos de entrada e saída (I/O)
para se comunicar com o ambiente externo.
O microcontrolador é um dispositivo que possui internamente um
microprocessador, unidades de memórias e interface com o mundo externo (porta
serial, porta paralela, temporizadores). Na figura abaixo o retângulo marrom
corresponde ao microprocessador e retângulo azul corresponde ao microcontrolador.
O microcontrolador é utilizado para sistemas dedicados, tais como: injeção
eletrônica, ignição eletrônica, computador de bordo, relógios microcontrolados,
sistemas de automação. Num chão de fábrica é muito utilizado o CLP, sendo que
este equipamento possui internamente um microcontrolador.

FAMÍLIA MCS-51
Existem vários microcontroladores disponíveis no mercado. Um dos mais
utilizados se refere à família MCS-51. Estes microcontroladores possuem a
vantagem de serem produzidos por vários fabricantes (Atmel, Philips, Texas...)
que mantém núcleo base (core) e diferem em outras características: uns apresentam
conversores analógicos digitais (A/D), outros variam na quantidade de memória, no
tipo de memória (flash, eeprom), uns possuem PWM, comunicação SPI, I2C, Ethernet,
clocks que variam de 2 a 100 MHz.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 2


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
A figura abaixo apresenta o diagrama de um microcontrolador 8051:

O MCS51 possui um conjunto de 111 instruções, sendo que 98% destas são
instruções de 1 ou de 2 ciclos de máquina, o que fornece uma maior velocidade de
processamento. A figura abaixo mostra o encapsulamento de 40 pinos do 80C51:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 3


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

MEMÓRIA EXTERNA
O contador de endereço do 80C51 (PC) é de 16 bits, portanto pode ser
adicionado até:

64 Kbytes de memória de dados (Pinos RD e WR)


64 Kbytes de memória de programa (Pino PSEN)

A habilitação da memória externa de programa é feita através do pino EA:

EA = 0  utiliza a memória externa de programa (até 64 Kbytes)


EA =1  utiliza a princípio a memória interna (4 Kbytes) e depois a
memória externa.

Para o uso de memórias externas, os seguintes pinos devem ser utilizados:

Pino 17 (RD) – utilizado para leitura na memória de dados (RAM) externa.


Pino 16 (WR) – utilizado para escrita na memória de dados (RAM) externa.
Pino 29 (PSEN) – utilizado para leitura na memória de programa (ROM) externa.
Pino 30 (ALE) – sinal para demultiplexar a porta P0 (enable latch).
Pino 31 (EA) – habilita o acesso externo da memória de programa (external Access)
Pinos de 1 a 8 (porta 0) – bus multiplexado endereços (A0-A7) e dados (D0-D7).
Pinos de 21 a 28 (porta 2) – contém os endereços de A8 a A15.

Esquema para ligar uma ROM externa de 64 Kbytes:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 4


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Esquema para ligar uma RAM de 64 Kbytes:

Esquema simplificado para ligar uma ROM de 64 Kbytes e uma RAM de 64 Kbytes:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 5


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

ORGANIZAÇÃO DA MEMÓRIA RAM INTERNA


O diagrama abaixo mostra a organização interna da memória RAM:

É mostrado no diagrama acima que a memória interna RAM é dividida em:


- 128 bytes superiores (de 80h a FFh) que são utilizados pelos registradores de
funções especiais (acumulador, psw, sp, dptr....).
- 128 bytes superiores (de 80h a FFH) com os mesmos endereços do SFR. Esta
memória está presentes apenas nos microcontroladores 80C32, 80C52 e 87C52.
- 128 bytes inferiores de uso geral (de 00h a 7Fh) divididos em:
- 80 bytes de uso geral
- 16 bytes que podem ser endereçados bit a bit
- 4 bancos (banco 0, Banco 1, Banco 2 e Banco 3) de 8 bytes cada.
Pelo diagrama anterior nota-se que os 8 bytes de cada Banco possui uma
denominação comum: R0, R1, R2, R3, R4, R5, R6 e R7. Desta forma, deve-se definir
qual banco está se utilizando, se nenhum banco for definido o microntrolador
trabalhará com o banco 0 (default).
Exemplo: O comando MOV é utilizado para transferência (movimento) de dados entre
memórias. O movimento é sempre para, de:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 6


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
1) Se o banco 0 for selecionado a instrução:

MOV A, R0 ; isto movimenta o valor que está em R0 do banco 0 (2Eh, no


exemplo acima) para o acumulador (que é o principal
registrador).

Neste comando teríamos:

(A)  2Eh os parênteses indicam que o valor no registrador A recebe o valor


constante 2Eh.

Outra forma de acessar os valores nos registradores sem selecionar o banco


seria através da sua posição de memória. Por exemplo, acessando o registrador R0
através de seu endereço:

MOV A, 00h ; isto movimenta o valor que está na posição de memória 00h
(2Eh, no ;exemplo acima) para o acumulador (que é o
principal registrador).

Neste comando teríamos:

(A)  (00h)os parênteses indicam que o valor no registrador A recebe o valor que
está na posição de memória 00h (que é 2Eh).

Exercício 1) Qual os valores que serão movidos para o acumulador


quando for dada a instrução:
MOV A, R6

e como esses valores poderiam ser acessados pela posição de memória:

Se for selecionado o banco 0:_________ ou _______________


O banco 1:_________ ou _______________
O banco 2:_________ ou _______________
O banco 3:_________ ou _______________

Exercício 2) Qual os valores que serão movidos para o acumulador:

MOV A, 15h (A) 


MOV A, 0CH (A) 
MOV A, 06h (A) 
MOV A, 0Eh (A) 
MOV A, 2Eh (A) 

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 7


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

REGISTRO DE FUNÇÕES ESPECIAIS (SFR)


O mapa abaixo mostra os registradores de funções especiais bem como os
valores que eles assumem após o sinal de reset:

Registros que podem ser Endereço


acessados bit a bit Final

0F8h 0FFh
0F0h B 0F7h
00000000
0E8h 0EFh
0E0h ACC 0E7h
00000000
0D8h 0DFh
0D0h PSW 0D7h
00000000
0C8h 0CFh
0C0h 0C7h
0B8h IP 0BFh
XX000000
0B0h P3 0B7h
11111111
0A8h IE 0AFh
0X000000
0A0h P2 0A7h
11111111
98h SCON SBUF 9Fh
00000000 XXXXXXXX

90h P1 97h
11111111
88h TCON TMOD TL0 TL1 TH0 TH1 8Fh
00000000 00000000 00000000 00000000 00000000 00000000
80h PO SP DPL DPH PCON 87h
11111111 00000111 00000000 00000000 0XXX0000

Endereço
Inicial

Pelo mapa, temos os endereços:

P0 - Porta 0, endereço 80h


P1 - Porta 1, endereço 90h
P2 – Porta 2, endereço A0h
P3 – Porta 3, endereço B0h

SP (stack point) – pilha, endereço 81h


DPTR – ponteiro para endereçar dados externos, é dividido em DPL (82h) e DPH
(83h), como cada registro possui 8 bits, o DPTR possui 16 bits, sendo possível
com isso acessar 64 Kbytes de memória externa.
PCON – controle de potência, endereço 87h
TCON – controle do timer/contador, endereço 88h
TMOD – modo de controle do timer/contador, endereço 89h

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 8


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
TL0 – byte baixo do timer/contador 0, endereço 8Ah
TL1 – byte baixo do timer/contador 1, endereço 8Bh
TH0 – byte alto do timer/contador 0, endereço 8Ch
TH1 – byte alto do timer/contador 1, endereço 8Dh
SCON – controle da porta serial, endereço 98h
SBUF – porta de dados serial, endereço 99h

IE – habilita interrupção, endereço A8h


IP – controle de prioridade de interrupção, endereço B8h

ACC – acumulador, endereço E0h  registrador mais importante contém os


resultados das operações aritméticas e lógicas.
B – registrador B, endereço F0h  utilizado para realizar multiplicação e
divisão

PSW – contém os flags de estado e os bits para selecionar o banco de


registradores, endereço D0h.

O PSW é mostrado abaixo:

Uso geral Seleção do Banco


Carry auxiliar Overflow
Carry Paridade

CY AC F0 RS1 RS0 OV - P
0 0 banco 0
0 1 banco 1
1 0 banco 2
1 1 banco 3

Exemplo: mover o conteúdo do acumulador (A) para o registrador R1 do banco 2.


Para isso, o primeiro passo é selecionar o banco de interesse, no caso o banco 2.
Para isso RS1=1 e RS0=0:

PSW:
CY AC F0 RS1 RS0 OV - P
0 0 0 1 0 0 0 0

MOV PSW,#10H ; selecionando o banco 2


MOV R1, A ; o conteúdo de R1 recebe o conteúdo do acumulador
; (R1)  (A)

Exercício 3): Selecione o banco 1 e faça o acumulador receber o


valor de R3, depois selecione o banco 3 e faça o registrador R3
receber o valor do acumulador:
________________________
________________________
________________________
________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 9


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

CICLO DE MÁQUINA
Na família MCS51, cada ciclo de máquina possui 6 estados (de S1 a S6), cada
estado possui 2 períodos do oscilador, portanto:

1 ciclo de máquina no 8051 possui 12 períodos de clock.

Se for utilizado um cristal de 12 MHz, o ciclo de máquina será:

1 1
Tciclo _ de _ máquina = 12 * = 12 * = 1µs
fcristal 12 Mhz

O 80C51 possui instruções de 1 ciclo de máquina – 1 byte (Ex.: inc A); 2


ciclos de máquina – 2 bytes (Ex.: add a,#dado) e 2 ciclos de máquina – 1 byte
(Ex.: inc dptr).

Abaixo é mostrado o diagrama de tempo da leitura da memória externa de


programa:

Para leitura de memória externa de dados, o diagrama é mostrado abaixo:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 10


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

RESET
Para iniciar o processamento, o microcontrolador necessita de um sinal de
reset. Este sinal faz a CPU procurar o endereço 00h da memória de programa para
iniciar o programa armazenado nela. Na família MCS51 este sinal corresponde a uma
borda de descida no pino 9 (RST), que pode ser feita automaticamente através do
seguinte esquema:

O valor do capacitor e do resistor pode ser calculado utilizando o tempo de


carga no capacitor e considerando que seja necessário:

10 ms  para estabilizar a tensão de alimentação


10 ms  para partida do oscilador
24 períodos de clock para inicialização do sistema.

No diagrama de tempo, vr corresponde a tensão de referência (3,5 V – acima


deste valor é considerado nível alto). Considerando que seja utilizado um cristal
de 1 MHz, o período do clock será:

1
Tcristal = = 10 −6 s
1MHz

Portanto seria necessário um tempo de 20,024 ms (10 m + 10 m + 24 * 1 µs).

A tensão no capacitor é dada por:


−t
Vr = Vcc * e RC
Aplicando ln em ambos os lados da equação
−t
ln(Vr ) = ln(Vcc) + ln(e RC
) Vcc = 5V e Vr = 3,5V
t
ln 3,5 = ln 5 −
RC
t = RC (ln 5 − ln 3,5)
t = 0,3566 RC
Como o tempo t é conhecido (20,024 ms), será necessário assumir um valor para o
capacitor (C = 10 µF) e calcular o valor do Resistor:

t = 0,3566 RC
20,034.10 −3 = 0,3566.10.10 −6 R
R = 5k 62
Valor comercial R = 6k8.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 11


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

CONJUNTO DE INSTRUÇÕES DO MICROCONTROLADOR 8051

Tipos de Endereçamento
Endereçamento imediato: um valor constante é diretamente transferido para o
registrador indicado. Ex:

MOV A,#0Fh

Neste caso o acumulador recebe diretamente o valor 0Fh: (A)  0Fh


Observe que neste modo de endereçamento existe o sustenido (#) antes do valor a
ser transferido.

Endereçamento direto: endereça a memória RAM interna (128 bytes inferiores e 128
bytes do SFR). Ex.: Considere a memória da figura abaixo:

MOV A, 0Ah

Aqui o acumulador irá receber o valor que está


dentro do endereço 0Ah da memória (no exemplo FFh):

(A)  (0Ah)

O conteúdo do acumulador recebe o conteúdo da


posição de memória 0Ah.
Observe que neste tipo de endereçamento não há
nenhum caractere especial antes do endereço de
memória.

Exercício 1: Transfira o valor 76h


para a posição de memória 30h:

_____________________________________
_

Endereçamento por registrador: utiliza um dos registradores Rn. Rn pode ser


qualquer um dos registradores (R0, R1, R2, R3, R4, R5, R6 e R7). Ex.;

MOV A, R1

O acumulador irá receber o conteúdo de R1 (utilizando a memória acima e


considerando que estamos trabalhando com o banco 0, este valor seria 0Ch).

(A)  (R1)

O conteúdo do acumulador recebe o conteúdo do registrador R1.


Endereçamento indireto: utiliza o valor do conteúdo do registrador Ri (neste caso
Ri pode ser, ou R0, ou R1) como posição de memória. Ex. Considere a figura abaixo
e que esteja selecionado o banco 0:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 12


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

MOV A, @R0

Neste caso o conteúdo de R0 (06h) é


transformado em posição de memória, e o valor desta
posição (B2h) é transferido para o acumulador,
portanto A = B2h

(A) ((R0)) substituindo o conteúdo de


R0
(A)(06h) substituindo o conteúdo da posição
de memória 06h
(A)  B2h
Note que para indicar esta operação deve existir o
caractere @ antes dos registradores (ou R0 ou R1).

Endereçamento indexado: utilizado para leitura de dados em tabela ou memória


externa de programa. A posição da memória é obtida por um endereço base + um
índice. É utilizada a instrução MOVC. Ex:

MOVC A, @A+DPTR MOVC A, @A+PC

Nos dois exemplos o acumulador é o índice e o endereço base é dado por DPTR
ou PC.

(A)  ((A)+(DPTR)) (A)  ((A)+(PC))

No primeiro caso o conteúdo do acumulador é somado ao conteúdo do DPTR


(endereço base), isto fornece a nova posição da memória, e o conteúdo desta nova
posição é transferido para o acumulador.

Endereçamento específico: utilizado para transferir dados entre cpu e memória de


dados externa. É utilizada a instrução MOVX. Ex:

MOVX A, @DPTR MOVX A, @Ri

O valor de DPTR é transformado em endereço e o conteúdo deste endereço é


transferido ao acumulador

(A)  ((DPTR)) (A)  ((Ri))

Conjunto de Instruções da família MCS51


Abreviaturas utilizadas:

A ou Acc acumulador, sendo A o registro e Acc o endereço direto, ou dir endereço


da RAM interna Rn um dos registradores: R0, R1, R2, R3, R4, R5, R6 e R7.
@Ri R0 ou R1, usado para endereçamento indireto.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 13


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
A família MCS51 possui 111 instruções, sendo:

24 instruções aritméticas
25 instruções lógicas
28 instruções de transferência de dados
17 instruções booleanas
17 instruções de desvios

INSTRUÇÕES ARITMÉTICAS

São instruções de soma, subtração, multiplicação, divisão, incremento e


decremento:

ADIÇÃO:
As somas são todas realizadas entre acumulador e outro operando, e o
resultado são sempre transferidos para o acumulador

comando byte CM C CA 0V descrição


s
ADD A, Rn 1 1 (A)  (A) + (Rn)
ADD A, 2 1 (A)  (A) + (posição de
direto memória)
X X X
ADD A, @Ri 1 1 (A)  (A) + (conteúdo da
posição indicado por Ri)
ADD A, #dado 2 1 (A)  (A) + valor do dado

Na tabela acima:

Bytes se referem ao número de posição que a instrução ocupa na memória de


programa. Quantos menos bytes forem utilizados, menos memória de programa será
utilizada.
CM – ciclo de máquina – indica quantos ciclos de máquina à instrução utiliza.
Lembre-se no 80C51 cada ciclo de máquina corresponde a 12 períodos de clock.
Quanto menos ciclo de máquina utilizar, mais rápida será a execução do programa.
C – flag de carry se estiver marcado com X, o flag será afetado.
CA – flag de carry auxiliar.
OV – flag de overflow.

ADIÇÃO COM CARRY:

Aqui o acumulador é somado com outro operando e com o flag de carry (que
pode ser 1 ou 0):

comando byte CM C CA 0V descrição


s
ADDC A, Rn 1 1 (A)  (A) + (Rn) + (C)
ADDC A, direto 2 1 (A)  (A) + (pos. de
memória) + (C)
ADDC A, @Ri 1 1 (A)  (A) + (conteúdo da
X X X
posição indicado por Ri) +
(C)
ADDC A, #dado 2 1 (A)  (A) + (C) + valor do
dado

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 14


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

SUBTRAÇÃO COM BORROW:


A subtração sempre ocorre com o acumulador menos o outro operando e menos o
flag de carry (que pode ser 1 ou 0):

comando byte CM C CA 0V descrição


s
SUBB A, Rn 1 1 (A)  (A) - (Rn) - (C)
SUBB A, direto 2 1 (A)  (A) - (pos. de
memória) - (C)
SUBB A, @Ri 1 1 (A)  (A) - (conteúdo da
X X X
posição indicado por Ri) -
(C)
SUBB A, #dado 2 1 (A)  (A) - (C) - valor do
dado

MULTIPLICAÇÃO E DIVISÃO
Na multiplicação e na divisão sempre são utilizados os registros A e B.

comando byte CM C CA 0V descrição


s
MUL AB 1 4 (A)  LSB[(A)*(B)]
O - X
(B)  MSB [(A)*(B)]
DIV AB 1 4 O X O (A)  quociente [(A)*(B)]
(B)  resto [(A)*(B)]

Onde: LSB – byte menos significativo da multiplicação


MSB – byte mais significativo da multiplicação.

A e B são registros de 1 byte (8 bits), a multiplicação desses registros


podem ultrapassar 1 byte, por isso e apenas neste caso, o registro B é utilizado
para armazenar resultados de uma operação. Ex:

Multiplicando o valor 80h (128 na base 10) por 02h

128 x 2 = 256
fazendo A = 1000 0000 (128 na base 10)
fazendo B = 0000 0010 *(2 na base 10)
0000 0000
1 0000 000 +
1 0000 0000 (256 na base 10, mas 256 passa de 1 byte, tem
9 bits. Portanto os 9 bits são divididos em 2
MSB LSB bytes usando os registros A e B).
B A

Trecho do programa para o exemplo acima:

MOV A, #80h ; movendo o valor 80h para o acumulador


MOV B, #02h ; movendo o valor 2h para o registro B
MUL AB ; multiplicando 128 (80h) por 2, colocando o resultado
; A = 00h e B = 1h

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 15


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

INCREMENTO DE 8 BITS
É sempre incrementado de uma unidade o operando

comando byte CM C CA 0V descrição


s
INC A 1 1 (A)  (A) + 1
INC Rn 1 1 (Rn)  (Rn) + 1
INC direto 2 1 - - - (pos. memória) 
(pos.memória)+1
INC @Ri 1 1 ((Ri))  ((Ri)) + 1

DECREMENTO DE 8 BITS

É sempre decrementado de uma unidade o operando

comando byte CM C CA 0V descrição


s
DEC A 1 1 (A)  (A) - 1
DEC Rn 1 1 (Rn)  (Rn) - 1
DEC direto 2 1 - - - (pos. memória) 
(pos.memória)-1
DEC @Ri 1 1 ((Ri))  ((Ri)) - 1

INCREMENTO DE 16 BITS
Existe apenas incremento de 16 bits, não existe decremento de 16 bits

comando byte CM C CA 0V descrição


s
INC DPTR 1 2 - - - (DPTR)  (DPTR) + 1

AJUSTE DECIMAL
Instrução para operação em BCD. Válido apenas após as instruções ADD ou
ADDC.

comando byte CM C CA 0V descrição


s
DA A 1 1 Converte o conteúdo do
X X -
acumulador em BCD

Exemplo:

Supondo: A = 56h (0101 0110) representando o valor 56 BCD


R1 = 6 (0110 0111) representando o valor 67 BCD
C = 1
Se for feita a adição:

ADDC A, R1 ; soma o valor do acumulador com o valor de R1 + o carry,


; resultando em A = BEh, com AC = C = 0.
DA A ; ajuste para BCD, A = 24h e C = 1.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 16


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

INSTRUÇÕES LÓGICAS
São instruções que realizam as operações lógicas AND (E), OR (OU) e XOR
(OU-EXCLUSIVO) entre o acumulador (ou uma posição de memória) e outro operando.

E LÓGICO (AND)
O resultado de uma operação AND só será verdadeiro (1) se os dois operandos
forem verdadeiros (1). Ex:

0101 1100
0111 0101
resultado AND = 0101 0100

comando byte CM C CA 0V descrição


s
ANL A, Rn 1 1 (A)  (A) AND (Rn)
ANL A, direto 2 1 (A)  (A) AND (direto)
- - -
ANL A, @Ri 1 1 (A)  (A) AND ((Ri))
ANL A, # dado 2 1 (A)  (A) AND dado
ANL direto, A 2 1 (direto)  (direto) AND (A)
ANL direto, 3 2 - - - (direto)  (direto) AND
#dado (dado)

OU LÓGICO (OR)
O resultado de uma operação OR será verdadeiro (1) se um dos dois operandos
for verdadeiro (1). Ex:

0101 1100
0111 0101
resultado OR = 0111 1101

comando byte CM C CA 0V descrição


s
ORL A, Rn 1 1 (A)  (A) OR (Rn)
ORL A, direto 2 1 (A)  (A) OR (direto)
- - -
ORL A, @Ri 1 1 (A)  (A) OR ((Ri))
ORL A, # dado 2 1 (A)  (A) OR dado
ORL direto, A 2 1 (direto)  (direto) OR (A)
ORL direto, 3 2 - - - (direto)  (direto) OR
#dado (dado)

OU-EXCLUSIVO (XOR)
O resultado de uma operação XOR será verdadeiro (1) se um dos operandos for
verdadeiro (1) e o outro operando for falso (0). Ex:

0101 1100
0111 0101
resultado OR = 0010 1001

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 17


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
comando byte CM C CA 0V descrição
s
XRL A, Rn 1 1 (A)  (A) XOR (Rn)
XRL A, direto 2 1 (A)  (A) XOR (direto)
- - -
XRL A, @Ri 1 1 (A)  (A) XOR ((Ri))
XRL A, # dado 2 1 (A)  (A) XOR dado
XRL direto, A 2 1 (direto)  (direto) XOR (A)
XRL direto, 3 2 - - - (direto)  (direto) XOR
#dado (dado)

OPERAÇÕES LÓGICAS COM O ACUMULADOR


Algumas operações lógicas só podem ser realizadas com o conteúdo do
acumulador;

comando bytes CM C CA 0V descrição


CLR A 1 1 - - - (A)  00h. Zera acumulador
CPL A 1 1 - - - Complementa o valor do
acumulador
RL A 1 1 - - - Roda o acumulador à esquerda
RLC A 1 1 X - - Roda o acumulador à esquerda com
carry
RR A 1 1 - - - Roda o acumulador à direita
RRC A 1 1 X Roda o acumulador à direita com
carry
SWAP A 1 1 - - - Troca os nibbles do acumulador

A figura abaixo mostra exemplos dessas operações:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 18


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

INSTRUÇÕES DE MOVIMENTO DE DADOS

PERMUTAÇÃO DE BYTE
É a troca de conteúdo entre os operandos:

comando byte CM C CA 0V descrição


s
XCH A, Rn 1 1 (A)  (Rn) e (Rn)  (A)
XCH A, direto 2 1 - - - (A)(direto)e (direto) (A)
XCH A, @Ri 1 1 (A)((Ri) e ((Ri))  (A)

TRANSFERÊNCIA DE DADOS
As transferências de dados permitidas são mostradas na tabela abaixo:

comando byte CM C CA 0V descrição


s
MOV A, Rn 1 1 (A)  (Rn)
MOV A, direto 2 1 (A)  (direto)
MOV A, @Ri 1 1 (A)  ((Ri))
MOV A, #dado 2 1 (A)  dado

MOV Rn, A 1 1 (Rn)  (A)


MOV Rn, direto 2 2 (Rn)  (direto)
MOV Rn, #dado 2 1 (Rn)  dado

MOV direto, A 2 1 - - - (direto)  (A)


MOV direto, Rn 2 2 (direto)  (Rn)
MOV direto, 3 2 (direto)  (direto)
direto
MOV direto, @Ri 2 2 (direto)  ((Ri))
MOV direto, #dado 3 2 (direto)  dado

MOV @Ri, A 1 2 ((Ri)) (A)


MOV @Ri, direto 2 2 ((Ri))  (direto)
MOV @Ri, #dado 2 1 ((Ri)) dado

MOV DPTR, #da16 3 2 Move p/ DPTR o dado de 16


bits

Nota-se pela tabela acima que com o acumulador e com o endereço de memória
são possíveis todas as transferências de dados. O mesmo não ocorre com os
registradores, por exemplo, não é permitida a instrução: MOV R1, R4, isto é, não
é permitido mover o conteúdo entre registradores.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 19


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

PERMUTAÇÃO DE NIBBLE
Esta troca ocorre entre os nibbles baixo do acumulador e a memória interna

comando byte CM C CA 0V descrição


s
XCHD A, @Ri 1 1 - - -

OPERAÇÕES COM A PILHA


comando byte CM C CA 0V descrição
s
PUSH direto 2 2 - - - Armazena o conteúdo na pilha
POP direto 2 2 - - - Tira o conteúdo da pilha

Para guardar ou retirar o conteúdo do acumulador na pilha, deve-se colocar


o endereço do acumulador (Acc). Ex:
PUSH ACC
POP ACC

TRANSFERÊNCIA DE DADOS COM A MEMÓRIA EXTERNA DE DADOS


É possível fazer a transferência de dados usando endereçamento de 16 bits
(DPTR), ou com endereçamento de 8 bits (@Ri). A instrução utilizada neste caso é
MOVX:

comando byte CM C CA 0V descrição


s
MOVX A, @Ri 1 2 - - - Leitura da memória externa
MOVX A, @DPTR 1 2 - - - Leitura da memória externa
MOVX @Ri, A 1 2 - - - Escrita em memória
MOVX @DPTR, A 1 2 - - - Escrita em memória

TRANSFERÊNCIA DE DADOS COM A MEMÓRIA EXTERNA DE PROGRAMA


Também, é possível fazer a transferência de dados usando endereçamento de
16 bits (DPTR), ou com endereçamento de 8 bits (@Ri). A instrução utilizada neste
caso é MOVC:

comando byte CM C CA 0V descrição


s
MOVC A, @A+DPTR 1 2 - - - Leitura da memória externa
MOVC A, @A + PC 1 2 - - - Leitura da memória externa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 20


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

INSTRUÇÕES BOOLEANAS
São operações que trabalham com 1 bit:

comando byte CM C CA 0V descrição


s
CLR C 1 1 0 - - Limpa o carry C=0
CLR bit 2 1 - - - Limpa um bit
SETB C 1 1 1 - - Seta o carry C=1
SETB bit 2 1 - - - Seta um bit
CPL C 1 1 X Complementa o carry
CPL bit 2 1 Complementa o bit

comando byte CM C CA 0V descrição


s
ANL C, bit 2 1 X AND entre carry e bit
2 1 AND entre carry e o
X
ANL C, bit complemento do bit
ORL C, bit 2 1 X - - OR entre carry e bit
2 1 OR entre carry e o
X
ORL C, bit complemento do bit

MOV C, bit 2 1 X (C)  (bit)


- -
MOV bit, C 2 2 - (bit)  (C)

JC label 2 2 Salta para o label se


carry=1
JNC label 2 2 Salta para o label se
carry=0
- - -
JB bit, label 3 2 Salta para o label se bit =1
JNB bit, label 3 2 Salta para o label se bit=0
JBC bit, label 3 2 Salta para o label se bit=1
e após o salto faz o bit=0

INSTRUÇÕES DE DESVIOS
As instruções de desvios podem ser realizadas com 8, 11 ou 16 bits (figura
ao lado).
Com 8 bits (chamados relativos) a instrução pode desviar 256 bytes para
cima, ou para baixo do local onde for chamada (SJMP, JMP).
Com 11 bits (adr11), a instrução pode pular até 2 kbytes para cima ou para
baixo do local onde for chamada (ACALL, AJMP).
E com 16 bits (adr16) a instrução pode acessar 64 kbytes para cima ou para
baixo (LCALL, LJMP).

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 21


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

CHAMADA DE SUBROTINAS
comando byte CM C C 0V descrição
s A
ACALL adr11 3 2 - - - Chamada de subrotina a 2 kbyte
LCALL adr16 2 2 - - - Chamada de subrotina a 64 kbyte

RETORNO SUBROTINAS E INTERRUPÇÕES

comando byte CM C CA 0V descrição


s
RET 1 2 - - - Retorno de subrotina
RETI 1 2 - - - Retorno de uma interrupção

DESVIOS INCONDICIONAIS

comando byte CM C CA 0V descrição


s
JMP @A+DPTR 1 2 - - - Desvio indireto para pos. mem.
SJMP relativo 1 2 - - - Desvio curto - 256 bytes
AJMP adr11 2 2 - - - Desvio absoluto até 2 kbytes
LJMP adr16 3 2 - - - Desvio longo – 64 kbytes

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 22


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

DESVIOS CONDICIONAIS

comando byte CM C CA 0V descrição


s
JZ label 2 2 - - - Salta para label se (A)=0
JNZ label 2 2 - - - Salta para label se (A)≠0
CJNE A, direto, label 3 2 Salta para label se
- - -
(A)≠(direto)
CJNE A, #dado, label 3 2 Salta para label se
- - -
(A)≠dado
CJNE Rn,#dado, label 3 2 Salta para label se
- - -
(Rn)≠dado
CJNE @Ri, #dado, 3 2 Salta para label se
- - -
label ((Ri))≠dado

LOOPS

comando byte CM C CA 0V descrição


s
DJNZ Rn, label 2 2 Decrementa (Rn) e salta
- - -
para label se (Rn)≠0
DJNZ direto, label 2 2 Decrementa conteúdo da
- - - posição de memória e salta
para label se (direto)≠0

SEM OPERAÇÃO
Existe uma instrução que não faz nada, apenas consome ciclos da memória:

comando byte CM C CA 0V descrição


s
NOP 1 1 - - - Não faz nada

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 23


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

ESTRUTURA DE UM PROGRAMA EM ASSEMBLY DA FAMÍLA MCS-51


Um pequeno exemplo é mostrado abaixo:

Ch EQU P1.0 ; atribuição de valores. Ao invés de usar o bit P1.0, o


; mesmo será substituído pela palavra ch
motor EQU P2.1 ; atribuição de valor.

ORG 0h ;a diretiva org serve para posicionar a próxima instrução


; na posição indicada da memória de programa. Neste caso
; está posicionando no endereço 00h.

inicio:
CLR motor ;aqui a palavra “inicio” é um label (um endereço de
;memória). Além disso o bit motor (p2.1) é zerado
JB ch, $ ;testa bit ch (p1.0) se for 1, salta para $. No caso o
;cifrão $
;representa a mesma linha. Portanto enquanto ch=1, o
;programa fica parado na mesma linha. Se ch =0, o
;programa prossegue para linha de baixo.
SETB motor ;o bit motor é setado (p2.1=1)
SJMP inicio ;aqui a instrução sjmp é um salto para o endereço “inicio”
; o programa fica em loop.
END ; indica fim de programa

Um programa em assembly sempre deve começar com um ORG e terminar com um


END. As atribuições de valores (EQU) são opcionais, se forem utilizadas devem
sempre vir antes do ORG. Os “labels” são endereços de referências para os saltos
e chamadas de sub-rotinas e interrupções (sjmp, ljmp, acall....). Repare no
rótulo “inicio”, o endereço dele é dado por “inicio:”(com os dois pontos), e as
referências é dada por “inicio” (sem os dois pontos).
Note, também, no exemplo que ponto e vírgula é utilizado para fazer
comentário em assembly. O compilador despreza tudo que vier depois do ponto e
vírgula até o final da linha.

ALGORITMO E FLUXOGRAMA
O algoritmo é a descrição passo a passo de um programa. Já o fluxograma é a
descrição gráfica do programa. Fluxogramas e algoritmos são utilizados como
documentação de um programa.
Símbolos do fluxograma:

início ou fim de um programa atribuição


Ou de uma sub-rotina processo

entrada e chamada de
decisão (if) saída sub-rotina
de dados

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 24


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
Exemplos:

1) Mover para o registrador R1 do segundo banco o valor F3h e realizar a soma


entre este registro e o conteúdo do acumulador. O resultado deve ser guardado na
posição de memória 34h.

Neste exemplo é utilizado R1 do banco 2, portanto antes de acessar este


banco o mesmo deve ser selecionado através de PSW (página 8-módulo 1).

Fluxograma:
Algoritmo:
Início
1) Selecionar banco 2 (PSW=10H)
2) Mover F3h para R1
3) Somar Acc com R1 PSW=10h selecionando
4) Mover para memória 34h o banco 2
resultado da soma (que fica no
acumulador) R1=F3h atribuindo F3h
a R1

AA+R1 somando acc com


R1

armazenando na
(34h)  A pos.memória 34h
a soma

Fim

PROGRAMA EM ASSEMBLY

ORG 0h ; posiciona o programa na posição 00h da memória


; Flash
inicio: MOV PSW, #10h ; seleciona o banco 2. Note o sustenido (#)
MOV R1, #0F3h ; carrega R1 (do banco 2) com o valor F3h. Note o
; sustenido. Repare na inserção do zero (0) antes de F3h
; Isto é necessário quando o valor começa com uma
; letra
ADD A, R1 ; soma os conteúdos do acumulador e de R1, o resultado
; é armazenado no acumulador
MOV 34h, A ; armazena o resultado da soma na posição de memória
; 34h. Note que aqui não existe o sustenido (#), porque é
; uma posição de memória e não um dado.
END ; fim do programa.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 25


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

2) Mova para o acumulador o valor #0Fh e criar um programa que faça a operação OU-EXCLUSIVO entre o conteúdo
do acumulador (A) e a constante #33h. O resultado deve ser armazenado no conteúdo do registrador R5 do banco 1.

_________________ ; posicionar o programa na posição 0h da Flash


início: _________________ ; armazenando o valor 0Fh no acumulador
_________________ ; fazer o Ou-Exclusivo entre Acc e o valor 33h
________________ ; selecionar o banco 1
________________ ; mover para R5 do banco 1 o resultado XOR
________________ ; fim de programa

3) Carregue o acumulador com o valor de 03h e faça um programa que adicione o conteúdo do acumulador (A) à
constante ACh e que armazene o conteúdo na posição de memória cujo endereço é 4Bh.

_________________ ; posicionar o programa na posição 0h da Flash


início: _________________ ; ____________________________________
_________________ ; ____________________________________
________________ ; ____________________________________
________________ ; fim de programa
4) Faça os seguintes carregamentos: A=E7h, R1=20h, R5=FDh e memória 20h=33h. Crie um programa que execute a
operação lógica AND dos conteúdos: do acumulador A, da posição de memória cujo endereço é dado pelo conteúdo do
registrador R1, e do registrador R5. Armazene o resultado no conteúdo do registrador R1 do banco 2.

_________________ ; posicionar o programa na posição 0h da Flash


início: _________________ ; ____________________________________
________________ ; ____________________________________
________________ ; ____________________________________
________________ ; ____________________________________
________________ ; ____________________________________
________________ ; ____________________________________
________________ ; ____________________________________
________________ ; ____________________________________
________________ ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 26


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

5) Carregue a posição de memória 78h com o valor de D7h e a posição de memória 57h com o
valor de 73h. Faça uma operação lógica OU EXCLUSIVA entre os conteúdos dessas duas
memórias e armazene o resultado no registrador R3 do banco 3.

_________________ ; posicionar o programa na posição 0h da Flash


início: _________________ ; ____________________________________
________________ ; ____________________________________
_________________ ; ____________________________________
________________ ; ____________________________________
_________________ ; ____________________________________
_________________ ; ___________________________________
_________________ ; fim de programa

6) Carregue a posição de memória 26h com o valor de D7h e a posição de memória 44h com o
valor de 73h e carregue o carry com o valor 1 (C=1).
Crie um programa que execute a rotação de um bit, a esquerda sem carry, do conteúdo da
posição de memória cujo endereço é 26h. O resultado deve ser somado com o carry e o conteúdo
da posição de memória cujo endereço é 44h. Com o resultado, faça uma operação lógica OU-
EXCLUSIVO com a constante 7Dh. O resultado deve ser armazenado no conteúdo da posição de
memória 48h.

_________________ ; posicionar o programa na posição 0h da Flash


início: _________________ ; ____________________________________
________________ ; ____________________________________
_________________ ; ____________________________________
________________ ; ____________________________________
_________________ ; ____________________________________
________________ ; ____________________________________
_________________ ; ____________________________________
_________________ ; ___________________________________
_________________ ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 27


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

7) Faça um programa que calcule a quantidade de números pares de um buffer de memória que vai do endereço 30h
até o endereço 37h. O resultado deve ser armazenado na posição de memória 38h. Carregue as posições de memória
com os valores: (30h)45h; (31h)D8h; (32h)66h; (33h)C9h;
(34h)56h; (35h)DAh; (36h)00h; (37h)99h;

Dicas: usar endereçamento indireto, isto é, carregar o endereço inicial da memória(30h) em R0 ou R1. Buscar o
conteúdo deste endereço (@Ri), verificar se é par ou impar, incrementar Ri e voltar até verificar todas as memórias
(no caso 8, de 30h a 37h).
Para controlar o loop, haverá necessidade de um contador que pode estar em uma memória ou qualquer
registrador.
Para verificar se um número é par pode-se: dividir o número por 2 e verificar se o resto é 0 (par) ou 1
(impar). Outro processo consiste em verificar o primeiro bit do número (bit 0), se for 0 é par, se for 1 é impar. A
verificação do bit pode ser feita no acumulador, exemplo: JB ACC.0, pula (aqui é testado o bit 0 do acumulador, se
for um (impar) o programa pula para o label “pula”, se for zero (par) o programa continua).

_________________ ; posicionar o programa na posição 0h da Flash


início: _________________ ; carrega a posição de memória 30h com o valor 45h
_________________ ; carrega a posição de memória 31h com o valor D8h
_________________ ; carrega a posição de memória 32h com o valor 66h
_________________ ; carrega a posição de memória 33h com o valor C9h
_________________ ; carrega a posição de memória 34h com o valor 56h
_________________ ; carrega a posição de memória 35h com o valor DAh
_________________ ; carrega a posição de memória 36h com o valor 00h
_________________ ; carrega a posição de memória 37h com o valor 99h
________________ ; inicializa o contador de no. Pares (38h) 0h
_________________ ; carrega R0 com a posição inicial de memória (30h)
________________ ; quant.de memória a ser verificada (R2)08h
volta: _________________ ; acumul. recebe conteúdo da memória apontada R0
_________________ ; Se acumulador é impar, salta para o rótulo “pula”
_________________ ; se for par incrementa o contador: memória (38h)
pula: ________________ ; decrementa a quantidade de memória verificada (R2)
_________________ ; busca a próxima memória (incrementa R0)
_________________ ; Compara (R2) com 0h p/ verificar se todas memórias
; foram verificadas. Se não, retorna ao label “volta”.
SJMP $ ; instrução para parar o processamento
_________________ ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 28


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

8) O programa seguinte é para fazer 2 sub-rotinas, uma para multiplicar (MULTI) e outra
para dividir (DIVISAO) dois números. Os números devem ser salvos antes da chamada da
sub-rotina para que não sejam perdidos.
Os resultados da multiplicação devem ser guardados em:
(R0) – valor mais significativo e
(R1) – valor menos significativo.
Os resultados da divisão devem ser guardados em: (R2) – quociente e
(R3) - resto
A divisão e multiplicação só podem ser efetuadas nos registros A e B, portanto
carregue (A)  40h e (B)  5h.
O push e pop são podem ser utilizados com o endereço, por isso no caso do
acumulador deve-se utilizar: PUSH ACC e POP ACC.

______________ ; posicionar o programa na posição 0h da Flash


início: ______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
MULTI: _______________; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
DIVISAO: ______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; _________________________________________
______________ ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 29


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

PORTAS PARALELAS
O 8051 possui 4 portas paralelas (P0, P1, P2 e P3) de 8 bits cada uma. Além
de poderem ser configuradas como pinos de entrada e/ou de saída, algumas portas
podem ser usadas para outras funções:

P0 – byte inferior de endereço e dados. Para acessar memória externa.


P2 – byte superior de endereço. Para acessar memória externa.
P3 – Bit 0 – RXD – entrada serial
Bit 1 – TXD – saída serial
Bit 2 – INTO – Interrupção externa 0
Bit 3 – INT1 – Interrupção externa 1
Bit 4 – T0 – entrada externa contador 0
Bit 5 – T1 – entrada externa contador 1
Bit 6 – WR – escrita memória externa de dados
Bit 7 – RD – leitura memória externa de dados

OPERAÇÕES DE ESCRITA E LEITURA NA PORTA


Escrita: basta escrever 0 ou 1 na porta. Exemplo;
MOV P1, #03h ; escrevendo nos 8 pinos da porta P1 o valor 0000 0011
SETB P1.6 ; escrevendo o valor “1” no bit 6 da porta P1
CLR P1.0 ; escrevendo o valor “0” no bit 0 da porta P1

Leitura: para configurar como leitura é só escrever o valor “1” nos bits de
interesse. Por default, quando se liga o microcontrolador, todas as portas
possuem o valor “1” nos seus bits.

** Se a porta for utilizada como leitura, não pode escrever “0” nela. ** Configuração
PORTA P1

CONFIGURAÇÃO PORTA P3

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 30


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

CONFIGURAÇÃO PORTA P2

CONFIGURAÇÃO DA PORTA P0

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 31


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

** Para a porta P0 é necessário resistores de Pull-up.**


Exemplo 1: Ler o pino 3 da porta P2, se for 1 escrever o conteúdo do acumulador
na porta P3, se for 0 não fazer nada. Deixar o programa em loop.

Fluxograma: Org 0h

Inicio Inicio:
JNB P2.3, salta ; se o pino=0 pula
MOV P3,A ; senão (P3)  (A)
S
P2.3 = 1
Salta:
SJMP Inicio ; volta para inicio
N
P3  A
END ; fim de programa

Exemplo 2: Utilizando a figura abaixo fazer um contador de 0 até FFh. A contagem


será incrementada cada vez que a chave Ch1 for pressionada. Se o contador for
igual a “1h” ligar motor, se for igual a “81h” desligar motor. Deixar o programa
em loop.

Definição: - Quando a chave Ch1 for pressionada o bit


P1.0 recebe o nível lógico “0” (vide figura).
- necessidade de uma variável para o contador.
Escolhendo o acumulador.
P3.2 = 1  Motor ligado

Inicio

Passos: (A)0h
- Ler o bit 0 da porta P1 (30h) 0H
- se for 0, incrementar contador
senão voltar a ler o pino da porta
- Contador igual a 01h? N
- se sim liga motor e volta ler a porta Ch1 = 0
senão continua 0001
- Contador igual a 81h? S
- se sim desliga motor e volta ler a porta AA+1
senão volta a ler o pino da porta
N
A=01h?
S
N
A=81h?
Liga motor P3.2=1
S

Liga motor P3.2=0

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 32


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

PROGRAMA:
Ch1 EQU P1.0 ; atribui o rótulo Ch1 ao pino P1.0.
motor EQU P3.2 ; atribui o rótulo motor ao pino P3.2

ORG 00h ; posiciona o programa na posição 00h da mem. Flash


Inicio:
MOV A, #00h ; inicializa o contador (acumulador) com 0.
Volta:
JB Ch1,Volta ; se a chave Ch1 estiver em “1”, não foi pressionada
; fica esperando a chave ser pressionada
JNB Ch1, $ ; espera a chave Ch1 ser solta
INC A ; Ch1 pressionada, incrementa contador (A)
CJNE A,#01h,pula ;se contador ≠ 01h, salta para verificar se é 81h
SETB motor ;se contador = 01h, liga motor
SJMP Volta ;retorna para ler o pino novamente
CJNE A,#81h,Volta ;se contador ≠ 81h, volta ler pino
CLR motor ; se contador = 81h, desliga motor
SJMP Volta ; retorna para ler o pino novamente

Conclusão: os comandos JB e JNB são úteis para verificar (LER) os estados dos pinos (bit) da
entrada.
JB P1.2, salta ; testando se o bit P1.2 = 1, se for vai para “salta”
...... ; senão continua o processamento na linha de baixo
JNB P2.5, salta ; testando se o bit P2.5 = 0, se for vai para “salta”
...... ; senão continua o processamento na linha de baixo

Para escrever nos pinos (bit) são utilizados os comandos: SETB e CLR
SETB P1.1 ; escrevendo “1” no bit P1.1 (setando)
CLR P3.5 ; escrevendo “0” no bit P3.5 (zerando)
END ; fim de programa.

Exemplo 3: Ler a porta P1 e verificar se P1 é igual a 03h, ou 76h, ou FEh. Se for


igual a um desses três valores, jogar na porta P2 o valor FFh, senão jogar em P2
o valor 00h. Deixar o programa em loop.

Org 0h ; posiciona o programa na


; posição 00h da mem. Flash
inicio: mov p2,#00h ; inicializa P2 com 00h
LER: mov a, p1 ; lê a porta P1
cjne a,#03h, T76 ; se a≠03h, testa com 76h
sjmp setar ; se a=03h, pula p/”setar” P2
T76: cjne a,#76h, TFE ; se a≠76h, testa com FEh
sjmp setar ; se a=76h setar porta P2
TFE: cjne a,#0feh, LMP ; limpar P2

setar; mov p2,#0ffh ; setando P2


sjmp LER ; volta ler P1
LMP: mov p2,#00h ; zerando P2
sjmp LER ; volta ler P1

END

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 33


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Conclusão: Comando MOV usado para ler ou escrever na porta toda:


Escrevendo na porta:
MOV P1, #0Fh
Lendo da porta:
MOV A, P3

Para comparar valor da porta: jogar valor no acumulador (ou Rn) e usar o comando CJNE
MOV A, P2
CJNE A,#00h, volta (enquanto conteúdo do A≠ 0h, pula para “volta” senão
continua)

Exercício 1) Dado o esquema abaixo, fazer um programa que mostre o valor em binário nos leds de quantas
vezes a chave Ch foi pressionada. Neste exercício, esperar a chave Ch ser solta para contar. Como há 4 leds a
contagem irá de 0 (0000b) até Fh (1111h).

OBS: Note que nesta configuração, o


acendimento do led é invertido, isto é:

Para ter todos leds apagados o valor na


porta tem que ser 0Fh,

Para acender todos os leds o valor na


porta tem que ser 00h

________ _____________ ; __________________________________________


________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 34


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 2) Dado o esquema abaixo, fazer um programa que acenda o led 0 e que leia a
chave Ch. Se a chave Ch estiver aberta (P3.1=1), o led aceso deve ficar rotacionando à
esquerda a cada 1 segundo. Se a chave Ch estiver fechada (P3.1=0), o led aceso deve ficar
rotacionando à direita a cada 1 segundo.

Para o atraso, faça uma rotina em loop. Calcule quantos ciclos de máquina devem ser
utilizados para obter o atraso de 1 segundo, considerando um clock de 12 MHz
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 35


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 3) Uma caixa d’água possui 2 sensores (A e B). Quando a água bate no sensor, ela
gera um nível lógico “1” caso contrário é gerado um nível lógico “0”. Deve-se ligar uma
bomba d’água (S = 1) para encher a caixa até o nível B quando, então, a bomba é desligada
(S=0). A bomba deve permanecer desligada até que não haja água no sensor A (A=0). A
figura seguinte mostra um sistema automático para realizar esta automação. Faça o programa
para o sistema.

________ _____________ ; __________________________________________


________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 36


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 4) Faça um programa utilizando o diagrama abaixo para mostrar no display de sete
segmento a conversão dos números binários que estão na porta P2:

Notar que os leds do display são acesos em nível lógico “0”. Por exemplo, para mostrar o
número 2, devem-se acender os leds “a, b, d, e, g”, portanto:

P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0


g f e d c b a
X 1 1 0 0 1 0 0

P1 = 64h ou B4h, caso P1.7 seja 0 ou 1


Faça o programa utilizando uma tabela (DPTR)

________ _____________ ; posiciona o programa na posição 00h da mem. Flash


________ _____________ ; inicializa o índice da tabela R1=0h (primeira posição)
________ _____________ ; carregue DPTR com o endereço inicial da tabela
________ _____________ ; mova o índice atual para o acumulador
________ _____________ ; busca o valor na tabela do endereço DPTR+Índice
________ _____________ ; mova o valor para a porta 1 p/mostrar no display
________ _____________ ; incremente o índice R1
________ _____________ ; enquanto não for o último valor, voltar p/ buscar
; novo valor
________ _____________ ; se for o último valor, zerar o índice R1 novamente
________ _____________ ; voltar para buscar novo valor
; Valores da tabela:
________ ________________________________________________________
________ ________________________________________________________
________ _____________ ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 37


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 5) Faça uma calculadora com 2 bytes (um da porta P1 e outro da porta P2).
Utilize a seguinte seleção de operação e os seguintes armazenamentos:

P0.0 =1 – soma (30h) – acumulador (31h) - carry


P0.1 =1 – subtração (30h) – acumulador (31h) – carry
P0.2 =1 – multiplicação (30h) – MSB (B) (31h) – LSB (A)
P0.3 =1 – divisão (30h) – quociente (A) (31h) – resto (B)

Dica: faça no início do programa um menu verificando esses bits de seleção. Se um dos bits
estiver em “1” saltar para a rotina adequada.
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 38


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 6) Um estacionamento possui 100 vagas e possui uma porta de entrada e uma porta
de saída. Fazer um programa para automatizar o estacionamento considerando o esquema
abaixo:

Considere:

Sensor A = 1  carro querendo entrar Sensor E = 1  carro querendo sair


Sensor B = 1  carro entrando Sensor F = 1 carro saindo
Fim de curso C = 1  porta aberta FC G = 1  porta aberta (saída)
Fim de curso D = 1  porta fechada FC H = 1  porta fechada (saída)

Motores M1A/M2A M1B/M2B Motor


0 0 motor travado
0 1 gira sentido anti-horário
1 0 gira sentido horário
1 1 motor livre

Funcionamento: se houver um carro querendo entrar (sensor A=1), o sistema deve abrir a porta de
entrada se:
- houver vagas disponíveis,
- ou caso não exista vaga, houver um carro querendo sair.
Para abrir a porta o motor deve ser acionado no sentido anti-horário e deve permanecer ligado até
atingir o fim de curso C, quando então deve ser desligado. Deve-se esperar o carro entrar verificando o
sensor B que deverá ir de 0 para 1 e novamente para 0, onde então o motor é ligado em sentido horário
até fechar a porta (FC D=1). A porta de saída tem funcionamento idêntico.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 39


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 7) Considere o esquema abaixo com um teclado simples. Faça um programa que
abre e fecha uma trava se for pressionada a seqüência das teclas; 1-7-2. Caso não seja
pressionada a seqüência certa, o programa deve acionar um buzzer. (OBS: espere sempre a
tecla ser solta para que a mesma não seja lida mais de uma vez). Estude o esquema, qual
valor deve ter na porta P1 para ler a tecla 5?

________ _____________ ; __________________________________________


________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 40


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 8) Considere o esquema abaixo com um teclado em matriz. Faça um programa que
abre e fecha uma trava se for pressionada a seqüência das teclas; 1-7-2. Caso não seja
pressionada a seqüência certa, o programa deve acionar um buzzer. (OBS: espere sempre a
tecla ser solta para que a mesma não seja lida mais de uma vez). Estude o esquema, por
exemplo, com se deve ler a tecla 5?

________ _____________ ; __________________________________________


________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 41


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

LCD
O LCD é um display de cristal líquido que possui dentro dele um
microcontrolador. Abaixo é mostrado a pinagem de um LCD:

Pinagem
Pino Descrição
1 Vss Terra (GND)
2 Vdd Vcc
3 V0 Tensão de ajuste de contraste
4 RS 1 – Dado 0 - Instrução
5 R/W 1 - Leitura 0 – Escrita
6 E Chip Select – habilita de 1 0
7 D0 DADOS: LSB
8 D1
9 D2
10 D3
11 D4
12 D5
13 D6
14 D7 MSB - dados

15 A Anodo para LED backlight


16 K Catodo para LEd backlight

Ligação para ajuste do contraste:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 42


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Escrevendo no LCD

LCD

Porta  Dado ou Instrução

Rotina
Habilitar Dados ou
Instrução

Rotina
Atraso

Dados  é o que você quer mostrar no display.


Instruções  não aparecem no display, servem para configurar o LCD.

Inicialização para sistemas com via de dados de 8 bits


- Fixação das condições de utilização: depende do lcd utilizado. Se tivermos um
lcd de 2 linhas 5x7 e 8 bits  código 38h
- Controle do display: define como o cursor é mostrado. Ex, código 0Eh  display
aceso com cursor fixo
- Modo de operação: modo como o cursor é deslocado. Ex: código 06h  escreve
deslocando o cursor à direita.
- limpeza do display: código 01h.

Característica do Módulo Seqüência de Instruções em hexadecimal


1 linha – Matriz 7 x 5 (8 x 5) 30 , ∆ , 30 , ∆ , 06 , ∆ , 0E , ∆ , 01
1 linha – Matriz 10 x 5 34 , ∆ , 34 , ∆ , 06 , ∆ , 0E , ∆ , 01
2 linhas – Matriz 7 x 5 (8 x 5) 38 , ∆ , 38 , ∆ , 06 , ∆ , 0E , ∆ , 01
∆ = atraso de tempo de aproximadamente 15 milisegundos.

Exemplo de uma sub-rotina só para configurar o display:


Supondo que a porta P1 contenha os dados (ou instrução) para o LCD e que a
porta P3 tenha o controle dos pinos 4 (RS), 5(R/W) e 6 (E):

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 43


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Instrução RS=0

Conf_display:

MOV P1,#38H ; display 2 linhas


LCALL habi_Inst ; habilita enviar instrução
MOV P1,#38H
LCALL habi_Inst ; habilita enviar instrução
MOV P1,#0EH ; display acesso com cursor fixo
LCALL habi_Inst ; habilita enviar instrução
MOV P1,#06H ; escreve deslocando à direita
LCALL habi_Inst ; habilita enviar instrução
MOV P1,#01H ; Limpa display
LCALL habi_Inst ; habilita enviar instrução

habi_Inst:

MOV P3,#02h ; criando borda


MOV P3,#00h ; de descida
LCALL ATRASO
RET

ATRASO:
MOV R1,#14h
VOLTA:
MOV R0,#0FAh
DJNZ RO, $
DJNZ R1, VOLTA
RET

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 44


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Tabela de Códigos e Formação dos Caracteres

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 45


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Esquema elétrico:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 46


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Fixação das condições de utilização Instrução


1 linha 5x7 (8 bits) 30H
2 linha 5x7 (8 bits) 38H
1 linha 5x10 (8 bits) 34H
1 linha 5x7 (4 bits) 20H
2 linha 5x7 (4 bits) 28H

Controle do display Instrução


Display acesso com cursor fixo OEH
Display acesso com cursor intermitente 0FH
Display acesso sem cursor 0CH
Display apagado 08H

Modo de operação Instrução


Escreve deslocando a mensagem para a esquerda (cursor fixo) O7H
Escreve deslocando a mensagem para a direita (cursor fixo) 05H
Escreve deslocando o cursor para a direita 06H
Escreve deslocando o cursor para a esquerda 04H

Comandos úteis Instrução


Limpa display e retorna cursor para o início O1H
Retorna o cursor para o início (sem alterar a DDRAM) 02H
Desloca somente o cursor para a direita 14H
Desloca somente o cursor para a esquerda 10H
Desloca o cursor + a mensagem para a direita 1CH
Desloca o cursor + a mensagem para a esquerda 18H
Desloca o cursor para a posição inicial da segunda linha C0H
Desloca o cursor para a posição inicial da primeira linha 80H

Resumo para utilizar o display: Fixação das condições de utilização (38h)


Fixação das condições de utilização (38h)
Controle do display (0Eh)
Modo de operação (06h)
- Configurar o display: limpeza do display (01h)
colocar a instrução na porta
habilitar dados (RS=0, R/W=0, E = 10) RS – Pino 4
rotina de atraso R/W – Pino 5
E – Pino 6
- Enviar dados:
colocar dados na porta
habilitar dados (RS=1, R/W=0, E = 10)
rotina de atraso

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 47


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

ROTINA COMENTADA:

Considerando a seguinte ligação, escreva uma mensagem no LCD.

ORG 0h ; posiciona o programa no endereço 0h da Flash

inicio: LCALL config_lcd ; chama rotina para configurar o LCD


LCALL config_lcd ; “ “ “ “ “ “
MOV R7, #0FFh ; inicializa o índice da tabela
MOV DPTR, #mensa ; carrega mensagem a ser escrita

volta: INC R7 ; pega o próximo índice da tabela


MOV A, R7 ; movimenta o índice para o Acc
MOVC A,@A+DPTR ; obtém o caractere referente ao índice carregado
MOV P1, A ; coloca o caractere a ser escrito na porta do LCD
LCALL habi_dado ; escreve no LCD (habilita escrita de dado)
CJNE A,#0FFh, volta ; se não chegou no fim da mensagem, volta
SJMP $ ; se chegou no fim, para o processamento

config_lcd: ; sub-rotina para configurar o LCD


MOV P1, #38h ; fixa condições iniciais
LCALL habi_inst ; habilita instrução
MOV P1, #38h ; fixa condições iniciais
LCALL habi_inst ; habilita instrução
MOV P1, #06h ; fixa controle do display
LCALL habi_inst ; habilita instrução
MOV P1, #0Fh ; fixa modo de operação
LCALL habi_inst ; habilita instrução
MOV P1, #01h ; limpa display
LCALL habi_inst ; habilita instrução
RET ; retorno da rotina de configuração do LCD

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 48


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

habi_inst: ; rotina para habilitar instrução


MOV P2, #02h ; coloca RS=0 (instrução) e E=1
MOV P2, #00h ; coloca RS=0 (instrução) e E=0 (borda descida)
LCALL atraso ; chamada da rotina de atraso
RET ; retorno da rotina de habilitar instrução

habi_dado: ; rotina para habilitar envio de dados


MOV P2, #03h ; coloca RS=1 (dado) e E=1
MOV P2, #01h ; coloca RS=1 (dado) e E=0 (borda descida)
LCALL atraso ; chamada da rotina de atraso
RET ; retorno da rotina de habilitar dados

atraso: ; rotina de atraso


MOV R1,#14h ; carrega R1
volta: MOV R0,#0FAh ; carrega R0
DJNZ RO, $ ; fica decrementando R0 enquanto for ≠ 0
DJNZ R1, volta ; se R0=0, decrementa R1 e volta
RET ; retorno da rotina de atraso

mensa: db ‘escreva aqui a sua mensagem’, 0FFh ; mensagem

END ; fim de programa

Exercício 1: Faça um programa que leia um teclado simples da porta P3 que


mostre no LCD as seguintes mensagens:

Se P3 = FFh  Funcionamento normal


Se P3.0 = 0  Pressão baixa de óleo
Se P3.1 = 0  Temperatura abaixo do normal
Se P3.2 = 0  Estado de emergência

Exercício 2: Utilizando um teclado de 16 teclas (0...9, A,B,C,D,E,F) faça um


programa que escreva no LCD qual foi a tecla pressionada.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 49


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

INTERRUPÇÕES
A família MCS51 possui cinco [default] tipos de fontes de interrupções:

Tipo Pino Endereço

- 2 externas Externa 0 INT0 P3.2 03h


Externa 1 INT1 P3.3 13h
- 2 timers Timer 0 T0 P3.4 0Bh
Timer 1 T1 P3.5 1Bh
- 1 serial RXD RI P3.0 23h
TXD TI P3.1 23h

INTERRUPÇÕES
As interrupções têm prioridades sobre a execução de um programa. Se houver
um pedido de interrupção à execução do programa é interrompida para atendimento
da interrupção. Assim que a interrupção for atendida, a execução do programa
continua de onde parou.
Uma das vantagens das interrupções é não ter que ficar verificando o estado
do pino de entrada.
Uma aplicação para interrupção é o botão de emergência de uma máquina
qualquer. Assim que o botão for acionado, a máquina deve ser colocada em estado
de segurança independente do estado do processo.

REGISTROS DE CONTROLE DAS INTERRUPÇÕES


Para controle das interrupções existem 3 registros: IE, IP e TCON.

IE (Interrupt Enable)  para habilitar as interrupções 1 – habilita


0 – desabilita
IE =
EA - - ES ET1 EX1 ET0 EX0
todas externa 0
serial timer/counter 0
timer/counter 1 externa 1

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 50


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
IP (Interrupt Priority)  define prioridades 1 – alta prioridade
0 – baixa prioridade

A prioridade das interrupções é EX0, ET0, EX1, ET1 e ES. Isto quer dizer se
por acaso elas acontecerem ao mesmo tempo, a primeira interrupção a ser atendida
será a externa 0, depois o timer 0 e assim por diante até a interrupção serial.
Através do registro IP, as prioridades podem ser alteradas.

default
IP =
- - - PS PT1 PX1 PT0 PX0
externa 0
serial timer/counter 0
timer/counter 1 externa 1

TCON (Timer CONtrol)  configuração da interrupção e do timer


Metade deste registro é usado para configurar o timer/couters e a outra
metade é usada para configurar as interrupções externas:

TIMERS/COUTERS INTERRUPÇÕES

TCON =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
overflow borda/nível
timer 1 externa 0
run/stop flag da interrupção
timer 1 externa 0
overflow borda/nível
timer 0 externa 1
run/stop flag da interrupção
timer 0 externa 1

TFx  flag de overflow TFx = 1  houve overflow do contador


TFx = 0  não houve overflow

TRx  liga/ desliga contador/temporizador TRx = 1  liga contador/temporizador


TRx = 0  desliga contador/tempor.

ITx  modo de operação da interrupção ITx = 1  atende na borda de descida


ITx = 0  atende no nível baixo

IEx  flag da interrupção IEx = 1  interrupção detectada


IEx =0  interrupção não foi detectada
O flag IEx é setado pelo hardware interno e também é apagado por hardware
caso o modo de operação esteja configurado para borda de descida. Caso seja
utilizado o modo de operação nível, o flag IEx deve ser apagado por software (CLR
IEx).

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 51


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 1) Programa os registros IE, IP e TCON para:


- interrupção externa 1 (INT1)  máxima prioridade, sensível a nível
- timer/counter 1  segunda prioridade
- externa 0 (INT0)  terceira prioridade, sensível a borda de descida
- serial e timer/counter 0  desabilitadas
Valor Hexa
EA
IE - - ES ET1 EX1 ET0 EX0 =

- - - PS PT1 PX1 PT0 PX0


IP =

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0


TCON =

MOV IE,
MOV IP,
MOV TCON,

Exercício 2) Programa os registros IE, IP e TCON para:


- serial  máxima prioridade
- timer/counter 0  segunda prioridade
- externa 1 (INT1)  terceira prioridade, sensível a nível
- demais interrupções desabilitadas

EA - - ES ET1 EX1 ET0 EX0


Valor Hexa
IE =

- - - PS PT1 PX1 PT0 PX0

IP =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0

TCON =

MOV IE,
MOV IP,
MOV TCON,

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 52


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 3) Utilizando o diagrama abaixo, faça um programa que mantenha 1 dos leds
aceso e cada vez que a chave ch for pressionada troque o led aceso.

Utilizar Interrupção.

-verificar o endereço da
da interrupção.
- no endereço da interrupção
dê um salto para a rotina
que irá tratar a interrupção
- no início do programa saltar
o endereço da interrupção
- fazer configurações iniciais e
configurar interrupção (IE e
TCON)
- fazer a troca do led aceso na
rotina de interrupção.

________ _____________ ; __________________________________________


________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 53


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 4) Faça um programa em assembler para controlar uma linha de produção. O


programa deve separar de um lote de 100 peças, as peças 4, 50 e 70 para inspeção.
Considere que um sensor infravermelho seja utilizado para contar as peças e que o mesmo
está conectado no bit 2 da porta P3 e que o bit 4 da porta P1 seja utilizado para acionar uma
solenóide que separe as peças para inspeção. Fazer o programa utilizando interrupção.

________ _____________ ; __________________________________________


________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 54


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 5) Um estacionamento possui 100 vagas e possui uma porta de entrada e uma porta
de saída. Fazer um programa para automatizar o estacionamento considerando o esquema
abaixo (utilize interrupções na porta de entrada e saída):

Considere:
Sensor A = 1  carro querendo entrar Sensor E = 1  carro querendo sair
Sensor B = 1  carro entrando Sensor F = 1 carro saindo
Fim de curso C = 1  porta aberta FC G = 1  porta aberta (saída)
Fim de curso D = 1  porta fechada FC H = 1  porta fechada (saída)

Motores M1A/M2A M1B/M2B Motor


0 0 motor travado
0 1 gira sentido anti-horário
1 0 gira sentido horário
1 1 motor livre

Funcionamento: se houver um carro querendo entrar (sensor A=1), o sistema deve abrir a porta
de entrada se:
- houver vagas disponíveis,
- ou caso não exista vaga, houver um carro querendo sair.
Para abrir a porta o motor deve ser acionado no sentido anti-horário e deve permanecer ligado
até atingir o fim de curso C, quando então deve ser desligado. Deve-se esperar o carro entrar
verificando o sensor B que deverá ir de 0 para 1 e novamente para 0, onde então o motor é
ligado em sentido horário até fechar a porta (FC D=1). A porta de saída tem funcionamento
idêntico.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 55


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 6) Uma máquina de cortar chapas de alumínio possui 2 sensores (A e B) para


indicar quando a chapa está em posição de corte. Quando os sensores de posição são
ativados, a máquina deve parar o motor de alimentação das chapas e acionar o motor
DC da lâmina para o corte da chapa. Um sensor C é utilizado para indicar que a chapa
foi cortada, devendo então o motor ser revertido para subir a lâmina de corte até acionar o
sensor D, após isso é acionado novamente o motor de alimentação das chapas. Caso somente
um dos sensores (A ou B) seja ativado, isto indica que a chapa é irregular ou não está bem
posicionada, devendo ser enviada para fora do sistema sem realizar o corte e deve também
soar um alarme.

O sistema deve possuir:


- 1 botão para iniciar o processo (start)
- 1 botão para término de serviço (stop). Quando pressionado para o processo após um ciclo
do processo.
- 1 botão de emergência. Quando pressionado para imediatamente o processo colocando a
máquina em segurança. O sistema neste caso deve ser reinicializado.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 56


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

TEMPORIZADORES E CONTADORES
Os 5 tipos de interrupções do 8051:

Tipo Pino Endereço

- 2 externas Externa 0 INT0 P3.2 03h


Externa 1 INT1 P3.3 13h

- 2 timers Timer 0 T0 P3.4 0Bh Interrupções do


Timer 1 T1 P3.5 1Bh timers/counters

- 1 serial RXD RI P3.0 23h


TXD TI P3.1 23h

Função: Contagem – o registro incrementa a cada transição de 10( ) no pino


Temporização – o registro incrementa a cada ciclo de máquina

Contador: o sinal deve permanecer pelo menos 1 ciclo de máquina em nível alto e
outro ciclo de máquina em nível baixo. Portanto, a freqüência máxima de resposta
do contador será de 1/24 da freqüência do clock.

REGISTROS DE CONTROLE DO TEMPORIZADOR


Para controle dos timers existem 3 registros: IE, TMOD e TCON.

IE (Interrupt Enable)  para habilitar as interrupções 1 – habilita


0 – desabilita
Já visto no módulo anterior:
IE =
EA - - ES ET1 EX1 ET0 EX0
todas externa 0
serial timer/counter 0
timer/counter 1 externa 1
TMOD (Timer Mode)  modo de operação dos timers

TIMER 1 TIMER 2

TMOD =
GATE C/T M1 M0 GATE C/T M1 M0

GATE (Porta de controle)


1  habilitado enquanto
TRx=1 e INTx=1
(software e hardware)
0  habilitado se TRx=1
(controle somente por software)
Modo de operação
C/T (seleciona modo) do timers/counters
1  modo contador (pino T0 e T1)
0  modo temporizador

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 57


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Modo de Operação dos timers/counters

M1 M0 REGISTROS
0 0 THi – 8 bits Contador de 13 bits
TLi – 5 bits Compatível com 8048
0 1 THi – 8 bits Contador de 16 bits
TLi – 8 bits
1 0 THi – recarga Contador de 8 bits com
TLi – 8 bits recarga
1 1 TH0 – 8 bits 2 contadores de 8 bits
TL0 – 8 bits
TH1 e TL1 - parado

TCON (Timer CONtrol)  configuração da interrupção e do timer

Metade deste registro é usado para configurar o timer/couters e a outra metade é usada para
configurar as interrupções externas:

TIMERS/COUTERS INTERRUPÇÕES

TCON =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
overflow borda/nível
timer 1 externa 0
run/stop flag da interrupção
timer 1 externa 0
overflow borda/nível
timer 0 externa 1
run/stop flag da interrupção
timer 0 externa 1

TFx  flag de overflow TFx = 1  houve overflow do contador


TFx = 0  não houve overflow

* TFx é apagado por hardware quando o processamento é desviado para a rotina de interrupção.
Caso não utilize a interrupção, TFx deve ser apagado por software (ex: CLR TF0, ou CLR TF1).

TRx  liga/ desliga contador/temporizador TRx = 1  liga contador/temporizador


TRx = 0  desliga contador/tempor.

ITx  modo de operação da interrupção ITx = 1  atende na borda de descida


ITx = 0  atende no nível baixo

IEx  flag da interrupção IEx = 1  interrupção detectada


IEx =0  interrupção não foi detectada

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 58


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

MODOS DE OPERAÇÃO

MODO 0: Para os dois contadores (timer 0 e timer 1)


Contador de 13 bits THi – 8 bits
TLi - 5 bits
Overflow ocorre em 1FFFh  0000h
aqui ativa TF1 ou TF0

MODO 1: Para os dois contadores (timer 0 e timer 1)


Contador de 16 bits THi – 8 bits
TLi - 8 bits
Overflow ocorre em FFFFh  0000h
aqui ativa TF1 ou TF0

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 59


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

MODO 2: Para os dois contadores (timer 0 e timer 1)


TLi – contador de 8 bits
THi – recarga de Tli quando ocorrer o overflow

MODO3: O timer 1 não é usado neste modo


TL0– contador de 8 bits (C/T, GATE 0, INT0 e TF0)
TH0 – contador de 8 bits (TR1 e TF1)

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 60


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

CÁLCULO DO VALOR A SER CARREGADO NO CONTADOR

O cálculo do valor a ser carregado no contador é dado por:

f clock f clok .Tdesejado


N= ou N=
12. f desejada 12

Os temporizadores/contadores contam de um valor carregado até o overflow, e não de zero


até o valor desejado. Portanto, para carregar os registradores THi e TLi deve-se subtrair do valor
máximo (que depende do modo utilizado) o valor calculado N.

Escolha do modo:

Modo 0 = 13 bits  213 = 8.192 contagens possíveis :::: THi, TLi = 8.192-N
Modo 1= 16 bits  216 = 65.536 contagens possíveis :::: THi, TLi = 65.536-N
Modo 2 = 8 bits  28 = 256 contagens possíveis :::: THi e TLi = 256-N
Modo 3 = 8 bits  28 = 256 contagens possíveis :::: TH0 e TL0 = 256-N

Comandos para:

Ligar temporizador/contador: SETB TR0 ou SETB TR1


Desligar temporizador/contador: CLR TR0 ou CLR TR1
Comandos quando não utiliza rotina de interrupção:
Esperar acabar um tempo programado: JNB TF0, $ ou JNB TF1, $
Apagar flags: CLR TF0 ou CLR TF1

Exercício 1) Utilizando um cristal de 12 MHz, programe:


- o timer 0 para 100 µs
- o timer 1 para 50 µs com auto-recarga
Para isso calcule o número de contagens (N) para os dois casos, escolha o
modo adequado e calcule o valor a ser carregado em THi e TLi.

Exercício 2) Utilizando um cristal de 12 MHz, programe:


- o timer 0 para 50 ms
- o timer 1 para 10 ms
Para isso calcule o número de contagens (N) para os dois casos, escolha o
modo adequado e calcule o valor a ser carregado em THi e TLi.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 61


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 3) Utilizando o esquema abaixo acender os leds alternadamente a uma taxa


de 100 Hz. Considere que o cristal utilizado seja de 12 MHz.

Cálculo de N:
12.10 6
N= = 10.000
12.100

esse valor cabe no modo 1 (até 65.536)

valor a ser carregado em TH e TL:

vi = 65.536 – 10.000 = 55.536

Escolhendo um dos dois timers: T0

Programando IE
EA - - ES ET1 EX1 ET0 EX0

Programando TMOD
GATE C/T M1 M0 GATE C/T M1 M0

________ ______________; atribui a recarga o valor de 55.536

________ ______________; posiciona o programa no endereço 00h da flash


________ ______________; salta para o inicio do programa
________ ______________; endereço do timer 0
________ ______________; salta para rotina de interrução do timer 0 (TIM0)

inicio: ______________; inicio programa, carrega TL com valor baixo de N


________ ______________; carrega TH com valor alto da contagem N
________ ______________; configura timer 0 no modo 1
________ ______________; configura a interrução IE
________ ______________; carrega acumulador com um led aceso (10110110)
________ ______________; acende o led na porta (move para P1 o acumulador)
________ ______________; seta o carry (uma vez que ele faz parte da rotação)
________ ______________; liga o temporizador
________ ______________; fica parado nesta linha esperando a interrupção

TIMO: ______________; Rotina TIM0, carrega TL com valor baixo de N


________ ______________; carrega TH com valor alto da contagem N
________ ______________; rotaciona o acumulador com o carry
________ ______________; move o valor do acumulador para a porta P1
________ ______________; retorna para o programa principal
________ ______________; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 62


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 4: Gerar uma onda quadrada nos pinos da porta P1 com uma freqüência
de 50 Hz, considerando a freqüência do cristal de 12 MHz.

12MHz
Cálculo de N: N= = 10.000 ∴modo 1 escolhido
12.100
Escolhendo o timer 0
Modo 1  valor inicial = 65536-10000 = 55536

TMOD = 01h
GATE C/T* M1 M0 GATE C/T* M1 M0
0 0 0 0 0 0 0 1

IE = 82h
EA - - ES ET1 EX1 ET0 EX0
1 0 0 0 0 0 1 0

Programa Sem Interrupção

$mod51

recarga equ 55536 ; valor de carga do timer

_________________ ; posiciona o progr. no endereço 00h da flash

inicio: _________________ ; configurando o modo 1 para o timer 0


_________________ ; inicializando o acumulador

volta: _________________ ; carregando os registradores ( TL0 )


_________________ ; do timer 0 ( TH0 )
_________________ ; fazendo a porta 1 receber o conteúdo do A
_________________ ; ligando o temporizador
_________________ ; esperando o tempo esgotar
_________________ ; desligando o temporizador
_________________ ; limpando o flag para novas temporizações
_________________ ; invertendo os bits do acumulador
_________________ ; voltando para o

end ; fim do programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 63


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 5: Fazer o mesmo exercício anterior utilizando interrupção.


12MHz
Cálculo de N: N= = 10.000 ∴modo 1 escolhido
12.100
Escolhendo o timer 0
Modo 1  valor inicial = 65536-10000 = 55536
TMOD = 01h
GATE C/T* M1 M0 GATE C/T* M1 M0
0 0 0 0 0 0 0 1

IE = 82h
EA - - ES ET1 EX1 ET0 EX0
1 0 0 0 0 0 1 0
Programa com Interrupção

$mod51
recarga equ 55536 ; valor de carga do timer

org 0h ; posiciona o progr. no endereço 00h da flash


___________________ ; salta para o inicio do programa
___________________ ; endereço da interrupção 0
___________________ ; salta para rotina de interrupção

inicio: ___________________ ; configurando o modo 1 para os 2 timers


___________________ ; habilita a interrupção do timer 0
___________________ ; carregando os registradores ( TL0 )
___________________ ; do timer 0 ( TH0 )
___________________ ; inicializo o acumulador com zero
___________________ ; desliga os bits da porta 1
___________________ ; ligando o temporizador
___________________ ; programa fica parado nesta linha esperando
; a interrupção
;**** ROTINA DE INTERRUPÇÃO *****************
tim0: ___________________ ; carregando os registradores
___________________ ; do timer 0
___________________ ; invertendo os bits do acumulador
___________________ ; acionando a porta com o conteúdo do Acc
___________________ ; retorna da interrupção
___________________ ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 64


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 6: Gerar a seguinte onda quadrada na porta P1, utilizando um cristal de


12 MHz:
40 µs Nível baixo
1 ms Nível alto
Utilize Interrupção.

TMOD = 01h
GATE C/T* M1 M0 GATE C/T* M1 M0

IE = 82h
EA - - ES ET1 EX1 ET0 EX0

_______ ______________; _________________________________________


_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________
_______ ______________; _________________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 65


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 7: Utilizando o esquema abaixo, faça um programa para controlar a velocidade do


motor DC através de um PWM. Considere o cristal de 12 MHz e o período do PWM de 25 ms.

25 ms

SA SB % nivel alto
0 0 0
0 1 20 %
1 0 50 %
1 1 80 %

PORTA SERIAL
Basicamente, existem três tipos de comunicação digital:
I) Modo Simplex  neste tipo de comunicação, um dispositivo apenas
transmite a informação e outro dispositivo apenas recebe.
II) Modo Half-Duplex  neste tipo de comunicação os dispositivos recebem e
transmitem os dados, mas essas operações não podem ocorrer
simultaneamente.
III) Modo Full-Duplex  neste modo os dispositivos podem receber e
transmitir os dados simultaneamente.

O microcontrolador da família MCS-51 operam no modo Full-Duplex.

REGISTROS DA INTERRUPÇÃO SERIAL

Para controle dos timers existem 3 registros: IE, SCON e PCON.

IE (Interrupt Enable)  para habilitar as interrupções 1 – habilita


0 – desabilita

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 66


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Já visto nos módulos anteriores:

IE =
EA - - ES ET1 EX1 ET0 EX0
todas externa 0
serial timer/counter 0
timer/counter 1 externa 1

PCON (Power CONtrol)  controle de potência

Apenas o bit 7 deste registro é utilizado na interrupção serial:

PCON =
SMOD - - - GF1 GF0 PD IDL
dobrador de ativa modo IDLE
Baud-rate modo Power Down
Bits de finalidade
geral

SMOD  quando em 1 dobra a baud rate. OBS: não é acessível o bit deste registro.
IDL  quando em 1, o oscilador continua a trabalhar apenas para três funções
(interrupções, timers e porta serial). Consumo de energia é de 85% do consumo
normal. Sai do IDL através de uma interrupção ou através do RESET.
POWER DOWN  quando em 1, o oscilador para de trabalhar. Consumo de energia é de
10µA. Único modo de sair do power down é através do RESET (neste caso mantém os
dados da RAM interna).

SCON (Serial CONtrol)  controle da serial

SCON = SM0 SM1 SM2 REN TB8 RB8 TI RI

Bit 0 do modo de operação


Bit 1 do modo de operação
Comunicação multi-processador

REN =1, habilita recepção serial

TB8  oitavo bit a ser transmitido nos modos 2 e 3


RB8  oitavo bit recebido nos modos 2 e 3

TI  flag de interrupção por transmissão (indica término da transmissão)


Setado no modo 0 no final do oitavo bit ou
Setado nos modos 1, 2 e 3 no começo do stop bit

RI  flag de interrupção por recepção (indica que há dados recebidos)


Setado no modo 0 no final do oitavo bit ou
Setado nos modos 1, 2 e 3 no começo do stop bit

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 67


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

OBS: TI e RI devem ser zerados por software (CLR TI, CLR RI)

Modos de Operação

Modo SM0 SM1 Descrição Baud-Rate


0 0 0 Registro de deslocamento, modo síncrono fCLOCK/12
1 0 1 UART de 8 bits (assíncrono) variável
(timer 1)
2 1 0 UART de 9 bits (assíncrono) fCLOCK/32 ou
fCLOCK/64
3 1 1 UART de 9 bits (assíncrono) variável
(timer 1)

MODO 0: (síncrono, 8 bits – registrador de deslocamento)

Baud-Rate  Fclock/12

Função dos pinos:


RXD (P3.0)  entrada e saída de dados
TXD (P3.1)  fornece o clock de deslocamento

Este modo pode ser utilizado para aumentar as portas de I/O ou quantidade de memória do
microcontrolador:

MODO 1: (assíncrono, 8 bits)

Baud-Rate  variável

Função dos pinos:


RXD (P3.0)  recebe dados
TXD (P3.1)  transmite dados

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 68


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Frame de bits no modo 0:

start 0 1 2 3 4 5 6 7 stop
Sempre 0 I N F O R M A Ç Ã O sempre 1
na transmissão na transmissão

Se SMOD=0, a cada 32 overflow do timer 1 envia um pulso


Se SMOD=1, a cada 16 overflow do timer 1 para o circuito serial

CÁLCULO DO VALOR A SER CARREGADO NO TIMER 1

f CLOCK
N=
192.BR.(1 + SMOD)
onde:
N – valor a ser programado no temporizador 1
BR – Baud Rate desejada

Exemplo 1: Calcule o valor a ser carregado no timer 1 para conseguir uma Baud-Rate de 9600 bauds
utilizando um cristal de 11,059 MHz e SMOD=0.

Cálculo de N:

11059000
N= = 2.999 ≈ 3 usando timer 1 no modo 2 (8 bits)
192.9600.(1 + 0)

valor inicial do temporizador:

vi = 256 – 3 = 253 (ou FDh)


MOV TL1, #0FDh ou MOV TL1,#253
MOV TH1, #0FDh ou MOV TH1,#253

O registro SBUF é responsável por enviar e receber os dados. O dado recebido é carregado
em SBUF se RI=0 e (SM2=0 ou stop bit=1)

MODO 2: (assíncrono, 9 bits)

Baud-Rate  Fclock/32 (SMOD=0) ou Fclock/64 (SMOD=1)

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 69


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Função dos pinos:

RXD (P3.0)  recebe dados


TXD (P3.1)  transmite dados

Frame de bits no modo 0:

start 0 1 2 3 4 5 6 7 TB8 stop


Sempre 0 I N F O R M A Ç Ã O sempre 1
na transmissão na transmissão

Trasmissão: bit 8 é copiado no TB8 (registro SCON)


Recepção: bit 8 é copiado em RB8 (registro SCON)

O dado recebido é carregado em SBUF se RI=0 e (SM2=0 ou stop bit=1)


MODO 3: (assíncrono, 9 bits)

Baud-Rate  variável

Função dos pinos:


RXD (P3.0)  recebe dados
TXD (P3.1)  transmite dados

Frame de bits no modo 0:

start 0 1 2 3 4 5 6 7 TB8 stop


Sempre 0 I N F O R M A Ç Ã O sempre 1
na transmissão na transmissão
Trasmissão: bit 8 é copiado no TB8 (registro SCON)
Recepção: bit 8 é copiado em RB8 (registro SCON)

O cálculo do valor a ser carregado no timer 1 é idêntico ao modo 1:


f CLOCK
N=
192.BR.(1 + SMOD)

Uso da serial (Endereço 23h):


- habilitar os devidos registros (IE, PCON e SCON)
- transmissão: escrever byte no registro SBUF
- recepção: habilitar o bit REN (=1) e RI=0 no registro SCON

Não esquecer de apagar RI e TI, quando a interrupção for atendida

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 70


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

COMUNICAÇÃO ENTRE VÁRIOS 8051

Os modos 2 e 3 permitem interligar vários 8051, sendo


um mestre e os outros escravos. Neste modo há:
- um start bit
- 8 bits de dados
- o nono bit que vai para o bit RB8 (na recepção), ou que
pode ser escolhido entre 0 ou 1 na transmissão escrevendo-se em
TB8.
- um stop bit

Se SM2 = 1 e RB8 =1, a interrupção da serial será


atendida.

Algoritmo de comunicação entre os 8051:

1) setar SM2 de todos os escravos


2) Mestre enviando dados: escrever 1 no seu bit TB8 e enviar serialmente o
endereço do escravo desejado. (Todos os escravos serão interrompidos, seus
RB8 estarão em 1, para verificar se é seu o endereço enviado).
3) O escravo selecionado zerará seu bit SM2 e ficará preparado para receber os
dados, os quais terão agora o nono bit RB8 em 0.
4) Os demais escravos permanecerão com SM2 em 1 e, dessa forma, não serão mais
interrompidos, pois os dados têm RB8=0.

OBS: O mestre envia o endereço desejado com o nono bit em 1 e os dados com o nono
bit em 0. Portanto, se o mestre quiser se comunicar com outro escravo basta
enviar o novo endereço com o nono bit em 1.

Exemplo 2: Comando para habilitar a recepção serial

SETB REN

- Verificando se a serial recebeu dados (sem usar interrupção):

LOOP: JNB RI,$ ; enquanto o flag RI não for para 1, não ocorreu
; interrupção, então fica aguardando
CLR RI ; limpa o flag RI para habilitar novas recepções
MOV A, SBUF ; transfere para acumulador o dado recebido

-Verificando se houve transmissão do dado:

MOV SBUF, A ; inicia a transmissão


LOOP: JNB TI, $ ; espera o término da transmissão (TI = 1)
CLR TI ; habilita novas transmissões

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 71


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

ERRO DA BAUD-RATE
Dependendo do cristal utilizado haverá erro entre a baud-rate desejada e a
baud-rate obtida. Como o transmissor e o receptor devem ser configurados com a
mesma baud-rate, este erro pode prejudicar a comunicação. O erro admitido em uma
comunicação serial é da ordem de 5%. A tabela abaixo mostra alguns erro obtidos
no modo 1 e 3 (baud-rate variável) e usando o timer 1 no modo 2 (auto-reload).

BR desejada BR obtida Erro Cristal SMOD Carga


1200 1200 0 0 E8h
2400 2400 0 0 F4h
11,059 MHz
9600 9600 0 0 FDh
19200 19200 0 1 FDh
1200 1202 0,16 % 0 E6h
2400 2404 0,16% 1 E6h
12 MHz
9600 8923 7 % 1 F9h
19200 20833 8,5 % 1 FDh

Cálculo do erro da baud-rate

Np − N
Erro = x100 (%)
Np

onde: Np – número da contagem programada


N – número de contagem:

f CLOCK
N=
192.BR.(1 + SMOD)

Exemplo: Qual o erro de uma comunicação serial realizada com o 8051 que utiliza uma baud-rate de
9600 bauds, SMOD=1 e com um cristal de 12 MHz.

f CLOCK 12 M
N= = = 6,51
192.BR.(1 + SMOD) 192.9600(1 + 0)

como não há contagem quebrada, temos que arredondar o valor acima  Np = 7.

Np − N 7 − 6,51
Erro = x100 = = 7%
Np 7

MAX232

O componente MAX232 realiza a conversão entre os níveis de tensão TTL (80C51) e a


RS232(PC). Portanto este integrado é necessário para realizar a comunicação serial entre o PC e o
80C51. Abaixo é mostrado este integrado, bem como a configuração dos conectores da porta serial:

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 72


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Conectores:

O microcontrolador se comunica com o PC através de algum software. Pode ser


um software de linguagem de programação (Delphi, CBuilder, C,..) ou através de um
hiperterminal. Um hiperterminal gratuito pode ser baixado em:
http://www.hilgrave.com.

ROTINAS COMENTADAS:

; Rotina para enviar dados para o terminal (sem usar interrupção). O programa irá
; enviar os caracteres de 0 até z para o terminal e ficará em loop.
; baud-rate utilizada de 2400 bauds com SMOD=1

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 73


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

$mod51
org 0h ; posiciona o programa no endereço 00h da flash

inicio: mov scon,#40h ; serial no modo 1 (8 bits, baud-rate variável)

mov a,pcon ; pcon possui o bit SMOD, para setar o bit:


setb acc.7 ; seta o bit sete de pcon
mov pcon,a ; atualiza o pcon

mov tmod,#20h ; habilita timer 1 no modo 2 (auto-reload)


mov th1,#0E6h ; carregando com 2400 bauds
mov tl1,#0E6h ; carregando com 2400 bauds
setb tr1 ; liga o temporizador

mov a,#'0' ; primeiro caractere a ser enviado


envia: mov sbuf,a ; começa a transmissão do caractere
jnb ti,$ ; espera o fim da transmissão
clr ti ; limpa o flag para novas transmissões
inc a ; incrementa o caractere
cjne a,#'z'+1,envia ; se não for o último caractere, volta para transmitir
mov a,#'0' ; se for o último caractere, reinicia o valor do caractere
sjmp envia ; volta na rotina para transmitir
end ; fim do programa

; Rotina para ler um caractere do terminal

; A próxima rotina ficará alterando o valor de um registrador e assim que chegar um


; dado na porta serial, o 8051 verificará se este dado é o caractere ‘A’ se for o dado
; será transmitido para o terminal, se não for o caractere ‘?’ será transmitido ao
; terminal

$mod51
org 0h ; posiciona o programa no endereço 00h da flash
sjmp inicio ; salta para o inicio do programa
org 23h ; endereço da interrupção serial
ljmp seri ; desvio para tratamento da interrupção serial

inicio: mov ie,#90h ; habilita interrupção serial


mov scon,#50h ; serial no modo 1 (8 bits, BR variável)
; REN = 1, habilita a recepção serial
mov a,pcon ; fazendo SMOD=1
setb acc.7 ; seta o bit sete de pcon
mov pcon,a ; atualiza o pcon

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 74


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

mov tmod,#20h ; habilita timer 1 no modo 2 (auto-reload)


mov th1,#0E6h ; configura com 2400 bauds
mov tl1,#0E6h ; configura com 2400 bauds
setb tr1 ; liga o temporizador

volta: mov r0,#'S' ; valores aleatórios carregados ...


mov r0,#'U' ; em R0 ...
mov r0,#'C' ; isso para mostrar que o programa pode...
mov r0,#'0' ; ser interrompido a qualquer momento ...
mov r0,#'4' ; logo que aparecer um dado na serial ...
sjmp volta ; retorna a carregar os valores em R0

seri: mov a,sbuf ; Rotina da serial. Le o que foi recebido


clr ri ; habilita nova recepção de dados
cjne a,#'A', erro ; se não for o caractere correto desvia para rotina ERRO

mov a,r0 ; dado correto, move valor de R0 para o acumulador


mov sbuf,a ; transmite o caractere de R0
jnb ti,$ ; espera o término da transmissão
clr ti ; reseta ti para a próxima transmissão
reti ; retorna da interrupção (dado certo)

erro: mov a,#3fh ; dado incorreto move ‘?’ para o acumulador


mov sbuf,a ; transmite o caractere ‘?’ para o terminal
jnb ti,$ ; espera o término da transmissão
clr ti ; reseta ti para a próxima transmissão
reti ; retorna da interrupção (dado errado)

end ; fim de programa

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 75


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 1) Faça uma rotina que escreva uma mensagem no terminal utilizado
uma tabela para isso. Baud-rate de 2400 bauds, com SMOD=1.
** Não é preciso utilizar interrupção.
** Configure SCON, TMOD e os valores de TH1 e TL1.
** No final da tabela coloque o valor 0FFh para indicar fim de mensagem. Ex:
mensa: db ‘Escreva uma mensagem.....’, 0FFh
** Quando chegar no valor FFh, pode-se terminar o programa, ou ficar escrevendo
a mensagem de novo.

_________ ________________ ; ______________________________________


_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________
_________ ________________ ; ______________________________________

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 76


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Exercício 2: Faça um programa que controle a velocidade de um torno (PWM)


através de um computador. O programa deve:
- esperar uma peça entrar em posição (sensor A – p1.0)
- se a peça entrar em posição enviar para o terminal a mensagem: “Entrar com o
código de velocidade”.
- o operador do terminal deve digitar o código para selecionar a velocidade do
PWM dado por:

código % nível alto % nível baixo


A 20 80
B 40 60
C 50 50
D 60 40
E 80 20
- Caso o operador digite qualquer código diferente, o microcontrolador deve
enviar a mensagem: “Código inválido” para o terminal e esperar um código válido
- Um sensor na máquina (sensor B – p1.1) indicará o fim da operação de
torneamento.
- O ciclo deverá se repetir

Exercício 3) Faça um programa para controlar um forno de microondas. O


aparelho deve ter as teclas de 0 a 9 (para o tempo em segundos), a tecla de ligar (o
tempo programado), a tecla + 1 minuto (quando desejar programar tempo
superiores a segundos) e a tecla parar/cancelar.
O motor e a lâmpada só devem ser ligados se a porta estiver fechada.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 77


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

Bibliografia

Gimenez, S. P. Microcontroladores 8051. Prentice Hall, 2002.

INTEL CORPORATION. MCS@51 Microcontroller Family User’s Manual.


Disponível em: http//WWW.intel.com/support/faq/microcontrollers/51_components.htm.
Acessado em: 10 de Janeiro de 2010.

__________. 8051 Microcontroller Instruction Set, 1995


Disponível em: http//WWW.intel.com/support/faq/microcontrollers/51_components.htm.
Acessado em: 10 de Janeiro de 2010.

________. MCS-51 Aplications Notes


Disponível em: http//WWW.intel.com/support/faq/microcontrollers/51_components.htm.
Acessado em: 10 de Janeiro de 2010.

Marcas Registradas

Todos os nomes registrados, marcas registradas ou direitos de uso citados nesta


apostila pertencem aos seus respectivos proprietários.

Sugestões de Leitura

Laboratório de Microcontroladores Família 8051 - Treino de Instruções, Hardware e Software


Denys E. C. Nicolosi

Microcontrolador 8051 - Detalhado


Denys Emílio Campion Nicolosi

Microcontrolador 8051 com linguagem C - Prático e Didático - Família AT89S8252 Atmel


Denys E. C. Nicolosi e Rodrigo B. Bronzeri

Programação Basic para Microcontroladores 8051 - Com Base na IDE BASCOM-8051 - Teoria e Prática
Fernando Simplicio de Sousa

Todos os livros indicados acima são da Editora Érica.

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 78


Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II

[Prof. Corradi – WWW.corradi.junior.nom.br] Página 79

Potrebbero piacerti anche