蜂鸣器与音乐编程.docx

上传人:b****1 文档编号:23210265 上传时间:2023-05-15 格式:DOCX 页数:18 大小:1.19MB
下载 相关 举报
蜂鸣器与音乐编程.docx_第1页
第1页 / 共18页
蜂鸣器与音乐编程.docx_第2页
第2页 / 共18页
蜂鸣器与音乐编程.docx_第3页
第3页 / 共18页
蜂鸣器与音乐编程.docx_第4页
第4页 / 共18页
蜂鸣器与音乐编程.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

蜂鸣器与音乐编程.docx

《蜂鸣器与音乐编程.docx》由会员分享,可在线阅读,更多相关《蜂鸣器与音乐编程.docx(18页珍藏版)》请在冰豆网上搜索。

蜂鸣器与音乐编程.docx

蜂鸣器与音乐编程

蜂鸣器与音乐编程

一、体验蜂鸣器演奏音乐

没有亲自体验过自己导出的代码可以让蜂鸣器奏乐的人,怎么会想着会有学习音乐编程的冲动呢。

在向下进行之前,小编在这希望即将走向热爱音乐编程道路上的朋友将下面附录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;j

fmq=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;j

fmq=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;pl

fmq=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;j

fmq=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;pl

fmq=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;j

fmq=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);

}

}

小编是是前人的基础人,对小编认为比较好的音乐编程方法进行的分析并经过小编认真排版,希望可以给刚学习开发板蜂鸣器音乐编程的朋友们帮助。

本人也是菜鸟,但通过整理资料算是掌握了这种编程方法,所以也希望其它新手朋友多多支持。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1