简明易懂易上手!
单片机产生音乐的原理:
音乐的产生主要是通过单片机的I/O口输出高低不同的脉冲信号来控制蜂鸣器发音,要想产生音频脉冲信号,需要算出某音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用单片机定时器计时这个半周期的时间,每当计时到后就输出脉冲的I/O口反相,这样就在此I/O口上得到此脉冲的频率。
通常,利用单片机的内部定时器0,工作在方式一下,改变计数初始值TH0和TL0来产生不同的率。
例如,若单片机采用12MHzs晶振,要产生频率为587Hzs的音频脉冲时,其音频信号的脉冲周期T=1/587=1703.5775us,半周期时间为852us,因此总要令计时器计数=852us/1us=852,在每计数852时将I/O口反相,就得到C大调的中调Re。
由于定时器0的在方式一计数方式为16位计数器,最多只能装载的数为2的16次方即65536个,也就是说定时器计数到65536就会进入中断函数,而在中断函数中将输出脉冲的I/O口反相即可,故只需设置好定时器0的初值就可以了发出特定的音频了。初值与音频的对应关系见下表所示:
音频 | 定时器初值 |
低1do | 63628 |
低2re | 63835 |
低3mi | 64021 |
低4fa | 64103 |
低5so | 64260 |
低6la | 64400 |
低7si | 64524 |
中1do | 64580 |
中2re | 64684 |
中3mi | 64777 |
中4fa | 64820 |
中5so | 64898 |
中6la | 64968 |
中7si | 65030 |
高1do | 65058 |
高2re | 65110 |
高3mi | 65157 |
高4fa | 65160 |
高5so | 65217 |
高6la | 65252 |
高7si | 65282 |
/*心中有江山的人岂能快意潇洒*/
for(s=0;s<13;s++)
{
i=song-1;
Timer0_init();
Timer0_init();
delay_ms(450);
}
delay_ms(500);
/*我只求于你共华发*/
for(s=0;s<8;s++)
{
i=song1-1;
Timer0_init();
Timer0_init();
delay_ms(450);
}
delay_ms(700);
/*剑出鞘,恩怨了*/
for(s=1;s<3;s++)
{
i=4;
Timer0_init();
Timer0_init();
delay_ms(450);
i=5;
Timer0_init();
Timer0_init();
delay_ms(450);
i=9;
Timer0_init();
Timer0_init();
delay_ms(700);
}
/*谁笑*/
i=7;
Timer0_init();
Timer0_init();
delay_ms(450);
i=8;
Timer0_init();
Timer0_init();
delay_ms(1000);
/*我只求今朝拥你入环抱*/
for(s=0;s<9;s++)
{
i=song2-1;
Timer0_init();
Timer0_init();
delay_ms(450);
}
delay_ms(100);
i=7;
Timer0_init();
Timer0_init();
delay_ms(1000);
/*红尘客栈风似刀*/
for(s=0;s<7;s++)
{
i=song3-1;
Timer0_init();
Timer0_init();
delay_ms(450);
}
delay_ms(1000);
/*骤雨落宿命敲*/
for(s=0;s<6;s++)
{
i=song4-1;
Timer0_init();
Timer0_init();
delay_ms(450);
}
delay_ms(1000);
}
联系客服