Teoria :
Se o cristal for de 12Mhz:
1 ciclo de máquina = 1/12MHZ * 12 => 1uS (1 microsegundo).
a Instrução "djnz r0,espera" gasta 02 ciclos de máquina (24 pulsoa de clock = 2uS).
Mas para uma contagem de 1 segundo, melhor usar um dos contadores Timer0 ou Timer1, como no exemplo abaixo:
Código :
MOV TMOD,#11H ;AMBOS OS TIMERS NO MODO1=TEMPORIZADOR SINAL INT.
MOV TCON,#00 ;AMBOS 16 BITS RECARGA AUT - INICIALM. DESLIGADOS
DELAY1S:MOV R7,#20 ;ATRASO DE 1000 MS SE R7=20(USAR R7 COMO MULTIPLICADOR DE 50)
RET: MOV TH0,#HIGH(65535-50000) ;Contador conta 50.000 vezeS X 1uS = 50mS
MOV TL0,#LOW(65535-50000) ;
SETB TR0 ;AQUI O CONTADOR É LIGADO E COMEÇA A CONTAR
JNB TF0,$ ;ENQUANTO TF0=0 AINDA NÃO CONTOU 50mS
CLR TF0 ;RESETA O FLAG DE OVERFLOW = COMPLETOU A CONTAGEM DE 50mS
DJNZ R7,RET ;REPETE A CONTAGEM DE DE 50mS POR MAIS 20 VEZES (VALOR DE R7)
CLR TR0
RET
Outro código de delay :
DELAY: MOV TMOD,#01
MOV TCON,#00
REPETE: MOV TH0,#08
;MOV TL,#DB
SETB TR0
AQUI: JNB TF0,AQUI
CLR TF0
DJNZ R4,REPETE
CLR TR0
RET
Fonte:
https://www.clubedohardware.com.br/forums/topic/900206-delay-1s-como-calcular-assembly-8051/
0 comments:
Postar um comentário