蜂鸣器与音乐编程.docx
- 文档编号:26802359
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:18
- 大小:1.19MB
蜂鸣器与音乐编程.docx
《蜂鸣器与音乐编程.docx》由会员分享,可在线阅读,更多相关《蜂鸣器与音乐编程.docx(18页珍藏版)》请在冰豆网上搜索。
蜂鸣器与音乐编程
蜂鸣器与音乐编程
一、体验蜂鸣器演奏音乐
没有亲自体验过自己导出的代码可以让蜂鸣器奏乐的人,怎么会想着会有学习音乐编程的冲动呢。
在向下进行之前,小编在这希望即将走向热爱音乐编程道路上的朋友将下面附录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); } } 小编是是前人的基础人,对小编认为比较好的音乐编程方法进行的分析并经过小编认真排版,希望可以给刚学习开发板蜂鸣器音乐编程的朋友们帮助。 本人也是菜鸟,但通过整理资料算是掌握了这种编程方法,所以也希望其它新手朋友多多支持。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蜂鸣器 音乐 编程