使用单片机(或单板机)吹打大概是无线电爱好者感兴趣的问题之一。本文从单片机的根本发间试验动身,谈谈音乐程序的规划原理,并给出详细实例,以供参阅。
1.单片机的根本发音试验
咱们知道,声响的频谱规模约在几十到几千赫兹,若能使用程序来操控单处机某个口线的“高”电平或低电平,则在该口线上就能发生必定频率的矩形波,接上喇叭就能宣布必定频率的声响,若再使用延时程序操控“高”“低”电平的持续时刻,就能改动输出频率,然后改动腔调。
例如,要发生200HZ的音频信号,按图1接入喇叭(若属暂时试验,也可将喇叭直接接在P1口线上),试验程序为:
读者能够依据表1所供给的常数,将其16进制代码送入R3,重复操练领会。依据表1能够奏出音符。仅这还不行,要精确奏出一首曲子,有必要精确地操控乐曲节奏,即一音符的持续时刻。
音符的节拍咱们能够用守时器T0来操控,送入不同的初值,就能够发生不同的守时时刻。便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。其它节拍与时刻的对应联系见表2。
但时,因为T0的最大守时时刻只能为131毫秒,因而不可能直接用改动T0的时刻初值来完结不同节拍。咱们能够用T0来发生10毫秒的时刻基准,然后设置一个中止计数器,经过判别中止计数器的值来操控节拍时刻的长短。表2中也给出了各种节拍所对应的时刻常数。例如对1/4拍音符,守时时刻为0.16秒,相应的时刻常数为16(即10H);对3拍音符,守时时刻为1.92秒,相应时刻长数为192(即C0H)。
咱们将每一音符的时刻常数和其相应的节拍常数作为一组,按次序将乐曲中的一切常数排列成一个表,然后由查表程序顺次取出,发生音符并操控节奏,就能够完结演奏作用。
此外,结束符和体止符能够分别用代码00H和FFH来表明,若查表成果为00H,则表明曲子终了;若查表成果为FFH,则发生相应的中止作用。
为了发生手弹的节奏感,在某些音符(例如两个相同音符)音刺进一个时刻单位的频率略有不同的音符。
程序框图如图2所示。
可直接在TD-III型学习机上演奏,对其它不同类型的学习机,只需相应地改动一下地址即可。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。读者也能够自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。本试验办法简洁,即便不明白音乐的人,将一首生疏的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
下面这个比如是我在网上找的简略易懂,只不过是用C编写的,并且根本思想跟上面讲的相同。
#i nclude
#i nclude
//本例选用89C52, 晶振为11.0592MHZ
//关于怎么编制音乐代码, 其实非常简略,各位能够看以下代码.
//频率常数即音乐术语中的腔调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 打听编吧!
unsigned char n=0;
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格局为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
void int0()
{
}
void delay (unsigned char m)
{
}
void delayms(unsigned char a)
{
}
void main()
{ unsigned char p,m;
play:
}