Titlelt;lt;Diseño e implementación de recordatorio de cuenta regresiva para competencia basado en microcomputadora de un solo chip (STC89C52)gt;gt;, por favor ayúdenme a escribir el programa de programación necesario
; lo adapté del sitio web del Laboratorio de Producción Electrónica. El diagrama del circuito es el de la placa de prueba de 51 microcontroladores, siempre que el LED P1.0, el botón de dial de 4 dígitos, el zumbador, K1 y. K2 se conservan. Un sistema mínimo de interruptores, circuitos de visualización, circuitos estabilizadores de voltaje y microcontroladores es suficiente.
; un temporizador de cuenta regresiva que puede configurar la hora, puede elegir 5/15/20/30/35/ Cuenta regresiva de 45/50 minutos
p>
;El tiempo de cuenta regresiva se controla mediante los 2/3/4 dígitos del interruptor DIP de cuatro dígitos,
;El segundo dígito indica 5 minutos, el tercer dígito indica 15 minutos y el cuarto dígito indica 30 minutos.
Se puede generar una cuenta regresiva de 5/15/20/30/35/45/50 minutos mediante diferentes combinaciones
; p>; El diodo emisor de luz externo del puerto P1.0 es el LED de estado, el LED siempre está encendido cuando el cronometraje no ha comenzado y el LED parpadea durante el proceso de cronometraje
; K1 es el botón de inicio, K2 es el botón de parada
a_bit?equ?20h?; tubo digital El dígito se almacena en la ubicación de la memoria
b_bit?equ?21h?; las decenas de dígitos del tubo digital se almacenan en la ubicación de la memoria
temp?equ?22h?; el valor del contador se almacena en la ubicación de la memoria
;Inicialización de encendido
MOV?P3, #0FFH; inicializa el puerto P3, configurado en nivel alto para entrada clave
MOV?P0, #0FFH Uso El tubo digital de visualización de tiempo se apaga
<; p>CLR?P1.0; enciende el indicador LED; espera la entrada del teclado
INICIO: JB?P3.6, $ Bucle para determinar si el botón de inicio K1 está presionado?
ACALL?DELAY10; Retraso de 10 milisegundos para el rebote del contacto
JB?P3.6, INICIO Si hay interferencia, regresa
JNB?P3; .6, $; Espere a que se suelte el botón
; Lea el estado del interruptor DIP para obtener el tiempo de cuenta regresiva
SET: MOV?A, # 0; A
JB?P2.0, A1; determine si el segundo bit del interruptor DIP está activado. Si está activado, agregue 5 a A (el valor aquí puede modificarlo usted mismo). /p>
ADD?A, #5
A1: JB?P2.1, A2; determine si el tercer bit del interruptor DIP está activado. Si está activado, agregue 15. a A (este valor lo puede modificar usted mismo)
ADD?A, #15
A2: JB?P2.2, A3 determina si el cuarto bit del DIP; El interruptor está activado, actívelo. Simplemente agregue 30 a A (el valor aquí puede modificarlo usted mismo)
ADD?A, #30
A3: MOV?TEMP, A
; en este momento el valor en TEMP es el tiempo de cuenta regresiva
El programa para mostrar el tiempo en el tubo digital
pantalla: CLR?P2 .4; libera el relé 1 e inicia el cronometraje (el relé está en estado de succión cuando se enciende la alimentación) Estado cerrado) (Dado que está utilizando un recordatorio de cuenta regresiva para la competencia, no necesita un relé y puede ignorarlo)
CLR?P2.3; libera el relé 2 y inicia el tiempo (el relé está en estado cerrado al arrancar)
MOV?R2, #120
AB: MOV?R3, #250
TIME1: mov?a, temp?; Cambiar el valor hexadecimal en temp ¿Convertir números del sistema a decimal?
mov?b, #10 ?; Decimal/10=decimal
div?ab
mov ?b_bit, a?; El dígito de las decenas está en a
mov?a_bit, b? ; El dígito de las unidades está en b
mov?dptr, #numtab?; Especifique la dirección inicial de la búsqueda en la tabla
mov?r0,#4;
?
dpl1: ?mov?r1, #250?;
dplop: ?mov?a, a_bit?; Toma el dígito único
MOVC?A , @A DPTR?; Verifique el código de 7 segmentos del dígito único
mov?p0, a?; Envíe el código de 7 segmentos del dígito único
clr?p2 .7?;Abrir visualización de dígitos de unidades
ACALL?DELY1; Visualización durante 1 milisegundo
setb?p2.7; Desactivar visualización de dígitos de unidades para evitar imágenes fantasma
mov?a, b_bit ?;Obtener el dígito de las decenas
MOVC?A,@A DPTR?;Comprueba los 7 segmentos del dígito de las decenas
mov?p0,a?; Enviar los 7 segmentos del código de las decenas
clr?p2.6?; activar la visualización de las decenas
ACALL?DELY1 durante 1 milisegundo
setb?p2.6; Desactive la visualización de decenas de dígitos para evitar imágenes fantasma
; inserte un segmento de programa para determinar si hay entrada clave durante el proceso de cronometraje
C1: JB? .6, B1
ACALL? DELAY10; Retraso de 10 milisegundos para eliminar la fluctuación
JB?P3.6, C1
JNB?P3.6, $; Espere a que se suelte el botón
AJMP? SET
B1: JB?P3.7, M33
ACALL?DELAY10;
JB?P3.7, B1
p>JNB?P3.7, $; Espere a que se suelte el botón
AJMP?OVER p>
M33: djnz?r3, TIME1?; Ejecución del bucle 250 veces en 2 milisegundos, el tiempo es de aproximadamente 0,5 segundos
CPL?P1.0; Haga que el LED parpadee una vez cada 1 segundo
djnz?r2, AB?; Ejecución del bucle 120 veces, el tiempo es 1 minuto
DEC?TEMP; Resta 1 del tiempo de tiempo después de un minuto.
MOV?A, TEMP
JNZ?DISPLAY; Determinar si el valor de TEMP es 0? ¿No es 0? ¿Ciclo?
; Finalizar el tiempo
OVER: CLR? P1.0; la luz indicadora LED está siempre encendida
SETB?P2.4; el relé 1 está cerrado. Cuando finaliza el temporizador, vuelve al estado en el que estaba encendido
SETB?P2.3; El relé 2 se cierra, cuando finaliza el temporizador, vuelve al estado en el que se encendió
SETB?P2.5; una bocina que sonará cuando se acabe el tiempo programado. Por supuesto, también puedes personalizar algunos métodos de recordatorio
ACALL?DELAY10;
ACALL?DELAY10;
ACALL?DELAY10;
ACALL?DELAY10;
AJMP?START Volver al estado de inicialización de encendido
<; p>; subrutina de retardo de 1 milisegundoDELY1: MOV?R4, #2
D1: MOV?R5, #248
DJNZ?R5, $
DJNZ?R4, D1
RET
; subrutina de retardo de 10 milisegundos
DELAY10: MOV?R4, #20
D2: MOV?R5, #248
DJNZ?R5, $
DJNZ?R4, D2
RET
; El código de visualización negativo del tubo digital de 7 segmentos de 0 a 9 en el tablero experimental
numtab:?DB?0CFH, 03H, 5DH, 5BH, 93H, 0DAH, 0DEH, 43H, 0DFH, 0DBH
fin