Documente Academic
Documente Profesional
Documente Cultură
MICROCONTROLADORES
Microcontrolador 8051
Prof. Corradi
www.corradi.junior.nom.br
Campinas, 2009
1
Arquitetura do 8051
2
Diagrama de Blocos do 8051
3
Diagrama de Blocos do 8051
Em termos de hardware, o diagrama de blocos mostra onde acaba o
microprocessador e quais as unidades adicionais presentes num
microcontrolador. Assim, enquanto o microprocessador é mais freqüentemente
usado no processamento de informações em computadores, onde são
complementados com os drivers e periféricos que compõem o sistema, um
microcontrolador é mais adequado para sistemas dedicados, tal como um
sistema de controle, onde deseja-se um sistema com um mínimo de
componentes periféricos e um programa gravado em ROM.
4
Diagrama de Blocos do 8051
RAM – As versões xx51 possuem memória de dados (RAM) de 128 bytes,
enquanto a capacidade de memória RAM das versões xx52 é de 256 bytes.
5
Diagrama de Blocos do 8051
Contadores/Temporizadores – O microcontrolador padrão da família 8051
possui dois contadores/temporizadores de 16 bits, que podem trabalhar em 4
(quadro) modos diferentes: modo de 13 bits, modo de 16 bits, modo único de 8
bits com recarga automática e modo duplo independente de 8 bits. O contador
é caracterizado por um clock externo, enquanto o temporizador usa o clock
interno do microcontrolador. Essa unidade trabalha de forma independente da
CPU e pode ser ativada tanto por software quanto por hardware.
Porta Serial – Há dois pinos para porta serial. O pino RxD é o pino de
recepção de dados na forma serial e o pino TxD é o pino de transmissão de
dados na forma serial.
6
Diagrama de Blocos do 8051
Portas Paralelas – As portas paralelas, num total de 4 (quatro), são
numeradas de P0 a P3 e são todas de 8 bits. A porta P3 tem dupla função:
além de servir como canal de entrada e saída de dados também pode ser
usada para a comunicação serial (P3.0 e P3.1), interrupções externas (P3.2 e
P3.3), canal de freqüência para a operação como contador (P3.4 e P3.5) e
canal de controle de gravação e leitura de memória externa (P3.6 e P3.7). A
porta P0 tem uma característica diferente das outras portas: ela é de coletor
aberto, o que significa que necessita de um resistor de pull-up e pode drenar
uma corrente maior que as demais.
7
Pinagem do 8051 de 40 pinos
8
Programação em Assembly do 8051
9
Fluxograma para o 8051
12
Label Mnemônico 8085 Label Mnemônico 8051
Programas LXI SP,20C0 h
MVI A,02 h
$MOD51
ORG 00H
para o OUT 20 h
MVI B,01h
LJMP INICIO
13
Memórias RAM e ROM do 8051
14
Memória ROM
15
Memória RAM
16
Memória RAM
A memória RAM, em qualquer versão, pode ser adicionada em 64 kbytes (0000 a
FFFFh), além dos 128 ou 256 bytes de memória interna.
17
Registradores do 8051
18
Parte Baixa
da RAM
32 registradores de 8 bits
19
32 MOV R0,#15H
Registradores
MOV R1,#25
com endereços
de 00H a 1FH
MOV 15H,R1
cada um com 7
MOV @R0,#20H
registradores
denominados
MOV R4,#0101b
R0 a R7
20
Memória RAM – Região endereçável por bit e por byte e
Região endereçável apenas por byte
MOV 20H,#35H
SETB 20.0H =
SETB 00H
CLR 18H =
CLR 23.0H
MOV 25H,#0FFH
21
Registradores Especiais do 8051
22
Registradores Especiais
23
Registradores Especiais
24
Registrador Especial PSW (Endereço: D0H)
(Program Status Word)
CY AC FD RS1 RS0 0V P
25
Registradores Especiais
Registrador Mnem End Bits individuais dos registradores
Latch Porta P0 P0 80H 87 86 85 84 83 82 81 80
Latch Porta P1 P1 90H 97 96 95 94 93 92 91 90
Latch Porta P2 P2 A0H A7 A6 A5 A4 A3 A2 A1 A0
Latch Porta P3 P3 B0H B7 B6 B5 B4 B3 B2 B1 B0
Acumulador A ACC E0H E7 E6 E5 E4 E3 E2 E1 E0
Registrador B B F0H F7 F6 F5 F4 F3 F2 F1 F0
Apontador de Pilha SP 81H
D7 D6 D5 D4 D3 D2 D1 D0
Registrador de Estado PSW D0H
CY AC F0 RS1 RS0 OV P
26
Registradores Especiais
Registrador Mnem End Bits individuais dos registradores
Apontador de Dados DPTR 82-83
LSB do DPTR DPL 82H
MSB do DPTR DPH 83H
27
Registradores Especiais
Controle de Prioridade de BF BE BD BC BB BA B9 B8
IP B8H
Interrupção PS PT1 PX1 PT0 PX0
28
Registradores Especiais - Observações
Apontador de Pilha (Stack Pointer): SP: 81h - Como valor “default”, SP aponta para
o endereço hexadecimal 07h da memória RAM interna. Ao contrário do
Microprocessador 8085, o endereço do apontador de pilha é incrementado a cada
endereço guardado na pilha e o byte menos significativo é guardado primeiro.
29
Registradores Especiais - Observações
Registradores dos Temporizadores/Contadores – TH e TL armazenam as partes
alta e baixa, respectivamente, da contagem dos temporizadores/contadores; TMOD
(89 h) define o modo de operação dos temporizadores/contadores e TCON (88 H)
controla o início e o fim de uma contagem.
Controle da Porta Serial: SCON (98 H) – Registrador que contém todos os bits que
definem o modo de operação e o controle da porta serial. SBUF (99 H) é o
registrador que armazena tanto os dados a serem transmitidos quanto os dados
recebidos via serial. Efetivamente há dois registradores de mesmo nome SBUF e
mesmo endereço (99 H), um responsável pela transmissão e outro pela recepção de
dados.
30
Circuitos de Reset e de Clock
31
Circuito de
Reset
Caso o Microcontrolador seja o 80C51, não é necessário o resistor de 8,2 kΩ, por já
existir um resistor interno.
32
Valores Iniciais após Reset
Registro Valor Registro Valor
PC 0000h TCON 00h
A 00h TH0 00h
B 00h TL0 00h
PSW 00h TH1 00h
SP 07h TL1 00h
DPTR 0000h SCON 00h
P0 - P3 FFh SBUF Indeterminado
IP xxx00000b PCON(NMOS) 0xxxxxxxb
TMOD 00h
33
Circuito de Clock
34
Ciclo de Clock e Ciclo de Máquina
Um ciclo de máquina corresponde a uma seqüência de 6 estados (S1 a S6), cada
um equivalente a 2 períodos do oscilador .
S1 S2 S3 S4 S5 S6
Ciclo de máquina
35
Ciclo de Clock e Ciclo de Máquina
Se o oscilador (cristal) for de 12 MHz, 1 ciclo de clock corresponde a:
1 1
Tclock = =
f clock 12 MHz
36
Circuito Mínimo
EA Nível lógico 1
Microcontrolador
busca instrução na
memória ROM
interna
37
Instruções do 8051
Instruções Gerais
Exemplos:
mov a,#25H carrega acumulador com valor 25H
mov a,#25 carrega acumulador com o decimal 25, que equivale ao
hexadecimal 19 H
mov a,#01011001b carrega acumulador com o binário que
corresponde a 59 H.
mov a,15H - Copia no acumulador o conteúdo do registrador
cujo endereço é 15h, ou seja, copia no acumulador o
conteúdo do registrador R5 do banco 2 de registradores.
39
Instruções Gerais
Exemplos:
mov a,R0 carrega acumulador com conteúdo do registrador R0
do banco 0.
40
Instruções Gerais
41
Instruções Gerais
Exemplo:
add a,R1 Se a = 07 H e R1 = 03 H, então, após a instrução, a = 0AH.
Exemplo:
subb a,#05H Se a = 07 H, então, após a instrução, a = 02 H.
42
Instruções Gerais
43
Instruções Gerais
swap a Faz a troca dos nibbles do acumulador, ou seja, o nibble mais significativo
passa a ocupar o quatro primeiros bits do acumulador e o nibble menos
significativo passa a ocupar os quatro últimos bits.
Por exemplo, se originalmente, A = 35 H, após a instrução, A = 53 H.
44
Instruções Gerais
45
Instruções Gerais
Exemplo:
anl a,#0FH se originalmente a = 35 H, após a instrução torna-se:
A = 05H.
Exemplo:
orl a,#20H se originalmente a = 07 H, após a instrução torna-se:
A = 27 H.
46
Instruções Gerais – Comparação, decisão e desvio
47
Instruções Gerais – Comparação, decisão e desvio
48
Instruções Gerais – Operações com Bit
jb bit,desvio Desvia para a posição “desvio”, caso o “bit” esteja setado.
jnb bit,desvio Desvia para “desvio”, caso o “bit” NÃO esteja setado.
49
Diretivas de Programação do 8051
e Programação em Assembly
50
Diretivas de Programação
org endereço Informa ao compilador o endereço onde deve ser
armazenada a próxima instrução.
Exemplo:
org 30 H
mov sp,#2Fh Esta instrução será armazenada na posição 30 H
da memória ROM.
51
Diretivas de Programação
variável bit ender. bit informa ao compilador que a “variável” é do tipo
bit e será armazenada no endereço dado por “ender.bit”.
Exemplo:
sentido bit 00H Esta diretiva diz ao compilador que a variável
“sentido” é do tipo bit e será armazenada no endereço
00H da região acima dos bancos de registradores.
O endereço do bit 00H corresponde ao primeiro endereço
dessa região, ou seja, posição 20.0H.
52
Programa que gera uma onda quadrada no pino 0 da porta P1:
53
Frequência da onda quadrada gerada no pino P1.0 para uma frequência
de clock de 12 MHz:
Instrução Ciclos por Tempo por Número de Tempo
instrução Instrução Execuções Total
por semiciclo
INICIO: CPL P1.0 1 1 µs 1 1 µs
MOV R0,#50 1 1 µs 1 1 µs
DJNZ R0,$ 2 2 µs 50 100 µs
SJMP INICIO 2 2 µs 1 2 µs
END 104 µs
54
Programa que faz a leitura de uma Tabela e envia valores para P2
Rótulo Mnemônico Rótulo Mnemônico
$mod51 continua: mov P2,a
org 00h pop acc
ljmp inicio inc a
sjmp volta
org 30h
Inicio: mov sp,#2Fh
mov dptr,#tabela tabela: db 0Ah
repete: mov a,#00h db 06H
volta: push acc db 05H
movc a, @a+dptr db 09H
cjne a,#0FFh,continua db 0FFH
pop acc end
sjmp repete
55
Programa que faz uma contagem hexadecimal crescente ininterrupta de 0 a FFH
Rótulo Mnemônico
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV A,#00H
VOLTA: MOV P1,A
INC A
SJMP VOLTA
END
56
Programa que faz uma contagem hexadecimal ininterrupta de 0 30H 0
RÓTULO MNEMÔNICO
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV A,#00H
VOLTA: MOV P1,A
INC A
CJNE A,#30H,VOLTA
VOLTA2: MOV P1,A
DJNZ ACC,VOLTA2
SJMP VOLTA
END
57
Programa que faz uma contagem decimal ininterrupta de 0 a 59
RÓTULO MNEMÔNICO
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
MOV A,#00H
VOLTA: MOV P1,A
ADD A,#01H
DA A
CJNE A,#60H,VOLTA
SJMP INICIO
END
58
Subrotina de atraso de tempo de 2 ms
59
Programa que faz uma contagem decimal decrescente de 59 a 0
RÓTULO MNEMÔNICO
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
MOV A,#60H
VOLTA: ADD A,#99H
DA A
MOV P1,A
CJNE A,#00H,VOLTA
SJMP INICIO
END
60
Rotação de bits do acumulador para a esquerda e para a direita
RÓTULO MNEMÔNICO
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
MOV A,#10000000B
VOLTA: RL A
MOV P0,A
LCALL ATRASO
CJNE A,#80H,VOLTA
VOLTA2: RR A
MOV P0,A
LCALL ATRASO
CJNE A,#01H,VOLTA2
SJMP VOLTA
END
78
Programa que lê os valores de uma
tabela e mostra na porta P1 o maior
desses valores.
79
RÓTULO MNEMÔNICO RÓTULO MNEMÔNICO
$MOD51 PULA2: POP ACC
ORG 00H INC A
LJMP INICIO SJMP VOLTA
81
Interrupções
82
Interrupções
Endereços de Desvio das Interrupções:
83
Interrupções
Registrador de Habilitação: IE (Interrupt Enable) = Registrador A8h
Bit 7 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
EA x x ES ET1 EX1 ET0 EX0
EA Enable All. Com EA = 1, todas as interrupções podem ser habilitadas
individualmente. Com EA = 0, ficam todas mascaradas.
ES Enable Serial. Com ES = 1, a interrupção pelo canal serial fica habilitada.
Com ES = 0 os pedidos de interrupção da serial são ignorados.
ET1 Enable Timer 1. Com ET1 = 1, as interrupções pedidas pelo Timer 1
são atendidas. Com ET1 = 0 elas são ignoradas.
EX1 Enable External Interrupt 1. Com EX1 = 1, as interrupções pedidas através
do pino P3.3 são atendidas. Com EX1 = 0 elas são ignoradas.
ET0 Enable Timer 0. Com ET0 = 1, as interrupções pedidas pelo Timer 0
são atendidas. Com ET0 = 0 elas são ignoradas.
EX0 Enable External Interrupt 0. Com EX0 = 1, as interrupções pedidas através
pino P3.2 são atendidas. Com EX0 = 0 elas são ignoradas.
84
Interrupções
Exemplo 1:
IE = 1 0 0 0 0 0 0 1
MOV IE,#81H
85
Interrupções
Exemplo 2:
IE = 1 0 0 0 0 1 0 1
MOV IE,#85H
86
Interrupções
Registrador de Controle: TCON (Timer Control) = Registrador 88h
TCON = TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
IE1 Interrupt 1 Edge Flag - É setado pelo hardware quando uma interrupção
externa através de INT1\ é detectada. É zerada quando da execução da
instrução RETI (retorno da subrotina de atendimento).
IT1 (Interrupt 1 Type) - Quando IT1 = 1 a interrupção externa 1 será reconhecida
pela transição de 1 para 0 no pino P3.3. Quando IT1 = 0, a interrupção é
reconhecida quando o sinal no pino P3.3 está em nível baixo (0).
IE0 (Interrupt 0 Edge Flag) - É setado pelo hardware quando uma interrupção
externa através de INT0\ é detectada. É zerada quando da execução da
instrução RETI (retorno da subrotina de atendimento).
IT0 (Interrupt 0 Type) - Quando IT0 = 1 a interrupção externa 0 será reconhecida
pela transição de 1 para 0 no pino INTO\. Quando IT0 = 0, a interrupção é
reconhecida quando o sinal no pino INTO\ está em nível baixo (0).
87
Interrupções
TCON = 0 0 0 0 0 0 0 1
MOV IE,#81H
MOV TCON,#01H
88
Interrupções
TCON = 0 0 0 0 0 0 0 1
MOV IE,#81H
MOV TCON,#01H
89
Interrupções
Registrador de Prioridade: IP (Interrupt Priority) = Registrador B8h
90
Interrupções
Uma interrupção ter prioridade alta (Prioridade 1) significa que ela será
atendida sempre que solicitada, mesmo quando o programa está
executando uma outra interrupção. No caso de todos os canais de
interrupção terem prioridade 0 ou 1, a escala de prioridade é como segue:
Interrupção Prioridade
Externa 0 Maior
Temporizador 0
Externa 1
Temporizador 1
Serial Menor
91
Interrupções
IP = 0 0 0 0 0 0 0 1
MOV IE,#85H
MOV TCON,#01H
MOV IP,#01H
92
Programa que envia uma contagem crescente para a porta P1 a cada solicitação da
interrupção INT0, através do pino P3.2.
ORG 30H
ATRASO: MOV R0,#10
INICIO: MOV SP, #2FH
REPETE: MOV R1,#100
MOV IE, #81H
DJNZ R1, $
MOV TCON, #01H DJNZ R0, REPETE
MOV A, #00H RET
CJNE A,#01H, $ FIM: NOP
SJMP FIM END
93
Programa que envia uma contagem crescente para a porta P1 a cada solicitação da
interrupção INT0 e uma decrescente a cada solicitação da INT1.
RÓTULO MNEMÔNICO RÓTULO MNEMÔNICO RÓTULO MNEMÔNICO
$MOD51 ATENDE0: PUSH ACC ATENDE1: PUSH ACC
94
Programa que faz o deslocamento à esquerda dos bits da porta P1 a cada
solicitação da interrupção INT0 e deslocamento à direita a cada solicitação da INT1.
RÓTULO MNEMÔNICO RÓTULO MNEMÔNICO RÓTULO MNEMÔNICO
$MOD51 ATENDE0: PUSH ACC ATENDE1: PUSH ACC
ORG 00H MOV A,#01H MOV A,#80H
LJMP INICIO VOLTA: MOV P1,A VOLTA2: MOV P1,A
ORG 03H LCALL ATRASO LCALL ATRASO
LJMP ATENDE0 RL A RR A
ORG 13H CJNE A,#01H,VOLTA CJNE A,#80H,VOLTA2
LJMP ATENDE1 POP ACC POP ACC
ORG 30H RETI RETI
INICIO: MOV SP, #2FH
MOV IE, #85H ATRASO: MOV R0,#10
MOV TCON, #05H REPETE: MOV R1,#100
MOV A, #00H DJNZ R1, $
SJMP $ DJNZ R0, REPETE
RET
END
95
Temporizadores/Contadores
Microcontrolador 8051
96
Temporizadores
97
Temporizadores
98
Temporizadores
99
Temporizadores
100
Temporizadores
101
Temporizadores
102
Temporizadores
TMOD = 0 0 0 0 0 0 0 1
Instrução Descrição
Seta o Temporizador 0 no modo 1 e o
MOV TMOD,#01H
Temporizador 1 no modo 0.
103
Temporizadores
Instrução Descrição
Seta o Temporizador 0 no modo 1. Conta até FFFF H
MOV TMOD,#01H
(65535).
MOV TH0,#20H
Setam início da contagem para 2050H. A partir da
MOV TL0,#50H segunda contagem começa em 0000H.
104
Temporizadores
Instrução Descrição
Seta o Temporizador 1 no modo 2, com recarga
MOV TMOD,#20H
automática.
105
Temporizadores
Instrução Descrição
Seta o Temporizador 0 no modo 1, contagem até
MOV TMOD,#01H
65535.
106
Temporizadores
Instrução Descrição
Seta o Temporizador 0 no modo 1, contagem até
MOV TMOD,#01H
65535.
Habilita as interrupções do Temporizador 0 e a
MOV IE,#83H
Externa 0.
MOV TCON,#01H Seta INT0 por transição
107
Programa com uma subrotina de atraso de tempo com temporizador
FIM: NOP
END
108
RÓTULO MNEMÔNICO
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
Temporizador no modo de INICIO: MOV SP, #2FH
recarga automática MOV TMOD,#20H
MOV TH1,#00H
Uso de interrupção do MOV TL1,TH1
temporizador SETB TR1
SJMP $
END
109
Exemplos com Interrupções
e Temporizadores do 8051
110
Acionamento de Lâmpada
Relé:
Bobina: 12 V
Contatos: 220 V / 1 A
Transistor BJT: BC548C
111
Acionamento de uma Lâmpada Incandescente
Rótulo Mnemônico Rótulo Mnemônico
112
Sensor de Presença
113
Acionamento de uma Lâmpada Incandescente – v2
A lâmpada é acionada através de um sensor de presença
Rótulo Mnemônico Rótulo Mnemônico
$MOD51 CPL LAMPADA
SENSOR EQU P3.0 JNB SENSOR,$
LAMPADA EQU P2.7 LCALL ATRASO
SJMP VOLTA
ORG 00H
LJMP INICIO ATRASO: MOV R5,#200
REP: MOV R6,#200
LCALL ATRASO
END
114
Acionamento de Motor de Passo
115
Acionamento de Motor de Passo
116
Acionamento de Motor de Passo
Rótulo Mnemônico Rótulo Mnemônico
$MOD51 MOV DPTR,#DIRETO
SENTIDO BIT 00H SJMP FRENTE
SENSOR1 EQU P3.0
SENSOR2 EQU P3.1 INVERSO: MOV DPTR,#REVERSO
ORG 00H FRENTE: PUSH ACC
LJMP INICIO MOVC A,@A+DPRT
ORG 30H CJNE A,#0FFH,PULA
INICIO: MOV SP,#2FH POP ACC
CLR SENTIDO SJMP COMECO
COMECO: MOV A,#00H
DECIDE: JB SENSOR1,OUTRO PULA: MOV P2,A
CLR SENTIDO LCALL ATRASO
OUTRO: JB SENSOR2,VAI POP ACC
SETB SENTIDO INC A
VAI: JB SENTIDO,INVERSO SJMP DECIDE
117
Acionamento de Motor de Passo
Rótulo Mnemônico Rótulo Mnemônico
REVERSO: DB 09H
DB 05H
DB 06H
DB 0AH
DB 0FFH
RET
END
118
Acionamento de Motor de Passo – Sensores de Extremidade
Rótulo Mnemônico Rótulo Mnemônico
$MOD51 VAI: JB SENTIDO,INVERSO
SENTIDO BIT 00H MOV DPTR,#DIRETO
SENSOR1 EQU P2.7 SJMP FRENTE
SENSOR2 EQU P2.6
ORG 00H INVERSO: MOV DPTR,#REVERSO
LJMP INICIO FRENTE: PUSH ACC
MOVC A,@A+DPRT
ORG 30H CJNE A,#0FFH,PULA
INICIO: MOV SP,#2FH POP ACC
CLR SENTIDO SJMP COMECO
COMECO: MOV A,#00H PULA: MOV P2,A
DECIDE: JNB SENSOR1,OUTRO LCALL ATRASO
CLR SENTIDO POP ACC
OUTRO: JNB SENSOR2,VAI INC A
SETB SENTIDO SJMP DECIDE
119
Acionamento de Motor de Passo – Sensores de Extremidade
Rótulo Mnemônico Rótulo Mnemônico
REVERSO: DB 09H
DB 05H
DB 06H
DB 0AH
DB 0FFH
RET
END
120
Acionamento de Motor de Passo – Com Interrupção
Rótulo Mnemônico Rótulo Mnemônico
$MOD51 DECIDE: JB SENTIDO,INVERSO
SENTIDO BIT 00H MOV DPTR,#DIRETO
ORG 00H SJMP FRENTE
LJMP INICIO INVERSO: MOV DPTR,#REVERSO
ORG 13H FRENTE: PUSH ACC
CPL SENTIDO MOVC A,@A+DPRT
RETI CJNE A,#0FFH,PULA
POP ACC
ORG 30H SJMP COMECO
INICIO: MOV SP,#2FH PULA: MOV P0,A
MOV IE,#84H LCALL ATRASO
MOV TCON,#04H POP ACC
CLR SENTIDO INC A
COMECO: MOV A,#00H SJMP DECIDE
121
Acionamento de Motor de Passo – Com Interrupção
Rótulo Mnemônico Rótulo Mnemônico
REVERSO: DB 09H
DB 05H
DB 06H
DB 0AH
DB 0FFH
RET
END
122
Acionamento de Motor de Corrente Contínua
12 V
123
Acionamento de Motor de Corrente Contínua – Ponte H
Driver para acionamento nos
dois sentidos de rotação
Chaves A e B fechadas
sentido direto
Chaves C e D fechadas
sentido reverso
124
Acionamento de Motor de Corrente Contínua
Ponte H – L298N
125
Acionamento de Motor de Corrente Contínua
Variação de Velocidade
T
VMAX V max
Va
127
Acionamento de Motor de Corrente Contínua
Variação de Velocidade
2. Para o período desligado faz-se TL = TON; dessa forma, o temporizador conta
de TON até 255, o que corresponde ao período desligado.
3. No início do programa desliga-se o motor (CLR P2.0 e CLR P2.1) e faz-se TL
= TON = 09H, o que faz com que o temporizador, na primeira contagem já
conte o período desligado, que começa em TON e vai até 255.
4. Após fazer TL = TON, encontra-se o complementar de TON (CPL A), ou seja,
TOFF, e carrega-se em TH. Dessa forma, a próxima contagem começará em
TOFF, o que significa que o temporizador contará o período ligado.
5. Cada vez que a subrotina de controle é executada define-se o próximo valor
de recarga, TH.
6. Para aumentar a velocidade aumenta-se o período ligado TON. Para diminuir
a velocidade, aumenta-se TOFF.
128
Programa para Acionamento de Motor de Corrente Contínua
Rótulo Mnemônico Rótulo Mnemônico
$MOD51 ORG 30H
INICIO: MOV SP,#2FH
TON EQU 03H MOV TMOD,#02H
TOFF EQU 04H MOV IE,#86H
LIGADO BIT 00H MOV TCON,#04H
MOV IP,#02H
ORG 00H CLR P2.0
LJMP INICIO CLR P2.1
CLR LIGADO
ORG 0BH MOV TON,#0FH
LJMP PWM MOV TL0,TON
MOV A,TON
ORG 13H CLR A
LJMP TECLADO MOV TH0,A
MOV T0FF,A
SJMP $
129
Programa para Acionamento de Motor de Corrente Contínua
Rótulo Mnemônico Rótulo Mnemônico
PWM: JB LIGADO,DESLIGA ANL A,#0FH
SETB P2.0 CJNE A,#01H,VERIF8
SETB LIGADO SJMP AUMENTA
MOV TH0,TON
RETI VERIF8: CJNE A,#09H,VERIF5
SJMP DIMINUI
DESLIGA: CLR P2.0
CLR LIGADO VERIF5: CJNE A,#05H,VOLTA
MOV TH0,TOFF SJMP PARA
RETI
VOLTA: SETB EX1
TECLADO: SETB TR0 RETI
CLR EX1
MOV A,P3
SWAP A
Programa para Acionamento de Motor de Corrente Contínua
Rótulo Mnemônico Rótulo Mnemônico
AUMENTA: MOV A,TON MOV B,A
ADD A,#08H SUBB A,#0F0H
MOV B,A JC PULA2
SUBB A,#0F0H MOV B,#0F0H
JC PULA PULA2: MOV A,B
MOV B,#0F0H MOV TOFF,A
PULA: MOV A,B CPL A
MOV TON,A MOV TON,A
CPL A SETB EX1
MOV T0FF,A RETI
SETB EX1
RETI
131
Programa para Acionamento de Motor de Corrente Contínua
Rótulo Mnemônico
PARA: CLR P2.0
CLR P2.1
CLR TR0
CLR LIGADO
MOV TON,#0FH
MOV TL0,TON
CPL A
Tecla 2 aumenta a velocidade
MOV TH0,A
MOV TOFF,A Tecla 8 diminui a velocidade
SETB EX1 Tecla 5 pára o motor
RETI
Obs.:
132
Comunicação Serial do 8051
133
Princípios da Comunicação Serial
Equipamento 8051
134
Comunicação Serial Síncrona
135
Comunicação Serial Assíncrona
136
Comunicação Serial Assíncrona
137
Comunicação Serial Assíncrona
(SCON) = SM0 SM1 SM2 REN TB8 RB8 TI RI
138
Comunicação Serial – Modo 0 (Síncrono)
f OSC
Baud Rate = (bits/s)
12
A recepção tem início com REN = 1 e RI = 0.
Ao final da recepção o bit RI é setado por hardware e o conteúdo recebido é
transferido para um registrador denominado por SBUF.
RI deve ser ressetado antes da próxima recepção.
139
Comunicação Serial – Modo 1 (Assíncrono 8 bits)
2 SMOD f osc
Baud rate = * (bits / s )
32 12 * (256 − TH 1)
São transmitidos 8 bits de dados, além de um bit de início e um bit de fim.
TH1 valor de recarga automática do temporizador 1 operando no modo 2.
SMOD variável que pode assumir valor 0 ou 1.
A recepção tem início quando há uma transição do nível lógico 1 para 0 no pino
RxD (pino P3.0) e o bit RI está zerado.
Ao final da recepção o RI é setado por hardware.
A transmissão é iniciada quando há uma transferência de dados para SBUF.
Ao final da transmissão o bit TI é setado.
Comunicação Serial – Modo 2 (Assíncrono 9 bits)
f osc
Baud rate = 2 SMOD
* (bits / s )
64
São transmitidos 9 bits de dados, além de um bit de início e um bit de fim.
SMOD variável que pode assumir valor 0 ou 1.
A recepção tem início quando há uma transição do nível lógico 1 para 0 no pino
RxD (pino P3.0) e o bit RI está zerado. O nono bit de dados é guardado em RB8.
Esse bit pode ser o bit de paridade.
Ao final da recepção o RI é setado por hardware.
A transmissão é iniciada quando há uma transferência de dados para SBUF. O
nono bit a ser transmitido é guardado em TB8. Esse bit pode ser o bit de
paridade.
Ao final da transmissão o bit TI é setado.
141
Comunicação Serial – Modo 3 (Assíncrono 9 bits)
2 SMOD f osc
Baud rate = * (bits / s )
32 12 * (256 − TH 1)
São transmitidos 9 bits de dados, além de um bit de início e um bit de fim.
TH1 valor de recarga automática do temporizador 1 operando no modo 2.
SMOD variável que pode assumir valor 0 ou 1.
A recepção tem início quando há uma transição do nível lógico 1 para 0 no pino
RxD (pino P3.0) e o bit RI está zerado.
Ao final da recepção o RI é setado por hardware.
A transmissão é iniciada quando há uma transferência de dados para SBUF.
Ao final da transmissão o bit TI é setado.
142
Comunicação Serial –
Taxas de Transmissão mais comuns
Timer 1
Baud Rate (bits/seg) Freq. Osc. (MHz) SMOD C/T barra Modo Valor Recar.
Modo 0 Máx: 1MHz 12 X X X X
Modo 2 Máx: 375K 12 1 X X X
Modo 1, 3: 62,5K 12 1 0 2 FFh
19,2K 11,059 1 0 2 FDh
9,6K 11,059 0 0 2 FDh
4,8K 11,059 0 0 2 FAh
2,4K 11,059 0 0 2 F4h
1.2K 11,059 0 0 2 E8h
137,5 11,059 0 0 2 1Dh
110 6 0 0 2 72h
110 12 0 0 1 FEEBh
143
RÓTULO INSTRUÇÃO
$MOD51
Comunicação Serial CONTADOR EQU 07H
144
Comunicação Serial – Programa Modo Síncrono
RÓTULO INSTRUÇÃO RÓTULO INSTRUÇÃO
MOSTRAP1: CLR TI MOV A,#0FH
MOV CONTADOR,#200 ANL A,R0
ESPERA: MOV A,#0F0H ORL A,#10H
ANL A,R0 MOV P1,A
SWAP A LCALL ATRASO
ORL A,#20H DJNZ CONTADOR,ESPERA
MOV P1,A RET
LCALL ATRASO ATRASO: MOV R4,#10
REPETE: MOV R5,#100
DJNZ R5,$
DJNZ R4,REPETE
RET
END
145
Comunicação Serial – Programa Modo 1 Assíncrono
RÓTULO INSTRUÇÃO RÓTULO INSTRUÇÃO
$MOD51 LOOP: MOV SBUF,R0
JNB TI,$
CONTADOR EQU 07H LCALL SERIAL
MOV A,R0
ORG 00H ADD A,#01
LJMP INICIO DA A
MOV R0,A
ORG 30H SJMP LOOP
INICIO: MOV SP,#2FH
MOV SCON,#40H Transmite e mostra no display de 7-
MOV TMOD,#20H segmentos uma contagem crescente,
MOV TL1,#0FDH usando o modo de comunicação serial
MOV TH1,#0FDH assíncrono, modo 1 (8 bits de dados)
MOV R0,#00H
SETB TR1 serial 5.asm
146
Comunicação Serial – Programa Modo 1 Assíncrono
RÓTULO INSTRUÇÃO RÓTULO INSTRUÇÃO
SERIAL: CLR TI MOV A,#0FH
MOV CONTADOR,#200 ANL A,R0
ESPERA: MOV A,#0F0H ORL A,#10H
ANL A,R0 MOV P1,A
SWAP A LCALL ATRASO
ORL A,#20H DJNZ CONTADOR,ESPERA
MOV P1,A RET
LCALL ATRASO
ATRASO: MOV R4,#10
Baud rate = 9600 bps REPETE: MOV R5,#100
DJNZ R5,$
SMOD = 0 DJNZ R4,REPETE
RET
fosc = 11,059 MHz
TH1 = FDH
END
147
Comunicação Serial – Programa Modo 1 Assíncrono
RÓTULO INSTRUÇÃO RÓTULO INSTRUÇÃO
$MOD51 MOV R0,#00H
SETB TR1
ORG 00H SETB REN
LJMP INICIO MOSTRA: LCALL DISPLAY
SJMP MOSTRA
ORG 23H
LJMP SERIAL SERIAL: CLR RI
MOV R0,SBUF
ORG 30H RETI
INICIO: MOV SP,#2FH
MOV SCON,#40H Programa que recebe dados no modo 1
MOV IE,#90H assíncrono a uma taxa de 4800 bps
MOV TMOD,#20H
serial 6.asm
MOV TL1,#0FAH TH1 = 0FAH
MOV TH1,#0FAH fosc = 11,059 MHz
148
Comunicação Serial – Programa Modo 1 Assíncrono
RÓTULO INSTRUÇÃO RÓTULO INSTRUÇÃO
DISPLAY: MOV A,#0F0H ATRASO: MOV R4,#10
ANL A,R0 REPETE: MOV R5,#100
ESPERA: SWAP A DJNZ R5,$
ORL A,#20H DJNZ R4,REPETE
MOV P1,A RET
LCALL ATRASO END
MOV P1,A
MOV A,#0FH
ANL A,R0
ORL A,#10H
MOV P1,A
LCALL ATRASO
RET
149
Comunicação Serial – Observações
150
Comunicação Serial – Observações
151
;============ Transmissão Serial no Modo Síncrono ===============
;============ SCON = 00 ===============
ORG 30H
INICIO: MOV SP,#2FH
MOV A,#00H O acumulador recebe o valor 00h
LOOP: MOV SBUF,A SBUF recebe o conteúdo de A, o que inicia automaticamente a
transmissão via serial
JNB TI,$ Loop de espera. Quando TI = transmissão chegou ao final.
CLR TI Limpa o bit TI, para permitir uma nova transmissão via serial
MOV P1,A Transfere para a porta P1 o conteúdo do acumulador
INC A Incrementa valor de a
SJMP LOOP Volta para a transmissão do próximo dado.
END
152
;============ Recepção Serial no Modo Síncrono ===============
;============ SCON = 00 ===============
Rótulo Mnemônico Descrição
$MOD51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
SETB REN Seta o bit REN, que habilita a recepção via serial
LOOP: JNB RI,LOOP Loop de espera. Quando RI = recepção chegou ao final.
CLR RI Limpa o bit RI, para permitir uma nova recepção via serial
MOV A,SBUF Transfere para o acumulador o conteúdo recebido pela serial.
MOV P1,A Transfere para a porta P1 o conteúdo do acumulador
SJMP LOOP Volta para a espera de um novo byte via serial
END
153
; ============== Serial no Modo 1 Assíncrono ================
; ============== SCON = 0100 0000 ================
; ============== TRANSMISSÃO
$mod51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
MOV SCON,#40H ; Serial no modo 1
MOV TMOD,#20H ; Temp 1 no modo 2
MOV TL1,#0FDH ; Baud rate de 9600 bps para clock de 11,059 MHz
MOV TH1,#0FDH
MOV A,#00H
SETB TR1
LOOP: MOV SBUF,A
JNB TI,$
MOV P1,A
INC A
CLR TI
SJMP LOOP
END
154
; ============== Serial no Modo 1 Assíncrono ================
; ============== SCON = 0100 0000 ================
; ============== RECEPÇÃO
$mod51
ORG 00H
LJMP INICIO
ORG 30H
INICIO: MOV SP,#2FH
MOV SCON,#40H ; Serial no modo 1
MOV TMOD,#20H ; Temp 1 no modo 2
MOV TL1,#0FDH ; Baud rate de 9600 bps para clock de 11,059 MHz
MOV TH1,#0FDH
SETB TR1
SETB REN
LOOP:
JNB RI,$ ; Aguarda fim de recepção
MOV A,SBUF ; Guarda em A conteúdo recebido via serial
MOV P1,A
CLR RI
SJMP LOOP
END
155
; ============== Serial no Modo 1 Assíncrono Com Interrupção ================
$mod51
ORG 00H
LJMP INICIO
ORG 23H
LJMP SERIAL
ORG 30H
INICIO: MOV SP,#2FH
MOV SCON,#01000000b ; Serial no modo 1
MOV IE,#90H ; Habilita interrupção da serial
MOV TMOD,#20H ; Temp 1 no modo 2
MOV TL1,#0FDH ; Baud rate de 9600 bps para clock de 11,059 MHz
MOV TH1,#0FDH
MOV A,#00H
SETB TR1
LOOP: MOV SBUF,A
JNB TI,$
SJMP LOOP
SERIAL: CLR TI
MOV P1,A
INC A
RETI
END
156
Expansão da Capacidade de
Memória do 8051
157
Expansão de Memória
158
Expansão de Memória
159
Expansão de Memória
Memória EEPROM AT28C256
(256 K = 32 K × 8 bits)
160
Expansão de Memória
Memória EEPROM AT28C256
(256 K = 32 K × 8 bits)
Leitura de Memória 0 1 0
Escrita de Memória 0 0 1
161
Expansão de Memória
Latch 74LS573
162
Sistema com Memória EEPROM de 32 K
OE\ LE
Latch
0V
WR\
ALE
RD\
MOV DPTR,#2000H Copia o conteúdo do acumulador na posição
MOVX @DPTR,A 2000H da RAM externa
163
Parte do Sistema do Diário de Classe
Memória EEPROM de 8 K AT28C64
(64 K = 8 K × 8 bits)
164
Sistema com Memória EEPROM de 8 K
OE\ LE
Latch
0V
WR\
ALE
RD\
MOV DPTR,#1000H Copia no acumulador o conteúdo da posição 1000H
MOVX A,@DPTR da RAM externa
165
Mapeamento de
Memória do 8051
166
Mapeamento de Memória
A divisão da região total de memória (64 K) pode ser feita, nesse caso,
em 8 regiões de 8K. Um componente que pode ser usado nesse
processo é o decodificador 74LS138, que contém 3 entradas de seleção
e 8 saídas.
167
Mapeamento de Memória
168
Sistema com Memória EEPROM de 8 K
OE\ LE
Latch
0V
WR\
ALE
RD\
MOV DPTR,#1000H Copia no acumulador o conteúdo da posição 1000H
MOVX A,@DPTR da RAM externa
169
Memória EEPROM de 8 K AT28C64
(64 K = 8 K × 8 bits)
170
Mapeamento de Memória no Sistema do Diário de Classe
74LS138
171
Tabela-verdade do 74LS138
172
Mapeamento de Memória
173
Mapeamento de Memória
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
174
Mapeamento de Memória – Motor de Passo
Endereço escolhido para o motor de passo: 2000H a 3FFFH.
Usar Latch
175
Endereço escolhido para o Display LCD: 4000H – 5FFFH
176
Mapeamento de Memória – Display LCD 4000H – 5FFFH
R/W RS
A1 A0
177
Comandos mais comuns para o Display LCD
DESCRIÇÃO MODO RS R/W Código (Hexa)
178
Mapeamento de Memória – Seleção do Dispositivo
Habilita EEPROM
Habilita Motor de Passo
Habilita LCD
179
Bibliografia
180