Microcontroladores Microcontroladores Família MCS51 Família

Propaganda
Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
Microcontroladores
Família MCS51®
MCS51®
Colégio Técnico de Campinas – COTUCA
Disciplina – TDM IIII- 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
MOV
MOV
MOV
MOV
A,
A,
A,
A,
A,
15h
0CH
06h
0Eh
2Eh
(A)
(A)
(A)
(A)
(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
acessados bit a bit
0F8h
0F0h
0E8h
0E0h
Endereço
Final
0FFh
0F7h
B
00000000
0EFh
0E7h
ACC
00000000
0D8h
0D0h PSW
0DFh
0D7h
0C8h
0C0h
0B8h IP
0CFh
0C7h
0BFh
0B0h P3
0B7h
0A8h
0AFh
00000000
XX000000
0A0h
98h
90h
88h
80h
11111111
IE
0X000000
P2
11111111
SCON
00000000
P1
11111111
TCON
00000000
PO
11111111
0A7h
SBUF
9Fh
XXXXXXXX
97h
TMOD
00000000
SP
00000111
TL0
TL1
TH0
TH1
00000000
00000000
00000000
00000000
DPL
DPH
PCON
00000000
00000000
0XXX0000
8Fh
87h
Endereço
Inicial
Pelo mapa, temos os endereços:
P0
P1
P2
P3
–
–
Porta
Porta
Porta
Porta
0,
1,
2,
3,
endereço
endereço
endereço
endereço
80h
90h
A0h
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
registradores, endereço D0h.
estado
e
os
bits
para
selecionar
o
banco
de
O PSW é mostrado abaixo:
Uso geral
Carry auxiliar
Carry
Seleção do Banco
Overflow
Paridade
CY
AC
F0
0
0
1
1
RS1
0
1
0
1
RS0 OV
banco 0
banco 1
banco 2
banco 3
-
P
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
0
MOV PSW,#10H
MOV R1, A
AC
0
F0
0
RS1
1
RS0
0
OV
0
0
P
0
; selecionando o banco 2
; 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á:
Tciclo _ de _ máquina = 12 *
1
1
= 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á:
Tcristal =
1
= 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:
Vr = Vcc * e
−t
RC
Aplicando ln em ambos os lados da equação
ln(Vr ) = ln(Vcc) + ln(e
−t
RC
)
Vcc = 5V
e
Vr = 3,5V
t
RC
t = RC (ln 5 − ln 3,5)
ln 3,5 = ln 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
registrador indicado. Ex:
valor
constante
é
diretamente
transferido
para
o
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
para a posição de memória 30h:
76h
_____________________________________
_
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
25
28
17
17
instruções
instruções
instruções
instruções
instruções
aritméticas
lógicas
de transferência de dados
booleanas
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
ADD A, Rn
ADD A,
direto
ADD A, @Ri
byte
s
1
2
CM
1
1
2
1
ADD A, #dado
C
CA
0V
descrição
X
(A)  (A) + (Rn)
(A)  (A) + (posição de
memória)
(A)  (A) + (conteúdo da
posição indicado por Ri)
(A)  (A) + valor do dado
1
1
X
X
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
s
1
2
CM
ADDC A, @Ri
1
1
ADDC A, #dado
2
1
ADDC A, Rn
ADDC A, direto
C
CA
0V
descrição
X
(A)  (A) + (Rn) + (C)
(A)

(A)
+
(pos.
de
memória) + (C)
(A)  (A) + (conteúdo da
posição indicado por Ri) +
(C)
(A)  (A) + (C) + valor do
dado
1
1
X
X
[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
s
1
2
CM
SUBB A, @Ri
1
1
SUBB A, #dado
2
1
SUBB A, Rn
SUBB A, direto
C
CA
0V
descrição
X
(A)  (A) - (Rn) - (C)
(A)

(A)
(pos.
de
memória) - (C)
(A)  (A) - (conteúdo da
posição indicado por Ri) (C)
(A)  (A) - (C) - valor do
dado
1
1
X
X
MULTIPLICAÇÃO E DIVISÃO
Na multiplicação e na divisão sempre são utilizados os registros A e B.
comando
Onde:
MUL AB
byte
s
1
CM
4
DIV AB
1
4
C
CA
0V
O
-
X
O
X
O
descrição
(A) 
(B) 
(A) 
(B) 
LSB[(A)*(B)]
MSB [(A)*(B)]
quociente [(A)*(B)]
resto [(A)*(B)]
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
MOV B, #02h
MUL AB
;
;
;
;
movendo o valor 80h para o acumulador
movendo o valor 2h para o registro B
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
CM
INC A
INC Rn
INC direto
byte
s
1
1
2
INC @Ri
1
1
1
1
1
C
-
CA
-
0V
descrição
-
(A)  (A) + 1
(Rn)  (Rn) + 1
(pos. memória) 
(pos.memória)+1
((Ri))  ((Ri)) + 1
DECREMENTO DE 8 BITS
É sempre decrementado de uma unidade o operando
comando
DEC A
DEC Rn
DEC direto
DEC @Ri
byte
s
1
1
2
CM
1
1
1
1
1
C
-
CA
-
0V
-
descrição
(A)  (A) - 1
(Rn)  (Rn) - 1
(pos.
memória)
(pos.memória)-1
((Ri))  ((Ri)) - 1

INCREMENTO DE 16 BITS
Existe apenas incremento de 16 bits, não existe decremento de 16 bits
comando
byte
s
1
INC DPTR
CM
C
CA
0V
2
-
-
-
descrição
(DPTR)  (DPTR) + 1
AJUSTE DECIMAL
Instrução para operação em BCD. Válido apenas após as instruções ADD ou
ADDC.
comando
DA A
byte
s
1
CM
1
C
CA
0V
descrição
X
X
-
Converte o conteúdo do
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
DA A
; soma o valor do acumulador com o valor de R1 + o carry,
; resultando em A = BEh, com AC = C = 0.
; 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:
resultado AND =
0101 1100
0111 0101
0101 0100
comando
ANL A, Rn
ANL A, direto
ANL A, @Ri
ANL A, # dado
ANL direto, A
ANL
direto,
#dado
byte
s
1
2
1
2
2
3
CM
1
1
1
1
1
2
C
CA
0V
-
-
-
-
-
-
descrição
(A)  (A) AND (Rn)
(A)  (A) AND (direto)
(A)  (A) AND ((Ri))
(A)  (A) AND dado
(direto)  (direto) AND (A)
(direto)

(direto)
AND
(dado)
OU LÓGICO (OR)
O resultado de uma operação OR será verdadeiro (1) se um dos dois operandos
for verdadeiro (1). Ex:
resultado OR =
0101 1100
0111 0101
0111 1101
comando
ORL A, Rn
ORL A, direto
ORL A, @Ri
ORL A, # dado
ORL direto, A
ORL
direto,
#dado
byte
s
1
2
1
2
2
3
CM
1
1
1
1
1
2
C
CA
0V
-
-
-
-
-
-
descrição
(A)  (A) OR (Rn)
(A)  (A) OR (direto)
(A)  (A) OR ((Ri))
(A)  (A) OR dado
(direto)  (direto) OR (A)
(direto)

(direto)
OR
(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:
resultado OR =
0101 1100
0111 0101
0010 1001
[Prof. Corradi – WWW.corradi.junior.nom.br]
Página 17
Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
comando
XRL A, Rn
XRL A, direto
XRL A, @Ri
XRL A, # dado
XRL direto, A
XRL
direto,
#dado
byte
s
1
2
1
2
2
3
CM
1
1
1
1
1
2
C
CA
0V
-
-
-
-
-
-
descrição
(A)  (A) XOR (Rn)
(A)  (A) XOR (direto)
(A)  (A) XOR ((Ri))
(A)  (A) XOR dado
(direto)  (direto) XOR (A)
(direto)

(direto)
XOR
(dado)
OPERAÇÕES LÓGICAS COM O ACUMULADOR
Algumas
acumulador;
lógicas
só
podem
bytes
1
1
CM
1
1
C
-
CA
-
0V
-
RL A
RLC A
1
1
1
1
X
-
-
RR A
RRC A
1
1
1
1
X
-
-
SWAP A
1
1
-
-
-
comando
CLR A
CPL A
operações
ser
realizadas
com
o
conteúdo
do
descrição
(A)  00h. Zera acumulador
Complementa
o
valor
do
acumulador
Roda o acumulador à esquerda
Roda o acumulador à esquerda com
carry
Roda o acumulador à direita
Roda o acumulador à direita com
carry
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
XCH A, Rn
XCH A, direto
XCH A, @Ri
byte
s
1
2
1
CM
C
CA
0V
descrição
1
1
1
-
-
-
(A)  (Rn) e
(Rn)  (A)
(A)(direto)e (direto) (A)
(A)((Ri) e ((Ri))  (A)
TRANSFERÊNCIA DE DADOS
As transferências de dados permitidas são mostradas na tabela abaixo:
comando
byte
s
1
2
1
2
CM
1
1
1
1
(A)
(A)
(A)
(A)
MOV Rn, A
MOV Rn, direto
MOV Rn, #dado
1
2
2
1
2
1
(Rn)  (A)
(Rn)  (direto)
(Rn)  dado
MOV direto, A
MOV direto, Rn
MOV
direto,
direto
MOV direto, @Ri
MOV direto, #dado
2
2
3
1
2
2
2
3
2
2
(direto)  ((Ri))
(direto)  dado
MOV @Ri, A
MOV @Ri, direto
MOV @Ri, #dado
1
2
2
2
2
1
((Ri)) (A)
((Ri))  (direto)
((Ri)) dado
MOV DPTR, #da16
3
2
Move p/ DPTR o dado de 16
bits
MOV
MOV
MOV
MOV
A,
A,
A,
A,
Rn
direto
@Ri
#dado
C
-
CA
-
0V
-
descrição




(Rn)
(direto)
((Ri))
dado
(direto)  (A)
(direto)  (Rn)
(direto)  (direto)
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
XCHD A, @Ri
byte
s
1
CM
C
CA
0V
1
-
-
-
CM
C
CA
0V
2
2
-
-
-
descrição
OPERAÇÕES COM A PILHA
comando
PUSH direto
POP
direto
byte
s
2
2
descrição
Armazena o conteúdo na pilha
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
MOVX
MOVX
MOVX
MOVX
A, @Ri
A, @DPTR
@Ri, A
@DPTR, A
byte
s
1
1
1
1
CM
C
CA
0V
2
2
2
2
-
-
-
descrição
Leitura
Leitura
Escrita
Escrita
da
da
em
em
memória externa
memória externa
memória
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
MOVC A, @A+DPTR
MOVC A, @A + PC
byte
s
1
1
CM
C
CA
0V
descrição
2
2
-
-
-
Leitura da memória externa
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
CLR
C
CLR
bit
SETB C
SETB
bit
CPL
C
CPL
bit
comando
CA
0V
descrição
1
1
1
1
1
1
0
1
X
-
-
Limpa o carry C=0
Limpa um bit
Seta o carry C=1
Seta um bit
Complementa o carry
Complementa o bit
C
1
1
X
2
2
1
1
2
2
1
2
2
2
label
2
2
bit, label
bit, label
bit, label
3
3
3
2
2
2
ANL
ORL
C, bit
C, bit
ORL
C, bit
MOV
MOV
C, bit
bit, C
JB
JNB
JBC
C
CM
C, bit
JNC
CM
byte
s
2
2
ANL
JC
byte
s
1
2
1
2
1
2
label
CA
0V
X
X
-
AND entre carry e bit
AND entre carry e o
complemento do bit
OR entre carry e bit
OR entre carry e o
complemento do bit
-
-
-
-
(C)  (bit)
(bit)  (C)
-
Salta para o label se
carry=1
Salta para o label se
carry=0
Salta para o label se bit =1
Salta para o label se bit=0
Salta para o label se bit=1
e após o salto faz o bit=0
X
X
-
descrição
-
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
ACALL adr11
LCALL adr16
byte
s
3
2
CM
C
2
2
-
C
A
-
0V
descrição
-
Chamada de subrotina a 2 kbyte
Chamada de subrotina a 64 kbyte
RETORNO SUBROTINAS E INTERRUPÇÕES
comando
RET
RETI
byte
s
1
1
CM
C
CA
0V
descrição
2
2
-
-
-
Retorno de subrotina
Retorno de uma interrupção
DESVIOS INCONDICIONAIS
comando
JMP
@A+DPTR
SJMP
relativo
AJMP adr11
LJMP adr16
byte
s
1
1
2
3
CM
C
CA
0V
2
2
2
2
-
-
-
[Prof. Corradi – WWW.corradi.junior.nom.br]
descrição
Desvio indireto para pos. mem.
Desvio curto - 256 bytes
Desvio absoluto até 2 kbytes
Desvio longo – 64 kbytes
Página 22
Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
DESVIOS CONDICIONAIS
comando
CM
C
CA
0V
JZ label
JNZ label
CJNE A, direto, label
byte
s
2
2
3
2
2
2
-
-
-
-
-
-
CJNE A, #dado, label
3
2
-
-
-
CJNE Rn,#dado, label
3
2
-
-
-
CJNE
label
3
2
-
-
-
C
CA
0V
-
-
-
-
-
-
@Ri,
#dado,
descrição
Salta para label
Salta para label
Salta
para
(A)≠(direto)
Salta
para
(A)≠dado
Salta
para
(Rn)≠dado
Salta
para
((Ri))≠dado
se (A)=0
se (A)≠0
label
se
label
se
label
se
label
se
LOOPS
comando
DJNZ Rn, label
DJNZ direto, label
byte
s
2
CM
2
2
2
descrição
Decrementa (Rn) e salta
para label se (Rn)≠0
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
NOP
byte
s
1
CM
C
CA
0V
1
-
-
-
[Prof. Corradi – WWW.corradi.junior.nom.br]
descrição
Não faz nada
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
motor EQU
; atribuição de valores. Ao invés de usar o bit P1.0, o
; mesmo será substituído pela palavra ch
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
JB ch, $
SETB motor
SJMP inicio
END
;aqui a palavra “inicio” é um label (um endereço de
;memória). Além disso o bit motor (p2.1) é zerado
;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.
;o bit motor é setado (p2.1=1)
;aqui a instrução sjmp é um salto para o endereço “inicio”
; o programa fica em loop.
; 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
Ou de uma sub-rotina
decisão (if)
entrada e
saída
de dados
[Prof. Corradi – WWW.corradi.junior.nom.br]
atribuição
processo
chamada de
sub-rotina
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:
1)
2)
3)
4)
Selecionar banco 2 (PSW=10H)
Mover F3h para R1
Somar Acc com R1
Mover para memória 34h o
resultado da soma (que fica no
acumulador)
Início
PSW=10h
selecionando
banco 2
R1=F3h
atribuindo F3h
a R1
AA+R1
somando acc com
R1
(34h)  A
armazenando na
pos.memória 34h
a soma
Fim
PROGRAMA EM ASSEMBLY
ORG 0h
inicio: MOV PSW, #10h
MOV R1, #0F3h
ADD A, R1
MOV 34h, A
END
; posiciona o programa na posição 00h da memória
; Flash
; seleciona o banco 2. Note o sustenido (#)
; 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
; soma os conteúdos do acumulador e de R1, o resultado
; é armazenado no acumulador
; 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.
; 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.
_________________
início: _________________
; posicionar o programa na posição 0h da Flash
; 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.
_________________
início: _________________
; posicionar o programa na posição 0h da Flash
; ____________________________________
________________
; ____________________________________
________________
; ____________________________________
________________
; ____________________________________
________________
; ____________________________________
________________
; ____________________________________
________________
; ____________________________________
________________
; ____________________________________
________________
; 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 OUEXCLUSIVO 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
_________________
; 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)
________________
; 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
volta:
pula:
; 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
MOV P1, #03h
SETB P1.6
CLR
P1.0
0
;
;
;
ou 1 na porta. Exemplo;
escrevendo nos 8 pinos da porta P1 o valor 0000 0011
escrevendo o valor “1” no bit 6 da porta P1
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
P2.3 = 1
N
JNB P2.3, salta ; se o pino=0 pula
MOV P3,A
; senão (P3)  (A)
S
Salta:
P3  A
SJMP Inicio
; volta para inicio
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
(A)0h
(30h) 0H
Passos:
- Ler o bit 0 da porta P1
- se for 0, incrementar contador
senão voltar a ler o pino da porta
- Contador igual a 01h?
- se sim liga motor e volta ler a porta
senão continua
- Contador igual a 81h?
- se sim desliga motor e volta ler a porta
senão volta a ler o pino da porta
Ch1 = 0
0001
S
AA+1
N
N
A=81h?
S
N
A=01h?
S
Liga motor P3.2=1
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
motor EQU P3.2
; atribui o rótulo Ch1 ao pino P1.0.
; atribui o rótulo motor ao pino P3.2
ORG 00h
Inicio:
MOV A, #00h
Volta:
JB Ch1,Volta
; posiciona o programa na posição 00h da mem. Flash
; inicializa o contador (acumulador) com 0.
;
;
JNB Ch1, $
;
INC A
;
CJNE A,#01h,pula
SETB motor
SJMP Volta
CJNE A,#81h,Volta
CLR
motor
SJMP Volta
se a chave Ch1 estiver em “1”, não foi pressionada
fica esperando a chave ser pressionada
espera a chave Ch1 ser solta
Ch1 pressionada, incrementa contador (A)
;se contador ≠ 01h, salta para verificar se é 81h
;se contador = 01h, liga motor
;retorna para ler o pino novamente
;se contador ≠ 81h, volta ler pino
; se contador = 81h, desliga motor
; 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
sjmp LER
LMP: mov p2,#00h
sjmp LER
; setando P2
; volta ler P1
; zerando P2
; 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
P0.1 =1 – subtração
P0.2 =1 – multiplicação
P0.3 =1 – divisão
(30h) – acumulador
(30h) – acumulador
(30h) – MSB (B)
(30h) – quociente (A)
(31h) - carry
(31h) – carry
(31h) – LSB (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
0
0
0
1
1
0
1
1
Motor
motor travado
gira sentido anti-horário
gira sentido horário
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
1 linha – Matriz 7 x 5 (8 x 5)
1 linha – Matriz 10 x 5
2 linhas – Matriz 7 x 5 (8 x 5)
Seqüência de Instruções em hexadecimal
30 , ∆ , 30 , ∆ , 06 , ∆ , 0E , ∆ , 01
34 , ∆ , 34 , ∆ , 06 , ∆ , 0E , ∆ , 01
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
LCALL habi_Inst
MOV P1,#38H
LCALL habi_Inst
MOV P1,#0EH
LCALL habi_Inst
MOV P1,#06H
LCALL habi_Inst
MOV P1,#01H
LCALL habi_Inst
; display 2 linhas
; habilita enviar instrução
; habilita enviar instrução
; display acesso com cursor fixo
; habilita enviar instrução
; escreve deslocando à direita
; habilita enviar instrução
; Limpa display
; habilita enviar instrução
habi_Inst:
MOV P3,#02h
MOV P3,#00h
LCALL ATRASO
RET
; criando borda
; de descida
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
1 linha 5x7 (8 bits)
2 linha 5x7 (8 bits)
1 linha 5x10 (8 bits)
1 linha 5x7 (4 bits)
2 linha 5x7 (4 bits)
Instrução
30H
38H
34H
20H
28H
Controle do display
Display acesso com cursor fixo
Display acesso com cursor intermitente
Display acesso sem cursor
Display apagado
Instrução
OEH
0FH
0CH
08H
Modo de operação
Escreve deslocando a mensagem para a esquerda (cursor fixo)
Escreve deslocando a mensagem para a direita (cursor fixo)
Escreve deslocando o cursor para a direita
Escreve deslocando o cursor para a esquerda
Instrução
O7H
05H
06H
04H
Comandos úteis
Limpa display e retorna cursor para o início
Retorna o cursor para o início (sem alterar a DDRAM)
Desloca somente o cursor para a direita
Desloca somente o cursor para a esquerda
Desloca o cursor + a mensagem para a direita
Desloca o cursor + a mensagem para a esquerda
Desloca o cursor para a posição inicial da segunda linha
Desloca o cursor para a posição inicial da primeira linha
Instrução
O1H
02H
14H
10H
1CH
18H
C0H
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)
limpeza do display (01h)
- Configurar o display:
colocar a instrução na porta
habilitar dados (RS=0, R/W=0, E = 10)
rotina de atraso
RS – Pino 4
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
LCALL config_lcd
MOV R7, #0FFh
MOV DPTR, #mensa
; chama rotina para configurar o LCD
; “
“
“
“
“ “
; inicializa o índice da tabela
; carrega mensagem a ser escrita
volta: INC R7
MOV A, R7
MOVC A,@A+DPTR
MOV P1, A
LCALL habi_dado
CJNE A,#0FFh, volta
SJMP $
; pega o próximo índice da tabela
; movimenta o índice para o Acc
; obtém o caractere referente ao índice carregado
; coloca o caractere a ser escrito na porta do LCD
; escreve no LCD (habilita escrita de dado)
; se não chegou no fim da mensagem, volta
; se chegou no fim, para o processamento
config_lcd:
MOV P1, #38h
LCALL habi_inst
MOV P1, #38h
LCALL habi_inst
MOV P1, #06h
LCALL habi_inst
MOV P1, #0Fh
LCALL habi_inst
MOV P1, #01h
LCALL habi_inst
RET
; sub-rotina para configurar o LCD
; fixa condições iniciais
; habilita instrução
; fixa condições iniciais
; habilita instrução
; fixa controle do display
; habilita instrução
; fixa modo de operação
; habilita instrução
; limpa display
; habilita instrução
; 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:
MOV P2, #02h
MOV P2, #00h
LCALL atraso
RET
; rotina para habilitar instrução
; coloca RS=0 (instrução) e E=1
; coloca RS=0 (instrução) e E=0 (borda descida)
; chamada da rotina de atraso
; retorno da rotina de habilitar instrução
habi_dado:
MOV P2, #03h
MOV P2, #01h
LCALL atraso
RET
; rotina para habilitar envio de dados
; coloca RS=1 (dado) e E=1
; coloca RS=1 (dado) e E=0 (borda descida)
; chamada da rotina de atraso
; retorno da rotina de habilitar dados
atraso:
; rotina de atraso
; carrega R1
; carrega R0
; fica decrementando R0 enquanto for ≠ 0
; se R0=0, decrementa R1 e volta
; retorno da rotina de atraso
MOV R1,#14h
volta: MOV R0,#0FAh
DJNZ RO, $
DJNZ R1, volta
RET
mensa: db ‘escreva aqui a sua mensagem’, 0FFh
END
; mensagem
; 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
Se P3.0 = 0
Se P3.1 = 0
Se P3.2 = 0
Funcionamento normal
Pressão baixa de óleo
Temperatura abaixo do normal
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
- 2 externas
- 2 timers
- 1 serial
Externa 0
Externa 1
Timer 0
Timer 1
RXD
TXD
INT0
INT1
T0
T1
RI
TI
Pino
Endereço
P3.2
P3.3
P3.4
P3.5
P3.0
P3.1
03h
13h
0Bh
1Bh
23h
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
IE =
EA -
-
1 – habilita
0 – desabilita
ES ET1 EX1 ET0 EX0
todas
serial
timer/counter 1
[Prof. Corradi – WWW.corradi.junior.nom.br]
externa 0
timer/counter 0
externa 1
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
timer/counter 0
externa 1
serial
timer/counter 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
TCON =
INTERRUPÇÕES
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
overflow
timer 1
run/stop
timer 1
overflow
timer 0
run/stop
timer 0
TFx flag de overflow
borda/nível
externa 0
flag da interrupção
externa 0
borda/nível
externa 1
flag da interrupção
externa 1
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
ES
ET1
EX1
ET0
EX0
EA
IE
=
-
IP
-
-
PS PT1 PX1 PT0 PX0
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 B = 1 carro entrando
Fim de curso C = 1 porta aberta
Fim de curso D = 1 porta fechada
Motores
0
0
1
1
M1A/M2A
0
1
0
1
Sensor E = 1 carro querendo sair
Sensor F = 1 carro saindo
FC G = 1 porta aberta (saída)
FC H = 1 porta fechada (saída)
M1B/M2B
Motor
motor travado
gira sentido anti-horário
gira sentido horário
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
- 2 externas
Externa 0
Externa 1
Pino
Endereço
INT0
INT1
P3.2
P3.3
03h
13h
- 2 timers
Timer 0
Timer 1
T0
T1
P3.4
P3.5
0Bh
1Bh
- 1 serial
RXD
TXD
RI
TI
P3.0
P3.1
23h
23h
Interrupções do
timers/counters
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
serial
timer/counter 1
externa 0
timer/counter 0
externa 1
TMOD (Timer Mode) modo de operação dos timers
TIMER 1
TMOD =
TIMER 2
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)
C/T (seleciona modo)
1 modo contador (pino T0 e T1)
0 modo temporizador
[Prof. Corradi – WWW.corradi.junior.nom.br]
Modo de operação
do timers/counters
Página 57
Colégio Técnico de Campinas – Cotuca – Disciplina - TDM II
Modo de Operação dos timers/counters
M1 M0
0 0
0
1
1
0
1
1
REGISTROS
THi – 8 bits
TLi – 5 bits
THi – 8 bits
TLi – 8 bits
THi – recarga
TLi – 8 bits
TH0 – 8 bits
TL0 – 8 bits
TH1 e TL1 - parado
Contador de 13 bits
Compatível com 8048
Contador de 16 bits
Contador de 8 bits com
recarga
2 contadores de 8 bits
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
TCON =
INTERRUPÇÕES
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
overflow
timer 1
run/stop
timer 1
overflow
timer 0
run/stop
timer 0
TFx flag de overflow
borda/nível
externa 0
flag da interrupção
externa 0
borda/nível
externa 1
flag da interrupção
externa 1
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:
N=
f clock
12. f desejada
ou
N=
f clok .Tdesejado
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
Desligar temporizador/contador:
CLR TR0
Comandos quando não utiliza rotina de interrupção:
Esperar acabar um tempo programado:
JNB TF0, $
Apagar flags:
CLR TF0
ou
ou
SETB TR1
CLR TR1
ou
ou
JNB TF1, $
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.
Cálculo de N:
N=
12MHz
= 10.000
12.100
∴modo 1 escolhido
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
1
-
0
0
ES
0
ET1 EX1 ET0 EX0
0
0
1
0
Programa Sem Interrupção
$mod51
recarga equ
55536
_________________
inicio: _________________
; valor de carga do timer
; posiciona o progr. no endereço 00h da flash
; 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.
Cálculo de N:
N=
12MHz
= 10.000
12.100
∴modo 1 escolhido
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
1
-
0
0
ES
0
ET1 EX1 ET0 EX0
0
0
1
0
Programa com Interrupção
$mod51
recarga equ
55536
org 0h
___________________
___________________
___________________
inicio: ___________________
; valor de carga do timer
; 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
; 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
0
0
1
1
SB % nivel alto
0
0
1
20 %
0
50 %
1
80 %
PORTA SERIAL
Basicamente, existem três tipos de comunicação digital:
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.
I)
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
[Prof. Corradi – WWW.corradi.junior.nom.br]
1 – habilita
0 – desabilita
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
serial
timer/counter 1
externa 0
timer/counter 0
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
Baud-rate
ativa modo IDLE
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
0
1
SM0
0
0
SM1
0
1
Descrição
Registro de deslocamento, modo síncrono
UART de 8 bits (assíncrono)
2
1
0
UART de 9 bits (assíncrono)
3
1
1
UART de 9 bits (assíncrono)
Baud-Rate
fCLOCK/12
variável
(timer 1)
fCLOCK/32 ou
fCLOCK/64
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
I N F O
Sempre 0
na transmissão
2
R
3
4
5
6
M A Ç Ã O
Se SMOD=0, a cada 32 overflow do timer 1
Se SMOD=1, a cada 16 overflow do timer 1
7
stop
sempre 1
na transmissão
envia um pulso
para o circuito serial
CÁLCULO DO VALOR A SER CARREGADO NO TIMER 1
N=
f CLOCK
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:
N=
11059000
= 2.999 ≈ 3
192.9600.(1 + 0)
usando timer 1 no modo 2 (8 bits)
valor inicial do temporizador:
vi = 256 – 3 = 253 (ou FDh)
MOV TL1, #0FDh ou
MOV TH1, #0FDh ou
MOV TL1,#253
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:
Sempre 0
na transmissão
start 0
I N
1
2
3
4
F O R M A
5
6
Ç Ã O
7
TB8 stop
sempre 1
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
I N
1
2
3
4
F O R M A
5
6
Ç Ã O
7
Sempre 0
na transmissão
Trasmissão: bit 8 é copiado no TB8 (registro SCON)
Recepção: bit 8 é copiado em RB8 (registro SCON)
TB8 stop
sempre 1
na transmissão
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,$
CLR RI
MOV A, SBUF
; enquanto o flag RI não for para 1, não ocorreu
; interrupção, então fica aguardando
; limpa o flag RI para habilitar novas recepções
; transfere para acumulador o dado recebido
-Verificando se houve transmissão do dado:
MOV SBUF, A
LOOP: JNB TI, $
CLR TI
; inicia a transmissão
; espera o término da transmissão (TI = 1)
; 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
1200
2400
9600
19200
1200
2400
9600
19200
BR obtida
1200
2400
9600
19200
1202
2404
8923
20833
Erro
0
0
0
0
0,16 %
0,16%
7 %
8,5 %
Cristal
11,059 MHz
12 MHz
SMOD
0
0
0
1
0
1
1
1
Carga
E8h
F4h
FDh
FDh
E6h
E6h
F9h
FDh
Cálculo do erro da baud-rate
Erro =
Np − N
x100
Np
(%)
onde: Np – número da contagem programada
N – número de contagem:
N=
f CLOCK
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.
N=
f CLOCK
192.BR.(1 + SMOD)
=
12 M
= 6,51
192.9600(1 + 0)
como não há contagem quebrada, temos que arredondar o valor acima Np = 7.
Erro =
Np − N
7 − 6,51
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
setb acc.7
mov pcon,a
; pcon possui o bit SMOD, para setar o bit:
; seta o bit sete de pcon
; atualiza o pcon
mov tmod,#20h
mov th1,#0E6h
mov tl1,#0E6h
setb tr1
; habilita timer 1 no modo 2 (auto-reload)
; carregando com 2400 bauds
; carregando com 2400 bauds
; liga o temporizador
mov a,#'0'
envia: mov sbuf,a
jnb ti,$
clr ti
inc a
cjne a,#'z'+1,envia
mov a,#'0'
sjmp envia
end
; primeiro caractere a ser enviado
; começa a transmissão do caractere
; espera o fim da transmissão
; limpa o flag para novas transmissões
; incrementa o caractere
; se não for o último caractere, volta para transmitir
; se for o último caractere, reinicia o valor do caractere
; volta na rotina para transmitir
; 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
sjmp inicio
org 23h
ljmp seri
inicio: mov ie,#90h
mov scon,#50h
mov a,pcon
setb acc.7
mov pcon,a
; posiciona o programa no endereço 00h da flash
; salta para o inicio do programa
; endereço da interrupção serial
; desvio para tratamento da interrupção serial
; habilita interrupção serial
; serial no modo 1 (8 bits, BR variável)
; REN = 1, habilita a recepção serial
; fazendo SMOD=1
; seta o bit sete de pcon
; 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
mov th1,#0E6h
mov tl1,#0E6h
setb tr1
; habilita timer 1 no modo 2 (auto-reload)
; configura com 2400 bauds
; configura com 2400 bauds
; liga o temporizador
volta: mov r0,#'S'
mov r0,#'U'
mov r0,#'C'
mov r0,#'0'
mov r0,#'4'
sjmp volta
; valores aleatórios carregados ...
; em R0 ...
; isso para mostrar que o programa pode...
; ser interrompido a qualquer momento ...
; logo que aparecer um dado na serial ...
; retorna a carregar os valores em R0
seri:
mov a,sbuf
clr ri
cjne a,#'A', erro
; Rotina da serial. Le o que foi recebido
; habilita nova recepção de dados
; se não for o caractere correto desvia para rotina ERRO
mov a,r0
mov sbuf,a
jnb ti,$
clr ti
reti
; dado correto, move valor de R0 para o acumulador
; transmite o caractere de R0
; espera o término da transmissão
; reseta ti para a próxima transmissão
; retorna da interrupção (dado certo)
mov a,#3fh
mov sbuf,a
jnb ti,$
clr ti
reti
; dado incorreto move ‘?’ para o acumulador
; transmite o caractere ‘?’ para o terminal
; espera o término da transmissão
; reseta ti para a próxima transmissão
; retorna da interrupção (dado errado)
end
; fim de programa
erro:
[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
Denys Emílio Campion Nicolosi
8051
-
Detalhado
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
Download