¡Pregunta por el lenguaje ensamblador de un contestador automático de ocho vías diseñado con el microcontrolador AT89C51, para que pueda mostrar 8 luces LED! ! Gracias
ORG?0000H
AJMP?MAIN
ORG?0003H
AJMP?INT0SUB
ORG?000BH
AJMP?T0INT
ORG?001BH
AJMP?T1INT
OK?EQU?20H?;Responder bandera de inicio
p>
RINGEQU?22H; Bandera de timbre
ORG?0040H
MAIN:?MOV?R1,#0FH;?El tiempo de respuesta inicial es de 15 s
MOV?R2,#0AH;?El tiempo de respuesta inicial es 10s
MOV?TMOD,#11H;?Establecer temporizador/modo 1
MOV?TH0 ,#0F0H
MOV?TL0,#0FFH;?Cuanto mayor sea la frecuencia del sonido, más nítido será
MOV?TH1,#3CH
MOV? TL1 ,#0B0H;?50ms es una interrupción por desbordamiento
SETB?EA
SETB?ET0
SETB?ET1
SETB? EX0
SETB?EX1;?Permitir cuatro interrupciones, T0/T1/INT0/INT1
CLR?OK
CLR?RING
SETB?TR1
SETB?TR0;? Ejecute el temporizador desde el principio para comenzar a mostrar FFF. Si desea volver a contar, simplemente reinicie TH1/TL1
// Consultar programa. :
INICIO:MOV?R5,#0BH MOV?R4,#0BH MOV?R3,#0BH ACALL?DISPLAY;?Muestra FFF cuando no se inicia la respuesta JB?P3.0,NEXT ACALL? JB?P3.0,NEXT;Antirrebote, si se presiona la "tecla Inicio", ejecute hacia abajo, de lo contrario saltará a la consulta de respuesta ilegal ACALL?BARK;Sonido del botón MOV?A,R1 MOV?R6,A;?Enviar R1->R6, porque R1 guarda el tiempo de respuesta SETB?OK;?El indicador de respuesta se utiliza en el programa COUNT para determinar si se debe consultar el MOV de respuesta?R3,#0AH;?La respuesta solo muestra el tiempo y el número de números extinguidos es AJMP?COUNT ;Ingrese al programa de cuenta regresiva, "Consultar el programa de respuesta efectiva" en COUNT
NEXT:JNB?P1.0,FALSE1 JNB?P1.1,FALSE2 JNB?P1.2 ,FALSE3 JNB?P1.3 ,FALSE4 JNB?P1.4,FALSE5 JNB?P1.5,FALSE6 JNB?P1.6,FALSE7 JNB?P1.7,FALSE8 AJMP?START
//Ilegal controlador de respuesta:
FALSE1:?ACALL?BARK;?Sonido del botón
MOV?R3,#01H
AJMP?ERROR
FALSE2:?ACALL?BARK
MOV?R3,#02H
AJMP?ERROR
FALSE3:?ACALL?BARK
MOV ?R3,#03H
AJMP?ERROR
FALSE4:?ACALL?BARK
MOV?R3,#04H
AJMP? ERROR
FALSE5:?ACALL?BARK
MOV?R3,#05H
AJMP?ERROR
FALSE6:?ACALL?BARK
MOV?R3,#06H
AJMP?ERROR
FALSE7:?ACALL?BARK
MOV?R3,#07H
AJMP?ERROR
FALSE8:?ACALL?BARK
MOV?R3,#08H
AJMP?ERROR
//Programa de cuenta regresiva (incluido el programa de respuesta válido): COUNT:?MOV?R0,#00H;?Restablecer temporizador de interrupción MOV?TH1,#3CH MOV?TL1,#0B0H;?Restablecer temporizador
RECOUNT:?MOV?A,R6 ;R6 guarda el tiempo de cuenta regresiva MOV?B,#0AH DIV?AB;?Divide diez y el dígito de las unidades/decenas es MOV?30H,A;El dígito de las decenas se almacena en (30H) MOV?31H,B;El dígito de las unidades se almacena en ( 31H) MOV?R5,30H?;?Tome el dígito de las decenas MOV?R4,31H?;?Tome el dígito de las unidades MOV?A,R6 CLR?C SUBB?A,#07H JNC?LARGER;Si es mayor que 5s , salte a MÁS GRANDE, si es menor o igual a Recordará MOV?A,R0 CJNE?A,#0AH,FULL en 5 segundos y se ejecutará hacia abajo durante 0,5 segundos en 1 segundo CLR?RING AJMP?CHECK
FULL:CJNE?A,#14H,CHECK?;? 1s, suena y muestra el número y borra R0, vuelve a cronometrar SETB? RING MOV? A, R6 JZ? DEC? R6; Marca de un segundo menos 1 AJMP? CHECK
LARGER:MOV?A,R0 CJNE?A,#14H,CHECK; display" DEC?R6; R6 disminuye automáticamente en 1 después de un segundo. MOV?R0, #00H
CHECK:JNB?P3.1,QUIT;?Si presiona la tecla detener para salir ACALL?DISPLAY P1.0, VERDADERO1? JNB? P1.1, VERDADERO2 JNB? P1.2, VERDADERO3 JNB? P1.3, VERDADERO4 JNB? P1.4, VERDADERO5 JNB? P1.5, VERDADERO6 JNB? P1.6, VERDADERO7 JNB?P1.7,TRUE8 AJMP?RECOUNT
SALIR:?CLR ?OK;?Si se presiona la "tecla de parada", se regresa al inicio CLR?RING ACALL?BARK AJMP?START
//Programa de procesamiento de respuesta normal:
TRUE1:?ACALL ?BARK;?Sonido del botón
MOV?A,R2
MOV?R6 ,A;?R2 le dará R6 después del tiempo de respuesta
MOV?R3,#01H
CLR?OK;?
AJMP?LOOP2
TRUE2:ACALL?BARK;
MOV?A,R2
MOV?R6,A
MOV?R3,#02H
CLR?OK
AJMP?LOOP2
TRUE3 :ACALL?BARK;
MOV?A,R2
MOV ?R6,A
MOV?R3,#03H
CLR ?OK
AJMP?LOOP2
TRUE4:ACALL?BARK;
MOV?A,R2
MOV?R6,A
MOV?R3,#04H
CLR?OK
AJMP?LOOP2
TRUE5:?ACALL?BARK;
MOV?A,R2
MOV?R6,A
MOV?R3,
#05H
CLR?OK
AJMP?LOOP2
TRUE6:?ACALL?BARK;
MOV?A,R2 p>
MOV?R6,A
MOV?R3,#06H
CLR?OK
AJMP?LOOP2
TRUE7:?ACALL?BARK;
MOV?A,R2
MOV?R6,A
MOV?R3,#07H
CLR?OK
AJMP?LOOP2
TRUE8:?ACALL?BARK;
MOV?A,R2
MOV?R6 ,A
MOV?R3,#08H
CLR?OK
AJMP?LOOP2
LOOP2:?AJMP?DISPLAY; Detenga el cronometraje y espere el retorno
SETB?RING
JNB?P3.1?,?QUIT
AJMP?LOOP2
/ /Programa de respuesta incorrecta:
ERROR:?SETB?RING;Anillo incorrecto
MOV?R5,#0BH
MOV?R4,#0BH;? FF y número de falta
LOOP3:?ACALL?DISPLAY
JNBP3.1?,?QUIT1 Esperar a que se presione la tecla "stop"
AJMP?LOOP3?
QUIT1:?CLR?RING
CLR?OK
AJMP?START
//Programa de visualización:
DISPLAY:MOV?DPTR,#DAT1;?Programa de visualización de tabla de búsqueda, que utiliza el puerto P0 como salida del puerto de selección de código de segmento/P2 bajo tres bits como salida de selección de código de bits
MOV? A,R5
MOVC?A,@A+DPTR
MOV?P2,#01H
MOV?P0,A
ACALL?DELAY
MOV?DPTR,#DAT2
MOV?A,R4
MOVC?A,@A+DPTR
MOV?P2 ,#02H MOV?P0,A ACALL?DELAY MOV?A,R3 MOVC?A,@A+DPTR MOV?P2,#04H MOV?P0,A ACALL?DELAY RET
DAT1 :DB? 00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;"Destruir","1","2","3", "4", "5", "6", "7", "8", "9", "aniquilación", "F"
DAT2:DB?3FH,?06h,5bh,4fh ,66h, 6dh,7dh,07h,7fh,6fh,00H,71H
DELAY1:?MOV?35H,#08H
LOOP0:?ACALL?DISPLAY
DJNZ ?35H,LOOP0
RET
//Retraso (usado para visualización y eliminación de rebotes):
DELAY:?MOV?32H,#12H
p>BUCLE:MOV?33H,#0AFH
BUCLE1:?DJNZ?33H,LOOP1
DJNZ?32H,BUCLE
RET
p>//Programa de sonido: BARK:SETB?RING
ACALL?DELAY1
ACALL?DELAY1
?ACALL? DELAY1
?ACALL?DELAY1
<p>CLR?RING; sonido del botón
RET
//INT0 (programa de ajuste del tiempo de respuesta R1): INT0SUB:MOV?A,R1
MOV? B,#0AH
DIV?AB
MOV?R5,A
MOV?R4,B
MOV?R3,# 0AH
ACALL?DISPLAY; Primero muestra R1 en los dos LED de tiempo
JNB?P3.2, INC0;?P3.2 es la tecla +1s. Si se presiona, se activará. saltar a INCO
JNB?P3.3,DEC0;?P3.3 es la tecla -1s. Si se presiona, salta a DECO
JNB?P3.4,BACK0; ?P3.4 Es la tecla de confirmación, si se presiona salta a BACKO
AJMP?INT0SUB
INC0:MOV?A,R1
CJNE?A ,#63H,ADD0; ?Si no es 99, suma 1 a R2. Si llega a 99, establece R1 en 0 y súmalo nuevamente
MOV?R1,#00H
<. p>ACALL?DELAY1AJMP?INT0SUB
ADD0:INC?R1
ACALL?DELAY1
AJMP?INT0SUB
DEC0:MOV?A ,R1
JZ?SETR1;Si R1 es 0,?R1 se establece en 99,
DEC?R1
ACALL?DELAY1
AJMP?INT0SUB
SETR1:?MOV?R1,#63H
ACALL?DELAY1
AJMP?INT0SUB
BACK0:? RETI
//TO interrupción de desbordamiento (programa de anillo):
T0INT:MOV?TH0,#0ECH MOV?TL0,#0FFH JNB ?RING,OUT CPL?P3.6 ?;Cuando el indicador RING es 1, el puerto P3.6 no está corto y la inversión hace que el altavoz emita un sonido de cierta frecuencia
OUT:? RETI
//Interrupción por desbordamiento T1 (programa de temporización):
T1INT:?MOV?TH1,#3CH
MOV?TL1,#0B0H
INC?R0
RETI FIN