Esto requiere convertir usted mismo la partitura musical a datos hexadecimales:
Conocimientos relacionados:
1. Para generar pulsos de audio, simplemente calcule la frecuencia de un determinado audio. período de frecuencia (1/frecuencia), y luego divida este período por 2, que es el tiempo del medio período. Utilice un temporizador para contar este tiempo de medio ciclo. Cada vez que expire el temporizador, invierta la E/S del pulso de salida y luego cuente repetidamente este tiempo de medio ciclo y luego invierta la E/S. /O pin.
2. Utilice el temporizador interno del 8051 para trabajar en modo contador MODE1, y cambie los valores de conteo TH0 y TL0 para generar diferentes frecuencias.
3. Por ejemplo, la frecuencia es 523 Hz y su período T = 1/523 = 1912 us, siempre que el contador cuente 956 us/1 us = 956 y la E/S se invierta cada 956 veces, puede obtener DO de rango medio (523 Hz).
La relación entre el valor del pulso de conteo y la frecuencia es la siguiente:
N=Fi÷2÷Fr N: Valor de conteo
Fi: La temporización interna es; 1us., por lo que su frecuencia es 12MHz;
Fr: la frecuencia a generar;
4. El método de conteo es el siguiente:
T=65536. -N= 65536-Fi÷2÷Fr
Por ejemplo: supongamos que K=65536, F=1000000=Fi=1MHz, encuentre los recuentos de DO de graves (261MHz), DO de rango medio (523MHz) y valor DO agudo (1046 MHz).
T=65536-N=65536-Fi÷2÷Fr=65536-1000000÷2÷Fr=65536-500000/Fr
DO’s de bajo T=65536-500000/ 262 =63627
Treble DO's T=65536-500000/523=64580
Treble DO's T=65536-500000/1047=65059
5 .La tabla de comparación de la frecuencia de cada nota en la clave de C y el valor de conteo T es el siguiente:
Tabla 1 La tabla comparativa de la frecuencia y el valor de conteo T de cada nota en la clave de C p>
Notas
Frecuencia 1DO baja (Hz) código de notación simple (valor T) frecuencia de nota (Hz) código de notación simple (valor T)
262 63628 #4FA# 740 64860
#1DO# 277 63731 Medio 5SO 784 64898
Bajo 2RE
#2RE# 294 63835 #5SO# 831 64934
311 63928 Media 6LA 880 64968
Baja 3M 330 64021 #6 932 64994
Baja 4FA 349 64103 Media 7SI 988 65030
#4FA# 370 64185 Alta 1DO 1046 65058
Bajo 5SO 392 64260 #1DO# 1109 65085
#5SO# 415 64331 Alto 2RE 1175 65110
Bajo 6LA 440 64400 #2RE# 1245 65134
#6 466 64463 Alto 3M 1318 65157
Bajo 7SI 494 64524 Alto 4FA 1397 65178
Medio 1DO 523 64580 #4FA# 1480 65198
#1DO# 554 64633 Alto 5SO 1568 65217
中2RE 587 64684 #5SO# 1661 65235
#2RE# 622 64732 Alto 6LA 1760 65252
中3M 659 64777 #6 1865 65268
Medio 4FA 698 64820 Alto 1967 65283
Tabla 2 Comparación de latidos y códigos de latidos
Número de latidos en código de ritmo Número de tiempos en el código de ritmo
1 1/4 disparo 1 1/8 disparo
2 2/4 disparo 2 1/4 disparo
3 3/4 disparo 3 3/8 disparo
4 1 disparo 4 1/2 tiempos
5 1 y 1/4 tiempos 5 5/8 tiempos
6 1 y 1/2 tiempos 6 3/4 tiempos
8 2 tiempos 8 1
A 2 y 1/2 tiempos A 1 y 1/4 tiempos
C 3 tiempos C 1 y 1/2 tiempos
F 3 y 3/4 tiempos
Tabla 3 Ajuste de tiempo de 1/4 de tiempo de cada tecla Ajuste de tiempo de 1/ 4 tiempos de cada tecla
Valor de melodía DELAY Valor de melodía DELAY
Ajuste 4/4 125 milisegundos, ajuste 4/4 62 milisegundos
Ajuste 3/4 187 milisegundos, ajuste 3/4 94 milisegundos
Ajuste 2/4 250 milisegundos Ajuste 2/4 125 milisegundos
Tiempo de retardo de 1/4 de tiempo = 187 milisegundos
RETRASO: MOVIMIENTO
R7, #02
D2: MOV R4, #187 Para otros valores de retardo, simplemente modifique el valor aquí al valor correspondiente.
D3: MOV R3, #248
DJNZ R3, $
DJNZ R4, D3
DJNZ R7, D2
DJNZ R5, el valor del tiempo de DELAY se coloca en R5 para determinar el ritmo
RET
Pasos para crear música:
1. Primero coloque el notas de la partitura Encuentre y luego construya la secuencia de tablas de valores T.
2. Cree la tabla de valores T en TABLA1 y coloque el valor de conteo de la nota de pronunciación en "TABLA".
3. El código de notación simple (nota) es el dígito alto, el tiempo (número de tiempos) son los 4 dígitos bajos y el código de tiempo de la nota se coloca en la "TABLA" del programa.
Conocimientos relacionados:
Cada nota utiliza 1 byte. Los 4 bits altos del byte representan la altura de la nota y los 4 bits bajos representan el tiempo de la nota. 2 muestra el ritmo y la comparación de códigos de ritmo. Si 1 tiempo de tiempo es de 0,4 segundos y 1/4 de tiempo es de 0,1 segundos, el tiempo de tiempo de tiempo de tiempo se puede obtener configurando el tiempo de retardo. Si 1/4 de tiempo es 1DELAY, entonces 1 tiempo debe ser 4DELAY, y así sucesivamente. Por lo tanto, sólo se requiere el tiempo DEALY de 1/4 de tiempo y los tiempos restantes son sus múltiplos. Por ejemplo, la Tabla 3 muestra los ajustes de tiempo de 1/4 y 1/8 de tiempo.
Valor T de pronunciación de notación musical simplificada código de notación musical simplificada
5 Bajo SO 1 64260
6 Bajo LA 2 64400
7 Bajo TI 3 64524
1 Medios DO 4 64580
2 Medios RE 5 64684
3 Medios MI 3 64777
4 Medios FA 7 64820
5 Alto SO 8 64898
6 Alto LA 9 64968
7 Alto TI A 65030
1 Agudos DO B 65058
2 Agudos RE C 65110
3 Agudos MI D 65157
4 Agudos FA E 65178
5 Agudos SO F 65217 p>
Silencio 0
Código rítmico número de tiempos
1 1/4 tiempo
2 2/4 tiempo
3 3/4 tiempos
4 1 tiempo
5 1 y 1/4 tiempos
6 1 y 1/2 tiempos
8 2 tiempos
La 2 y 1/2 tiempos
C 3 tiempos
F 3 y 3/4 tiempos
Tabla 4 El código de notación musical simplificada, el valor T y el número de tiempo correspondientes a la notación musical simplificada
#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
uchar * TABLE;
código uint TABLE1 [15]={64260, 64400, 64524, 64580,
64684, 64777 , 64820, 64898,
64968, 65030, 65058, 65110,
65157, 65178, 65217}
código uchar SONG [ ]={ p>
//1. Amor tardío
//0
0x08, 0x08,
//1
0x02. , 0x12, 0x42, 0x62, 0x52, 0x42, 0x21, 11,
0x18, 0x18,
0x02, 0x22, 0x42, 0x82, 0x92, 0x82, 0x61, 0x51, 0x42. ,
p>0x58, 0x58,
//2
0x66, 0x51, 0x61, 0x84, 0x62, 0x82,
0x52, 0x62, 0x42, 0x52, 0x28,
0x52, 0x42, 0x52, 0x62, 0x94, 0x81, 0x91, 0x81, 0x61,
0x1C, 0x12, 0x82, p>
> //3
0x68, 0x02, 0x92, 0x82, 0x42,
0x5C, 0x12, 0x62,
0x58, 0x02, 0x42, 0x51, 0x41 , 0x22,
0x4C, 0x62, 0x52,
//4
0x66, 0x82, 0x92, 0x82, 0x61, 0x51, 0x41, 0x51,
0x6C, 0x52, 0x62,
0x53, 0x63, 0x52, 0x42, 0x42, 0x22,
0x1C, 0x12, 0x22,
//5
0x42, 0x44, 0x51, 0x61, 0x82, 0x84, 0x61, 0x81,
0x96, 0x82, 0x66, 0x51, 0x61,
0x56, 0x42, 0x22, 0x42, 0x82, 0x62,
0x5C, 0x62, 0x52,
//6
0x66, 0x82, 0x92, 0x82 , 0x61, 0x51, 0x41, 0x51,
0x6C, 0x52, 0x62,
0x56, 0x62, 0x52, 0x42, 0x42, 0x22,
0x1C, 0x12, 0x22,
//7
0x42, 0x44, 0x51, 0x61, 0x82, 0x84, 0x61, 0x81,
0x96, 0x82, 0x66, 0x51, 0x61,
0x56, 0x62, 0x92, 0x82, 0x62, 0x52,
0x4C, 0x62, 0x61, 0x81,
//8 p>
0x9C, 0x81, 0x91, 0x81, 0x61,
0x6C, 0x82, 0x62,
0x56, 0x42, 0x24, 0x42, 0x52,
0x6C, 0x62, 0x61, 0x81,
//9
0x9C, 0xB2, 0x92,
0x8C, 0x82, 0x92,
0xB2, 0xB2, 0xB2, 0x92, 0xD4, 0xC1, 0xD1, 0xC1, 0xB1,
0xCC, 0xB2, 0xB1, 0xC1,
//A
0xDC, 0xD2, 0xC1, 0xB1,
> 0x9C, 0x92, 0x91, 0xC1,
0x92, 0x84, 0x92, 0x82, 0x62, 0x51, 0x61, 0x51, 0x41,
0x48, 0x48,
//B
0x42, 0x41, 0x51, 0x66, 0x82, 0x91, 0xB1,
0x92, 0x86, 0x88,
0x42, 0x41, 0x51, 0x66, 0x42, 0x41, 0x51,
0x22, 0x16, 0x18,
0x86, 0x62, 0x58,
//C
0x83, 0x91, 0x62, 0x82, 0x58,
0x52, 0x62, 0x52, 0x42, 0x22, 0x12, 0x62, 0x52,
0x4C, 0x62, 0x52,
//6
0x66, 0x82, 0x92, 0x82, 0x61, 0x51, 0x41, 0x51,
0x6C, 0x52, 0x62,
0x56, 0x62, 0x52, 0x42, 0x42, 0x22,
0x1C, 0x12, 0x22,
//7
0x42, 0x44, 0x51, 0x61, 0x82, 0x84, 0x61, 0x81,
0x96, 0x82, 0x66, 0x51, 0x61,
0x56, 0x62, 0x92, 0x82, 0x62, 0x52,
0x4C, 0x62, 0x61, 0x81,
//8
0x9C, 0x81, 0x91, 0x81, 0x61,
0x6C, 0x82, 0x62 ,
0x56, 0x42, 0x24, 0x42, 0x52,
0x6C, 0x62, 0x61, 0x81,
//9
0x9C, 0xB2, 0x92,
0x8C, 0x82, 0x92,
0xB2, 0xB2, 0xB2, 0x92, 0xD4, 0xC1, 0xD1, 0xC1, 0xB1,
0xCC, 0xB2, 0xB1, 0xC1,
//A
0xDC, 0xD2, 0xC1, 0xB1,
0x9C, 0x92, 0x91, 0xC1,
0x92, 0x84, 0x9
2, 0x82, 0x62, 0x51, 0x61, 0x51, 0x41,
0x4C, 0x62, 0x61, 0x81,
//8
0x9C, 0x81, 0x91, 0x81, 0x61,
0x6C, 0x82, 0x62,
0x56, 0x42, 0x24, 0x42, 0x52,
0x6C, 0x62, 0x61, 0x81 ,
//9
0x9C, 0xB2, 0x92,
0x8C, 0x82, 0x92,
0xB2, 0xB2, 0xB2, 0x92, 0xD4, 0xC1, 0xD1, 0xC1, 0xB1,
0xCC, 0xB2, 0xB1, 0xC1,
//A
0xDC, 0xD2, 0xC1, 0xB1,
0x9C, 0x92, 0x91, 0xC1,
0x92, 0x84, 0x92, 0x82, 0x62, 0x51, 0x61, 0x51, 0x41,
0x4C. , 0x62, 0x61, 0x81,
//D
0x66, 0x51, 0x61, 0x86, 0x61, 0x81,
0x52, 0x62, 0x52, 0x42 , 0x28,
0x82, 0x91, 0x01, 0x62, 0x11, 0x52, 0x11, 0x01, 0x62, 0x54,
0x48, 0x48, 0x00}; > uchar ljsz;
uchar jpm;
uchar yfm
uchar t0 =0; p>
uchar yfm; p>
sbit Altavoz =P1^0;
uint k
void Delay1()
{
for ( k=0; klt; 20000; k );
}
void Lignt()
{ uchar t; /p>
for( t=0; tlt; 10; t )
{
P2=0xff
Retraso1(); p>
P2=0x00 ;
Retraso1();
}
}
void Lignt1()
{
P2=0xaa;
Retraso1();
P2=0x55;
1();
}
void Retraso(uchar t0)//retraso
{
while(t0--) / /Determinar el ritmo
Lignt1();
}
void Delay2(uchar w0)//Delay
{
p>
while(w0--) //Determina el ritmo
Lignt();
}
void T0Int() interrumpir 1//TIMER0
{
TL0 = ljsz
TH0 = hjsz
Altavoz=!Altavoz
}
anular ExtInt0() interrupción 0//INT0
{
if(t0gt;10)
t0 =0;
p>
i=0;
cambiar(t0 )
{
caso 0: TABLA= SONG; break; //Selecciona la primera canción
caso 1: TABLE=SONG1; //Selecciona la canción 2
caso 2: TABLE=SONG2; canción 3
caso 3: TABLE=SONG3; //Selecciona la cuarta canción
caso 4: TABLE=SONG4; //Selecciona la quinta canción
caso 5: TABLE= SONG5; //Selecciona canción 6
caso 6: TABLE=SONG6; //Selecciona canción 7
caso 7: TABLE= SONG7; break; // Selecciona la octava canción
case 8: TABLE=SONG8; //Selecciona la novena canción
case 9: TABLE=SONG9; Seleccione la décima canción
p>}
}
void songing()//Programa de pronunciación
{
i=0;
p>while(TABLE[i])
{
jpm=TABLE[i]amp; valor
yfm= (TABLE[i]gt; gt; 0x04)amp; 0x0f; // valor de notación musical simplificada
if(yfm)
//La notación musical simplificada es 1, toma el valor de conteo
{
yfm=yfm-1;
hjsz=(uchar)(TABLE1[yfm ]gt;gt ;0x08); //Obtener el byte alto del valor de recuento
TH0 = hjsz;
ljsz=(uchar)(TABLE1[yfm]); Obtenga el byte bajo del valor de recuento
TL0 = ljsz
TR0 = 1; //Iniciar TIMER0
}
else; TR0 = 0; //La notación musical simple es 0, silenciosa
Delay(jpm); //retraso del tiempo
i; >
}
void main(void)
{
TMOD =0X01 //Establece TIMER0 en MODE1
TCON =0X01; //Interrupción externa INT0, disparador de flanco descendente
IE =0x83; //Habilitar interrupción (INT0, TIMER0)
IP =0x00; p>
TABLE=SONG0 ;
while(1)
{
Lignt(
canciones(); // Llama al programa de pronunciación
TR0 = 0; // Detener TIMER0
Delay2(1); > cantando();
}
}