蜂鸣器与音乐编程.docx
《蜂鸣器与音乐编程.docx》由会员分享,可在线阅读,更多相关《蜂鸣器与音乐编程.docx(18页珍藏版)》请在冰豆网上搜索。
![蜂鸣器与音乐编程.docx](https://file1.bdocx.com/fileroot1/2023-5/15/db3474cc-371e-4c97-b8b0-45ffa8c3590e/db3474cc-371e-4c97-b8b0-45ffa8c3590e1.gif)
蜂鸣器与音乐编程
蜂鸣器与音乐编程
一、体验蜂鸣器演奏音乐
没有亲自体验过自己导出的代码可以让蜂鸣器奏乐的人,怎么会想着会有学习音乐编程的冲动呢。
在向下进行之前,小编在这希望即将走向热爱音乐编程道路上的朋友将下面附录1中的代码复制粘贴,然后烧写到开发板中,体验一把音乐编程的快乐。
二、认识蜂鸣器奏乐原理
其实,这个也没有必要,因为我学习音乐编程的过程中也没有走这个过程,不过原因呢是我小时候学过一段时间的乐理知识,现在有那么一点印象。
假如你没有我那么好的音乐功底(呵呵,开个玩笑,我也只是低等玩家),没关系,告诉你捷径,看好了-------跳过此部分。
我们都知道,音调和音调的时长是音符的主要特征,通过产生不同的音调和音调的时长可以奏出不同的音符来。
然后一个个音符串联在一起就可以产生美妙的音乐来了。
音调主要由声音的频率决定,通过单片机给蜂鸣器不同的音频脉冲来产生不同的音调。
要产生音频脉冲,只要算出某一音频的周期(周期=1/频率),然后将此周期除以2即为半周期的时间。
利用单片机的定时器工作在计数模式MODE1下,设定TH0和TL0的值以产生这半个周期,每当计时到达时就将输出脉冲的I/O(即接蜂鸣器的那个管脚)反相,然后重复计时此半个周期再对I/O反相,就可以在I/O引脚上得到此频率的脉冲。
如果没有必要进行精确的计时,可以用for循环空语句来粗略计时即可(本文选用此法)。
当单片机使用11.0592Mhz的晶振时,for(i=0;i<115;i++);这个空循环延时约为1ms;当晶振选用12Mhz时,可使用for(i=0;i<125;i++);这个空循环来延时1ms。
在这个空循环外头再进行一次循环就可以实现延时若干ms。
首先介绍蜂鸣器的发声原理。
如:
下面附上不同音调所对应的频率表:
三、准备相关基础知识
假如你只是想体验一把让自己的开发板唱歌,那你在这里可以找到好几个完整源码。
假如你是想让自己掌握音乐编程,那你必须具备以下小编认为的能力:
1、开发板初级使用能力
2、使用框架的能力
3、细心、认真、耐心
以上三种能力,让你在往下的学习中可以掌握音乐编程的其中之一的方法。
四、蜂鸣器奏出音符音调(完整实例)
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfmq=P3^6;
voiddelay(uinta)
{ucharb;
while(a--)
{for(b=0;b<115;b++);}
}
voidyanzou(uchari,uintpai)
{uchart;
uintj;
for(j=0;jfmq=0;
for(t=0;t
fmq=1;
for(t=0;t
}
}
voidmain()
{
while
(1)
{
yanzou(220,131);//1拍高音1中音110低音220
yanzou(196,147);//1拍高音2中音98低音196
yanzou(175,165);//1拍高音3中音87低音175
yanzou(164,175);//1拍高音4中音82低音164
yanzou(147,196);//1拍高音5中音73低音147
yanzou(131,220);//1拍高音6中音65低音131
yanzou(116,247);//1拍高音7中音58低音116
delay(250);
yanzou(110,262);//1拍高音1中音110低音220
yanzou(98,293);//1拍高音2中音98低音196
yanzou(87,330);//1拍高音3中音87低音175
yanzou(82,349);//1拍高音4中音82低音164
yanzou(73,392);//1拍高音5中音73低音147
yanzou(65,440);//1拍中音6
yanzou(58,494);//1拍中音7
delay(250);
yanzou(55,524);//1拍高音1中音110低音220
yanzou(49,587);//1拍高音2中音98低音196
yanzou(44,660);//1拍高音3中音87低音175
yanzou(41,698);//1拍高音4中音82低音164
yanzou(37,784);//1拍高音5中音73低音147
yanzou(33,880);//1拍高音6中音65低音131
yanzou(29,984);//1拍高音7中音58低音116
delay(250);
}
}
五、编程框架设置
框架一:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfmq=P3^6;
voiddelay(uinta)
{ucharb;
while(a--)
{for(b=0;b<115;b++);}
}
voidyanzou(uchari,uintpai)
{uchart;
uintj;
for(j=0;jfmq=0;
for(t=0;t
fmq=1;
for(t=0;t
}
}
voidmain()
{
while
(1)
{
yanzou(音码,时长);
……
}
}
框架二:
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfmq=P3^6;
sbitstart=P1^4;//定义了一个按键进行控制,当按键按下时,开始演奏音乐
ucharcodepinlv[]={音码1,音码2,音码3,……};
uintcodejiepai[]={对应音码的时长1,时长2,时长3,……};
voiddelay(unsignedinti)
{
ucharj;
while(i--){for(j=0;j<115;j++);}
}
voidyanzou(ucharpinlv,uintjiepai)
{
ucharpl;
uintjp;
if(jiepai==1)delay(250);//1/2拍暂停,即1/2拍的0
elseif(jiepai==2)delay(500);//1拍暂停,即1拍的0
else{
for(jp=0;jp{
fmq=0;
for(pl=0;plfmq=1;
for(pl=0;pl}
}
}
voidmain()
{
uchari,x;
i=68;//I的值取决于音乐编码数组的长度
if(start==0)for(x=0;x
}
六、蜂鸣器与音符长度
(低音码,时长)
(低音码,时长)
(低音码,时长)
1
220,131
110,262
55,524
2
196,147
98,293
49,587
3
175,165
87,330
44,660
4
64,175
82,349
41,698
5
147,196
73,392
37,784
6
131,220
65,440
33,880
7
116,247
58,494
29,984
说明
四分音符为一拍,上面所示时长为四分音符的时长,既是一拍的时长。
八分音符时长是四分音乐的一半,同理十六分音符为八分音符的一半。
一般说来,如果乐曲没有特殊说明,一拍的时长大约为400~500ms。
我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。
音符音高分为三档:
低、中、高。
其中:
四分音符即一拍的0的音码为0,时长为2,八分音符即1/2拍的音码为0,时长为1
七、对简单歌谱编程
利用上表可以很轻松地编出新的歌谱程序代码。
示例如下:
110,26298,29387,330110,262
110,26298,29387,330110,262
87,33082,34973,39273,392
87,33082,34973,39273,392
73,19665,11073,19682,8887,330110,262
73,19665,11073,19682,8887,330110,262
110,26273,392110,262110,262
110,26273,392110,262110,262
利用框架1或框架3来完成整个实例代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfmq=P3^6;
voiddelay(uinta)
{ucharb;
while(a--)
{for(b=0;b<115;b++);}
}
voidyanzou(uchari,uintpai)
{uchart;
uintj;
for(j=0;jfmq=0;
for(t=0;t
fmq=1;
for(t=0;t
}
}
voidmain()
{
while
(1)
{
yanzou(110,262);
yanzou(98,293);
yanzou(87,330);
yanzou(110,262);
yanzou(110,262);
yanzou(98,293);
yanzou(87,330);
yanzou(110,262);
yanzou(87,330);
yanzou(82,349);
yanzou(73,392);
yanzou(73,392);
yanzou(87,330);
yanzou(82,349);
yanzou(73,392);
yanzou(73,392);
yanzou(73,196);
yanzou(65,110);
yanzou(73,196);
yanzou(82,88);
yanzou(87,330);
yanzou(110,262);
yanzou(73,196);
yanzou(65,110);
yanzou(73,196);
yanzou(82,88);
yanzou(87,330);
yanzou(110,262);
yanzou(110,262);
yanzou(73,392);
yanzou(110,262);
yanzou(110,262);
yanzou(110,262);
yanzou(73,392);
yanzou(110,262);
yanzou(110,262);
}
}
好了,上面的代码仅供参考,不知道你编写对了没有。
八、歌谱编程
例二:
(此乐曲是《让我们荡起双桨》)便是通过框架二来实现的。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfmq=P3^6;
sbitstart=P1^4;//定义了一个按键进行控制,当按键按下时,开始演奏音乐
uintcodejiepai[]={
110,131,147,494,196,165,131,294,440,1,131,147,165,588,196,440,294,660,330,165,196,880,588,220,262,124,110,196,220,330,131,147,495,196,262,220,131,147,165,220,784,392,2,660,660,220,196,175,330,588,495,196,110,131,147,2,131,147,330,392,440,524,247,220,196,165,880,880
};
ucharcodepinlv[]={
131,110,98,87,73,87,110,98,131,0,110,98,87,73,73,65,
98,87,87,87,73,65,73,65,55,58,65,73,65,87,110,98,87,73,110,131,
110,98,87,65,73,73,0,87,65,65,73,82,87,98,87,73,131,110,98,0,
110,98,87,73,65,55,58,65,73,87,65,65
};
voiddelay(unsignedinti)
{
ucharj;
while(i--){for(j=0;j<115;j++);}
}
voidyanzou(ucharpinlv,uintjiepai)
{
ucharpl;
uintjp;
if(jiepai==1)delay(250);//1/2拍暂停,即1/2拍的0
elseif(jiepai==2)delay(500);//1拍暂停,即1拍的0
else
{
for(jp=0;jp{
fmq=0;
for(pl=0;plfmq=1;
for(pl=0;pl}
}
}
voidmain()
{
uchari,x;
i=68;//数组共有68个元素
if(start==0)for(x=0;x
{yanzou(pinlv[x],jiepai[x]);}
}
九、蜂鸣器实例与练习
练习一
练习二
练习三
附录1:
《莫斯哥郊外的晚上》#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfmq=P3^6;
voiddelay(uinta)
{ucharb;
while(a--)
{for(b=0;b<115;b++);}
}
voidyanzou(uchari,uintpai)
{uchary;
uintj;
for(j=0;jfmq=0;
for(y=0;y
fmq=1;
for(y=0;y
}
}
voidmain()
{
while
(1)
{
yanzou(65,220);//1/2拍中音6
yanzou(55,262);//1/2拍高音1
yanzou(44,330);//1/2拍高音3
yanzou(55,262);//1/2拍高音1
yanzou(49,587);//1拍高音2
yanzou(55,262);//1/2拍高音1
yanzou(58,247);//1/2拍中音7
yanzou(44,660);//1拍高音3
yanzou(49,587);//1拍高音2
yanzou(65,880);//2拍中音6
yanzou(55,262);//1/2拍高音1
yanzou(44,330);//1/2拍高音3
yanzou(37,392);//1/2拍高音5
yanzou(37,392);//1/2拍高音5
yanzou(65,440);//1拍中音6
yanzou(37,392);//1/2拍高音5
yanzou(41,349);//1/2拍高音4
yanzou(44,2640);//4拍高音3
yanzou(41,698);//1拍高音4
yanzou(37,784);//1拍高音5
yanzou(29,492);//1/2拍高音7
yanzou(33,440);//1/2拍高音6
yanzou(44,660);//1拍高音3
delay(250);
yanzou(58,494);//1拍中音7
yanzou(65,220);//1/2拍中音6
yanzou(44,330);//1/2拍高音3
yanzou(49,293);//1/2拍高音2
yanzou(41,698);//1拍高音4
yanzou(41,698);//1拍高音4
yanzou(37,392);//1/2拍高音5
yanzou(41,349);//1/2拍高音4
yanzou(44,660);//1拍高音3
yanzou(49,293);//1/2拍高音2
yanzou(55,262);//1/2拍高音1
yanzou(44,660);//1拍高音3
yanzou(49,587);//1拍高音2
yanzou(65,880);//2拍中音6
yanzou(65,880);//2拍中音6
yanzou(41,698);//1拍高音4
yanzou(37,784);//1拍高音5
yanzou(29,492);//1/2拍高音7
yanzou(33,440);//1/2拍高音6
yanzou(44,660);//1拍高音3
delay(250);
yanzou(58,494);//1拍中音7
yanzou(65,220);//1/2拍中音6
yanzou(44,330);//1/2拍高音3
yanzou(49,293);//1/2拍高音2
yanzou(41,698);//1拍高音4
yanzou(41,698);//1拍高音4
yanzou(37,392);//1/2拍高音5
yanzou(41,349);//1/2拍高音4
yanzou(44,660);//1拍高音3
yanzou(49,293);//1/2拍高音2
yanzou(55,262);//1/2拍高音1
yanzou(44,660);//1拍高音3
yanzou(49,587);//1拍高音2
yanzou(65,880);//2拍中音6
yanzou(65,880);//2拍中音6
delay(5000);
}
}
小编是是前人的基础人,对小编认为比较好的音乐编程方法进行的分析并经过小编认真排版,希望可以给刚学习开发板蜂鸣器音乐编程的朋友们帮助。
本人也是菜鸟,但通过整理资料算是掌握了这种编程方法,所以也希望其它新手朋友多多支持。