Escolar Documentos
Profissional Documentos
Cultura Documentos
1 - Apostila8051Hari
1 - Apostila8051Hari
apenas onde for necessrio. Informaes complementares podem ser obtidas em [Inte89], [Siem90] e
[Silv94]. : http://www.ustr.net/
LOW POWER
LOW VOLTAGE
EPROM
& OTP
ENCAPSULAMENTO
MINIMIZADO
I/O
ESTENDIDAS
80C51
NCLEO
MEMRIA
1k - 32k
EEPROM
DERIVATIVES
FUNES
ESPECIAIS
CLOCK
de at 40 MHz
IC & CAN
SERIAL BUS
Pinos
40
84
84
68
68
68
68
68
68
68
68
80
68
68
Fabr.
Intel
Siemens
Siemens
Siemens
Siemens
Siemens
Siemens
Siemens
Intel
Intel
Philips
Philips
Philips
Philips
RAM
1K
256
256
256
256
256
256
256
256
256
256
256
256
256
CODE
16K
64Kx
32K
64Kx
32K
64Kx
8K
64Kx
64Kx
8K
64Kx
32K
64Kx
8K
EEL7030
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
8
0
5
1
40
39
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
VCC
P0.0 AD0
P0.1 AD1
P0.2 AD2
P0.3 AD3
P0.4 AD4
P0.5 AD5
P0.6 AD6
P0.7 AD7
EA
ALE
PSEN
P2.7 A15
P2.6 A14
P2.5 A13
P2.4 A12
P2.3 A11
P2.2 A10
P2.1 A9
P2.0 A8
P0
P2
TX
EPROM
CPU
8031
P3
RAM
LATCH
ALE
P1
RX
bits, que se denomina DPTR. Este registrador o nico que pode conter valores de 16 bits e por isso
freqentemente utilizado no endereamento da memria externa, que sempre indireto. PC contm o
endereo da prxima instruo executvel e SP aponta para o topo da pilha.
15
PC
15
SP
7
DH
DL
R0
R4
DPTR
0
B
0
R1
R5
R2
R6
R3
R7
CY
AC
F0
RS1
RS0
OV
F1
PSW
EEL7030
Bloco superior
de 128 bytes
FFH
MOV com
endereamento
indireto
80H
Bloco inferior de
128 bytes
MOV com
endereamento
direto ou
indireto
7FH
Registradores de
funes
especiais
MOV com
endereamento
direto
FFH
80H
00H
armazena na posio 20H da memria RAM interna o contedo do acumulador. Por outro lado,
para armazenar o mesmo contedo na posio 20H da memria de dados externa, o procedimento
seria:
MOV R0,#20H
MOVX @R0,A
; coloca o endereo em R0
; copia A para a posio em R0
7F
7E
7D
7C
7B
7A
79
78
0C 0B
04 03
R0 - R7
Banco 3
R0 - R7
Banco 2
R0 - R7
Banco 1
R0 - R7
Banco 0
0A
02
09
01
08
00
...
0F
07
0E
06
0D
05
2FH
...
21H
20H
1FH
18H
17H
10H
0FH
08H
07H
00H
RS0
0
1
0
1
Banco
0
1
2
3
Endereo
8051hari.29.01.2004 01/29/04 6/32
EEL7030
F8
F0
E8
E0
D8
D0
C8
C0
B8
B0
A8
A0
98
90
88
80
B
B
ACC
PSW
IP
P3
IE
P2
SCON
P1
TCON
P0
SBUF
TMOD
SP
TL0
DPL
TL1
DPH
TH0
TH1
PCON
FF
F7
EF
E7
DF
D7
CF
C7
BF
B7
AF
A7
9F
97
8F
87
1.9 As interrupes
O 8051 tem cinco fontes de interrupo: duas entradas externas (INT0 e INT1), dois
temporizadores/contadores (Timer 0 e Timer 1) e o canal de comunicao serial. Conforme descrito
na seo 0.6, as entradas das interrupes externas e o canal serial ocupam pinos da porta P3.
Os endereos de desvio das interrupes so fixos e dados pela tabela 0.6.
O 8051 permite habilitar ou desabilitar cada interrupo individualmente atravs dos bits EX0, ET0,
EX1, ET1 e ES do registrador IE (Interrupt Enable), que aparece na figura 0.12. Esses bits controlam
as interrupes externa 0, do timer 0, externa 1, do timer 1 e do canal serial, respectivamente. O bit EA
(Enable All) permite habilitar (1) ou desabilitar (0) todas as interrupes de uma s vez. Para que uma
interrupo esteja habilitada, tanto o bit correspondente quanto EA precisam estar setados.
EEL7030
Interrupo
Interrupo externa 0
Timer 0
Interrupo externa 1
Timer 1
Canal serial
Endereo
0003H
000BH
0013H
001BH
0023H
EA
...
...
ES
ET1
EX1
ET0
EX0
...
...
...
PS
PT1
PX1
PT0
PX0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
Gate1
C/T1
M1.1
M0.1
Gate0
C/T0
M1.0
M0.0
Os bits TF0 e TF1 (5 e 7) de TCON so flags associados aos Timers 0 e 1, respectivamente. Cada vez
que ocorre um overflow (passagem de FFH para 0) na contagem de um timer, o bit correspondente
setado, o que gera um pedido de interrupo (que ser atendido se a interrupo correspondente
estiver habilitada). TR0 e TR1 (bits 4 e 6) permitem habilitar ou desabilitar (parar) a contagem,
respectivamente para Timer 0 e Timer 1. Os bits de 0 a 3 deste registrador dizem respeito s
interrupes e foram discutidos na seo 0.18.
O registrador TMOD (figura 0.16b) define o modo de funcionamento dos timers, discutido logo
adiante.
1.10.2 Aplicaes
A possibilidade de se habilitar um timer externamente atravs do pino INT.x permite medir a largura
de pulsos externos. Para tanto, conecta-se o sinal cuja largura se deseja medir ao pino INT.x, com o
timer correspondente configurado como temporizador (C/T.x = 0) e com o bit GATE.x = 1. Desta
forma, a contagem avanar enquanto o sinal externo estiver em nvel alto, obtendo-se uma contagem
proporcional durao do pulso. A largura do pulso pode ento ser calculada a partir do perodo do
sinal de clock.
possvel tambm contar pulsos externos. Para tanto, conecta-se o sinal a medir ao pino T.x, com o
contador configurado como contador (C/T.x = 1) e com o bit GATE.x = 0. Desta forma, a contagem
avanar a cada pulso do sinal externo.
Os dois mecanismos acima podem ainda ser combinados para contar pulsos de um sinal externo
somente durante um intervalo de tempo determinado por outro sinal externo. Para tanto, configura-se
o timer como contador (bit C/T.x = 1) com o bit GATE.x=1. Desta forma, a contagem avanar de
acordo com os pulsos recebidos no pino Tx, mas somente enquanto o nvel em INT.x estiver em 1.
EEL7030
/12
C/T=0
overflow
Tx PIN
TLx
(5 bits)
(8 bits)
C/T=1
THx
(8 bits)
TFx
INTERRUPT
CONTROL
TRx
GATE
INTx PIN
/12
C/T=0
Tx PIN
TLx
(8 bits)
C/T=1
TRx
overflow
TFx
INTERRUPT
CONTROL
GATE
THx
INTx PIN
(8 bits)
GATE
0 se modo 3 para
timer 1
TH1
CONTROL
C/T=1
TL1
T1 PIN
C/T=0
CONTROL
TR1
TH0
OSC
overflow
TF1
(8 bits)
/12
INTERRUPT
C/T=0
T0 PIN
TL0
(8 bits)
C/T=1
overflow
TF0
INTERRUPT
CONTROL
TR0
GATE
INT0 PIN
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SMOD
...
...
...
GF1
GF0
PD
IDL
EEL7030
SM0 SM1
0
0
0
1
1
0
1
1
Modo
0
1
2
3
Tipo
Sncrona, HD
Assncrona, FD
Assncrona, FD
Assncrona, FD
Bits
8
10
Taxa de TX
Fclock/12
Varivel
Fclock/32 ou /64
Varivel
,
32
12(256 TH1)
(0.2)
onde SMOD o bit 7 do registrador PCON (figura 0.28b) e TH1 o registrador mais significativo da
contagem do timer 1.
X.C
Y.ASM
AVC
AVMAC51
SIMULADOR
X.OBJ
Y.OBJ
AVLINK
AVLIB
XY.LIB
XYZ.HEX
CARREGADOR
GRAVADOR
DE EPROM
HARDWARE
Fig. 0.30 - Conjunto de ferramentas de desenvolvimento
1.12.2.2 Montagem
A sintaxe para chamar o assembler , no caso do exemplo acima:
8051hari.29.01.2004 01/29/04 14/32
EEL7030
AVMAC51 <nome>
1.12.2.3 Linkagem
A sintaxe para chamar o linker , no caso do exemplo acima:
AVLINK51 <nome>=<novo nome>
1.12.2.4 Simulao
Um simulador um programa que roda em um determinado computador e simula a operao de uma
outra CPU. O simulador da Avocet chamado atravs do comando AVSIM51
Movimentao do cursor
F1
RUN
Esc
F10
F7
F9
Ctrl Pg Up
Scroll lock
F2
Move Breakpoint UP
Ctrl A / B
Registradores A / B
F3
Set breakpoint
Ctrl D
Data Pointer
F4
F5
Velocidade de simulao
Ctrl I
Interrupes
Alt F5
Ctrl P
PC
F6
Ctrl R
Banco de Registradores
Notao
Decimal
Hexadecimal
Binrio
255
$FF ou 0FFH
%1111 ou 1111B
1.13 Exerccios
1. Estude as instrues que aparecem no programa abaixo e procure determinar o valor do
acumulador ao final da execuo. Crie um arquivo-fonte com o programa, gere o arquivo .hex e
simule-o no AVSIM51. So necessrias as diretivas ORG e END, que constam dos anexos.
MENS
MOV R1,#3
MOV R3,#4
INC @R1
MOV A,@R1
MOV DPTR,#MENS
MOVC A,@A+DPTR
SJMP $
DB "1234567890ABCDE",0
END
2. Use o simulador para ver a troca dos bancos de registradores no programa abaixo( BANCO.asm)
ORG 2000H;
MOV A,12
INICIO: CLR RS0
CLR RS1
MOV R0,A
MOV R1,A
MOV R2,#00H
MOV R3,#00H
INC A
SETB RS0
MOV R0,A
MOV R1,A
; DADOS NO BANCO0
RS1=RS0=00
; DADOS NO BANCO1
RS1 RS0 = 01
EEL7030
MOV R2,#11H
MOV R3,#11H
INC A
CLR RS0
SETB RS1
MOV R0,A
MOV R1,A
MOV R2,#22H
MOV R3,#22H
INC A
SETB RS0
MOV R0,A
MOV R1,A
MOV R2,#33H
MOV R3,#33H
INC A
JMP INICIO
END
; DADOS NO BANCO2
RS1 RS0 = 10
; DADOS NO BANCO3
RS1
RS0 = 11
3. O programa abaixo l a porta P1. Se o valor lido for par, incrementa R2; em caso contrrio,
incrementa R1. Os dados pares so colocados na porta P2 e os dados mpares na porta P3; todos os
dados so armazenados seqencialmente a partir da posio de memria 20H
ORG 2000H
MOV R0,#20H
MOV R1,#0H
MOV R2,#0H
INICIO:MOV A,P1
MOV @R0,A
ANL A,#01
JNZ IMPAR
PAR: INC R2
MOV A,@R0
MOV P2,A
INC R0
JMP INICIO
IMPAR:INC R1
MOV A,@R0
INC R0
MOV P3,A
JMP INICIO
END
; INICIO DO ARMAZENAMENTO
; CONTADOR DOS IMPARES
; CONTADOR DOS PARES
PARIDADE.ASM e P1.DAT
; GRAVA DADO
; VER SE PAR OU IMPAR
; MOSTRA DADO
Este programa utiliza a porta P1 como porta de entrada, dentro do simulador. Esta entrada de
dados pode ser feita por meio de um arquivo (ideal quando existem muitos dados ) ou com uma
entrada manual, neste caso desloque o cursor at a porta P1 e digite ali o valor pretendido.
Tambm pode-se associar um arquivo a essa porta. Cada vez que o programa acessa a porta, um
novo caracter do arquivo lido. O valor lido o valor hexadecimal do caracter, incluindo espaos
em branco e caracteres de fim de linha (0DH, 0AH). Opcionalmente, pode-se fazer com que a
leitura do arquivo recomece do incio sempre que o programa chegar ao fim do arquivo, o que
garante uma fonte ininterrupta de dados para simulao.
Para o programa acima, crie com um editor de texto um arquivo chamado P1.DAT, contendo a
linha:
0123456789
e um ENTER no final.
Monte o programa e carregue-o no AVSIM51. Para associar o arquivo de entrada porta P1, siga os
passos abaixo:
use o comando IO, opo Open;
digite o nome do arquivo de entrada, P1.DAT;
8051hari.29.01.2004 01/29/04 17/33
EEL7030
Interpretao
registrador R0 a R7 do banco selecionado por RS1 e RS0
endereamento indireto do byte endereado por Ri; i 1
endereamento imediato; dado8 uma constante de 8 bits
endereamento imediato; dado16 uma constante de 16 bits
endereamento direto; direto um endereo da RAM interna
endereamento direto de um bit da memria RAM interna ou SFR
endereo de 16 bits (LJMP e LCALL)
endereo de 11 bits (SJMP e SCALL)
endereamento relativo (SJMP e todos os JMPs condicionais)
Significado
Origin
Equate
Funo
Definir ende. montagem
Criar sinnimos
DB <valor>
DB <valor>,..
DB <string>
%INCLUDE
END
Define byte
Define byte
Define byte
Include
End
Criar variveis
Criar vetores
Criar strings ASCII
Incluir arquivos-fonte
Indica final de programa
Exemplo
ORG 2000H
CR EQU 0DH;
LF EQU 0AH
CONTAGEM DB 00H
TABELA DB 15H, 22H, 35H
MSG DB Mensagem 1
%INCLUDE RET.ASM
END
2.3 As instrues
As tabelas a seguir apresentam o conjunto de instrues do microcontrolador 8051.
As colunas B e C indicam, respectivamente, o nmero de bytes e o nmero de ciclos de clock de
cada instruo. As colunas CY, AC e OV de cada tabela indica como cada instruo afeta,
respectivamente, os flags de carry, auxiliary carry e overflow, de acordo com a seguinte notao:
0: o flag resetado nesta operao;
1: o flag setado nesta operao
*: o flag afetado e seu valor pode ser 0 ou 1, dependendo do resultado da operao. Observe que
-: o flag no afetado.
Operando
A,Rn
A,direto
A,@Ri
A,#dado8
A,Rn
A,direto
Descrio
Soma registrador ao acumulador
Soma byte ao acumulador
Soma byte no endereo Ri a A
Soma dados imediatos a A
Soma o registrador e o carry a A
Soma byte e o carry a A
B
1
2
1
2
1
2
C
1
1
1
1
1
1
CY
*
*
*
*
*
*
AC
*
*
*
*
*
*
OV
*
*
*
*
*
*
ADDC
ADDC
SUBB
SUBB
SUBB
SUBB
INC
INC
INC
INC
DEC
DEC
DEC
DEC
INC
MUL
DIV
DA
A,@Ri
A,#dado8
A,Rn
A,direto
A,@Ri
A,#dado8
A
Rn
Direto
@Ri
A
Rn
Direto
@Ri
DPTR
AB
AB
A
1
2
1
2
1
2
1
1
2
1
1
1
2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
4
4
1
*
*
*
*
*
*
0
0
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
0
-
B
1
2
1
2
2
3
1
2
1
2
2
3
1
2
1
2
2
3
1
1
1
1
1
1
1
C
1
1
1
1
1
2
1
1
1
1
1
2
1
1
1
1
1
2
1
1
1
1
1
1
1
CY
*
*
-
AC
-
OV
-
C
1
1
1
1
1
1
2
2
2
2
1
CY
0
1
*
*
*
*
*
*
Operando
A,Rn
A,direto
A,@Ri
A,#dado8
direto,A
dir,#dado8
A,Rn
A,direto
A,@Ri
A,#dado8
direto,A
dir,#dado
A,Rn
A,direto
A,@Ri
A,#dado8
direto,A
dir,#dado
A
A
A
A
A
A
A
Descrio
AND entre registrador e acumulador
AND entre byte e acumulador
AND entre o contedo do endereo Ri e A
AND entre dado imediato e o acumulador
AND entre acumulador e byte
AND entre dado imediato e byte
OR entre registrador e acumulador
OR entre byte e acumulador
OR entre o contedo do endereo Ri e A
OR entre dado imediato e o acumulador
OR entre acumulador e byte
OR entre byte e dado imediato
XOR entre o acumulador e Registrador
XOR entre acumulador e byte
XOR entre A e o contedo do endereo Ri
XOR p/ dado imediato e o acumulador
XOR entre acumulador e byte
XOR entre byte e dado imediato
Zera o acumulador
Complementa o acumulador
Rotaciona o acumulador para a esquerda
Rotaciona A para a esquerda pelo carry
Rotaciona A direita
Rotaciona A direita pelo carry
Permuta os bits (3-0) e (7-4) de A
Operando
C
bit
C
bit
C
bit
C,bit
C,/bit
C,bit
C,/bit
C,bit
Descrio
Reseta CY
Reseta o bit endereado
Seta o CY
Seta o bit endereado
Complementa CY
Complementa o bit endereado
AND entre o bit endereado e CY
AND entre CY e complemento do bit
OR entre CY e o bit endereado
OR entre CY e complemento do bit
Copia bit endereado para CY
B
1
2
1
2
1
2
2
2
2
2
2
AC
-
OV
-
EEL7030
MOV
bit,C
2 2 -
CY
-
AC
-
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOVC
MOVC
MOVX
MOVX
MOVX
MOVX
PUSH
POP
XCH
XCH
XCH
XCHD
Descrio
A,Rn
Move registrador para acumulador
A,direto
Move byte para acumulador
A,@Ri
Move contedo do endereo Ri para A
A,#dado8
Move dados imediatos para acumulador
Rn,A
Move acumulador para registrador
Rn,direto
Move byte para registrador
Rn,#dado8
Move dados imediatos para registrador
direto,A
Move acumulador para byte
direto,Rn
Move registrador para byte
direto,direto Move da byte1 para a byte2
direto,@Ri
Move contedo do endereo Ri p/ byte
dieto,#dado8 Move dados imediatos para byte
@Ri,A
Move A para o endereo em Ri
@Ri,direto
Move byte para o endereo em Ri
@Ri,#dado8
Move dado imediato p/ endereo em Ri
DPTR,#dad16
Carrega DPTR com constante de 16 bits
A,@A+DPTR
Move byte endereado por DPTR+A para A
A,@A+PC
Move byte endereado por PC+A para A
A,@Ri
Move RAM externa (end. de 8 bits) p/ A
A,@DPTR
Move RAM externa (end. de 16 bits) p/ A
@Ri,A
Move A p/ RAM externa (end. de 8 bits)
@DPTR,A
Move A p/ RAM externa (end. de 16 bits)
Direto
Move byte para a pilha (stack)
Direto
Retira byte da pilha (stack)
A,Rn
Permuta A com Rn
A,direto
Permuta A com byte
A,@Ri
Permuta A com o contedo do endereo Ri
A,@Ri
Permuta nibble inferior de A c/ byte
B
1
2
1
2
1
2
2
2
2
3
2
3
1
2
2
3
1
1
1
1
1
1
2
2
1
2
1
1
C
1
1
1
1
1
2
1
1
2
2
2
2
1
2
1
2
2
2
2
2
2
2
2
2
1
1
1
1
OV
-
Operando
end11(2k)
end16 (64k)
end11 (2k)
end16 (64k)
end. rel.
@A+DPTR
end. rel.
end rel.
end rel.
end rel.
bit,end. rel.
bit,end. rel.
bit,end. rel.
A,direto,end. rel.
A,#dado8,end. rel.
Rn,#dado8,end. rel.
@Ri,#dado8,end. rel.
Rn,end.rel
direto,end. rel.
Descrio
Chamada de sub-rotina
Chamada de sub-rotina
Retorno de sub-rotina
Retorno de interrupo
Desvio incondicional
Desvio incondicional
Desvio incondicional
Desvio indireto relativo a DPTR
Desvio se A = 0
Desvio se A 0
Desvio se CY = 1
Desvio se CY =0
Desvio se bit = 1
Desvio se bit = 0
Desvio se bit =1; zera bit
Desvio se A byte
Desvio se A dado imediato
Desvio se Rn dado imediato
Desvio se byte endereado dado
Decrementa Rn; desvio se Rn 0
Decrementa byte e desvia se 0
Instruo sem efeito
B
2
3
1
1
2
3
2
1
2
2
2
2
3
3
3
3
3
3
3
2
3
1
C
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
1
CY
*
*
*
*
-
AC
-
OV
-
Endereos
0000H - 1FFFH
5000H - 3FFFH
LCD
4000H - 4002H
10
11
12
13
14
15
80
81
82
83
84
85
86
87
88
89
8A
8B
8C
8D
8E
8F
C0
C1
C2
C3
C4
C5
C6
C7
C8
C9
CA
CB
CC
CD
CE
CF
3.2 Restries
As portas P0 e P2, bem como os pinos P3.6 e P3.7, so usados para acessar a memria externa. Os bits
P3.0 e P3.1 e o bit 7 do registrador PCON so utilizados na transmisso de dados pelo canal serial e
portanto s podem ser utilizados por programas que, depois de carregados no kit, no faam mais uso
da comunicao com o PC.
Endereo
Funo
tempo
RAM
EQU 5000H
INICIO DA RAM
INTE0
EQU 4230H
INTT0
EQU 4240H
INTE1
EQU 4250H
EEL7030
INTT1
EQU 4260H
REGI&TI
EQU 4270H
SUBROUTINAS
Endereo
Funo
CLR_DSP
EQU 10AAH
APAGA DISPLAY
MENS
EQU 110FH
AC_DSP
EQU 10E7H
DPT_DSP
EQU 1121H
DSP_DAT
EQU 10FFH
DSP_COM
EQU 109AH
LE_TEC
EQU 1002H
LE_DAD0
EQU 0F00H
LE_DAD1
EQU 0F27H
ASCII
EQU 114CH
AD
EQU 145FH
DA
EQU 1471H
DELAY
EQU 11C8H
1ms
O redirecionamento das interrupes, no simulador, conseguido atravs das linhas finais do arquivo
ENDERED.ASM, reproduzidas abaixo. No KIT isto est gravado na EPROM.
ORG 0003H
LJMP 4230H
ORG 000BH
LJMP 4240H
ORG 0013H
LJMP 4250H
ORG 001BH
LJMP 4260H
; INT 0
; INT 0 redirecionada
; T0
; T0 redirecionada
; INT 1
; INT 1 redirecionada
; T1
; T1 redirecionada
Note que estas linhas no tm efeito sobre programas transferidos para o kit, pois este tem EPROM
nos endereos modificados. A utilidade deste redirecionamento est em permitir a execuo de
programas no simulador. Por isso, programas que utilizem tratadores de interrupo devem seguir a
estrutura dada abaixo:
ORG RAM
SJMP INICIO
ORG INTE0
...
ORG INTT1
...
INICIO: ...
END
Um outro problema que aparece no desenvolvimento de programas para o kit que o simulador
AVSIM51 no possui as sub-rotinas de servio e portanto no pode simul-las. Ento, se um programa
escrito para chamar sub-rotinas da eprom for executado no simulador, preciso tomar cuidado para
que o programa no se perca quando saltar para uma dessas sub-rotinas. A soluo adotada aqui
8051hari.29.01.2004 01/29/04 23/33
consiste em incluir, no incio do programa, o arquivo RET.ASM, que coloca instrues RET em todos
os endereos listados na tabela Desta forma, as chamadas das sub-rotinas so ignoradas durante a
simulao e no atrapalham. Mais uma vez, este arquivo s tem efeito no simulador, pois o kit tem
EPROM nesses endereos.
3.6 - Exemplos
3.6.1 Utilizao da interrupo do timer 0
O programa abaixo utiliza o timer 0 para controlar a escrita das palavras BOM e DIA no LCD,
que alternam a cada segundo.
SegundoD.asm
;**************************************************segundoD.asm
; Timer0 controla escrita de mensagem BOM DIA a cada segundo no Display
; Ulisses Percegona Neto 05.06.02
;***********************************************************
%include ENDERED.ASM
TIMER0H EQU 00BH
; valores para o timer0
TIMER0L EQU 0DCH
ORG INTT0
LJMP INTR0
ORG RAM
LJMP INICIO
;INTERRUPCAO DO TIMER 0
INTR0:
INC R0
CJNE R0,#16h,RECARGA ; 16 Int perfazem 1 segundo
MOV R0,#00
;POSICIONA CURSOR PRIMEIRA AREA LCD
CJNE R1,#0,DIA ; seleciona a mensagem
BOM:
MOV DPTR,#MENS_1
8051hari.29.01.2004 01/29/04 24/32
EEL7030
MOV A,#82H
; seleciona linha 1 e coluna 2
LCALL DSP_COM
LCALL MENS
MOV R1,#1
; alterna a mensagem
LJMP RECARGA
DIA:
MOV DPTR,#MENS_2
MOV A,#82H
; seleciona linha 1 e coluna 2
LCALL DSP_COM
LCALL MENS
MOV R1,#0
; alterna a mensagem
RECARGA:
MOV TH0,#TIMER0H
MOV TL0,#TIMER0L
RETI
INICIO: LCALL CLR_DSP
;R0 = USADO PARA CONTROLE DE ESTOURO DO TIMER 0
MOV R0,#0 ; 16 ESTOUROS = 1 segundo
MOV R1,#0 ; R1 =USADO PARA INDICAR 0=BOM!!!!! 1=!!!!!DIA
MOV TMOD,#01h ; TIMER 0 NO MODO DE CONTAGEM 1
MOV TH0,#TIMER0H
;Valor inicial do Timer0
MOV TL0,#TIMER0L
SETB ET0 ;
HABILITAR TIMER 0 GERAR INTERRUPCAO
SETB EA ;
HABILITA TODAS INTERRUPCOES
SETB TR0 ;
DISPARA TIMER0
SJMP $
;
AGUARDA INTERRUPCAO
MENS_1: DB 13,"!!!!!Bom!!!!!"
MENS_2: DB 13,"!!!!!Dia!!!!!"
END
; Freq Cristal = 12MHZ ==> Periodo =0.00000008333S (1/12MHZ)
; O TIMER incrementa a cada 12 perodos de clock
; Quero uma pausa de 1 segundo, Logo, necessito de 1000000 perodos (1s/12Periodo)
; Como o topo de contagem mximo do TIMER e' 65536 (0..65535)
; Necessitarei de 15,2588 estouros do TIMER de 65536.
; Como o microcontrolador trabalha apenas com nmeros inteiros usamos 16 contagens, 65536*15 = 1048580
; 1048580 ultrapassa 1000000 de 43576. Esta diferena se tira em cada contagem, ou seja, o TIMER no partir de 0
; 65536 - 3036 = 62500 que multiplicado por 16 da 1000000
; 3036 HEXA e' 0BDCH. Logo, sempre Inicializo TH0=0BH e TL0=DCH
LIMPAR DISPLAY
CONTADOR DE NMEROS IMPARES
CONTADOR DE NMEROS PARES
ENTRADA DO TECLADO
SALVAR VALOR LIDO
VER SE PAR OU IMPAR
DESVIA SE PAR
DEFINIR AREA1
PAR:
FIM:
MENS1
MENPAR
MENIMP
CALL NUMLCD
; MOSTRAR VALOR IMPAR
DJNZ R1,LACO
; CONTADOR
MOV DPTR,#MENIMP
; ATINGIU N IMPARES
SJMP FIM
MOV A,#0
; POSICIONAR AREA2
CALL AREA2
POP ACC
; RECUPERAR VALOR
CALL NUMLCD
; IMPRIMIR PARES NA AREA2
DJNZ R4,LACO
MOV DPTR,#MENPAR
; ATINGIU N PARES
CALL APAGA
CALL MENLCD
; MOSTRA MENSAGEM DE FINAL ATINGIDO
CALL MENTER
SJMP $
; PERMANECE PRESO NESTE LACO
DB ' ENTRE COM UM NUMERO < 255 ',CR,LF
DB ' O PROGRAMA IRA DETECTAR SE SAO PARES OU IMPARES ',CR,LF
DB ' O PROGRAMA TERMINA COM A ENTRADA DE 4 DO MESMO TIPO',CR,LF,0
DB '4 PARES ',0
DB '4IMPARES',0
END
3.6.3 Exercicios
1. Fazer um programa para apagar as duas reas do display e escrever a letra A na terceira coluna da 1
LINHA e o numero 2 na 4 coluna da 2.
2. Fazer um contador hexadecimal que coloque este valor na porta P1.
3. Alterar o contador acima para fazer uma contagem decimal e mostrar os valores de forma legvel no
display de cristal lquido (incluir um delay) para permitir a leitura.
4. Mostrar o contedo de 16 posies de memria, a partir de uma posio de memria solicitada ao
operador pelo teclado, no terminal de vdeo. Defina uma tecla para avanar para a linha seguinte e
outra para retroceder.
5. Fazer um programa que gere uma onda quadrada na porta P1.7.
6. Gerar uma onda quadrada, em P1.0, com a maior freqncia possvel. Qual esta freqncia ?
7. Fazer um programa que gere uma onda retangular na porta P1.7.
8. Fazer um programa para ler a porta P1 e mostrar o resultado em hexadecimal, binrio e decimal no
LCD.
9. Contar o numero de vezes que a sada P1.7 foi colocada em nvel baixo. Mostrar este valor em
decimal na LINHA1 e em hexadecimal na LINHA 2.
10.Incrementar o contedo da posio de memria 20H de uma unidade cada vez que a porta P1.7
baixar para o nvel zero. Se o bit P1.6 for para o nvel baixo este valor deve ser decrementado em
uma unidade. Mostrar o contedo desta posio de memria no vdeo e no display.
11.Fazer um programa que gere uma onda quadrada na sada P1.7 usando o temporizador T0.
12.Gerar uma forma de onda retangular na sada P1.6 do 8031. A onda retangular deve ter um nvel
alto durante 25 microsegundos e um nvel baixo durante 40 microsegundos.
13.Gerar uma forma de onda retangular na sada P1.6 do 8031. A onda retangular deve ter um nvel
alto durante 350 milisegundos e um nvel baixo durante 180 milisegundos.
14.Gerar uma onda quadrada na sada P1.7 usando o temporizador T0. O programa principal deve ler
um nmero no teclado, carregar para o temporizador (THx) e mostrar o valor hexadecimal da tecla
no terminal e no LCD.
15.Usar o timer para gerar uma onda quadrada P1.7 com freqncia varivel e proporcional aos 4 bits
menos significativos de P1.
8051hari.29.01.2004 01/29/04 26/32
EEL7030
16.Fazer um programa que possa medir a freqncia de um sinal colocado na sada P1.7. Quais so os
limites e erros nestas medies.
17.Medir o intervalo de tempo em que a onda retangular gerada no exerccio 7 permanece em nvel
alto. Quais so os limites existentes nesta medida de tempo ?
18.Fazer a leitura de 8 nmeros da porta P2 e colocar os valores na memria interna a partir do
endereo 40H. Classificar estes nmeros por ordem crescente e coloca-los nesta ordem a partir da
posio de memria 50H. As duas seqncias tambm devem ser mostradas no terminal de vdeo e
no display LCD. Criar um arquivo com os dados para a sua utilizao no simulador.
19.Ler um nmero na porta P1 que representa o nmero de bytes que devem ser somados a partir do
endereo 2000H. Colocar o resultado nos endereos 20 e 21H da memria interna do
microcontrolador
4 O kit de desenvolvimento WF
4.1 Apresentao
O sistema WF8031 v. 2.0 tem uma CPU 8031. Pode comunicar-se com um PC atravs do canal serial,
atravs do qual possvel transferir programas desenvolvidos no PC para o kit. Este conta ainda com
outros componentes, listados na tabela 2.2 juntamente com os endereos que ocupam.
Componente
Endereos
0000H - 1FFFH
2000H - 3FFFH
LCD
4000H - 4002H
Tab. 4.1 - Componentes perifricos do kit WF
O display de cristal lquido (LCD) possui uma linha, dividida em duas reas de oito colunas, conforme
mostra a figura 2.2.
REA 1
0
REA 2
5
4.2 Restries
As portas P0 e P2, bem como os pinos P3.6 e P3.7, so usados para acessar a memria externa. Os bits
P3.0 e P3.1 e o bit 7 do registrador PCON so utilizados na transmisso de dados pelo canal serial e
portanto s podem ser utilizados por programas que, depois de carregados no kit, no faam mais uso
da comunicao com o PC. Alm disso, o timer 1 utilizado para determinar a taxa de transmisso do
canal serial e portanto tambm s pode ser usado em outras aplicaes se no houver necessidade de
comunicao atravs do canal serial.
preciso tomar muito cuidado com instrues que manipulem os registradores SCON, PCON,
TMOD e TCON para evitar que as configuraes do timer 1 e do canal serial no sejam alteradas
involuntariamente. Se isto acontecer, a comunicao com o PC pode apresentar problemas.
APAGA
APAGAT
LEBYTE
NUMTER
NUMLCD
CARLCD
AREA1
AREA2
MENLCD
APACUR
ACECUR
HOMCUR
OUTLCD
CARTER
MENTER
LENUM
LEMENS
TECPRES
CODTECL
Endereo
0089H
0196H
00D0H
0164H
013EH
0071H
00A4H
00ADH
00B6H
009BH
01BDH
0092H
0059H
01AAH
0118H
00DDH
00F3H
01C6H
01DAH
Descrio
tempo
Apaga display
Apaga terminal de vdeo
L numero digitado no teclado (byte fica em a )
Imprime numero no terminal, (valor de a)
Imprime numero no display (valor de a)
Imprime caracter no display (valor de a)
Posiciona cursor do display na rea 1, (coluna em A)
Posiciona cursor do display na rea 2, (coluna em A)
Imprime mensagem no display (inicio=DPTR, 0 =fim)
Apaga cursor do LCD
Acende cursor do LCD
Home cursor do LCD
Comando para LCD
Imprime caracter no terminal de vdeo (dado de A)
Imprime mensagem n terminal de vdeo, inicio=DPTR
L numero digitado no terminal,(numero em A)
L mensagem digitada no terminal, (DPTR=endereo)
Faz CY = 1 se alguma tecla foi pressionada
L o cdigo da tecla pressionada, (valor em A)
1,5ms
1,5ms
1,1ms
40s
60s
40s
40s
64s/D
1,1ms/D
1,1ms/D
EEL7030
Descrio
Endereo
Incio da RAM
2000H
2003H
200BH
2013H
201BH
; INT 0
; INT 0 redirecionada
; T0
; T0 redirecionada
; INT 1
; INT 1 redirecionada
; T1
; T1 redirecionada
Note que estas linhas no tm efeito sobre programas transferidos para o kit, pois este tem EPROM
nos endereos modificados. A utilidade deste redirecionamento est em permitir a execuo de
programas no simulador. Por isso, programas que utilizem tratadores de interrupo devem seguir a
estrutura dada abaixo:
ORG RAM
SJMP INICIO
ORG 2003H
...
ORG 200BH
...
INICIO: ...
END
Um outro problema que aparece no desenvolvimento de programas para o kit WF que o simulador
AVSIM51 no possui as sub-rotinas de servio e portanto no pode simul-las. Ento, se um programa
escrito para chamar sub-rotinas da tabela 4.4 for executado no simulador, preciso tomar cuidado para
que o programa no se perca quando saltar para uma dessas sub-rotinas. A soluo adotada aqui
consiste em incluir, no incio do programa, o arquivo RET.ASM, que coloca instrues RET em todos
os endereos listados na tabela 4.4. Desta forma, as chamadas das sub-rotinas so ignoradas durante a
simulao e no atrapalham. Mais uma vez, este arquivo s tem efeito no simulador, pois o kit tem
EPROM nesses endereos.
um montador, AVMAC51;
um linkador, AVLINK51;
um conversor de arquivo HEX (texto) para BIN (binrio), HEXBIN;
um programa para transferir o arquivo do PC para o kit, LINK8031.
Para agilizar a compilao, pode-se criar um arquivo bat com o contedo listado abaixo.
avmac51 %1
@pause
avlink51 %1=%1
hexbin %1.hex %1.bin I
Porta selecionada
03F0H (COM 1)
02F0H (COM 2)
03E0H (COM 3)
02E0H (COM 4)
4.6 Exemplos
4.6.1 Utilizao da interrupo do timer 0
O programa abaixo utiliza o timer 0 para controlar a escrita das palavras BOM e DIA no LCD,
que alternam a cada segundo.
Segundo.asm
%INCLUDE ENDERECO.ASM
TIMER0H EQU 10H
TIMER0L EQU 01H
ORG RAM
LJMP INICIO
;INTERRUPCAO DO TIMER 0
ORG 200BH
INC R0
CJNE R0,#15,RECARGA ; 15 Int perfazem 1 segundo
MOV R0,#00
MOV A,#0
; cursor na coluna 0
8051hari.29.01.2004 01/29/04 30/32
EEL7030
LCALL AREA1
CJNE R1,#0,DIA
BOM:
MOV DPTR,#MSGBOM
LCALL MENLCD
MOV R1,#1
SJMP RECARGA
DIA:
MOV DPTR,#MSGDIA
LCALL MENLCD
MOV R1,#0
RECARGA: MOV TH0,#TIMER0H
MOV TL0,#TIMER0L
RETI
INICIO: LCALL APAGA
MSGBOM
MSGDIA
;
;
;
;
;
;
;
;
;
;
;
MOV R0,#0
MOV R1,#0
MOV TMOD,#1
MOV TH0,#TIMER0H
MOV TL0,#TIMER0L
SETB ET0
SETB EA
SETB TR0
SJMP $
DB "!!!!!BOM",0
DB "DIA!!!!!",0
END
; da rea 1 do LCD
; seleciona a mensagem
; alterna a mensagem
; alterna a mensagem
LIMPAR DISPLAY
CONTADOR DE NMEROS IMPARES
CONTADOR DE NMEROS PARES
ENTRADA DO TECLADO
SALVAR VALOR LIDO
VER SE PAR OU IMPAR
DESVIA SE PAR
DEFINIR AREA1
PAR:
FIM:
MENS1
MENPAR
MENIMP
DJNZ R1,LACO
; CONTADOR
MOV DPTR,#MENIMP
; ATINGIU N IMPARES
SJMP FIM
MOV A,#0
; POSICIONAR AREA2
CALL AREA2
POP ACC
; RECUPERAR VALOR
CALL NUMLCD
; IMPRIMIR PARES NA AREA2
DJNZ R4,LACO
MOV DPTR,#MENPAR
; ATINGIU N PARES
CALL APAGA
CALL MENLCD
; MOSTRA MENSAGEM DE FINAL ATINGIDO
CALL MENTER
SJMP $
; PERMANECE PRESO NESTE LACO
DB ' ENTRE COM UM NUMERO < 255 ',CR,LF
DB ' O PROGRAMA IRA DETECTAR SE SAO PARES OU IMPARES ',CR,LF
DB ' O PROGRAMA TERMINA COM A ENTRADA DE 4 DO MESMO TIPO',CR,LF,0
DB '4 PARES ',0
DB '4IMPARES',0
END
EEL7030
P2
P0
74LS04
P1.0
P1.1
.
.
P1.7
P3.2
P3.3
P3.4
P3.5
Vcc
470
CH1
CH8
CH9
CH12
74LS04
Led1 P1.0
CPU
J1
Latch
EPROM
2732
Reset
Serial
8031
CH7
CH8
P1
Led8 P1.7
Fonte
Dispaly LCD
74LS04
CH9
CH10
CH11
CH12
Led9 P3.2
P3.3
P3.4
Led12 P3.5
Trafo
P3
A placa com os Leds e as chaves est sobrecarregando a fonte e fazendo com que a tenso de
alimentao caia a ponto de impedir a transmisso serial para o PC. Por isso deve-se retirar o Jumper
J1 para fazer o Download do programa e aps recolocar os jumper caso seja necessrio.