Canción de programación musical de MCU "Little Star"
Solo el programa de ensamblaje de sonido musical, sin agregar luces LED, como referencia.
El código de datos ha sido cambiado a la voz de Little Star
;******************************** **** ************
ORG 0000H
SJMP PRINCIPAL
ORG 0BH
AJMP TIME0 p>
;******************Programa principal********************* ****
PRINCIPAL: MOV SP,#60
MOV TMOD,#01H ;Modo de trabajo de temporización T0
MOV IE,#82H ;Interrupción de CPU habilitado, interrupción T0 habilitada
START0: MOV 30H,#00H ;Puntero de dirección relativa TABLE
NEXT: MOV A,30H MOV DPTR,#TABLE ;Vaya a TABLE para obtener la configuración simplificada ¿Código de notación musical? Código de ritmo
MOVC A,@A+DPTR
MOV R2,A ;¿El código de notación musical simplificado obtenido se almacena temporalmente en R2
JZ ENDF ;Obtiene 00 y final
ANL A,#0FH ;No, obtiene los cuatro dígitos inferiores del código de ritmo
MOV R5,A ;Guardar el código de ritmo en R5
MOV A, R2 ; ¿Código de notación musical simplificado en A
SWAP A ;Intercambiar los 4 bits altos con los 4 bajos bits
ANL A,#0FH ;Obtener el código de notación musical simple
JNZ SING ; Si el código de notación musical simplificada obtenido no es 0, entonces sonará
<; p> CLR TR0 ; Si es 0, no sonaráSJMP DLY1 ; Subrutina de retardo de ritmo (seguida de El código de ritmo cambia y el tiempo de retardo es diferente)
;- --------------Voz----------------- ------
CANTAR: DEC A ; ¿El código de notación musical simplificada obtenido se reduce en 1?
;(La primera dirección del almacenamiento de datos de 16 bits del valor de recuento del código de notación musical simplificada es de la TABLA1 MOV 22H,A; Almacena en (22H) RL A; Multiplica por 2 porque los datos tomados ocupan dos bytes (16 bits) ;Por lo tanto, el incremento del puntero debe multiplicarse por 2 MOV DPTR,#TABLE1 ;..... El código de notación musical simplificada se convierte en el correspondiente 16- valor de recuento de bits del temporizador....... MOVC A,@A+DPTR Vaya a la TABLA1 para obtener el valor de recuento de bytes alto correspondiente MOV TH0,A ; El valor de recuento de bytes alto se almacena en TH0 y (21H) MOV 21H,A MOV A,22H Resto de 1 código de notación musical simplificado; para A RL A ;Multiplique por 2 porque los datos recuperados ocupan dos bytes (16 bits) ;Por lo tanto, el incremento del puntero debe multiplicarse por 2 INC A ;A incrementa el siguiente valor de conteo de bytes ;.....convierte el código de notación musical simplificada al valor de conteo de 16 bits correspondiente del temporizador..... ..... MOVC A,@A+DPTR ;Vaya a la TABLA1 para obtener el valor de recuento de bytes bajo correspondiente MOV TL0,A ;El valor de recuento de bytes bajo se almacena en TL0 y (20H ) MOV 20H,A SETB TR0 ; Inicia el temporizador T0 para permitir que el altavoz emita sonidos de diferentes frecuencias ;------ - ---------Retraso del ritmo----------------- DLY1: ACALL DELAY; El tiempo de la unidad básica es 1/4 Take 187ms INC 30H; ¿Anotar el siguiente código de notación musical simplificado? Código de ritmo SJMP NEXT ;---------------La canción termina------------ - -- ENDF: CLR TR0 ;Cerrar temporizador T0 AJMP START0 ;Repetir bucle ;****Subrutina de interrupción T0 (utilizada para controlar el altavoz para emitir sonidos de diferentes frecuencias)*************** TIME0: PUSH ACC PUSH PSW MOV TL0 ,20H ;Reinstalar valor de recuento MOV TH0,21H CPL P3.7 ;Sonido del controlador POP PSW POP ACC RETI ;******************retardo de latido 187ms*********** ** ************** RETARDO: MOV R7,#187;subrutina de retardo de 187 ms DLY2: MOV R4,#02 DLY3: MOV R3,#248 DJNZ R3,$ DJNZ R4,DLY3 DJNZ R7,DLY2 DJNZ R5,DELAY RET ;*******Nota la tabla de valores T (utilizada para hacer que el temporizador emita diferentes frecuencias)**DW significa que un valor de conteo ocupa dos bytes de unidad de almacenamiento *************** TABLA1: DW 64260,64400,64524,64580,64684 Bajo SO Bajo LA Bajo SI ?/Medio DO Medio; ¿RE? DW 64777, 64820, 64898, 64968, 65030; Medio MI Medio FA Medio SO Medio LA Medio SI DW 65058,65110,65157,65178,65217;Agudos DO , agudos RE, agudos MI, agudos FA, agudos SO ;************ ¿Código de notación musical simplificado? Código de ritmo (código de notación musical simple de 4 dígitos alto, bajo). código de ritmo de 4 dígitos)****************** TABLA: DB 44H,44H,84H,84H ? > DB 094H,094H,88h; DB 74H,74H,63H,63H; ?4 4 3 3? DB 52H,52H,48h; ?2 2 1 - DB 84H,84H,74H,74H DB 64H,64H,58h?; p> DB 84H, 84H, 74H, 74H; DB 44H, 44H, 84H, 84H; 1 5 5 DB 094H,094H,88h?; ?4 4 3 3? DB 52H, 52H,48h?; ?2 2 1- FIN Se agregaron luces LED, el nivel es limitado, el efecto no es muy bueno ;**** **************************************** ORG 0000H SJMP PRINCIPAL ORG 0BH AJMP TIME0 ;******************Programa principal************************ p> PRINCIPAL: MOV SP,#60 MOV TMOD,#01H ;TO modo de trabajo de sincronización MOV IE,#82H ;Interrupción de CPU habilitada, interrupción TO habilitada START0: MOV 30H,#00H ;Puntero de dirección relativa TABLE NEXT: MOV A,30H MOV DPTR,#TABLE ;¿Ir a TABLE para obtener el código de notación musical simplificado? MOVC A ,@A+DPTR MOV R2,A ;¿El código de notación musical simple obtenido? El código de ritmo se almacena temporalmente en R2 JZ ENDF. ;Obtenga 00 y finalice ANL A,#0FH ;No, tome los cuatro dígitos inferiores del código de ritmo MOV R5,A ;Guarde el código de ritmo en R5 MOV A ,R2 ;¿Código de notación musical simplificado? Código de ritmo para A SWAP A ;Intercambia los 4 bits altos con los 4 bits bajos ANL A,#0FH ;Obtener el código de notación musical simple JNZ SING; Si el código de notación musical simplificada obtenido no es 0, sonará. CLR TR0; es 0, no sonará. SJMP DLY1; subrutina de retardo de ritmo (con los cambios de código de ritmo, el tiempo de retardo es diferente) ;-------- -------Sonido------------------ ---- SING: DEC A ;El código de notación musical simplificada obtenido se reduce por 1? (La primera dirección del almacenamiento de datos de 16 bits del valor de recuento del código de notación musical simplificada es de la TABLA1 "dirección relativa" 0. Comienza a colocarse al principio, por lo que es necesario a restar por 1) MOV 22H,A; almacenar en (22H) RL A; multiplicar por 2 porque los datos tomados ocupan dos bytes (16 bits) ;Por lo tanto, el incremento del puntero debe multiplicarse por 2 MOV DPTR,#TABLE1 ;..........Código de notación musical simplificado Convertir a el valor de recuento de 16 bits del temporizador correspondiente....... MOVC A,@A+DPTR Vaya a TABLA1 para obtener el valor de recuento de bytes alto correspondiente MOV TH0,A ; El valor de recuento de bytes alto se almacena en TH0 y (21H) MOV 21H,A MOV A,22H ; Dale A RL A ;Multiplica por 2 porque los datos tomados ocupan dos bytes (16 bits) ;Por lo tanto, el incremento del puntero debe multiplicarse por 2 INC A ;A Aumenta y recupera el siguiente valor de conteo de bytes ;..........convierte el código de notación musical simplificada al valor de conteo de 16 bits correspondiente del temporizador... ....... ... MOVC A,@A+DPTR ;Vaya a la TABLA1 para obtener el valor de recuento de bytes bajo correspondiente MOV TL0,A ;El valor bajo El valor del recuento de bytes se almacena en TL0 y (20H) en MOV 20H,A SETB TR0; inicia el temporizador T0 para permitir que el altavoz emita sonidos de diferentes frecuencias. ;-------- -------Retraso del compás------------------- DLY1: ACALL DELAY; El tiempo de la unidad básica es 1/4 de tiempo 187 ms INC 30H; ¿Eliminar el siguiente código de notación musical simplificado? ¿La luz LED CPL P1.0 parpadea? > ¿CPL P1.1? CPL P1.2 CPL P1.3 CPL P1.4 CPL P1.5 CPL P1.6 CPL P1.7 SJMP NEXT ;---------------La canción termina---------- -- -- ENDF: CLR TR0 ;Cerrar temporizador T0 AJMP START0 ;Bucle repetidamente ;****Subrutina de interrupción T0 (utilizada para controlar los altavoces para emitir sonidos de diferentes frecuencias)*************** TIME0: PUSH ACC PUSH PSW MOV TL0 ,20H ;Reinstalar valor de recuento MOV TH0,21H CPL P3.7 ;Sonido del controlador POP PSW POP ACC RETI ;******************retardo de latido 187ms************** **** ******************* RETARDO: MOV R7,#187; subrutina de retraso de 187 ms DLY2: MOV R4,# 02 DLY3: MOV R3,#248 DJNZ R3,$ DJNZ R4,DLY3 DJNZ R7 ,DLY2 DJNZ R5,DELAY RET ;*******Nota la tabla de valores T (utilizada para hacer que el temporizador emita diferentes frecuencias)**DW Indica que un valor de conteo ocupa dos bytes de la unidad de almacenamiento *************** TABLA1: DW 64260,64400,64524,64580,64684 ; Bajo SO Bajo LA Bajo SI ?/Rango medio DO ¿Rango medio RE? DW 64777, 64820, 64898, 64968, 65030;Rango medio MI,Rango medio FA,Rango medio SO,Rango medio LA,Rango medio SI DW 65058,65110,65157,65178,65217;Agudos DO, agudos RE, agudos MI, agudos FA, agudos SO ;************ Musical simplificado código de notación? código de ritmo (código de notación musical simple de dígitos altos, código de ritmo de dígitos bajos)************ TABLA: DB 44H,44H,84H,84H ? 1 5 5 DB 094H,094H ,88h; - - significa que hay un ritmo DB 74H,74H,63H,63H; /p> DB 52H,52H,48h; ?2 2 1- DB 84H,84H,74H,74H; DB 64H,64H; 58h 3 3 2- DB 84H, 84H,74H,74H ; > DB 44H, 44H, 84H, 84H ; DB 74H, 74H, 63H, 63H ? 4 4 3 3? DB 52H,52H ,48h ?2 2 1- FIN