蜂鸣器播放青鸟,含曲谱(小萌白新文)

您所在的位置:网站首页 mood曲谱 蜂鸣器播放青鸟,含曲谱(小萌白新文)

蜂鸣器播放青鸟,含曲谱(小萌白新文)

#蜂鸣器播放青鸟,含曲谱(小萌白新文)| 来源: 网络整理| 查看: 265

此次是用proteus仿真单片机加蜂鸣器播放青鸟,简谱和代码最后给出。

蜂鸣器发声原理

以标准音高“ A ”为例:A 的频率 f=440Hz,其对应的周期为:T=1/f=1/440=2272us。

控制蜂鸣器的波形图,通过对端口循环的置位、清零来达到输出固定频率波形,相对于A音频率440Hz, T=2272us,那么t=T/2=2272/2=1136us。所以我们只要在程序中将端口置为高电平,延时1136us,再置为低电平,延时 1136us,如此循环,就可以得到 440Hz 频率的声音。

七个基本音级的音名是:C,D,E,F,G,A,B,其唱名形式为:Do,Re,Mi,Fa,Sol,La,Si。

在单片机里用定时器中断完成七个音的高,中,低音部分,也就是21个音。

频率对照表低中高Do2625231046Re2945871175Mi3306591318Fa3496981397Sol3927841568La4408801760Si4949881976

单片机仿真用到的是Atmega32,之前用的是Atmega16,曲谱占用的内存超了,所以就改了。完整曲谱和代码在最后给出,曲谱还有更省内存的写法,懒得改了。

单片机产生以上表中音调的原理都一样,以我仿真用到的单片机为例,8Mhz时钟,定时器1,普通模式,8分频,计数上限65536。8M的时钟,设置8分频,计时频率就是:8M/8 = 1 Mhz(加1所需要的时间是1ns)

频率与计数初值就有以下关系:

TCNT1 = 65536-1000000/2f

以上公式可以这么理解,计数初值(ns)=溢出值(ns)-半周期(ns),单位都是ns,TCNT1就是Atmega单片机的初值寄存器。1/f 是这个频率所对应的时间,1/2f 就是半周期所对应的时间,因为单位是ns所以要乘1000000。

编辑曲谱用到了查看简谱的知识,以下图为例,数字头顶带点的就是高音,脚下带点的就是低音,不带的就是中音。以16分拍为时间单位1,8分拍就是2,四分拍就是4。可以在某度或某音查一些简谱知识,最多10分钟就会看了。

就是高音1,2分拍。对于下面的简谱编程如下:

{H1,8,2}, {M7,6,2}, {M6,2,1}, {M6,8,2}, {0,2,2}, {M3,2,2}, {M6,2,2}, {M7,2,2},

H1,M7 等等在宏定义里,H是高音,M是中音,L是低音。{H1,8,2},8就是8个时间单位,即2分拍 ,2是代表后面没有延音线,1就是有延音线,此次曲谱全部是按照这个规则写的,不过根据简谱知识,延音线并不是这么用的,我这个方案还有很大漏洞,小伙伴有更好的方案欢迎分享。

uchar QN_Music[400][3]={ //12 {15,2,2}, {10,2,2}, {15,2,2}, {14,2,1}, {14,2,2}, {13,2,2}, {12,2,2}, {13,2,1}, {13,2,2}, {8,2,2}, {9,2,2}, {10,2,1}, {10,2,2}, {10,2,2}, {10,2,2}, {10,2,2}, {10,4,2}, {15,4,2}, {14,3,1}, {13,3,1}, {12,3,2}, {12,2,2}, {13,2,2}, {13,4,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, //13 {15,12,2},{15,4,2}, {14,2,2}, {15,4,2}, {14,2,1}, {14,2,2}, {14,2,2}, {14,2,2}, {15,2,2}, {16,12,2},{0,2,2}, {16,2,2}, {15,2,2}, {14,4,2}, {13,2,1}, {13,2,2}, {13,2,2}, {15,2,2}, {16,2,2}, {17,2,1}, {13,2,2}, {13,2,2}, {15,2,2}, {16,2,2}, {17,4,2}, {17,2,1}, //14 {17,2,2}, {19,2,1}, {19,2,2}, {18,2,1}, {18,2,2}, {17,6,1}, {17,2,1}, {17,6,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,8,2}, {14,6,2}, {13,2,1}, {13,8,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,6,2}, {15,2,2}, {16,4,2}, {15,2,2}, {16,2,1}, //15 {16,2,2}, {17,6,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,8,2}, {14,6,2}, {13,2,1}, {13,8,2}, {0,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {12,4,2}, {12,2,1}, {12,2,2}, {13,2,2}, {13,4,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, //16 {15,8,2}, {14,6,2}, {13,2,1}, {13,8,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,6,1}, {15,2,2}, {16,4,2}, {15,2,2}, {16,2,1}, {16,2,2}, {17,6,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,8,2}, {14,6,2}, {13,2,1}, //17 {13,8,2}, {0,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {12,4,2}, {12,2,1}, {12,2,2}, {13,2,2}, {13,12,2}, {0,30,2}, {13,2,2}, //18 {17,4,2}, {13,2,2}, {13,2,1}, {13,2,2}, {12,4,2}, {12,2,1}, {13,12,2},{0,2,2}, {13,2,2}, {17,4,2}, {13,2,2}, {13,2,1}, {13,2,2}, {12,4,2}, {12,2,1}, {13,12,2},{0,2,2}, {14,2,2}, {15,2,1}, {13,2,2}, {13,2,2}, {15,2,1}, {15,2,2}, {0,2,2}, {16,2,2}, //19 ------- - - {16,2,1}, {14,2,2}, {14,2,2}, {16,2,1}, {16,4,2}, {0,2,2}, {16,2,2}, {17,3,2}, {17,1,1}, {17,2,2}, {17,2,2}, {15,3,2}, {15,1,1}, {15,2,2}, {16,2,2}, {17,16,1}, {17,8,2}, {0,30,2}, //20 {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,8,2}, {14,6,2}, {13,2,1}, {13,8,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,6,2}, {15,2,2}, {16,4,2}, {15,2,2}, {16,2,1}, {16,2,2}, {17,6,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, //21 {15,8,2}, {14,6,2}, {13,2,1}, {13,8,2}, {0,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {12,4,2}, {12,2,1}, {12,2,2}, {13,2,2}, {13,4,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,8,2}, {14,6,2}, {13,2,1}, //22 {13,8,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,6,1}, {15,2,2}, {16,4,2}, {15,2,2}, {16,2,1}, {16,2,2}, {17,6,2}, {0,2,2}, {10,2,2}, {13,2,2}, {14,2,2}, {15,8,2}, {14,6,2}, {13,2,1}, {13,8,2}, {0,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, //23 {16,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {12,4,2}, {12,2,1}, {12,2,2}, {13,2,2}, {13,4,2}, {0,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {12,4,2}, {12,2,1}, {12,2,2}, {13,2,2}, {13,4,2}, {0,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, //24 {16,2,2}, {13,2,2}, {17,2,2}, {16,2,1}, {16,2,2}, {12,4,2}, {12,2,1}, {12,2,2}, {13,2,2}, {13,12,2}, {0xff,0,0} }; /******************蜂鸣器音乐常量******************/ // 计时值=65536-8000000/8/2/频率 // 音名 计时值 频率Hz #define L1 63627 //262 #define L2 63835 //294 #define L3 64021 //330 #define L4 64103 //349 #define L5 64270 //392 #define L6 64400 //440 #define L7 64524 //494 #define M1 64580 //523 #define M2 64684 //587 #define M3 64777 //659 #define M4 64820 //698 #define M5 64898 //784 #define M6 64968 //880 #define M7 65030 //988 #define H1 65058 //1046 #define H2 65110 //1175 #define H3 65157 //1318 #define H4 65178 //1397 #define H5 65217 //1568 #define H6 65252 //1760 #define H7 65283 //1976 uint Music_tone[22]={ 0,L1,L2,L3,L4,L5,L6,L7,M1,M2,M3,M4,M5,M6,M7,H1,H2,H3,H4,H5,H6,H7 }; void biu_speaker(unsigned int aa) { TIMSK=0x05; //Timer1 溢出中断使能 tone=aa; //取音调频率 TCNT1=tone; //将频率值对应的计数值写入计时器,开始发声 } void play_music() { unsigned int i=0,p_time=10,con_time=1; while(1) { if(QN_Music[i][0]==0xff) { break; } else if(QN_Music[i][0]==0) { biu_speaker(0); delay_ms(p_time*QN_Music[i][1]); } else { biu_speaker(Music_tone[QN_Music[i][0]]); delay_ms(p_time*QN_Music[i][1]); } biu_speaker(0); delay_ms(con_time*QN_Music[i][2]); i++; } }

play_music 里面的两变量 p_time,con_time 分别是 16分音符的时长 和 两个音符之间的间隔时长。曲谱代码中注释的数字对应就是下面曲谱的行数,青鸟的曲谱是在网上找的,如下:

最后可仿真的proteus、.c代码、完整曲谱、完整曲谱的代码都放在压缩包里,Atmega单片机编程使用到的软件是CodeVisionAVR。

压缩包会发一个资源或群,主要是谱子,需要的可以改改用。

企鹅 群:7443五五五15



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3