Você está na página 1de 143

MICROCONTROLADORES -

8051 EM LINGUAGEM C
Rafael Oliveira do Prado
Tcnico em Eletrnica
rafael.prado@udesc.br
1
www.mecatronicadegaragem.blogspot.com.br
INTRODUO
Esta apresentao tem como objetivo introduzir alguns conceitos
fundamentais sobre microcontrolares de maneira prtica e de fcil
compreenso para iniciantes. O microcontrolador utilizado da
famlia 8051 e a linguagem de programao a linguagem C;

Alm de abordar teoricamente as principais caractersticas do 8051,
so descritos passo a passo como program-lo, exemplos de
circuitos, programas comentados e exerccios propostos;

No so abordados desenhos de placa de circuito impresso nem
mtodos ou circuitos de programao do 8051. Para tanto procure
na folha de dados do fabricante, livros ou internet;

Como pr-requisitos, so recomendados conhecimentos prvios de
programao em linguagem C e eletrnica digital.
2
www.mecatronicadegaragem.blogspot.com.br
TEMAS ABORDADOS
Sistemas Embarcados
Definio;
Aplicaes.
Microcontroladores
Histria;
Microprocessador;
Microcontrolador;
Microprocessador vs Microcontrolador;
Microcontroladores mais Usados.
8051
Descrio;
Pinagem;
Descrio dos Pinos;
Linguagem C vs Linguagem Assembly;
Memria Externa no 8051;
Memria no 8051;







3
AT89S52;
Descrio do AT89S52;
Memria de Programa no AT89S52;
Memria de Dados no AT89S52;
Keil;
Leitura de Boto;
Display LCD Interface 4 Bits;
Teclado Matricial 4x4;
Interrupes;
Prioridade das Interrupes;
Interrupes Externas;
Temporizadores/Contadores;
Comunicao Serial.
www.mecatronicadegaragem.blogspot.com.br
SISTEMAS EMBARCADOS
Um sistema embarcado a combinao de hardware e
software, e ocasionalmente elementos mecnicos ou de
outra natureza, projetados para desempenhar uma
funo especfica.

Programming Embedded Systems in C and C++, Michael Barr,
1999.
4
www.mecatronicadegaragem.blogspot.com.br
SISTEMAS EMBARCADOS
um sistema no qual o computador completamente
encapsulado e dedicado ao dispositivo ou sistema que
controla, diferente dos computadores de uso geral como o
PC;

J que o sistema dedicado a tarefas especficas, pode-se
otimizar o projeto reduzindo tamanho, recursos
computacionais e custo do produto.
5
www.mecatronicadegaragem.blogspot.com.br
SISTEMAS EMBARCADOS
Geralmente baseado em Microcontroladores, no entanto
existem sistemas embarcados baseados em outras tecnologias:

Dispositivos Lgico Programveis (PLDs);
FPGAs (Field-Programmable Gate Array);
Processadores Digitais de Sinais (DSPs).
6
www.mecatronicadegaragem.blogspot.com.br
APLICAES
A aplicao para sistemas embarcados imensa e pode ser
observada em diversas reas:

Equipamentos Mdicos;
Automao Industrial;
Automao Residencial;
Automobilstica;
Avinica;
Televiso, Videogame;
Perifricos para computador;
Eletrodomsticos;
Celular, iPad, iPod;
Etc...
7
www.mecatronicadegaragem.blogspot.com.br
HISTRIA DO MICROCONTROLADOR
Em 1969, a INTEL encomenda circuitos integrados (CIs)
japoneses para a produo de calculadoras;

Neste perodo, Marcian Hoff, funcionrio da prpria INTEL
apresentou uma soluo diferente: Que a funo do CI fosse
determinada por um programa nele armazenado;
8
www.mecatronicadegaragem.blogspot.com.br
HISTRIA DO MICROCONTROLADOR
Em 1971 um funcionrio da INTEL chamado Frederico
Faggin transformou a ideia de Hoff num produto real e assim,
o primeiro microprocessador nasceu;

Com o passar dos anos, o avano da tecnologia
proporcionou a criao de microprocessadores mais rpidos
e inteligentes;

Aliados a memrias RAM e ROM, disco rgido, dispositivos
de entrada (teclado, mouse...) e sada (monitor,
impressora..), o microprocessador a parte central de troca
de informaes entre dispositivos.
9
www.mecatronicadegaragem.blogspot.com.br
HISTRIA DO MICROCONTROLADOR
Logo que os microprocessadores foram popularizados, a
indstria percebeu que tais componentes poderiam ser
aplicados na automao de processos;

Para viabilizar tal propsito, os microprocessadores foram
reprojetados e os perifricos de entrada e sada foram
integrados todos num nico CI.
10
www.mecatronicadegaragem.blogspot.com.br
HISTRIA DO MICROCONTROLADOR
Esse CI, integrando perifricos em sua arquitetura, era na
verdade, um sistema mais completo que um
microprocessador;

Ele poderia processar dados e controlar dispositivos
externos sem a necessidade de perifricos externos;

Foi este, ento, batizado de microcontrolador.
11
www.mecatronicadegaragem.blogspot.com.br
MICROPROCESSADOR

Possui apenas CPU. Os perifricos so externos:

Placa Me;
Disco Rgido
Memria RAM;
Placa de Vdeo;
Monitor;
Teclado;
Mouse;
Etc...
12
www.mecatronicadegaragem.blogspot.com.br
MICROCONTROLADOR

Possui CPU + memria + perifricos (variam de acordo com o
modelo) em um nico circuito integrado:

Memria (RAM, ROM, Flash);
Oscilador interno;
Comunicao serial, USB, 1wire, etc...;
Conversor Analgico-Digital;
Conversor Digital-Analgico;
Comparador analgico;
Modulador por largura de pulso (PWM);
Etc...
13
www.mecatronicadegaragem.blogspot.com.br
MICROPROCESSADOR VS MICROCONTROLADOR

A principal diferena que para um sistema microprocessado
funcionar so necessrios elementos externos (memria,
placa me e componentes para enviar e receber dados)
enquanto que para um sistema microcontrolado, basta o
microcontrolador.
14
www.mecatronicadegaragem.blogspot.com.br
MICROCONTROLADORES MAIS USADOS

Intel famlia 8051;
PIC;
Microcontroladores ATMEL;
Microcontroladores COP;
Microcontroladores FREESCALE (MOTOROLA).
15
www.mecatronicadegaragem.blogspot.com.br
8051
O microcontrolador escolhido um microcontrolador da
famlia 8051, porque alm de j ter sido a arquitetura mais
utilizada por profissionais e hobbistas (ainda muito
utilizado), o 8051 bsico possui recursos mais simples,
facilitando o aprendizado para iniciantes;

Uma vez que se entenda as funcionalidades e mtodos de
desenvolvimento com dispositivos dessa famlia, no ser
difcil migrar para outros tipos de microcontroladores.
16
www.mecatronicadegaragem.blogspot.com.br
DESCRIO
Algumas das caractersticas mais importantes do 8051 so:

32 pinos de Entrada/Sada programveis;
2 Pinos de interrupo externa;
2 Temporizadores/Contadores de 16 bits;
Comunicao Serial.
17
www.mecatronicadegaragem.blogspot.com.br
PINAGEM
18
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
Alm de E/S, os pinos das portas 1, 2, 3, 4 podem assumir
outras funes.

Port 0 e Port 2:
Quando utilizado um sistema com memria externa de 16
bits, a PORT0 opera como barramento de dados
multiplexado da parte menos significativa da palavra binria,
enquanto a PORT2 fornece a parte mais significativa.

A Port 0 no possui resistores de pull-up internos. Para
obter nvel lgico 1 preciso conectar em cada pino
resistores de 4k7 em relao ao +VCC. Esta a nica porta
que pode ter +VCC diferente de 5V.
19
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
Port 1:
Pino Funes
P1.5 MOSI - usado para gravao in-System (ISP)
P1.6 MISO - usado para gravao in-System (ISP)
P1.7 SCK - usado para gravao in-System (ISP)
20
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
Pino Funes
P3.0 RXD - pino de entrada serial
P3.1 TXD - pino de sada serial
P3.2 - interrupo externa 0
P3.3 - interrupo externa 1
P3.4 T0 - entrada externa do TIMER0
P3.5 T1 - entrada externa do TIMER1
P3.6 - pulso para escrita em memria externa
P3.7 - pulso para leitura em memria externa
1
0
INT
INT
RD
WR
Port 3:
21
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
RST:
Nvel alto nesse pino por
dois ciclos de mquina
enquanto o oscilador estiver
funcionando, reinicia o
sistema;

Ao energizar o sistema
importante que seja
resetado para o programa
comear a ser executado
desde o endereo 00H.
interessante haver um boto
para reset manual tambm. 22
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
ALE/ :
Adress Latch Enable (ALE) um pulso para travar (latch) a
parte baixa do endereo durante o acesso memria
externa. tambm o pino de entrada do pulso de
programao (PROG) durante a operao de gravao da
memria Flash interna.

Em operao normal, sem uso da memria externa, esse
pino pulsado em uma frequncia de 1/6 do oscilador
interno e pode ser usado como clock externo;
PROG
23
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
PSEN:
Program Store Enable o pulso de habilitao para leitura
de memria de programa externa;

EA/VPP:
External Acess Enable (EA). Habilitao de memria de
programa externa. Deve ser conectado ao GND quando uso
de programas em memria externa e em VCC quando for
utilizada a Flash interna;
24
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DOS PINOS
XTAL1, XTAL2:
Pinos de entrada para configurao do circuito de clock. A
frequncia do sistema ser igual a frequncia do cristal.
25
www.mecatronicadegaragem.blogspot.com.br
LINGUAGEM ASSEMBLY VS LINGUAGEM C
Vantagens:
Maior controle sobre hardware;

Economia de memria de
programa;

Tempo de execuo de
programa menor.

Desvantagens:
Conjunto de mnmnicos
extenso, tornando a tarefa de
programar e interpretar
programas enfadonha;

Portabilidade reduzida, pois o
Assembly de uma mquina
diferente de outra.
Assembly C
Vantagens:
Portabilidade elevada;

Poucos comandos so
necessrios para obter
resultado;

Facilidade para realizar clculos
complexos.

Desvantagem:
Cdigo gerado maior,
consequentemente, maior
ocupao de memria e maior
tempo de execuo do
programa.
26
www.mecatronicadegaragem.blogspot.com.br
LINGUAGEM ASSEMBLY VS LINGUAGEM C
Programa escrito em C:

#include <reg51.h> // Biblioteca padro de nomes dos RSFs do 8051

sbit LED = P0^0; // Define LED como o pino 0 da P0
sbit BOTAO = P0^1; // Define BOTAO como o pino 1 da P0

main()
{
int i;
while(1)
{
if(!BOTAO) // Aguarda o botao ser pressionado
{
while(!BOTAO); // Espera soltar
for(i=0; i<900; i++) ; // Delay de aproximadamente 50ms (cristal
// 11,0592MHz) para tratar efeito bounce
LED = !LED; // Apaga/acende o LED
}
}
}
27
www.mecatronicadegaragem.blogspot.com.br
LINGUAGEM ASSEMBLY VS LINGUAGEM C
Programa em C aps compilao:
C:0x0000 020818 LJMP C:0818
C:0x0003 00 NOP
C:0x0004 00 NOP
.
.
.
C:0x0800 2091FD JB 0x90.1,C:0800
C:0x0803 3091FD JNB 0x90.1,C:0803
C:0x0806 E4 CLR A
C:0x0807 FF MOV R7,A
C:0x0808 FE MOV R6,A
C:0x0809 0F INC R7
C:0x080A BF0001 CJNE R7,#0x00,C:080E
C:0x080D 0E INC R6
C:0x080E BE03F8 CJNE R6,#0x03,C:0809
C:0x0811 BF84F5 CJNE R7,0x84,C:0809
C:0x0814 B290 CPL 0x90.0
C:0x0816 80E8 SJMP C:0800
C:0x0818 787F MOV R0,#0x7F
C:0x081A E4 CLR A
C:0x081B F6 MOV @R0,A
C:0x081C D8FD DJNZ R0,C:081B
C:0x081E 758107 MOV 0x81,#0x07
C:0x0821 020800 LJMP C:0800
Memria ocupada: 39 bytes
28
www.mecatronicadegaragem.blogspot.com.br
LINGUAGEM ASSEMBLY VS LINGUAGEM C
Programa com a mesma funo escrito em Assembly:
LED equ P0.0 ; Define LED como o pino 0 da P0
BOTAO equ P0.1 ; Define BOTAO como o pino 1 da P0

ORG 0 ; Inicia escrita do programa no endereo 0 da memria
aguardaBotao:
JNB BOTAO, $ ; Testa se o botao foi pressionado
JB BOTAO, $ ; Testa se o botao foi solto
MOV R1, #60H ; Carrega R1 com o valor 60 em hexadecimal

delay: ; Delay de aproximadamente 50ms (cristal 11,0592MHz) para
DJNZ R0, $ ; tratar efeito bounce. Decrementa R0 e no prossegue
DJNZ R1, delay ; enquanto R0 for diferente de 0. Decrementa R1 e volta para
; delay enquanto R1 for diferente de 0

CPL LED ; Apaga/acende LED
SJMP aguardaBotao ; Retorna para aguardaBotao

END ; Fim
29
www.mecatronicadegaragem.blogspot.com.br
LINGUAGEM ASSEMBLY VS LINGUAGEM C
Programa em Assembly aps compilao:
C:0x0000 2081FD JB 0x80.1,C:0000
C:0x0003 3081FD JNB 0x80.1,C:0003
C:0x0006 7960 MOV R1,#0x60
C:0x0008 D8FE DJNZ R0,C:0008
C:0x000A D9FC DJNZ R1,C:0008
C:0x000C B280 CPL 0x80.0
C:0x000E 80F0 SJMP C:0000
Memria ocupada: 16 bytes
30
Um simples programa em C ocupa 23 bytes de memria a mais que
o mesmo programa escrito em assembly.
www.mecatronicadegaragem.blogspot.com.br
MEMRIA EXTERNA NO 8051
Alguns dispositivos da famlia 8051 no possuem memria
de programa interna, sendo necessrio o uso de memria
externa;

Para os que possuem, em determinadas aplicaes a
memria interna insuficiente;

Nesses casos so utilizados circuitos de memria externa.
31
www.mecatronicadegaragem.blogspot.com.br
MEMRIA NO 8051
Atualmente grande parte dos microcontroladores possuem
memria interna suficiente para a maioria das aplicaes;

As aplicaes aqui descritas no requisitam o recurso de
memria externa, por isso tais circuitos e programao no
sero abordados.
32
www.mecatronicadegaragem.blogspot.com.br
AT89S52
O microcontrolador utilizado ser o AT89S52. Ele
essencialmente parecido com o 8051 clssico, possuindo
um temporizador/contador a mais;

Atualmente existem diversos dispositivos da famlia 8051
com perifricos e recursos extras, alm dos disponveis nas
primeiras verses;

A seguir a memria e registradores de funes especiais do
AT89S52 sero brevemente descritos, no entanto, esta
apresentao se limitar apenas aos recursos do 8051
tradicional.
33
www.mecatronicadegaragem.blogspot.com.br
DESCRIO DO AT89S52
8 Kbytes de memria de programa on-chip (Flash);
256 bytes de RAM de dados;
32 pinos de Entrada/Sada programveis;
Modo de programao serial ISP (In-System Programmable)
3 Temporizadores/Contadores de 16 bits;
Comunicao Serial;
Watch Dog Timer programvel;
Estruturas de interrupo com dois nveis de prioridade;
Oscilador de clock on-chip;
Operao de 0Hz a 33MHz;
Proteo contra cpias (lock bit);
Alimentao de 4 a 5,5V.
34
www.mecatronicadegaragem.blogspot.com.br
MEMRIA DE PROGRAMA NO AT89S52
O AT89S52 possui 8 Kbytes de memria de programa on-
chip (Flash). O programa executado a partir do endereo
0000H. Os primeiros endereos so reservados para rotinas
de interrupo.
35
www.mecatronicadegaragem.blogspot.com.br
MEMRIA INTERNA DE DADOS NO AT89S52
36
O AT89S52 possui
256 bytes de RAM
de dados (espao
para variveis de
programa);

Os primeiros 128
bytes so para uso
geral;

Os 128 bytes
restantes so
reservados para
funes especficas.
www.mecatronicadegaragem.blogspot.com.br
MEMRIA INTERNA DE DADOS NO AT89S52
Bancos de registradores:
Pacotes de registradores que recebem os nomes R0,
R1...R7. Para selecionar qual banco utilizar utiliza-se um
dos registradores de funes especiais chamado PSW;

Bit e byte enderevel:
128 bits que podem ser acessados individualmente
37
www.mecatronicadegaragem.blogspot.com.br
MEMRIA INTERNA DE DADOS NO AT89S52
A vantagem de utilizar as regies Banco de Registradores
e Bit e Byte Endereveis ao invs da regio de Apenas
Bytes Endereveis est no tamanho e velocidade de
execuo da instruo.;

Como na programao C j previsto o uso de memria e
velocidade de execuo elevados, deixamos que o
compilador se preocupe com isso.
38
www.mecatronicadegaragem.blogspot.com.br
MEMRIA INTERNA DE DADOS NO AT89S52
Registradores de Funes Especiais (RFE):
So registradores reservados na memria para operaes
especficas. No deve-se utiliz-los para uso geral;

Para programar microcontroladores, preciso conhecer os
RFE do referido circuito integrado pelo menos de maneira
superficial, para poder utiliz-los quando necessrio.

A funo da maioria dos RFE do 8051 sero estudadas no
decorrer desta apresentao. O mapa da memria interna
dos RFE do AT89S52 exibido no slide a seguir.
39
www.mecatronicadegaragem.blogspot.com.br
REGISTRADORES DE FUNES ESPECIAIS (RSF)
NO AT89S52
40
www.mecatronicadegaragem.blogspot.com.br
KEIL
Antes de iniciar o estudo de programao,
recomendvel conhecer algum programa de
desenvolvimento e depurao de programas para o
8051;

Vrios cdigos sero exibidos e explicados, por isso
importante test-los para melhor compreenso.
41
www.mecatronicadegaragem.blogspot.com.br
KEIL
Segue abaixo o link para um tutorial de introduo ao
Keil, um programa onde possvel escrever, depurar e
simular cdigos para diversos dispositivos da famlia
8051. Crditos - Gilson Yukio Sato:

Tutorial Keil uVision 4



Utilize o cdigo fonte do prximo slide para seguir
instrues do tutorial.
42
www.mecatronicadegaragem.blogspot.com.br
KEIL
#include <reg51.h> //Biblioteca de nomes dos bits/bytes dos RFE do 8051
sbit pino_led = P1^0; // Define o pino P1.0 como pino_led
void troca_estado_led(void) { // Funcao para inverter estado do led
pino_led = !pino_led;
}
void atraso_ms(int i) { // TC0 configurado para uma temporizacao
for(i; i > 0; i--){ // de aproximadamente 1ms * i (cristal de 11,0592MHz)
TMOD = (TMOD & 0xF0) | 0x01; TH0 = 0xFC; TL0 = 0x66; TR0 = 1;
while(!TF0); TR0 = 0; TF0 = 0;
}
}
main() {
while(1) {
troca_estado_led();
atraso_ms(1000);
};
}
43
www.mecatronicadegaragem.blogspot.com.br
LEITURA DE BOTO E ACIONAMENTO DE LED
O primeiro programa microcontrolado o simples e clssico
acionamento de um LED atravs da leitura de um boto. A
cada vez que o boto for pressionado o LED inverte seu
estado. Se continuar pressionado o estado do LED continuar
sendo invertido de acordo com a taxa de repetio do boto;

Na prtica botes apresentam o chamado efeito bounce
(assim como todos os outros componentes eletromecnicos),
que a sucessiva troca de estado lgico at atingir o estado
final. Ocorre ao pressionar ou soltar o boto e dura de 10 a
50ms de acordo com a qualidade do componente;

Para tratar o efeito bounce pode ser inserido no cdigo um
atraso depois que o boto for pressionado. Este atraso alm
de tratar o efeito bounce, determina a taxa de repetio do
boto.
44
www.mecatronicadegaragem.blogspot.com.br
LEITURA DE BOTO E ACIONAMENTO DE LED
45
www.mecatronicadegaragem.blogspot.com.br
LEITURA DE BOTO E ACIONAMENTO DE LED
Para ler um boto e inverter o estado de um LED preciso
seguir a seguinte sequncia de passos:

1. Testar se o boto foi pressionado;

2. Chamar uma rotina de atraso cujo perodo determina a taxa de
repetio do boto;

3. Inverter o estado do LED
46
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca padro de nomes dos RSFs do 8051

sbit LED = P0^0; // Define LED como o pino 0 da P0
sbit BOTAO = P0^1; // Define BOTAO como o pino 1 da P0

void atraso_ms(int i) { // TC0 configurado para uma temporizacao de
for(i; i > 0; i--) { // aproximadamente 1ms * i (cristal de 11,0592MHz)
TMOD=(TMOD & 0xF0) | 0x01; TH0=0xFC; TL0=0x66; TR0=1;
while(!TF0); TR0=0; TF0=0;
} // Nao se preocupe em entender esta funcao agora. Os
} // temporizadores/contadores serao discutidos mais adiante

main() {
while(1) {
if(!BOTAO); // Aguarda o botao ser pressionado
atraso_ms(500); // Trata efeito bounce e determina taxa de repeticao do botao
LED = !LED; // Apaga/acende o LED
}
}
47
Leitura de boto e acionamento de LED
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
Os mdulos LCDs so interfaces de sada muito teis em
sistemas microcontrolados. Estes mdulos podem ser grficos ou
a caractere. Os LCDs a caractere so especificados em nmero
de colunas por linhas, sendo os mais usuais 16x2, 16x1, 20x2,
20x4, 8x2;

Os mdulos podem ser encontrados com backlight (LEDs para
iluminao de fundo), facilitando a leituras em ambientes
escuros. Os LCDs mais comuns empregam o controlador
HD44780 com interface paralela, todavia, existem LCDs com
controle serial e a gama de LCDs aumenta constantemente.
48
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
A seguir iremos trabalhar com o LCD de 16 caracteres por 2
linhas. O uso de qualquer outro baseado no controlador
HD44780 similar, variando apenas o nmero de linhas e
colunas;

A interface pode ser de 4 ou 8 bits. O mais usual 4 bits por usar
menos pinos. A diferena que para mandar instrues ou
caracteres ao mdulo, deve-se enviar primeiro os 4 MSBs e
depois os 4 LSBs. Por definio o mdulo inicia em 8 bits, ento
para utilizar interface de 4 bits o primeiro comando deve ser para
alterar a interface.
49
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
50
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
51
Instrues mais usuais
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
52
Detalhamento das instrues
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
53
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
Para ler ou escrever comandos no display LCD (4 bits)
preciso seguir a seguinte sequncia de passos:

1. Levar o pino R/W (Read/Write) a 0 para escrita, 1 para leitura. Aterra-se
o pino se no h necessidade de monitorar a resposta do LCD;

2. Escrever os dados nos pinos correspondentes a via de dados do LCD;

3. Levar o pino RS (Register Select) para 0 ou 1 (instruo ou caractere);

4. Levar o pino E (Enable) a 1 e em seguida a 0 para transferir os dados.

5. Aguardar o tempo necessrio para transferir os dados e o mdulo
executar o comando. 2ms so suficientes;

6. Repetir os passos anteriores com os 4 LSBs (desloca-se a varivel
responsvel pelo armazenamento dos dados 4 vezes para a esquerda.
54
www.mecatronicadegaragem.blogspot.com.br
DISPLAY LCD INTERFACE 4 BITS
Como o display LCD inicia em 8 bits mas apenas 4 bits esto
conectados, preciso enviar a primeira instruo de modo de
utilizao 2 vezes. Na primeira vez so enviados apenas os 4 bits
que informam que ser utilizada interface de 4 bits;

A partir do segundo comando, quando o mdulo LCD j est
operando em 4 bits, envia-se primeiro os 4 MSBs e depois os 4
LSBs. Envia-se ento o comando de modo de utilizao novamente;

As intrues de modo de utilizao e configurao do cursor devem
estar na rotina de configurao do mdulo, e ser usada antes de
comear a operar o display normalmente;

Quando o LCD energizado, executada a rotina de inicializao
interna do display, por isso preciso adicionar um atraso na nossa
rotina de configurao do LCD, para garantir que o mdulo no
esteja ocupado no momento em que comea a receber comandos
do microcontrolador. 10ms so suficientes.
55
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051
#define DADOS_LCD P1 // Define DADOS_LCD como P1
sbit RS = P1^2; // Pino de instrucao ou caractere do LCD.
sbit E = P1^3; // Pino de enable do LCD
unsigned char i = 1; // Variavel usada para enviar comandos ao LCD. Inicia
// em 1 porque a interface inicia como 8 bits
void atraso_ms(int i) { // TC0 configurado para uma temporizacao de
for(i; i > 0; i--) { // aproximadamente 1ms * i (cristal de 11,0592MHz)
TMOD=(TMOD & 0xF0) | 0x01; TH0=0xFC; TL0=0x66; TR0=1;
while(!TF0); TR0=0; TF0=0;
} // Nao se preocupe em entender esta funcao agora. Os
} // temporizadores/contadores serao discutidos mais adiante
void cmd_LCD(unsigned char dado, char tipo) { // Funcao p/ enviar comandos ao LCD
DADOS_LCD = dado; // Envia 4 MSBs
for(; i != 0; i--) {
if (tipo == 0) RS = 0; else RS = 1; // Seleciona instrucao ou caractere
E = 1; E = 0; // Transfere dados
atraso_ms(2); // Aguarda tempo de execucao dos comandos
DADOS_LCD = dado << 4; // Envia os 4 LSBs
} i = 2; // Na primeira vez que a funcao for executada sera enviado apenas os
} // 4 MSBs. A partir da segunda serao enviados primeiro os 4 MSBs e
// depois os 4 LSBs
56
Acionamento de display LCD interface 4 bits
// CONTINUA...
www.mecatronicadegaragem.blogspot.com.br
void config_LCD() { // Funcao de configuracao do LCD
atraso_ms(10); // Aguarda execucao de inicializacao interna do display
cmd_LCD(0x28,0); // Chaveia para modo 4 bits
cmd_LCD(0x28,0); // Envia instrucao de modo de utilizacao
cmd_LCD(0x0D,0); // Cursor piscante
cmd_LCD(0x01,0); // Limpa o display
cmd_LCD(0x80,0); // Escreve na primeira linha a esquerda
}

void escreve_LCD(char *c) { // Funcao p/ escrever strings no LCD
for(; *c != \0; c++) cmd_LCD(*c,1);
}

main() {
config_LCD();
escreve_LCD(Interface de);
cmd_LCD(0xC0,0); // Escreve na segunda linha a esquerda
escreve_LCD(dados de 4 bits);

while(1);
}
57
Acionamento de display LCD interface 4 bits
www.mecatronicadegaragem.blogspot.com.br
TECLADO MATRICIAL 4X4
Uma forma muito comum de entrada de dados em um sistema
microcontrolado atravs de teclas (botes). Quando o nmero
delas pequeno, cada uma pode ser associada a um pino de
entrada do microcontrolador.

Entretanto, quando o nmero de teclas se torna grande no
recomendado desperdiar pinos de entrada. Utilizando um
teclado matricial de 4x4 teclas, ao invs de se empregar 16 pinos
para leitura das referidas teclas, emprega-se 8 pinos.
58
www.mecatronicadegaragem.blogspot.com.br
TECLADO MATRICIAL 4X4
Os botes so arranjados em matriz (colunas e linhas), e o
teclado lido por varredura atravs de um CI decodificador ou
um microcontrolador. O pressionar de uma tecla produzir um
curto entre uma coluna e uma linha e o sinal da coluna se
refletir na linha (ou vice-versa).

A ideia trocar sucessivamente o nvel lgico das colunas e
verificar se esse nvel lgico aparece nas linhas (ou vice-versa).
Se por exemplo houver alterao no nvel lgico de alguma linha
significa que alguma tecla foi pressionada e, ento, com base na
coluna habilitada e na linha, se sabe qual tecla foi pressionada.
59
www.mecatronicadegaragem.blogspot.com.br
TECLADO MATRICIAL 4X4
60
www.mecatronicadegaragem.blogspot.com.br
TECLADO MATRICIAL 4X4
Para realizar a varredura de um teclado matricial, os bits (linhas
e colunas) devem iniciar em 1, e deve-se seguir a seguinte
sequncia de passos:

1. Levar o nvel lgico da primeira coluna a 0;

2. Aguardar um tempo no muito pequeno para evitar leitura de
rudos e nem muito grande a ponto de no detectar o pressionar
de uma tecla. 50ms so suficientes;

3. Testar cada linha em relao a essa coluna. Caso uma linha
esteja em 0, um boto foi pressionado e deve-se retornar o valor
referente ao boto dessa linha e coluna especficas;

4. Levar essa coluna a nvel lgico 1 novamente;

5. Repetir os passos anteriores para cada uma das colunas
restantes.

61
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051
#define DADOS_LCD P1 // Define DADOS_LCD como P1

#define setBit(adress,bit) (adress|=(1<<bit)) // Seta bit do endereco selecionado
#define clrBit(adress,bit) (adress&=~(1<<bit)) // Zera bit do endereco selecionado
#define tstBit(adress,bit) (adress&(1<<bit)) // Testa bit do endereco selecionado

unsigned char teclado[4][4] = {{0x01, 0x02, 0x03, 0x0F}, // De acordo com o botao
{0x04, 0x05, 0x06, 0x0E}, // pressionado sera enviado o
{0x07, 0x08, 0x09, 0x0D}, // elemento correspondente
{0x0A, 0x00, 0x0B, 0x0C}}; // da matriz

void atraso_ms(int i) { // TC0 configurado para uma temporizacao de
for(i; i > 0; i--) { // aproximadamente 1ms * i (cristal de 11,0592MHz)
TMOD=(TMOD & 0xF0) | 0x01; TH0=0xFC; TL0=0x66; TR0=1;
while(!TF0); TR0=0; TF0=0;
} // Nao se preocupe em entender esta funcao agora. Os
} // temporizadores/contadores serao discutidos mais adiante
62
Varredura de Teclado Matricial 4x4
// CONTINUA...
www.mecatronicadegaragem.blogspot.com.br
unsigned char lerTeclado() {
unsigned char n, j, valor, linha;
for(n=0; n<4; n++) { // Alterna as colunas
clrBit(P2,n); // Zera bit da coluna para testar as linhas que estao em 1.
// Caso um botao seja pressionado a linha tambem valera 0
atraso_ms(50); // Atraso para varredura mais lenta e trata efeito bounce
linha = P2 >> 4; // Elimina informao sobre as colunas

for(j=0; j<4; j++) if(!tstBit(linha,j)) valor = teclado[j][n]; // Testa cada linha j em
// relacao a coluna n. Se um botao for pressionado, retorna o valor correspondente

setBit(P2,n); // Seta o bit da coluna zerado anteriormente
}
return tecla; // Retorna botao pressionado
}

main() {
unsigned char tecla;
P2 = 0xFF; // Por padrao todas as E/S's ja iniciam em 1
while(1) {
n = lerTeclado();
P0 = tecla; // Escreve na P0 o valor do botao pressionado
}
}
63
Varredura de Teclado Matricial 4x4
www.mecatronicadegaragem.blogspot.com.br
EXERCCIO PROPOSTO
Faa o programa que escreva no display LCD o caractere
correspondente ao boto que for pressionado. O programa
deve ter as seguintes restries:

Os caracteres devem aparecer um aps o outro;
Quando terminar a primeira linha os caracteres devem ser
escritos na linha de baixo;
Quando terminar as duas linhas o display deve ser limpo e a
escrita iniciar da primeira posio da primeira linha.

64
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
So eventos internos ou externos que provocam a
interrupo do fluxo normal do programa e o desvia para um
endereo especfico da memria, para atender o evento que
gerou a interrupo;

As interrupes permitem que o processador foque em sua
atividade principal sem precisar travar o programa em uma
temporizao ou verificar constantemente perifricos e
outras fontes de interrupo;

O programa principal torna-se mais simples e eficiente.
65
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
Programa sem uso de interrupes
Programa com uso de interrupes
66
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
O 8051 prov 5 fontes de interrupo + reset (endereo 00H).
67
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
Para utilizar interrupes, preciso habilit-las. O RFE
responsvel por esta funo o IE (Interrupt Enable).

Para habilitar o uso das interrupes, deve-se setar EA
(Enable All). Esse bit apenas permite o uso das
interrupes, para efetivamente habilitar uma interrupo
deve-se setar o bit correspondente.



ES: Enable Serial;
ETi: Enable Timer i;
EXi: Enable External i;
68
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
Na programao em Assembly alguns cuidados so
necessrios:
Desviar para um endereo de memria que no ser
utilizado, caso a rotina de interrupo seja maior que 8
bytes;
Salvar na pilha contedo de registradores utilizados na
rotina de interrupo (A, B, R0, R1...);
Retornar da interrupo.

Em programao C, o compilador se encarrega desses
cuidados.
69
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
Para utilizar interrupes em linguagem C deve-se:

1. Habilitar as interrupes desejadas atravs do RFE IE;

2. Configurar as fontes de interrupo desejadas tais como
temporizadores, interrupes externas e comunicao
serial;

3. Escrever a rotina de interrupo de acordo com a sintaxe
exibida no slide a seguir.
70
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES
void nome_interrupo(void) interrupt nmero_interrupo
{
// rotina aqui
}
nome_interrupo pode ser qualquer nome definido pelo
programador;
nmero_interrupo o nmero da interrupo de acordo
com a tabela abaixo.





Interrupes no aceitam passagem nem retorno de variveis.
Para usar uma varivel na rotina de interrupo, ela deve ser
global.
71
www.mecatronicadegaragem.blogspot.com.br
PRIORIDADE DAS INTERRUPES
Ocasionalmente podem ocorrer mais de uma solicitao de
interrupo ao mesmo tempo;

Por padro o 8051 adota como prioridade a sequncia:

EX0>ET0>EX1>ET1>ES

No entanto, possvel dar mxima prioridade a uma ou
mais fontes de interrupo. O registrador responsvel por
esta funo o RFE IP.
72
www.mecatronicadegaragem.blogspot.com.br
PRIORIDADE DAS INTERRUPES
Para dar alta prioridade a uma fonte de interrupo deve-se
setar o bit correspondente.





PS: Priority Serial;
PTi: Priority Timer i;
PXi: Priority External i;
73
www.mecatronicadegaragem.blogspot.com.br
PRIORIDADE DAS INTERRUPES
Nada pode interromper uma interrupo de alta prioridade,
nem mesmo outra interrupo de alta prioridade;

Uma interrupo de alta prioridade pode interromper uma
interrupo de baixa prioridade, e quando terminar sua
rotina, volta para o ponto em que parou na interrupo de
baixa prioridade;

Se duas interrupes ocorrerem ao mesmo tempo, a de
maior prioridade atendida primeiro. Se forem de igual
prioridade, seguida a ordem padro do 8051.
74
www.mecatronicadegaragem.blogspot.com.br
PRIORIDADE DAS INTERRUPES

#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

main()
{
EA = 1; // Habilita uso de interrupcoes
EX0 = 1; // Habilita a interrupcao externa 0
ES = 1; // Habilita interrupcao da comunicacao serial

PS = 1; // Configura interrupo da serial como alta prioridade
// Caso ocorra ao mesmo tempo que a interrupcao externa 0, a
// interrupcao da serial sera atendida primeiro

// Caso ocorra enquanto atende a rotina da interrupcao externa 0,
// interrompe a rotina da interrupcao externa 0 e vai para a rotina
// da serial. Quando terminar volta para a rotina da interrupcao
// externa 0
.
.
.
}
75
Habilitao das interrupes externa 0 e serial. A serial
configurada como alta prioridade.
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES EXTERNAS
Os pinos INT0 e INT1 podem ser utilizados com funo de
pedido de interrupo por dispositivos externos;

Alm de adequadamente habilitada no registrador IE, uma
interrupo externa deve ser configurada para disparo por
nvel ou por transio de nvel;

Esta a funo dos bits IT0 e IT1 do RFE TCON.
76
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES EXTERNAS
ITi (Bit de controle do tipo de interrupo):
-1 configura a interrupo externa para ser disparada por
transio de nvel 1 para 0;
-0 configura a interrupo para ser disparada por nvel 0.

IEi (Flag de transio da interrupo):
Em interrupo por nvel, so setadas quando o pino INTi
1 e resetadas quando INTi 0. Por transio, so setadas a
cada pedido de interrupo e resetadas automaticamente
na rotina de interrupo. Com interrupo desabilitada
podem ser testadas via software, e precisam ser resetadas
no programa no caso de interrupo por transio.
77
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES EXTERNAS
78
www.mecatronicadegaragem.blogspot.com.br
INTERRUPES EXTERNAS
Para utilizar interrupes externas em linguagem C deve-se:

1. Habilitar o uso de interrupes (bit EA);

2. Habilitar as interrupes desejadas (bits EX0 e/ou EX1) e
prioridade (bit IP);

3. Configurar disparo por nvel (bit ITi = 0) ou por transio (bit
ITi = 1);

4. Escrever a rotina de interrupo de acordo com o slide 71.
79
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

sbit BOTAO = P3^2; // Define o pino P3.2 como BOTAO

void intExterna0() interrupt 0 // Rotina da interrupcao externa 0
{
P1++; // Incrementa uma contagem binaria na P1 enquanto
} // o botao estiver pressionado

main()
{
EA = 1; // Habilita uso de interrupcoes
EX0 = 1; // Habilita a interrupcao externa 0
IT0 = 0; // Configura disparo por nivel

while(1); // Aguarda interrupcoes
}
Interrupo externa 0 por nvel
80
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

sbit BOTAO = P3^2; // Define o pino P3.2 como BOTAO

void intExterna0() interrupt 0 // Rotina da interrupcao externa 0
{
P1++; // Incrementa uma contagem binaria na P1 cada vez
} // que o botao for pressionado

main()
{
EA = 1; // Habilita uso de interrupcoes
EX0 = 1; // Habilita a interrupcao externa 0
IT0 = 1; // Configura disparo por transicao

while(1); // Aguarda interrupcoes
}
Interrupo externa 0 por transio
81
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

sbit BOTAO = P3^2; // Define o pino P3.2 como BOTAO

main()
{
EA = 0; // Desabilita uso de interrupcoes (por padrao esse bit ja e
// inicializado em 0)
IT0 = 1; // Configura disparo por transicao

while(1)
{
if(IE0) // Testa interrupcao externa 0 (P3.2)
{
P1++; // Incrementa uma contagem binaria na P1
IE0=0; // Reseta flag
}
}
Teste da flag de interrupo (por transio) com
interrupes desabilitadas
82
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

sbit BOTAO = P3^2; // Define o pino P3.2 como BOTAO

main()
{
EA = 0; // Desabilita uso de interrupcoes (por padrao esse bit ja e
// inicializado em 0)
IT0 = 0; // Configura disparo por nvel (esse tambem)

while(1)
{
if(IE0) // Testa interrupcao externa 0 (P3.2)
{
P1++; // Incrementa uma contagem binaria na P1
} // Nesse caso nao e preciso resetar a flag pois
// ela ja e resetada quando o pino INT0 for 1
}
Teste da flag de interrupo (por nvel) com interrupes
desabilitadas
83
www.mecatronicadegaragem.blogspot.com.br
EXERCCIO PROPOSTO
A partir do circuito abaixo, faa o programa que determine qual
das 8 linhas est solicitando interrupo e escreva esse valor
na P1.
84
www.mecatronicadegaragem.blogspot.com.br
EXERCCIO PROPOSTO
Desenvolva um programa de segurana contra abertura de
portas/janelas. O programa deve conter as seguintes
funcionalidades:

Usar interrupo externa;
Monitorar 8 portas/janelas;
Acionar um alarme (representado por um LED) quando uma
ou mais portas/janelas forem abertas;
As portas/janelas que esto sendo violadas devem ser
escritas em um display LCD;
O alarme s deve parar quando uma senha pr-definida de
4 dgitos for escrita atravs de um teclado matricial 4x4;
Caso a senha esteja incorreta, deve aparecer uma
mensagem no display de senha incorreta por 3 segundos e
depois retornar para a mensagem de monitoramento das
portas/janelas.


85
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
O 8051 prov dois temporizadores/contadores (T/C), que
podem ser individualmente configurados para operao de
temporizao ou contagem, em diferentes modos;

Um contador pode ser utilizado em operaes como contar
peas em um processo industrial;

Um temporizador geralmente utilizado quando preciso
gerar um perodo preciso de tempo.
86
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
Operando como contador, um pedido de interrupo
solicitado aps o contador atingir um nmero
predeterminado de pulsos negativos;

Como temporizador, o pedido de interrupo solicitado
aps ser atingido um perodo de tempo predeterminado;

Como contador, a contagem medida diretamente pelos
pinos T0 (P3.4) e T1 (P3.5). Como temporizador, o tempo
contado a partir do clock da CPU dividido por 12.
87
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
Gerao da base de tempo primria para os T/Cs do 8051
(modo temporizador)
88
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
Os RFE responsveis pela configurao dos T/Cs so o TMOD e
o TCON;

TCON
Possui as flags de pedido de interrupo e os bits para
ligar/desligar a temporizao/contagem;

TMOD
Possui bits de controle de modo de acionamento da
temporizao/contagem; modo de operao (temporizao ou
contagem); e modo de temporizao/contagem.

No enderevel por bit, portanto no possvel configurar
os bits individualmente, preciso configurar todos de uma vez
ou utilizar lgica OU/E para configurar os bits desejados.
89
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
90
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
91
Gatei
Determina o modo de habilitao do T/Ci:
-0: A temporizao ocorre enquanto o bit TRi de TCON for 1
-1: A temporizao ocorre apenas enquanto o bit TRi de
TCON for 1 e o pino INTi tambm for 1
C/Ti
Determina operao de temporizao ou contagem:
-0: Modo temporizador
-1: Modo contador
M1 e M0
Determinam o modo de temporizao/contagem:












M1 M0 Modo de Operao
0 0 13 bits, sendo 8 bits no RFE THi e um
prescaler de 5 bits no TLi
0 1 16 bits no par de RFE THi e TLi
1 0 8 bits com recarga automtica (contagem em
THi e constante de recarga em TLi)
1 1 T/C0: TL0 opera como T/C de 8 bits
TH0 opera como temporizador de 8 bits
T/C1: Trava a temporizao.
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES

92
Funcionamento:
Executa uma contagem crescente nos registradores THi e TLi;

A origem dos pulsos depende do bit C/Ti. Como contador
incrementa a contagem a cada borda de descida no pino Ti; como
temporizador a contagem incrementada a cada clock da CPU
dividido por 12;

A habilitao da contagem est relacionada ao bit Gatei. Se
resetado, o incio da contagem ocorre quando o bit TRi for 1. Caso
o bit Gatei esteja setado, a contagem somente ocorrer quando o
bit TRi for 1 e enquanto o pino INTi estiver em nvel alto.

TRi em 1 inicia a contagem. Se TRi for 0 novamente, a contagem
congela no ltimo valor, se 1 mais uma vez, a contagem
recomea do ltimo valor atingido;


www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
93
Gate0 = 0


Gate0 = 1


www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
94
Um pedido de interrupo solicitado aps a contagem atingir
um estouro. O modo de contagem depende dos bits M1i e M0i.
M1 M0 Modo de Operao
0 0 Modo 0: 13 bits
0 1 Modo 1: 16 bits
1 0 Modo 2: 8 bits com recarga automtica
1 1 Modo 3
T/C0: TL0 opera como T/C de 8 bits
TH0 opera como temporizador de 8 bits
T/C1: Trava a temporizao.

www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
95
Modo 0: 13 bits
A contagem obtida atravs de uma contagem crescente de
8 bits (0 a 255) no RFE THi incrementada a cada estouro na
pr escala de 5 bits (0 a 31) no RFE TLi. Os 3 bits mais
significativos de TLi so irrelevantes.

Lembrando que o sinal que incrementa os T/C proveniente
do clock da CPU ( ) dividido por 12, utiliza-se a
seguinte equao para calcular a temporizao T desejada,
onde n o valor inicial no RFE THi:
CPU
CLK
T n T * 12 * 32 * ) 256 (
CPU
CLK
T
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
96
Modo 0: 13 bits
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
97
Modo 1: 16 bits
A contagem obtida atravs de uma contagem crescente de
16 bits (0 a 65 535) nos RFE THi e TLi.

Lembrando que o sinal que incrementa os T/C proveniente
do clock da CPU ( ) dividido por 12, utiliza-se a
seguinte equao para calcular a temporizao T desejada,
onde n o valor inicial no par de RFE THi.TLi :



Obs: lembre-se de converter n para hexadecimal e
substituir o MSB em THi e o LSB em TLi.

CPU
CLK
T n T * 12 * ) 65536 (
CPU
CLK
T
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
98
Modo 1: 16 bits
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
99
Modo 1: 16 bits
Temporizao de 50ms utilizando um clock de 11,0592MHz
CPU
CLK
T n T * 12 * ) 65536 (
11059200
12
* ) 65536 ( 05 , 0
11059200
1
* 12 * ) 65536 ( 05 , 0
11059200
1
05 , 0
n
n
T
s T
CPU
CLK

) ( 00 4
19456
46080 65536
65536 46080
65536
12
11059200 * 05 , 0
l hexadecima C n
n
n
n
n




www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
100
Modo 2: 8 bits com recarga automtica
A contagem obtida atravs de uma contagem crescente de
8 bits (0 a 255) no RFE TLi, enquanto o RFE THi mantm o
valor inicial da contagem que automaticamente
recarregado no TLi a cada fim de contagem, quando o bit
TFi setado.

Lembrando que o sinal que incrementa os T/C proveniente
do clock da CPU ( ) dividido por 12, utiliza-se a
seguinte equao para calcular a temporizao T desejada,
onde n o valor inicial nos RFE TLi e THi (recarga
automtica):
CPU
CLK
T n T * 12 * ) 256 (
CPU
CLK
T
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
101
Modo 2: 8 bits com recarga automtica
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
102
Modo 2: 8 bits
Temporizao de aproximadamente 200s utilizando um clock
de 11,0592MHz
CPU
CLK
T n T * 12 * ) 256 (
11059200
12
* ) 256 ( 0002 , 0
11059200
1
* 12 * ) 256 ( 0002 , 0
11059200
1
0002 , 0
n
n
T
s T
CPU
CLK

) ( 48
72
32 , 184 256
256 32 , 184
256
12
11059200 * 0002 , 0
l hexadecima n
n
n
n
n




(arredonda-se para um
valor inteiro)
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
103
Modo 3: Temporizador dividido
T/C0:
TH0 e TL0 operam como temporizadores separados de 8 bits
cada. O clculo para uma temporizao T o mesmo do modo
2;

TL0 usa os bits C/T0, Gate0, TR0 e TF0 normalmente. TH0
opera apenas como temporizador utilizando os bits TF1, TR1 e o
endereo de interrupo do T/C1.

T/C1:
No modo 3 congela sua atividade. A temporizao/contagem
ainda pode ser utilizada nos outros modos, mas no pode
solicitar interrupo nem habilitar/desabilitar a contagem pois os
bits TF1, TR1 e o endereo de interrupo esto emprestados
ao T/C0;

A contagem ser desativada entrando no modo 3 e reativada
voltando ao modo original.
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
104
Modo 3: Temporizador dividido


www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
105
Modo 0 (13 bits):
Conta de 0 a 8,888ms (cristal 11,0592MHz);
Pouco usual, mantido para manter compatibilidade entre os
microcontroladores da famlia 8051.

Modo 1 (16 bits):
Conta de 0 a 71ms (cristal 11,0592MHz);
Mais utilizado para temporizaes maiores.

Modo 2 (8 bits):
Conta de 0 a 277s (cristal 11,0592MHz);
Utilizado para temporizaes menores e gerar baud rate.

Modo 3 (Temporizador dividido):
TH0 e TL0 contam de 0 a 277s (cristal 11,0592MHz);
TC1 trava;
Pouco usual. Pode ser utilizado quando houver necessidade de um T/C
de 8 bits, um temporizador de 8 bits e um gerador de baud rate para a
comunicao serial.
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
106
A partir deste ponto no ser mais detalhado o
modo 0 por no ser um modo de operao usual;

O modo 3, apesar de no usual, ser discutido por
no haver muitos exemplos de aplicao na
literatura sobre o 8051.
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
107
Temporizao:
Para calcular o valor inicial a ser carregado nos RFE THi e
TLi para uma determinada temporizao, deve-se utilizar a
equao para o modo que ser utilizado, conforme os slides
anteriores.

Contagem:
Para realizar uma contagem, basta subtrair o valor da
contagem c desejada pelos RFE THi e TLi de acordo com
o modo utilizado, conforme o slide a seguir.


www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
108
Valores n em THi e TLi para uma contagem c

Modo 1: 0 < c 65 536

n = 65 536 c

Obs: lembre-se de converter n para hexadecimal e substituir o
MSB em THi e o LSB em TLi.

Modos 2 e 3: 0 < c 256

n = 256 c

Para testar uma contagem basta conectar um boto entre o pino
Ti e GND.
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
Para utilizar interrupes dos T/Cs em linguagem C deve-se:

1. Habilitar o uso de interrupes (bit EA);

2. Habilitar as interrupes desejadas (bits ET0 e/ou ET1);

3. Configurar o RFE TMOD:
Gate em 0 habilitao do T/C depende apenas do bit TR,
em 1 depende de TR e do pino INT estar em nvel alto;
C/T em 0 o T/C opera como temporizador, em 1 opera
como contador;
Configurar o modo de contagem nos bits M1 e M0 e
calcular o valor inicial dos RFE TH e TL.

4. Escrever a rotina de interrupo de acordo com o slide 71.
109
www.mecatronicadegaragem.blogspot.com.br
TEMPORIZADORES/CONTADORES
As constantes utilizadas para as temporizaes
dos cdigos a seguir foram calculadas
considerando um cristal de 11,0592MHz
110
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre a cada 50ms
{
TH0 = 0x4C; // Recarga da constante de tempo
TL0 = 0x00; // Recarga da constante de tempo
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x01; // Configura TC0 como temporizador, modo 1, ativado
// apenas pelo bit TR0
TH0 = 0x4C; // Constante de tempo para 50ms
TL0 = 0x00; // Constante de tempo para 50ms

TR0 = 1; // Ativa temporizacao

while(1); // Aguarda interrupcao
}
111
Interrupo do TC0 como temporizador em modo 1 ativado
apenas pelo bit TR0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre quando
{ // houver uma transicao de 1 para 0 em T0
TH0 = 0xFF; // Recarga da constante de contagem
TL0 = 0xFF; // Recarga da constante de contagem
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x05; // Configura TC0 como contador, modo 1, ativado
// apenas pelo bit TR0
TH0 = 0xFF; // Constante para contagem n=1
TL0 = 0xFF; // Constante para contagem n=1

TR0 = 1; // Ativa contagem

while(1); // Aguarda interrupcao
}
112
Interrupo do TC0 como contador em modo 1 ativado apenas
pelo bit TR0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre apenas
{ // se INT0 for 1, a cada 50ms
TH0 = 0x4C; // Recarga da constante de tempo
TL0 = 0x00; // Recarga da constante de tempo
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x09; // Configura TC0 como temporizador, modo 1, ativado
// pelo bit TR0, enquanto o pino INT0 for 1
TH0 = 0x4C; // Constante de tempo para 50ms
TL0 = 0x00; // Constante de tempo para 50ms

TR0 = 1; // Ativa temporizacao

while(1); // Aguarda interrupcao
}
113
Interrupo do TC0 como temporizador em modo 1 ativado pelo
bit TR0 e o pino INT0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre apenas se INT0
{ // for 1 e se houver uma transio de 1 para 0 em T0
TH0 = 0xFF; // Recarga da constante de contagem
TL0 = 0xFF; // Recarga da constante de contagem
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x0D; // Configura TC0 como contador, modo 1, ativado
// pelo bit TR0, enquanto o pino INT0 for 1
TH0 = 0xFF; // Constante para contagem n=1
TL0 = 0xFF; // Constante para contagem n=1

TR0 = 1; // Ativa contagem

while(1); // Aguarda interrupcao
}
114
Interrupo do TC0 como contador em modo 1 ativado pelo bit
TR0 e o pino INT0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre a cada 200us
{
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x02; // Configura TC0 como temporizador, modo 2, ativado
// apenas pelo bit TR0
TL0 = 0x48; // Constante de tempo para 200us
TH0 = 0x48; // Recarga automatica para 200us

TR0 = 1; // Ativa temporizacao

while(1); // Aguarda interrupcao
}
115
Interrupo do TC0 como temporizador em modo 2 ativado
apenas pelo bit TR0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre quando
{ // houverem duas transicoes de 1 para 0 em T0
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x06; // Configura TC0 como contador, modo 2, ativado
// apenas pelo bit TR0
TL0 = 0xFE; // Constante para contagem n=2
TH0 = 0xFE; // Recarga automatica para contagem n=2

TR0 = 1; // Ativa contagem

while(1); // Aguarda interrupcao
}
116
Interrupo do TC0 como contador em modo 2 ativado apenas
pelo bit TR0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre apenas
{ // se INT0 for 1, a cada 50ms
P1+; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x0A; // Configura TC0 como temporizador, modo 2, ativado
// pelo bit TR0, enquanto o pino INT0 for 1
TL0 = 0x48; // Constante de tempo para 200us
TH0 = 0x48; // Recarga automatica para 200us

TR0 = 1; // Ativa temporizacao

while(1); // Aguarda interrupcao
}
117
Interrupo do TC0 como temporizador em modo 2 ativado pelo
bit TR0 e o pino INT0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

void intTC0() interrupt 1 // Rotina de interrupcao do TC0. Ocorre apenas se INT0
{ // for 1 e se houverem duas transicoes de 1 para 0 em T0
P1++; // Incrementa uma contagem binaria na P1
}
main()
{
EA = 1; // Habilita uso de interrupcoes
ET0 = 1; // Habilita a interrupcao do TC0
TMOD = 0x0E; // Configura TC0 como contador, modo 2, ativado
// pelo bit TR0, enquanto o pino INT0 for 1
TL0 = 0xFE; // Constante para contagem n=2
TH0 = 0xFE; // Recarga automatica para contagem n=2

TR0 = 1; // Ativa contagem

while(1); // Aguarda interrupcao
}
118
Interrupo do TC0 como contador em modo 2 ativado pelo bit
TR0 e o pino INT0
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca de nomes dos bits/bytes dos RFE do 8051

int i = 0; // i e definido como global porque sera usado em rotina de interrupcao

void atraso_1s(void) // Funcao para atraso de aproximadamente 1s
{
int j;
TMOD = (0x0F & TMOD) | 0x10; // Configura TC1 em modo 1 sem afetar TC0

for(j=0; j<20; j++)
{
TH1 = 0x4C; // Constante de tempo para 50ms
TL1 = 0x00; // Constante de tempo para 50ms
while(TH1 != 0xFE); // ** Prximo slide explica essa instruo
}
TMOD = (0x0F & TMOD) | 0x30; // Trava TC1 alternando para modo
} // 3 sem afetar TC0
// CONTINUA...
119
TC0 em modo 3, TL0 como contador de 8 bits (interrupo do
TC0) e TH0 como temporizador de 8 bits (interrupo do TC1).
T/C1 utilizado para gerar um atraso de 1s (sem interrupo)
www.mecatronicadegaragem.blogspot.com.br
Como a flag de interrupo TR1 esta emprestada ao TH0,
deve-se testar diretamente os RFE TH1 e TL1;

No pode-se testar um valor exato como TH1 e TL1 iguais a 0xFF
porque nesse instante a CPU pode estar ocupada com uma rotina
de interrupo ao invs do programa principal;

Por isso testa-se durante todo o tempo em que TH1 vale 0xFE e
os 256 valores de TL1. Caso haja uma rotina de interrupo com
muitas instrues, deve-se testar um intervalo maior de tempo.
Usando este recurso a temporizao no muito precisa.



Continuao do programa no prximo slide
120
TC0 em modo 3, TL0 como contador de 8 bits (interrupo do
TC0) e TH0 como temporizador de 8 bits (interrupo do TC1).
T/C1 utilizado para gerar um atraso de 1s (sem interrupo)
www.mecatronicadegaragem.blogspot.com.br
void intTC0() interrupt 1 { // Rotina de interrupcao vinculada ao TL0. Ocorre
// quando houver uma transicao de 1 para 0 em T0
TL0 = 0xFF; // Recarga para contagem n=1
P0+; // Incrementa uma contagem binaria na P0
}
void intTC1() interrupt 3 { // Rotina de interrupcao vinculada ao TH0. Ocorre
// a cada 200us
TL0 = 0x48; // Recarga para 200us
P1++; // Incrementa uma contagem binaria na P1
}
main() {
IE = 0x8A; // Habilita uso de interrupcoes, interrupcao TC0 e TC1
TMOD = 0x37; // TC1 travado. TL0 como contador ativo por TR0. TH0 como
// temporizador ativo por TR1
TH0 = 0x48; // Constante de tempo para 200us
TL0 = 0xFF; // Constante para contagem n=1
TR0 = 1; // Ativa contagem
TR1 = 1; // Ativa temporizacao
while(1) {
atraso_1s();
P2++; // Incrementa contagem binaria na P2
}
}
121
TC0 em modo 3, TL0 como contador de 8 bits (interrupo do
TC0) e TH0 como temporizador de 8 bits (interrupo do TC1).
T/C1 utilizado para gerar um atraso de 1s (sem interrupo)
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h> // Biblioteca padro de nomes dos RSFs do 8051
sbit LED = P0^0; // Define LED como o pino 0 da P0

void atraso_ms(int i) { // TC0 configurado para uma temporizacao de
for(i; i > 0; i--){ // aproximadamente 1ms * i (cristal de 11,0592MHz)
TMOD = (0x0F & TMOD) | 0x10; // Configura TC1 em modo 1 sem afetar TC0
TH0=0xFC; // Constante de tempo para 1ms
TL0=0x66; // Constante de tempo para 1ms
TR0=1; // Ativa temporizacao
while(!TF0); // Aguarda terminar temporizacao de 1ms
TR0=0; // Desativa temporizacao
TF0=0; // Zera a flag de fim de temporizacao
}
}

main() {
while(1) {
atraso_ms(1000); // Atraso de 1s
LED = !LED; // Apaga/acende o LED
}
}
122
TC0 para gerar um atraso de 1ms*i com interrupes desabilitadas
www.mecatronicadegaragem.blogspot.com.br
EXERCCIO PROPOSTO
Escreva um programa que mostre as horas, minutos e
segundos em um display LCD no formato hh:mm:ss.


123
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
Uma necessidade comum em sistemas microcontrolados a
troca de informao entre dispositivos. Pode-se transmitir
palavras de modo paralelo utilizando-se um fio para cada bit;

Contudo inconveniente utilizar uma grande quantidade de
fios para a transmisso de dados. Utiliza-se ento a
comunicao serial, onde os bits so transmitidos um aps o
outro em uma linha nica. A desvantagem que a
comunicao serial mais lenta comparada a paralela.

Cada vez mais est sendo usada a interface USB ao invs
dos padres mais antigos. Vrios microcontroladores
suportam esse protocolo, inclusive microcontroladores da
famlia 8051. Procure saber mais sobre essa tecnologia.
124
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
O 8051 dispe de um canal de comunicao serial com
diversos recursos como:

4 modos de operao;
Full duplex;
Programvel;
Compatibilidade com o padro RS-232 (exceto pelos nveis
de tenso);
Pode trabalhar com interrupo.

Portanto, no preciso se preocupar em desenvolver uma
comunicao serial a partir do zero, pois o 8051 faz isso por
ns. Basta configurar essa programao de acordo com nossa
necessidade.
125
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
Para comunicao com dispositivos padro RS-232 utiliza-se
conversores de nveis lgicos tais como o MAX232. Ele
converte +5V para +12V e vice-versa, 0V para -12V e vice-
versa, que o padro da comunicao serial RS-232.
126
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
Os registradores de transmisso/recepo da porta serial
so acessveis atravs do RFE SBUF. Fisicamente existem
dois SBUF mas para o software apenas um. Dependendo da
instruo, a CPU sabe qual SBUF deve ser usado;

Toda vez que o circuito recebe um byte, ele o apresenta no
SBUF e todo byte escrito no SBUF imediatamente
transmitido para a porta serial.
127
x = SBUF; // O byte recebido via serial e copiado para a variavel x

SBUF = x; // O byte da variavel x e transmitido para a porta serial
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
O RFE responsvel pela configurao da porta serial o
SCON. Neste registrador so configurados o modo de
operao, deteco de erro, reconhecimento automtico de
endereos em multiprocessamento e habilitao de
recepo de dados;

Ainda no SCON, esto presentes nono bit em
recepo/transmisso (quando habilitados) e as flags de
interrupo para recepo/transmisso;

Alm do SCON, existem mais 2 bits que atuam na
configurao da porta serial, localizados no RFE PCON. O
baud rate nos modos 1 e 3 so configurados no T/C1. Em
dispositivos que possuem um T/C2 pode-se optar para gerar
o baud rate a partir do T/C1 ou do TC2.
128
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
FE/SM0:
FE (bit de deteco de erro) setado automaticamente quando detectado um
bit de parada invlido. No resetado automaticamente, precisa ser resetado
por software para limpar estado de erro. O bit SMOD0 do RFE PCON precisa
estar em 1 para acessar o FE;
SM0 referente ao modo de operao da serial. O bit SMOD0 do RFE PCON
precisa estar em 0 para acessar SM0;

SM1: Referente ao modo de operao da serial;

SM2: Em 0 desabilita e em 1 habilita reconhecimento automtico de endereo em
multiprocessamento. Pode ser usado nos modos 2, 3 e eventualmente no 1. No
modo 0 precisa estar resetado;

REN: Habilita recepo de dados. O pino RX s ser efetivamente monitorado se
REN for 1. Em 0 o pino RX pode ser usado para outra funo;

TB8 e RB8: Nonos bits de transmisso e recepo respectivamente. Utilizados nos
modos 2 e 3;

TI e RI: flags de fim de transmisso e recepo respectivamente. No so zerados
automaticamente na rotina de interrupo e devem ser resetados por software.
129
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
130
Seleo do modo de operao da comunicao serial.
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
Taxa de transmisso/recepo da comunicao serial
(Baud Rate):

Nos modos 1 e 3 a taxa de comunicao serial
determinada a partir do T/C1 (ou T/C2 em dispositivos que
o possuam);

Geralmente programa-se o temporizador em modo 2
(recarga automtica). Nesse caso a tabela do slide a seguir
exibe os valores que devem ser armazenados em TL1 e
TH1 para o baud rate desejado;

No necessrio habilitar a interrupo de T/C1 nem
resetar a flag TF1.
131
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
132
Constantes de tempo para o T/C1 em modo recarga automtica de
acordo com o baud rate desejado











Observe que os cristais de clock de 11,0592MHz e 22,1184MHz permitem
uma excelente aproximao para a taxa desejada.
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
Ser detalhado apenas o modo 1 de operao da
comunicao serial, sem usar deteco de erro
ou reconhecimento automtico de endereos em
multiprocessamento;

suficiente para a maioria das aplicaes,
porm, existem muitas outras peculiaridades
acerca da comunicao serial que no sero
tratadas aqui;

Para maiores informaes consulte a folha de
dados e bibliografias complementares.

133
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
A seguir ser exibido um programa simples de comunicao
entre dois microcontroladores 8051 ambos com o mesmo
cdigo;

A partir de dois botes o microcontrolador envia o cdigo
para acender o LED correspondente ao boto pressionado
no outro microcontrolador;

Observe que a interrupo no distingue transmisso de
recepo, e preciso tratar esta situao no programa.
134
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
135
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h>
sbit botao0=P2^0; sbit botao1=P2^1;
unsigned char dadosRX;

void atraso_ms(int i) { // TC0 configurado para uma temporizacao
for(i; i > 0; i--){ // de aproximadamente 1ms * i (cristal de 11,0592MHz)
TMOD = (TMOD & 0xF0) | 0x01; TH0 = 0xFC; TL0 = 0x66; TR0 = 1;
while(!TF0); TR0 = 0; TF0 = 0;
}
}
void intSerial() interrupt 4 { // Rotina da interrupo da serial
if(TI) { // TRANSMISSAO
TI=0; // Reseta flag pois no e resetada automaticamente
}
if(RI) { // RECEPCAO
RI=0 // Reseta flag pois no e resetada automaticamente
P2=SBUF; // Acende LED correspondente atraves do valor recebido via serial
atraso_ms(2000);
P2=0xFF; // Aps 2 segundos apaga o LED
}
}
// CONTINUA...
136
Comunicao serial em modo 1 baud rate de 9600b/s
www.mecatronicadegaragem.blogspot.com.br
main() {
SCON = 0x50; // Configura scon em modo 1, recepcao habilitada
TMOD = 0x20; // Habilita TC1 para gerar baud rate em modo recarga automatica
TL1 = 0xFD; // Baud rate 9600
TH1 = 0xFD; // Recarga automatica para Baud rate 9600
TR1 = 1; // Ativa temporizacao
EA = 1; // Habilita uso de interrupcoes
ES = 1; // Habilita a interrupcao da serial

while(1) {
if(!botao0) { // Se botao0 for pressionado aguarda um tempo para debounce
atraso_ms(500);
SBUF=0xFB; // Transmite via serial codigo para acender LED correspondente
}
if(!botao1) { // Se botao0 for pressionado aguarda um tempo para debounce
atraso_ms(500);
SBUF=0xF7; // Transmite via serial codigo para acender LED correspondente
}
}
}
137
Comunicao serial em modo 1 baud rate de 9600b/s
www.mecatronicadegaragem.blogspot.com.br
COMUNICAO SERIAL
descrito a seguir um esboo de programa
utilizando o T/C0 em modo 3 e o T/C1 como
gerador de baud rate.

TL0 como contador de 8 bits (interrupo do TC0)
e TH0 como temporizador de 8 bits (interrupo
do TC1).
138
www.mecatronicadegaragem.blogspot.com.br
#include <reg51.h>
void intTC0() interrupt 1 { // Rotina de interrupcao vinculada ao TL0. Ocorre
// quando houver uma transicao de 1 para 0 em T0
TL0 = 0xFF; // Constante para contagem n=1
// ESCREVA SEU CODIGO AQUI
}
void intTC1() interrupt 3 { // Rotina de interrupcao vinculada ao TH0. Ocorre
// a cada 200us
TL0 = 0x48; // Recarga para 200us
// ESCREVA SEU CODIGO AQUI
}
void intSerial() interrupt 4 { // Rotina da interrupo da serial
if(TI) { // TRANSMISSAO
TI=0; // Reseta flag pois no e resetada automaticamente
// ESCREVA SEU CODIGO AQUI
}
if(RI) { // RECEPCAO
RI=0 // Reseta flag pois no e resetada automaticamente
// ESCREVA SEU CODIGO AQUI
}
}
// CONTINUA...
139
T/C0 em modo 3 e T/C1 utilizado para gerar baud rate para a
comunicao serial
www.mecatronicadegaragem.blogspot.com.br
main() {
IE = 0x9A; // Habilita uso de interrupcoes, interrupcao TC0, TC1 e serial
SCON = 0x50; // Configura scon em modo 1, recepcao habilitada
TMOD = 0x27; // TC1 como gerador de baud rate. TL0 como contador ativo por TR0.
// TH0 como temporizador ativo por TR1
TH0 = 0x48; // Constante de tempo para 200us
TL0 = 0xFF; // Constante para contagem n=1
TL1 = 0xFD; // Baud rate 9600
TH1 = 0xFD; // Recarga automatica para Baud rate 9600
TR0 = 1; // Ativa contagem
TR1 = 1; // Ativa temporizacao de 200us. Quando o T/C0 esta no modo 3 a
// temporizacao do T/C1 ja inicia ativa e so pausa se alternar o T/C1 para o modo 3

while(1) {
// ESCREVA SEU CODIGO AQUI
}
}
140
T/C0 em modo 3 e T/C1 utilizado para gerar baud rate para a
comunicao serial
www.mecatronicadegaragem.blogspot.com.br
EXERCCIO PROPOSTO
Escreva um programa para um microcontrolador transmissor e
outro programa para um microcontrolador receptor.

O transmissor deve enviar atravs da serial o caractere
correspondente ao boto pressionado em um teclado matricial
4x4. O receptor deve escrever o dado recebido em um display
LCD.


141
www.mecatronicadegaragem.blogspot.com.br
CONSIDERAES FINAIS
Foram apresentadas as funcionalidades bsicas do 8051
clssico e exemplos de interface com teclado matricial e
display de caracteres. Uma vez que compreendidos estes
conceitos no difcil estudar diferentes tipos de
microcontroladores;

Os dispositivos da famlia 8051 mais recentes possuem
outros recursos que atendem necessidades mais modernas;

Esta apresentao apenas uma introduo aos
microcontroladores. Procure estudar no s outros
dispositivos 8051 mas tambm outras famlias de
microcontroladores. Bons estudos!
142
www.mecatronicadegaragem.blogspot.com.br
REFERNCIAS
Atmel 8051 Microcontrollers Hardware Manual: Manual do fabricante.

MELO, dson. Arquitetura Padro 8051 de Microcontroladores: Uma
Introduo Apostila. Instituto Federal de Santa Catarina, 1 ed.,
Departamento de Eletrnica, 2005.

S, Marcio Cardoso de. Programao C para microcontroladores
8051. rica, 1 ed., 2005.

LIMA, Charles Borges de. Os Poderosos controladores AVR
Apostila. Instituto Federal de Santa Catarina, 1 ed., Departamento de
Eletrnica, 2009.

8051 Teoria. Disponvel em:
http://www.u8051.com.br/aulas/8051_Teoria.pdf - Acesso em
29/08/2012.

8051 Tutorial. Disponvel em: http://www.8052.com/tut8051 - Acesso em
29/08/2012.

143
www.mecatronicadegaragem.blogspot.com.br

Você também pode gostar