Beruflich Dokumente
Kultur Dokumente
Microcontroladores
Família MCS51®
MCS51®
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.
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:
MEMÓRIA EXTERNA
O contador de endereço do 80C51 (PC) é de 16 bits, portanto pode ser
adicionado até:
Esquema simplificado para ligar uma ROM de 64 Kbytes e uma RAM de 64 Kbytes:
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).
(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).
0F8h 0FFh
0F0h B 0F7h
00000000
0E8h 0EFh
0E0h ACC 0E7h
00000000
0D8h 0DFh
0D0h PSW 0D7h
00000000
0C8h 0CFh
0C0h 0C7h
0B8h IP 0BFh
XX000000
0B0h P3 0B7h
11111111
0A8h IE 0AFh
0X000000
0A0h P2 0A7h
11111111
98h SCON SBUF 9Fh
00000000 XXXXXXXX
90h P1 97h
11111111
88h TCON TMOD TL0 TL1 TH0 TH1 8Fh
00000000 00000000 00000000 00000000 00000000 00000000
80h PO SP DPL DPH PCON 87h
11111111 00000111 00000000 00000000 0XXX0000
Endereço
Inicial
CY AC F0 RS1 RS0 OV - P
0 0 banco 0
0 1 banco 1
1 0 banco 2
1 1 banco 3
PSW:
CY AC F0 RS1 RS0 OV - P
0 0 0 1 0 0 0 0
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 1
Tciclo _ de _ máquina = 12 * = 12 * = 1µs
fcristal 12 Mhz
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:
1
Tcristal = = 10 −6 s
1MHz
t = 0,3566 RC
20,034.10 −3 = 0,3566.10.10 −6 R
R = 5k 62
Valor comercial R = 6k8.
Tipos de Endereçamento
Endereçamento imediato: um valor constante é diretamente transferido para o
registrador indicado. Ex:
MOV A,#0Fh
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
(A) (0Ah)
_____________________________________
_
MOV A, R1
(A) (R1)
MOV A, @R0
Nos dois exemplos o acumulador é o índice e o endereço base é dado por DPTR
ou PC.
24 instruções aritméticas
25 instruções lógicas
28 instruções de transferência de dados
17 instruções booleanas
17 instruções de desvios
INSTRUÇÕES ARITMÉTICAS
ADIÇÃO:
As somas são todas realizadas entre acumulador e outro operando, e o
resultado são sempre transferidos para o acumulador
Na tabela acima:
Aqui o acumulador é somado com outro operando e com o flag de carry (que
pode ser 1 ou 0):
MULTIPLICAÇÃO E DIVISÃO
Na multiplicação e na divisão sempre são utilizados os registros A e B.
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
INCREMENTO DE 8 BITS
É sempre incrementado de uma unidade o operando
DECREMENTO DE 8 BITS
INCREMENTO DE 16 BITS
Existe apenas incremento de 16 bits, não existe decremento de 16 bits
AJUSTE DECIMAL
Instrução para operação em BCD. Válido apenas após as instruções ADD ou
ADDC.
Exemplo:
INSTRUÇÕES LÓGICAS
São instruções que realizam as operações lógicas AND (E), OR (OU) e XOR
(OU-EXCLUSIVO) entre o acumulador (ou uma posição de memória) e outro operando.
E LÓGICO (AND)
O resultado de uma operação AND só será verdadeiro (1) se os dois operandos
forem verdadeiros (1). Ex:
0101 1100
0111 0101
resultado AND = 0101 0100
OU LÓGICO (OR)
O resultado de uma operação OR será verdadeiro (1) se um dos dois operandos
for verdadeiro (1). Ex:
0101 1100
0111 0101
resultado OR = 0111 1101
OU-EXCLUSIVO (XOR)
O resultado de uma operação XOR será verdadeiro (1) se um dos operandos for
verdadeiro (1) e o outro operando for falso (0). Ex:
0101 1100
0111 0101
resultado OR = 0010 1001
PERMUTAÇÃO DE BYTE
É a troca de conteúdo entre os operandos:
TRANSFERÊNCIA DE DADOS
As transferências de dados permitidas são mostradas na tabela abaixo:
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.
PERMUTAÇÃO DE NIBBLE
Esta troca ocorre entre os nibbles baixo do acumulador e a memória interna
INSTRUÇÕES BOOLEANAS
São operações que trabalham com 1 bit:
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).
CHAMADA DE SUBROTINAS
comando byte CM C C 0V descrição
s A
ACALL adr11 3 2 - - - Chamada de subrotina a 2 kbyte
LCALL adr16 2 2 - - - Chamada de subrotina a 64 kbyte
DESVIOS INCONDICIONAIS
DESVIOS CONDICIONAIS
LOOPS
SEM OPERAÇÃO
Existe uma instrução que não faz nada, apenas consome ciclos da memória:
inicio:
CLR motor ;aqui a palavra “inicio” é um label (um endereço de
;memória). Além disso o bit motor (p2.1) é zerado
JB ch, $ ;testa bit ch (p1.0) se for 1, salta para $. No caso o
;cifrão $
;representa a mesma linha. Portanto enquanto ch=1, o
;programa fica parado na mesma linha. Se ch =0, o
;programa prossegue para linha de baixo.
SETB motor ;o bit motor é setado (p2.1=1)
SJMP inicio ;aqui a instrução sjmp é um salto para o endereço “inicio”
; o programa fica em loop.
END ; indica fim de programa
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:
entrada e chamada de
decisão (if) saída sub-rotina
de dados
Fluxograma:
Algoritmo:
Início
1) Selecionar banco 2 (PSW=10H)
2) Mover F3h para R1
3) Somar Acc com R1 PSW=10h selecionando
4) Mover para memória 34h o banco 2
resultado da soma (que fica no
acumulador) R1=F3h atribuindo F3h
a R1
armazenando na
(34h) A pos.memória 34h
a soma
Fim
PROGRAMA EM ASSEMBLY
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.
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.
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.
6) Carregue a posição de memória 26h com o valor de D7h e a posição de memória 44h com o
valor de 73h e carregue o carry com o valor 1 (C=1).
Crie um programa que execute a rotação de um bit, a esquerda sem carry, do conteúdo da
posição de memória cujo endereço é 26h. O resultado deve ser somado com o carry e o conteúdo
da posição de memória cujo endereço é 44h. Com o resultado, faça uma operação lógica OU-
EXCLUSIVO com a constante 7Dh. O resultado deve ser armazenado no conteúdo da posição de
memória 48h.
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).
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.
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:
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
CONFIGURAÇÃO PORTA P2
CONFIGURAÇÃO DA PORTA P0
Fluxograma: Org 0h
Inicio Inicio:
JNB P2.3, salta ; se o pino=0 pula
MOV P3,A ; senão (P3) (A)
S
P2.3 = 1
Salta:
SJMP Inicio ; volta para inicio
N
P3 A
END ; fim de programa
Inicio
Passos: (A)0h
- Ler o bit 0 da porta P1 (30h) 0H
- se for 0, incrementar contador
senão voltar a ler o pino da porta
- Contador igual a 01h? N
- se sim liga motor e volta ler a porta Ch1 = 0
senão continua 0001
- Contador igual a 81h? S
- se sim desliga motor e volta ler a porta AA+1
senão volta a ler o pino da porta
N
A=01h?
S
N
A=81h?
Liga motor P3.2=1
S
PROGRAMA:
Ch1 EQU P1.0 ; atribui o rótulo Ch1 ao pino P1.0.
motor EQU P3.2 ; atribui o rótulo motor ao pino P3.2
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.
END
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).
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
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
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.
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:
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:
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.
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
________ _____________ ; __________________________________________
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:
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.
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?
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?
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
Escrevendo no LCD
LCD
Rotina
Habilitar Dados ou
Instrução
Rotina
Atraso
Instrução RS=0
Conf_display:
habi_Inst:
ATRASO:
MOV R1,#14h
VOLTA:
MOV R0,#0FAh
DJNZ RO, $
DJNZ R1, VOLTA
RET
Esquema elétrico:
ROTINA COMENTADA:
INTERRUPÇÕES
A família MCS51 possui cinco [default] tipos de fontes de interrupções:
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.
A prioridade das interrupções é EX0, ET0, EX1, ET1 e ES. Isto quer dizer se
por acaso elas acontecerem ao mesmo tempo, a primeira interrupção a ser atendida
será a externa 0, depois o timer 0 e assim por diante até a interrupção serial.
Através do registro IP, as prioridades podem ser alteradas.
default
IP =
- - - PS PT1 PX1 PT0 PX0
externa 0
serial timer/counter 0
timer/counter 1 externa 1
TIMERS/COUTERS INTERRUPÇÕES
TCON =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
overflow borda/nível
timer 1 externa 0
run/stop flag da interrupção
timer 1 externa 0
overflow borda/nível
timer 0 externa 1
run/stop flag da interrupção
timer 0 externa 1
MOV IE,
MOV IP,
MOV TCON,
IP =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
TCON =
MOV IE,
MOV IP,
MOV TCON,
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.
Exercício 5) Um estacionamento possui 100 vagas e possui uma porta de entrada e uma porta
de saída. Fazer um programa para automatizar o estacionamento considerando o esquema
abaixo (utilize interrupções na porta de entrada e saída):
Considere:
Sensor A = 1 carro querendo entrar Sensor E = 1 carro querendo sair
Sensor B = 1 carro entrando Sensor F = 1 carro saindo
Fim de curso C = 1 porta aberta FC G = 1 porta aberta (saída)
Fim de curso D = 1 porta fechada FC H = 1 porta fechada (saída)
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.
TEMPORIZADORES E CONTADORES
Os 5 tipos de interrupções do 8051:
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.
TIMER 1 TIMER 2
TMOD =
GATE C/T M1 M0 GATE C/T M1 M0
M1 M0 REGISTROS
0 0 THi – 8 bits Contador de 13 bits
TLi – 5 bits Compatível com 8048
0 1 THi – 8 bits Contador de 16 bits
TLi – 8 bits
1 0 THi – recarga Contador de 8 bits com
TLi – 8 bits recarga
1 1 TH0 – 8 bits 2 contadores de 8 bits
TL0 – 8 bits
TH1 e TL1 - parado
Metade deste registro é usado para configurar o timer/couters e a outra metade é usada para
configurar as interrupções externas:
TIMERS/COUTERS INTERRUPÇÕES
TCON =
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IE0
overflow borda/nível
timer 1 externa 0
run/stop flag da interrupção
timer 1 externa 0
overflow borda/nível
timer 0 externa 1
run/stop flag da interrupção
timer 0 externa 1
* TFx é 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).
MODOS DE OPERAÇÃO
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:
Cálculo de N:
12.10 6
N= = 10.000
12.100
Programando IE
EA - - ES ET1 EX1 ET0 EX0
Programando TMOD
GATE C/T M1 M0 GATE C/T M1 M0
Exercício 4: Gerar uma onda quadrada nos pinos da porta P1 com uma freqüência
de 50 Hz, considerando a freqüência do cristal de 12 MHz.
12MHz
Cálculo de N: N= = 10.000 ∴modo 1 escolhido
12.100
Escolhendo o timer 0
Modo 1 valor inicial = 65536-10000 = 55536
TMOD = 01h
GATE C/T* M1 M0 GATE C/T* M1 M0
0 0 0 0 0 0 0 1
IE = 82h
EA - - ES ET1 EX1 ET0 EX0
1 0 0 0 0 0 1 0
$mod51
IE = 82h
EA - - ES ET1 EX1 ET0 EX0
1 0 0 0 0 0 1 0
Programa com Interrupção
$mod51
recarga equ 55536 ; valor de carga do timer
TMOD = 01h
GATE C/T* M1 M0 GATE C/T* M1 M0
IE = 82h
EA - - ES ET1 EX1 ET0 EX0
25 ms
SA SB % nivel alto
0 0 0
0 1 20 %
1 0 50 %
1 1 80 %
PORTA SERIAL
Basicamente, existem três tipos de comunicação digital:
I) Modo Simplex neste tipo de comunicação, um dispositivo apenas
transmite a informação e outro dispositivo apenas recebe.
II) Modo Half-Duplex neste tipo de comunicação os dispositivos recebem e
transmitem os dados, mas essas operações não podem ocorrer
simultaneamente.
III) Modo Full-Duplex neste modo os dispositivos podem receber e
transmitir os dados simultaneamente.
IE =
EA - - ES ET1 EX1 ET0 EX0
todas externa 0
serial timer/counter 0
timer/counter 1 externa 1
PCON =
SMOD - - - GF1 GF0 PD IDL
dobrador de ativa modo IDLE
Baud-rate modo Power Down
Bits de finalidade
geral
SMOD quando em 1 dobra a baud rate. OBS: não é acessível o bit deste registro.
IDL quando em 1, o oscilador continua a trabalhar apenas para três funções
(interrupções, timers e porta serial). Consumo de energia é de 85% do consumo
normal. Sai do IDL através de uma interrupção ou através do RESET.
POWER DOWN quando em 1, o oscilador para de trabalhar. Consumo de energia é de
10µA. Único modo de sair do power down é através do RESET (neste caso mantém os
dados da RAM interna).
OBS: TI e RI devem ser zerados por software (CLR TI, CLR RI)
Modos de Operação
Baud-Rate Fclock/12
Este modo pode ser utilizado para aumentar as portas de I/O ou quantidade de memória do
microcontrolador:
Baud-Rate variável
start 0 1 2 3 4 5 6 7 stop
Sempre 0 I N F O R M A Ç Ã O sempre 1
na transmissão na transmissão
f CLOCK
N=
192.BR.(1 + SMOD)
onde:
N – valor a ser programado no temporizador 1
BR – Baud Rate desejada
Exemplo 1: Calcule o valor a ser carregado no timer 1 para conseguir uma Baud-Rate de 9600 bauds
utilizando um cristal de 11,059 MHz e SMOD=0.
Cálculo de N:
11059000
N= = 2.999 ≈ 3 usando timer 1 no modo 2 (8 bits)
192.9600.(1 + 0)
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)
Baud-Rate variável
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.
SETB REN
LOOP: JNB RI,$ ; enquanto o flag RI não for para 1, não ocorreu
; interrupção, então fica aguardando
CLR RI ; limpa o flag RI para habilitar novas recepções
MOV A, SBUF ; transfere para acumulador o dado recebido
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).
Np − N
Erro = x100 (%)
Np
f CLOCK
N=
192.BR.(1 + SMOD)
Exemplo: Qual o erro de uma comunicação serial realizada com o 8051 que utiliza uma baud-rate de
9600 bauds, SMOD=1 e com um cristal de 12 MHz.
f CLOCK 12 M
N= = = 6,51
192.BR.(1 + SMOD) 192.9600(1 + 0)
Np − N 7 − 6,51
Erro = x100 = = 7%
Np 7
MAX232
Conectores:
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
$mod51
org 0h ; posiciona o programa no endereço 00h da flash
$mod51
org 0h ; posiciona o programa no endereço 00h da flash
sjmp inicio ; salta para o inicio do programa
org 23h ; endereço da interrupção serial
ljmp seri ; desvio para tratamento da interrupção serial
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.
Bibliografia
Marcas Registradas
Sugestões de Leitura
Programação Basic para Microcontroladores 8051 - Com Base na IDE BASCOM-8051 - Teoria e Prática
Fernando Simplicio de Sousa