Buscamos expertos: diseño de timbre musical basado en MCU, incluido el programa C completo.
#include
sbit sound=P3^7 //Definir el bit de sonido como P3.7
p>
unsigned int C; //Almacena la constante de tiempo del temporizador
// La siguiente es la macro de audio de tonos medios definida en lenguaje C
#define dao 523 //Definir macro "dao".
#define xi 987 //Defina la macro "xi" como la frecuencia del centro "7", 523 Hz
/************** ** ******************************
Función: 1 unidad de retardo, 200ms
*******************************************/
retraso nulo()
{
carácter sin firmar i,j
for(i=0;i<250;i++)
for(j=0;j<250;j++)
}
/****************** ****** **********************
Función Función:
***** ************ *************** *******************/
void main(void)
{
unsigned char i,j
//La siguiente es la canción "Two Tigers" p>
unsigned int code f[]={dao ,re,mi,dao, // Cada línea corresponde a la nota de un compás
dao,re,mi,
mi,fa,sao,
mi ,fa,sao,
sao,la,sao,fa,mi,dao,
sao,la ,sao,fa,mi,dao,
dao,sao,dao,
dao,sao,dao,
0xff};
// La siguiente es la partitura de tiempo simple de cada nota
// "4" corresponde a 4 unidades de retraso, "2" corresponde a 2 unidades de retraso, "1" corresponde a 1 unidad de retraso
// "1" corresponde a 1 unidad de tiempo de retardo.
código de carácter sin firmar JP[ ]={2,2,2,2,
2,2,2,2,
2,2,3 ,
2,2,3,
1,2,2, 1,2,2,
1,2,2,2,1, 2,2,
2,2,2,
2,2,2,
2,2,2,
2,2,2,
2,2,2,
};
EA=1; // Permitir interrupción del temporizador T0
TMOD=0x00; // Usar el modo 1 del temporizador T0 (contador de 13 bits)
while(1) // Bucle infinito
{
i=0; // Comienza a tocar desde la primera nota f[0]
while(f[i]!
C= 460830/f[i];
TH0=(8192-C)/32; // Se puede demostrar que este es el método para asignar el valor inicial a los 8 bits superiores de los 13 bits. contador TH0
TL0=(8192-C)%32;
TL0=(8192-C)%32 //Se puede demostrar que este es el valor inicial asignado a los 8 bits inferiores del método TL0 del contador de 13 bits
TL0=(8192-C)%32
TR0=1 //inicia el temporizador T0
<; p> for(j=0;jdelay(); //retraso por 1 unidad de tiempo
TR0=0; //apaga el temporizador T0
i++; //reproduce la siguiente nota
}
}
}
}
/************************************ ************ *************
Función: Interrumpir la subrutina de servicio del temporizador T0
** ********** **************************************** ********/
void Time0(void ) interrupción 1 uso 1
{ <
sonido=!sound; nivel de salida del pin P3.7 para formar una onda cuadrada
TH0=(8192-C)/32 // Se puede demostrar que este es el método de asignación alta de 8 bits del de 13 bits; contador TH0
TL0=(8192-C)%32;
TL0=(8192-C)%32 //Se puede demostrar que este es el método de asignación inicial. valor a los 5 bits inferiores del contador de 13 bits TL0
}