Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
KIT S51
Kit didtico para microcontrolador AT89S51/52
Requisitos
1. Placa
Lista de componentes:
17 resistores 10k
9 resistores 470
1 resistor 1k5
1 trimpot multivoltas 10k vertical
2 capacitores cermicos 100nF
2 capacitores eletrolticos 10uF x 16V ou 25V
2 capacitores cermicos 33pF
1 capacitor polister 330nF
1 display de 7 segmentos anodo comum vermelho
1 cristal 11,059200 MHz
1 CI AT89S51 ou AT89S52
1 CI ULN2803
1 7805 (regulador de tenso)
25 micro-swich NA para PCI (ver foto da placa)
Barra de pinos 1800 [4 pinos]
Barra de pinos fmea para PCI (mini modul
para PCI) [19 pinos]
Barra de pinos fmea torneado [42 pinos]
1 soquete torneado 40 pinos
1 soquete torneado 18 pinos
1 display LCD 16 x 2 sem backlight
Com o display
Dica para
montagem do
diplay de 7
segmentos:
soquete com
barra de pinos
fmea.
1/29
1
2
3
4
5
1
2
3
4
5
6
7
8
2/29
1
2
3
4
Alimentao +V
GRAVADOR
P1.5
P1.6
P1.7
RST
GND
CABO
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
0.33uF
C10
+V
R14
1k5
7805
VIN
U6
VOUT
R4
10K
14
13
12
11
10
9
8
7
6
5
4
3
2
1
DISPLAY
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
E
R/W
RS
Vo
Vdd
Vss
R3
10K
0.1uF
C11
R5
10K
R1
10k
GND
470
RESET
33pF
C1
8051
GND
VCC
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
U1
10uF
20
40
1
2
3
4
5
6
7
8
39
38
37
36
35
34
33
32
R10
10K
R2
+5V
+5V
R9
10K
0.1uF
C9
R8
10K
C3
R7
10K
10uF
C12
+5V
10k
R11
+5V
R6
10K
+5V
31
30
29
10
11
12
13
14
15
16
17
21
22
23
24
25
26
27
28
+5V
CH7
CH6
CH5
CH4
CH3
CH2
CH1
CH0
33pF
CRY STAL
11,0592MHz C2
RST
EA
ALE
PSEN
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
X2
P0
GND
X1
19
10uF
C5
10uF
C4
1
3
4
5
11
10
12
9
MAX232
C1+
C1C2+
C2-
T1IN
T2IN
GND
V+
V-
VCC
T1OUT
T2OUT
15
2
6
16
14
7
Title
470
R28
10uF
C8
470
Size
Document Number
Custom
V1.1
Date:
470
R27
470
R24
R26
470
R23
470
470
R13
R25
470
R12
+5V
g f + a b
8
7
6
5
4
3
2
1
1
2
3
1
6
2
7
3
8
4
9
5
SERIAL
FMEA
DB9
+5V
1
2
3
4
5
6
7
8
e d + c dp
P3
P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7
7SEG
U4
P2.7D
P2.6D
P2.5D
P2.4D
P2.3D
P2.2D
P2.1D
P2.0D
P2D
Sheet
of
C7
10uF
10uF
C6
+5V
13
8
18
17
16
15
14
13
12
11
P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7
R1IN
R2IN
1
2
3
4
5
6
7
8
P2
GND
OUT1
OUT2
OUT3
OUT4
OUT5
OUT6
OUT7
OUT8
ULN2803
COM
R1OUT
R2OUT
U3
DK
10
IN1
IN2
IN3
IN4
IN5
IN6
IN7
IN8
U2
10
9
8
7
6
1
2
3
4
5
1
2
3
4
5
6
7
8
Rev
-
2. Circuito
7
10
8
6
18-25
(D5)
(ACK)
(D6)
(D4)
(GND)
P1.5
P1.6
P1.7
RST
GND
Montagem
- Componentes: aproximadamante 60 cm. de cabo de rede (8 vias, 4 pares tranados);
conector DB25 macho para cabo;
barra de pinos 1800 [5 pinos];
- Uma via (fio) de cada par tranado para cada sinal (D5, ACK, D6, D4).
- GNDs em um nico ponto.
Cabo
conectado na
placa.
3/29
4. Aplicativos
- Para o desenvolvimento dos programas a serem gravados no microcontrolador:
RIDE - IDE Raisonance para 8051
1 Faa o download em http://www.raisonance.com/download/index.php, clicando em
Eval51. necessrio um pequeno cadastro.
2 Instale. O aplicativo chama-se RIDE. uma verso de avaliao com todas as
funcionalidades da verso completa, porm limitada a 4k de cdigo.
- Para a gravao do programa no microcontrolador:
Aec_isp.exe
Faa o Download em http://www.aec-electronics.co.nz/index.php?page_id=18.
necessrio um pequeno cadastro.
Roda em linha de comando (DOS) e grava os microcontroladores 8051 ATMEL da linha
AT89S, modelos AT89S51/52/53/8252. Comunica-se com o microcontrolador pela porta
paralela, utilizando o cabo descrito anteriormente.
5. Tutorial
1 Programa a ser gravado no microcontrolador
Passo 1.
Abrir o
RIDE:
Selecionar
AT89S51
ou
AT89S52
e clicar em OK
4/29
5/29
;fim do programa
6/29
2 Gravao e execuo
-
Passo 1.
Setup
Para escolha do
modelo de
microcontrolador e
configurao dos
lock bits.
Configure os
parmetros e
saia desta tela
fazendo um
Save setup.
(Estas configuraes
so armazenadas em
um arquivo chamado
AECPRG.CFG.)
Passo 2.
Load HEX file to
Flash buffer
Para carregar o
arquivo hexa Intel do
seu programa.
Digite o caminho inteiro
ou garanta que o .hex
est no mesmo diretrio
do aec_isc.exe.
O buffer mostrado,
indicando que o
programa foi
carregado.
(o contedo do buffer
da figura ao lado
apenas ilustrativo. No
corresponde ao do
programa tutorial.hex)
Pressione qualquer
tecla para continuar.
7/29
Passo 3.
Program
Para gravar.
OK!
Desconecte o cabo da
placa e o programa
estar rodando.
Caso tenha recebido
uma mensagem de
erro durante a
gravao, revise a
alimentao e o clock
do microcontrolador e
as conexes do cabo.
ATENO
00h
P2,#00 ;APAGA TODOS OS SEGMENTOS
8/29
9/29
Exemplo 2
;==============================================================================
;AUTOR:Fernando E. Gazzoni/GUSTAVO B. BORBA DATA: 05/2008
ARQUIVO: lcd.a51 =
;CPU: AT89S51
clk: 11,059200MHz
=
;==============================================================================
=
;Quatro chaves colocadas em P3.0, P3.1, P3.2 e P3.3 comandam o display LCD
;==============================================================================
;P3.0 = acionada -> Apaga tudo e escreve "TESTE DE DISPLAY" na primeira linha =
=
;P3.1 = acionada -> Escreve "Kit S51" na segunda linha
;P3.2 = acionada -> Apaga tudo e escreve uma frase nas duas linhas do display =
=
;P3.3 = acionada -> Apaga o que estiver escrito no display
;==============================================================================
ORG
00h
MOV
;==============================================================================
=
; INICIO DO PROGRAMA PRINCIPAL
;==============================================================================
LCALL INILCD
;-----------------------------------------------------------------------------; LEITURA DAS CHAVES
;-----------------------------------------------------------------------------MAIN:
MOV
CJNE
LCALL
JMP
A,P3
A,#11111110b,C1 ;se achave CH0 (em P3.0) for pressionada...
CH0 ;...chama subrotina CH0
MAIN
C1:
CJNE A,#11111101b,C2 ;se a chave CH1 (em P3.1) for pressionada...
LCALL CH1 ;...chama a subrotina CH1
JMP
MAIN
C2:
CJNE A,#11111011b,C3 ;se a chave CH2 (em P3.2) for pressionada...
LCALL CH2 ;... chama a subrotina CH2
JMP
MAIN
C3:
CJNE A,#11110111b,MAIN ;se a chave CH3 (em P3.3) for pressionada...
LCALL CLEARLCD ;... apaga os dados escritos no LCD
JMP
MAIN
;-----------------------------------------------------------------------------; SUBROTINA DE TRATAMENTO DA CHAVE CH0 (EM P3.0)
;-----------------------------------------------------------------------------CH0:
LCALL CLEARLCD ;...apaga todos os caracteres escritos no display
MOV
DPTR,#FRASE1
LCALL PRINTSTRING
RET
;-----------------------------------------------------------------------------; SUBROTINA DE TRATAMENTO DA CHAVE CH1 (EM P3.1)
;-----------------------------------------------------------------------------CH1:
MOV
B,#40h ;seleciona primeira coluna da segunda linha
LCALL POSCURSOR
MOV
DPTR,#FRASE2
LCALL PRINTSTRING
RET
;-----------------------------------------------------------------------------; SUBROTINA DE TRATAMENTO DA CHAVE CH2 (EM P3.2)
;-----------------------------------------------------------------------------CH2:
MOV
DPTR,#FRASE3
LCALL PRINTSTRINGALL
RET
;-----------------------------------------------------------------------------; FRASES A SEREM ESCRITAS NO DISPLAY
;-----------------------------------------------------------------------------FRASE1:
DB
'TESTE DE DISPLAY!\'
FRASE2:
DB
'Kit S51\'
FRASE3:
DB
'MICROCONTROLADORES/
ENSITEC\'
10/29
;==============================================================================
;=
SUBROTINAS PARA O DISPLAY LCD
=
;==============================================================================
;==============================================================================
;
RESUMO DAS FUNCOES
=
;==============================================================================
;
NOME
= ENTRADA =
DESCRICAO
=
;==============================================================================
;
INILCD
=
= Inicializacao do LCD
=
;-----------------------------------------------------------------------------;
CLEARLCD
=
= Apaga todos caracteres e coloca cursor no inicio =
;-----------------------------------------------------------------------------;
POSCURSOR
=
B
= Seleciona a posicao do cursor no display
=
;-----------------------------------------------------------------------------IWRITE
=
B
= Executa uma instrucao
=
;
;-----------------------------------------------------------------------------PRINTASCII
=
B
= Escreve um caractere ASCII no display
=
;
;-----------------------------------------------------------------------------PRINTBCDL
=
B
= Escreve um digito BCD (menos significativo)
=
;
;-----------------------------------------------------------------------------;
PRINTBCDHL
=
B
= Escreves dois digitos BCD
=
;-----------------------------------------------------------------------------PRINTHEXAL
=
B
= Escreve um digito hexadecimal(menos significativo=
;
;-----------------------------------------------------------------------------PRINTHEXAHL =
B
= Escreve dois digitos hexadecimal
=
;
;-----------------------------------------------------------------------------;
PRINTSTRING =
DPTR = Escreve frase em uma das linhas do display
=
;-----------------------------------------------------------------------------DPTR = Escreve frase nas duas linhas do display
=
; PRINTSTRINGALL =
;-----------------------------------------------------------------------------= Desloca caracteres escritos no LCD para direita =
;
SHIFTLCDR
=
B
;-----------------------------------------------------------------------------SHIFTLCDL
;
=
B
= Desloca caracteres escritos no LCD para esquerda =
;-----------------------------------------------------------------------------DELAY
=
R6
= Gera atraso de R6 x 0,5ms
=
;
;==============================================================================
;-----------------------------------------------------------------------------; INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: R1
; CHAMA: IWRITE, CLEARLCD, DELAY
;-----------------------------------------------------------------------------INILCD:
CLR
MOV
LCALL
MOV
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL
P0.1
;desabilita a escrita no display
R6,#50 ;gera atraso de 50x0,5ms = 25ms
DELAY
B,#00110000b ;comando para inicializacao
IWRITE
R6,#9 ;gera atraso de 9x0,5ms = 4,5ms
DELAY
IWRITE ;repete instrucao
R6,#1 ;gera atraso de 1x0,5ms = 0,5ms
DELAY
IWRITE ;repete instrucao
; Configuracao do usuario
MOV
B,#00111000b
;|||______ F = 0 -> matrizde 5x8 pontos
;||_______ N = 1-> 2 linhas
;|________ DL = 1 -> 8 bits
LCALL IWRITE
MOV
B,#00001110b
;|||____ B = 0 -> local do cursor nao pisca
;||_____ C = 1 -> cursor visivel
;|______ D = 1 -> liga o display (aparece frase)
LCALL IWRITE
MOV
B,#00000110b
;||____ SH=0 -> no desloca frase ao escrever caractere
;|_____ I/D = 1 -> cursor se move para direita
LCALL IWRITE
LCALL CLEARLCD
RET
11/29
B
B,#00000001b ;Instrucao Clear display
IWRITE
R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...
DELAY ;...clear display leva para ser executada
B,#0
;posiciona o cursor no inicio do display -> endereco 00h
POSCURSOR
B
P1,B
P0.0 ;seleciona RS = 0 (instrucao)
P0.1 ;habilita escrita
R7,#18 ;aguarda 39us para...
R7,$ ;executar o comando
P0.1 ;desabilita escrita
P1,B
P0.0 ;seleciona RS = 1 (dado)
P0.1 ;habilita escrita
R7,#20 ;aguarda 43us para...
R7,$ ;... realizar a escrita
P0.1 ;desabilita escrita
12/29
13/29
LCALL
POP
MOV
ANL
MOVC
MOV
LCALL
RET
PRINTASCII
B ;restaura conteudo de B da pilha
A,B
A,#00001111b ;separa nibble menos significativo
A,@A+DPTR ;converte caractere para ASCII
B,A
PRINTASCII
DB
'0123456789ABCDEF'
TABHEXA:
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASE EM APENAS UMA LINHA DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caractere especial: '\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRING:
PUSH
MOV
MOV
MOVC
MOV
CJNE
POP
RET
PRINTS:
WRITE:
LCALL PRINTASCII
INC
R0
JMP
PRINTS
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caracteres especiais: '/' -> quebra de linha (da primeira para a segunda)
;
'\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRINGALL:
PUSH B ;armazena conteudo de B na pilha
LCALL CLEARLCD
MOV
R0,#0 ;inicia a escrita a partir da primeira letra da frase
PRINTSALL:
MOV
MOVC
MOV
CJNE
MOV
LCALL
INC
JMP
WRITEALL:
LCALL PRINTASCII
R0
INC
JMP
PRINTSALL
FIMSTR:
CJNE
POP
RET
14/29
R7,#228
R7,$
R6,DELAY
END
Exemplo 3
;=====================================================================================
;AUTOR: Gustavo B. Borba/Fernando E. Gazzoni
DATA: 04/2007
ARQUIVO: int0.a51
;CPU: AT89S51
clk: 11,059200MHz
;=====================================================================================
;Duas chaves em P3.2 e P3.3 comandam um alarme
;=====================================================================================
;P3.3 = pressionado -> toca alarme
;P3.2 = borda de descida -> para alarme
;=====================================================================================
; Esquema eltrico simplificado:
;
; -----------+5v
/|
;
|
|
|
|
--- |
;
8 |
| U 2 |
----|
|
;
0 |
| L 8 |
----|
| Buzzer
;
5 |
| N 0 |
\
--- |
;
1 |
PINO8|
3 |PINO11
/
\|
;
|----------|
|------------ \
; ----- P2.7
-------/ 10k (potenciometro)
;
\
;
|
;
-----;
---;
-;=====================================================================================
15/29
DESLIGA
EQU
ORG
LJMP
ORG
LJMP
ORG
MOV
TCON,#00000001b
; ||||
|___
; ||||_______
; |||________
; ||_________
; |__________
IT0
TR0
TF0
TR1
TF1
=
=
=
=
=
1
0
0
0
0
->
->
->
->
->
int ext
timer 0
flag de
timer 1
flag de
MOV
TMOD,#00000001b
; ||||___ M0 = 1 -> timer 0 no...
; |||____ M1 = 0 -> ... modo 1: 16 bits
; ||_____ C/T'= 0 -> timer 0 na funcao timer
; |______ GATE= 0 -> timer 0 controlado somente por TR0
; T/C 1 nao utilizado
MOV
IP,#00000001b
; |_____ PX0 = 1 -> prioridade alta para a int ext 0
MOV
IE,#10000001b
; |
|_____ EX0 = 1 -> habilita a int ext 0
; |____________ EA = 1 -> habilita todas as ints que...
; ...estiverem habilitadas
;------------------------------------------------------------------------------------;PROGRAMA PRINCIPAL
;------------------------------------------------------------------------------------le:
JB
CLR
LCALL
SJMP
;------------------------------------------------------------------------------------; SUBROTINA QUE COMPLEMENTA P2.7 COM CICLO ATIVO DE 50% USANDO Timer 0
; OSCILACAO COM FREQ = 262Hz
;------------------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
; DESTROI: nada
;------------------------------------------------------------------------------------alarme:
MOV
MOV
SETB
JNB
CLR
CLR
CPL
JNB
RET
TH0,#0F9h
TL0,#1Eh
TR0
;dispara timer
TF0,$ ;preso
TR0
;stop timer
TF0
;zera flag overflow
P2.7 ;complementa P2.0
DESLIGA,alarme ;sai se o flag de parada estiver setado
END
16/29
Exemplo 4
;==============================================================================
DATA:05/2008
ARQUIVO:tec.a51 =
;= AUTOR: FERNANDO GAZZONI/GUSTAVO BORBA
clk: 11,059200MHz
=
;= CPU: AT89S51
;==============================================================================
=
;=
Teclado matricial: escreve o valor da tecla no display LCD
;-----------------------------------------------------------------------------=
;=
Usa as funcoes do display LCD
;==============================================================================
ORG
JMP
ORG
00h
;reset
INI
;salta para rotina principal
;reserva regio do vetor de interrupes
0050h
;incio do programa
;-----------------------------------------------------------------------------;
INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------INI:
MOV
P2,#00 ;apaga display 7 segmentos
LCALL INILCD
LCALL CLEARLCD
;-----------------------------------------------------------------------------; PROGRAMA PRINCIPAL
;-----------------------------------------------------------------------------MAIN:
LCALL
MOV
LCALL
MOV
LCALL
SJMP
;==============================================================================
=
;=
SUBROTINAS PARA LEITURA DO TECLADO MATRICIAL
;==============================================================================
;-----------------------------------------------------------------------------; SUBROTINA PARA DEBOUNCE DA LEITURA DO TECLADO MATRICIAL
; LIVRO: The 8051 Microcontroller
AUTOR: MacKenzie, I. Scott
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
; DESTROI: R4, R6
; CHAMA: READ
;
; USA DEBOUNCE DE 50 REPETICOES
;-----------------------------------------------------------------------------IN_HEX:
MOV
CALL
JNC
DJNZ
PUSH
MOV
CALL
JC
DJNZ
POP
MOV
RET
READ
RETURN:
RETURN2:
RETURN3:
;chave continua pressionada?
RETURN2 ;sim -> verifica novamente
R4,RETURN3 ;nao -> repete 50x
ACC ;recupera o codigo hexa da chave e...
R6,A ;... salva em R6
MOV
MOV
P3,A
R7,A
TEST_AGAIN:
;guarda o conteudo do acumulador
17/29
MOV
ANL
CJNE
MOV
RL
DJNZ
CLR
SJMP
MOV
MOV
CLR
SUBB
MOV
MOV
SWAP
MOV
RRC
JNC
INC
INC
INC
INC
DJNZ
SETB
MOV
CH_PRESS:
AGAIN:
HEX:
FIN:
RET
;==============================================================================
=
;=
SUBROTINAS PARA O DISPLAY LCD
;==============================================================================
;-----------------------------------------------------------------------------; INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: R6
; CHAMA: IWRITE, CLEARLCD, DELAY
;-----------------------------------------------------------------------------INILCD:
CLR
MOV
LCALL
MOV
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL
; Configuracao do usuario
MOV
B,#00111000b
;|||______ F = 0 -> matrizde 5x8 pontos
;||_______ N = 1-> 2 linhas
;|________ DL = 1 -> 8 bits
LCALL IWRITE
MOV
B,#00001110b
;|||____ B = 0 -> local do cursor nao pisca
;||_____ C = 1 -> cursor visivel
;|______ D = 1 -> liga o display (aparece frase)
LCALL IWRITE
MOV
B,#00000110b
;||____ SH=0 -> no desloca frase ao escrever caractere
;|_____ I/D = 1 -> cursor se move para direita
LCALL IWRITE
MOV
B,#00000010b ;return home -> retorna o cursor para a...
LCALL IWRITE ;...primeira linha e primeira coluna
LCALL CLEARLCD
RET
18/29
B
B,#00000001b ;Instrucao Clear display
IWRITE
R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...
DELAY
;...clear display leva para ser executada
B,#0 ;posiciona o cursor no inicio do display -> endereco 00h
POSCURSOR
B
B
A,B
A,#10000000b
B,A
IWRITE
B
P1,B
P0.0 ;seleciona RS = 0 (instrucao)
P0.1 ;habilita escrita
R7,#18 ;aguarda 39us para...
R7,$ ;executar o comando
P0.1 ;desabilita escrita
P1,B
P0.0 ;seleciona RS = 1 (dado)
P0.1 ;habilita escrita
R7,#20 ;aguarda 43us para...
R7,$ ;... realizar a escrita
P0.1 ;desabilita escrita
19/29
;
; DESTROI: A
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDL:
PUSH
MOV
ANL
ADD
MOV
LCALL
POP
RET
20/29
MOV
B,A
LCALL PRINTASCII
RET
TABHEXA:
DB
'0123456789ABCDEF'
MOV
MOVC
MOV
CJNE
POP
RET
PRINTS:
WRITE:
LCALL PRINTASCII
INC
R7
JMP
PRINTS
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R7
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caracteres especiais: '/' -> quebra de linha (da primeira para a segunda)
;
'\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRINGALL:
PUSH B ;armazena conteudo de B na pilha
LCALL CLEARLCD
MOV
R7,#0 ;inicia a escrita a partir da primeira letra da frase
PRINTSALL:
MOV
MOVC
MOV
CJNE
MOV
LCALL
INC
JMP
WRITEALL:
LCALL PRINTASCII
R7
INC
JMP
PRINTSALL
FIMSTR:
CJNE
POP
RET
21/29
; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI:
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDR:
PUSH
MOV
LCALL
POP
RET
R7,#228
R7,$
R6,DELAY
END
Exemplo 5
;==============================================================================
;= AUTOR: FERNANDO GAZZONI/GUSTAVO BORBA
DATA:05/2008
ARQUIVO:clock.a51 =
;= CPU: AT89S51
clk: 11,059200MHz
=
;==============================================================================
;=
RELOGIO DIGITAL
=
;-----------------------------------------------------------------------------;=
USA AS FUNCOES DO LCD
=
;==============================================================================
;CH0 --> Ajusta relogio
=
;CH1 --> Inicia o relogio
=
;
=
; --> Dentro do menu de ajuste:
=
;CHO --> Confirma ajuste
=
;CH1 --> Connfigura as horas
=
;CH2 --> Configura os minutos
=
;CH3 --> Zera o relogio (00:00:00)
=
;==============================================================================
;-----------------------------------------------------------------------------;
VARIAVEIS DO RELOGIO
;-----------------------------------------------------------------------------HORA
MINUTO
SEGUNDO
TESTE
EQU
EQU
EQU
EQU
40h
41h
42h
43h
;armazena
;armazena
;armazena
;testa se
as horas
os minutos
os segundos
passou 1seg para atualizar o relogio
22/29
;-----------------------------------------------------------------------------;
INICIO DO PROGRAMA E CONFIGURACAO DA INTERRUPCAO DO TIMER 1
;-----------------------------------------------------------------------------ORG
LJMP
ORG
MOV
INC
MOV
CJNE
MOV
LCALL
FIM:
RETI
;-----------------------------------------------------------------------------;
INICIALIZACAO: APENAS INT TIMER 1 HABILITADA, PRIORIDADE ALTA
;-----------------------------------------------------------------------------ORG
0050h
INICIO:
MOV IE,#00000000B ;desabilita todas as interrupcoes
MOV TCON,#00000000B
; ||||_______
; |||________
; ||_________
; |__________
TR0
TF0
TR1
TF1
=
=
=
=
0
0
0
0
->
->
->
->
timer 0
flag de
timer 0
flag de
parado
overflow do T/C 0 zerado
parado
overflow do T/C 0 zerado
MOV TMOD,#00010000B
; ||||___ M0 = 1 -> timer 1 no...
; |||____ M1 = 0 -> ...modo 1: 16 bits
; ||_____ C/T'= 0 -> timer 1 na funcao timer
; |______ GATE= 0 -> timer 1 controlado somente por TR0
;T/C 1 nao utilizado
MOV
IP,#00001000b
; |__ PT1 = 1 -> prioridade para a int do timer 1
MOV
IE,#10001000b
;|
|__ ET1 = 1 -> habilita a int do timer 1
;|____ EA = 1 -> habilita todas as ints que...
; ...estiverem habilitadas
A,P3
A,#11111110b,START ;AJUSTAR O RELOGIO?
TR1
MOV
CJNE
LCALL
LJMP
A,P3
A,#11111111b,SOLTA ;INICIAR O RELOGIO?
AJUSTE
CHAVE0
SOLTA:
START:
CJNE A,#11111101b,CHAVE0 ;INICIAR O RELOGIO?
LCALL TIMER1
LJMP CHAVE0
;-----------------------------------------------------------------------------;SUBROTINA PARA TRATAMENTO DA INTERRUPCAO EXTERNA 0
;-----------------------------------------------------------------------------AJUSTE:
MOV
CJNE
TERMINAAJUSTE:
MOV
CJNE
RET
CHAVE1:
CJNE
LCALL
R0,P3
R0,#11111110b,CHAVE1 ; terminou ajuste?
R0,P3
R0,#11111111b,TERMINAAJUSTE ; verifica se chave 0 foi solta
R0,#11111101b,CHAVE2 ; se chave 1 pressionada...
AJUSTEHORA
; ...incrementa hora
23/29
SOLTAHORA:
MOV
CJNE
LJMP
R0,P3
R0,#11111111b,SOLTAHORA
AJUSTE
CHAVE2:
CJNE R0,#11111011b,CHAVE3
LCALL AJUSTEMIN
; se chave 0 pressionada...
; ...incrementa minuto
MOV
CJNE
LJMP
SOLTAMIN:
R0,P3
R0,#11111111b,SOLTAMIN
AJUSTE
CHAVE3:
CJNE R0,#11110111b,AJUSTE ; se chave 2 pressionada...
LCALL ZERA
; ... zera o relogio
SOLTAZERA:
MOV
CJNE
LJMP
R0,P3
R0,#11111111b,SOLTAZERA
AJUSTE
A,HORA
A,#1
AJUSTEMIN:
MOV
ADD
DA
MOV
CJNE
MOV
ATUALIZAMIN:
LCALL MIN
RET
;-----------------------------------------------------------------------------;TRTAMENTO DA INTERRUPCAO DO TIMER --> SUBROTINA DO RELOGIO
;-----------------------------------------------------------------------------RELOGIO:
MOV
ADD
DA
MOV
CJNE
MOV
MOV
ADD
DA
MOV
CJNE
MOV
MOV
ADD
DA
MOV
CJNE
LCALL
RET
A,HORA
A,#1
SOMAMIN:
SOMAHORA:
;aumenta 1 hora e...
;... ajusta o numero hexa ...
; ...para o formato BCD
A
HORA,A
; atualiza a variavel hora
A,#24h,HOR ;se hora = 24: chama a rotina para...
ZERA
;... colocar o relogio em 00:00:00
B,#0Ah
;atualiza o valor...
POSCURSOR ;... dos segundos...
B,SEGUNDO ;... no display LCD
PRINTBCDHL
MIN:
MOV
B,#07h
LCALL POSCURSOR
MOV
B,MINUTO
;atualiza o valor...
;... dos minutos...
24/29
B,#04h
POSCURSOR ;atualiza o valor...
B,HORA
;... das horas...
PRINTBCDHL ;... no display LCD
MIN
B,#04h
;ajusta a posicao do cursor para o relogio...
POSCURSOR ;... ficar no meio do display
DPTR,#MEIANOITE ;escreve a frase...
PRINTSTRING
;...meia noite no display
MEIANOITE:
DB
'00:00:00\'
;==============================================================================
=
;=
SUBROTINAS PARA O DISPLAY LCD
;==============================================================================
;-----------------------------------------------------------------------------; INICIALIZACAO DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: nenhuma
; SAIDA: nenhuma
;
; DESTROI: R1
; CHAMA: IWRITE, CLEARLCD, DELAY
;-----------------------------------------------------------------------------INILCD:
CLR
MOV
LCALL
MOV
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL
P0.1
;desabilita a escrita no display
R6,#50 ;gera atraso de 50x0,5ms = 25ms
DELAY
B,#00110000b ;comando para inicializacao
IWRITE
R6,#9 ;gera atraso de 9x0,5ms = 4,5ms
DELAY
IWRITE ;repete instrucao
R6,#1 ;gera atraso de 1x0,5ms = 0,5ms
DELAY
IWRITE ;repete instrucao
; Configuracao do usuario
MOV
B,#00111000b
;|||______ F = 0 -> matrizde 5x8 pontos
;||_______ N = 1-> 2 linhas
;|________ DL = 1 -> 8 bits
LCALL IWRITE
MOV
B,#00001110b
;|||____ B = 0 -> local do cursor nao pisca
;||_____ C = 1 -> cursor visivel
;|______ D = 1 -> liga o display (aparece frase)
LCALL IWRITE
MOV
B,#00000110b
;||____ SH=0 -> no desloca frase ao escrever caractere
;|_____ I/D = 1 -> cursor se move para direita
LCALL IWRITE
LCALL CLEARLCD
RET
;------------------------------------------------------------------------------
25/29
B
B,#00000001b ;Instrucao Clear display
IWRITE
R6,#3 ;atraso de 1,5ms -> tempo que a instrucao...
DELAY ;...clear display leva para ser executada
B,#0
;posiciona o cursor no inicio do display -> endereco 00h
POSCURSOR
B
P1,B
P0.0 ;seleciona RS = 0 (instrucao)
P0.1 ;habilita escrita
R7,#18 ;aguarda 39us para...
R7,$ ;executar o comando
P0.1 ;desabilita escrita
P1,B
P0.0 ;seleciona RS = 1 (dado)
P0.1 ;habilita escrita
R7,#20 ;aguarda 43us para...
R7,$ ;... realizar a escrita
P0.1 ;desabilita escrita
26/29
; DESTROI: A
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------PRINTBCDL:
PUSH
MOV
ANL
ADD
MOV
LCALL
POP
RET
27/29
RET
TABHEXA:
DB
'0123456789ABCDEF'
MOV
MOVC
MOV
CJNE
POP
RET
PRINTS:
WRITE:
LCALL PRINTASCII
INC
R0
JMP
PRINTS
;-----------------------------------------------------------------------------; SUBROTINA PARA ESCREVER FRASES NAS DUAS LINHAS DO DISPLAY
;-----------------------------------------------------------------------------; ENTRADA: DPTR --> frase a ser escrita
; SAIDA: nenhuma
;
; DESTROI: A, R0
; CHAMA: PRINTASCII
;-----------------------------------------------------------------------------; Caracteres especiais: '/' -> quebra de linha (da primeira para a segunda)
;
'\' -> fim da frase
;
; Nao verifica se a frase cabe no display
; Precisa ser colocado o caractere '\' no final da frase
;-----------------------------------------------------------------------------PRINTSTRINGALL:
PUSH B ;armazena conteudo de B na pilha
LCALL CLEARLCD
MOV
R0,#0 ;inicia a escrita a partir da primeira letra da frase
PRINTSALL:
MOV
MOVC
MOV
CJNE
MOV
LCALL
INC
JMP
WRITEALL:
LCALL PRINTASCII
R0
INC
JMP
PRINTSALL
FIMSTR:
CJNE
POP
RET
28/29
;
; DESTROI:
; CHAMA: IWRITE
;-----------------------------------------------------------------------------SHIFTLCDR:
PUSH
MOV
LCALL
POP
RET
R7,#228
R7,$
R6,DELAY
END
29/29