蜂鸣器播放青鸟,含曲谱(小萌白新文)
此次是用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個音。
| 頻率對照表 | |||
| 低 | 中 | 高 | |
| Do | 262 | 523 | 1046 |
| Re | 294 | 587 | 1175 |
| Mi | 330 | 659 | 1318 |
| Fa | 349 | 698 | 1397 |
| Sol | 392 | 784 | 1568 |
| La | 440 | 880 | 1760 |
| Si | 494 | 988 | 1976 |
單片機仿真用到的是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
總結
以上是生活随笔為你收集整理的蜂鸣器播放青鸟,含曲谱(小萌白新文)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 缩短bch码能用matlab,BCH码编
- 下一篇: 在计算机上采用线性同余法,随机数生成算法