1、蜂鸣器与音乐编程一、 体验蜂鸣器演奏音乐没有亲自体验过自己导出的代码可以让蜂鸣器奏乐的人,怎么会想着会有学习音乐编程的冲动呢。在向下进行之前,小编在这希望 即将走向热爱音乐编程道路上的朋友 将下面附录 1 中的代码复制粘贴,然后烧写到开发板中,体验一把音乐编程的快乐。二、 认识蜂鸣器奏乐原理其实,这个也没有必要,因为我学习音乐编程的过程中也没有走这个过程,不过原因呢是我小时候学过一段时间的乐理知识,现在有那么一点印象。假如你没有我那么好的音乐功底(呵呵,开个玩笑,我也只是低等玩家) ,没关系,告诉你捷径,看好了-跳过此部分。我们都知道,音调和音调的时长是音符的主要特征,通过产生不同的音调和音调
2、的时长可以奏出不同的音符来。然后一个个音符串联在一起就可以产生美妙的音乐来了。音调主要由声音的频率决定,通过单片机给蜂鸣器不同的音频脉冲来产生不同的音调。要产生音频脉冲,只要算出某一音频的周期(周期=1/频率) ,然后将此周期除以 2 即为半周期的时间。利用单片机的定时器工作在计数模式MODE1 下,设定 TH0 和 TL0 的值以产生这半个周期,每当计时到达时就将输出脉冲的 I/O(即接蜂鸣器的那个管脚)反相,然后重复计时此半个周期再对 I/O 反相,就可以在 I/O 引脚上得到此频率的脉冲。如果没有必要进行精确的计时,可以用 for 循环空语句来粗略计时即可(本文选用此法) 。当单片机使用
3、 11.0592Mhz 的晶振时,for(i=0;i #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-) for(b=0;b #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-) for(b=0;b #define uchar unsigned char#define uint unsig
4、ned 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;j #define uchar unsigned char#define uint unsigned intsbit fmq=P36; void delay(uint a) uchar b; while(a-)
5、for(b=0;b #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,39
6、2,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,11
7、0,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;j #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=
8、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 拍 高音
9、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
10、 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);
11、/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 拍
12、 高音 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); 小编是是前人的基础人,对小编认为比较好的音乐编程方法进行的分析并经过小编认真排版,希望可以给刚学习开发板蜂鸣器音乐编程的朋友们帮助。本人也是菜鸟,但通过整理资料算是掌握了这种编程方法,所以也希望其它新手朋友多多支持。