




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
蜂鸣器与音乐编程一、 体验蜂鸣器演奏音乐没有亲自体验过自己导出的代码可以让蜂鸣器奏乐的人,怎么会想着会有学习音乐编程的冲动呢。在向下进行之前,小编在这希望 即将走向热爱音乐编程道路上的朋友 将下面附录1中的代码复制粘贴,然后烧写到开发板中,体验一把音乐编程的快乐。二、 认识蜂鸣器奏乐原理其实,这个也没有必要,因为我学习音乐编程的过程中也没有走这个过程,不过原因呢是我小时候学过一段时间的乐理知识,现在有那么一点印象。假如你没有我那么好的音乐功底(呵呵,开个玩笑,我也只是低等玩家),没关系,告诉你捷径,看好了-跳过此部分。我们都知道,音调和音调的时长是音符的主要特征,通过产生不同的音调和音调的时长可以奏出不同的音符来。然后一个个音符串联在一起就可以产生美妙的音乐来了。音调主要由声音的频率决定,通过单片机给蜂鸣器不同的音频脉冲来产生不同的音调。要产生音频脉冲,只要算出某一音频的周期(周期=1/频率),然后将此周期除以2即为半周期的时间。利用单片机的定时器工作在计数模式MODE1下,设定TH0和TL0的值以产生这半个周期,每当计时到达时就将输出脉冲的I/O(即接蜂鸣器的那个管脚)反相,然后重复计时此半个周期再对I/O反相,就可以在I/O引脚上得到此频率的脉冲。如果没有必要进行精确的计时,可以用for循环空语句来粗略计时即可(本文选用此法)。当单片机使用11.0592Mhz的晶振时,for(i=0;i115;i+);这个空循环延时约为1ms;当晶振选用12Mhz时,可使用for(i=0;i125;i+);这个空循环来延时1ms。在这个空循环外头再进行一次循环就可以实现延时若干ms。首先介绍蜂鸣器的发声原理。如: 下面附上不同音调所对应的频率表: 三、 准备相关基础知识假如你只是想体验一把让自己的开发板唱歌,那你在这里可以找到好几个完整源码。假如你是想让自己掌握音乐编程,那你必须具备以下小编认为的能力:1、开发板初级使用能力2、使用框架的能力3、细心、认真、耐心以上三种能力,让你在往下的学习中可以掌握音乐编程的其中之一的方法。四、 蜂鸣器奏出音符音调(完整实例)#include #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-) for(b=0;b115;b+) ; void yanzou(uchar i,uint pai) uchar t; uint j; for(j=0;jpai;j+) fmq=0; for(t=0;ti;t+) ; fmq=1; for(t=0;ti;t+) ; void main() while(1) yanzou(220,131); /1拍 高音1 中音 110低音 220 yanzou(196,147); /1拍 高音2 中音 98低音 196yanzou(175,165); /1拍 高音3 中音 87低音 175yanzou(164,175); /1拍 高音4 中音 82低音 164 yanzou(147,196); /1拍 高音5 中音 73低音 147yanzou(131,220); /1拍 高音6 中音 65 低音 131yanzou(116,247); /1拍 高音7 中音 58低音 116delay(250);yanzou(110,262); /1拍 高音1 中音 110 低音 220 yanzou(98,293); /1拍 高音2 中音 98低音 196yanzou(87,330); /1拍 高音3 中音 87低音 175yanzou(82,349); /1拍 高音4 中音 82低音 164 yanzou(73,392); /1拍 高音5 中音 73低音 147yanzou(65,440); /1拍 中音6yanzou(58,494); /1拍 中音7 delay(250);yanzou(55,524); /1拍 高音1 中音 110低音 220 yanzou(49,587); /1拍 高音2 中音 98低音 196yanzou(44,660); /1拍 高音3 中音 87低音 175yanzou(41,698); /1拍 高音4 中音 82低音 164 yanzou(37,784); /1拍 高音5 中音 73低音 147yanzou(33,880); /1拍 高音6 中音 65 低音 131yanzou(29,984); /1拍 高音7 中音 58低音 116 delay(250); 五、 编程框架设置框架一:#include #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-) for(b=0;b115;b+) ; void yanzou(uchar i,uint pai) uchar t; uint j; for(j=0;jpai;j+) fmq=0; for(t=0;ti;t+) ; fmq=1; for(t=0;ti;t+) ; void main() while(1) yanzou(音码,时长); 框架二:#include #define uchar unsigned char#define uint unsigned intsbit fmq=P36; sbit start=P14; /定义了一个按键进行控制,当按键按下时,开始演奏音乐 uchar code pinlv=音码1, 音码2, 音码3,;uint code jiepai=对应音码的时长1, 时长2, 时长3,; void delay(unsigned int i) uchar j; while(i-) for(j=0;j115;j+); void yanzou(uchar pinlv,uint jiepai) uchar pl; uint jp; if(jiepai=1) delay(250); /1/2拍暂停,即1/2拍的0 else if(jiepai=2) delay(500); /1拍暂停,即1拍的0 else for(jp=0;jpjiepai;jp+) fmq=0; for(pl=0;plpinlv;pl+); fmq=1; for(pl=0;plpinlv;pl+); void main() uchar i,x; i=68; /I的值取决于音乐编码数组的长度 if(start=0) for(x=0;xi;x+) yanzou(pinlvx,jiepaix); 六、 蜂鸣器与音符长度(低音码,时长)(低音码,时长)(低音码,时长)1220,131110,26255,5242196,14798,29349,5873175,16587,33044,660464,17582,34941,6985147,19673,39237,7846131,22065,44033,8807116,24758,49429,984说明四分音符为一拍,上面所示时长为四分音符的时长,既是一拍的时长。八分音符时长是四分音乐的一半,同理十六分音符为八分音符的一半。一般说来,如果乐曲没有特殊说明,一拍的时长大约为400500ms 。我们以一拍的时长为400ms为例,则当以四分音符为节拍时,四分音符的时长就为400ms,八分音符的时长就为200ms,十六分音符的时长就为100ms。音符音高分为三档:低、中、高。 其中:四分音符即一拍的0的音码为0,时长为2,八分音符即1/2拍的音码为0,时长为1 七、 对简单歌谱编程利用上表可以很轻松地编出新的歌谱程序代码。示例如下:110,262 98,293 87,330 110,262 110,262 98,293 87,330 110,262 87,330 82,349 73,392 73,392 87,330 82,349 73,392 73,392 73,196 65,110 73,196 82,88 87,330 110,262 73,196 65,110 73,196 82,88 87,330 110,262 110,262 73,392 110,262 110,262110,262 73,392 110,262 110,262利用框架1或框架3来完成整个实例代码#include #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-) for(b=0;b115;b+) ; void yanzou(uchar i,uint pai) uchar t; uint j; for(j=0;jpai;j+) fmq=0; for(t=0;ti;t+) ; fmq=1; for(t=0;ti;t+) ; void main() 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 #define uchar unsigned char#define uint unsigned intsbit fmq=P36; sbit start=P14; /定义了一个按键进行控制,当按键按下时,开始演奏音乐 uint code jiepai=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; uchar code pinlv= 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 ;void delay(unsigned int i) uchar j; while(i-) for(j=0;j115;j+); void yanzou(uchar pinlv,uint jiepai) uchar pl; uint jp; if(jiepai=1) delay(250); /1/2拍暂停,即1/2拍的0 else if(jiepai=2) delay(500); /1拍暂停,即1拍的0 else for(jp=0;jpjiepai;jp+) fmq=0; for(pl=0;plpinlv;pl+); fmq=1; for(pl=0;plpinlv;pl+); void main() uchar i,x; i=68; /数组共有68个元素 if(start=0) for(x=0;xi;x+) yanzou(pinlvx,jiepaix); 九、 蜂鸣器实例与练习练习一练习二练习三附录1:莫斯哥郊外的晚上#include #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-) for(b=0;b115;b+) ; void yanzou(uchar i,uint pai) uchar y; uint j; for(j=0;jpai;j+) fmq=0; for(y=0;yi;y+) ; fmq=1; for(y=0;yi;y+) ; void main() 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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 方城一中考试卷子及答案
- 2025乐清社工考试真题及答案
- 2025考试文言文真题及答案
- 湖北恩施中考试题及答案
- 2025今天司法考试真题及答案
- 2025教师d类考试真题及答案
- 考点攻克苏科版八年级物理下册《力与运动》重点解析练习题(含答案详解)
- 新版煤矿班组长考试题库及答案
- 中职高一思想政治考试试题及答案
- 国家开放大学电大《学前教育学》期末试题及答案
- 非煤矿山建设项目管理办法
- 相似三角形的判定与性质复习课(原创修订)课件
- 姓氏源流与文化寻根(精品·创新·实用)课件
- 南医大之十四经脉与常用腧穴课件
- 自动化生产线 课件
- 氧化锆氧量计测氧原理课件
- 教科版四年级(上)科学1.1听听声音课课练习题(含答案)
- 原子物理学:第2章 第5节 索末菲理论
- 金刚经讲义江味农居士遗著
- 二甲医院麻醉科相关工作制度汇编
- SOT600 -SY2000交换机操作指导
评论
0/150
提交评论