標題: 單片機編曲程序中音樂頻率和節拍時長代碼表怎么確定? [打印本頁]
作者: 七七四十九 時間: 2019-3-23 19:54
標題: 單片機編曲程序中音樂頻率和節拍時長代碼表怎么確定?
麻煩問一下51編曲里面,音樂頻率還有節拍時間長度代碼表如何確定
附上一個好的程序
- /************************************************************************
- [文件名] C51音樂程序(八月桂花)
- [功能] 通過單片機演奏音樂
-
- /**********************************************************************/
- #include <REG52.H>
- #include <INTRINS.H>
- //本例采用89C52, 晶振為12MHZ
- //關于如何編制音樂代碼, 其實十分簡單,各位可以看以下代碼.
- //頻率常數即音樂術語中的音調,而節拍常數即音樂術語中的多少拍;
- //所以拿出譜子, 試探編吧!
- sbit Beep = P1^5;
-
- unsigned char n=0; //n為節拍常數變量
- unsigned char code music_tab[] ={
- 0x18, 0x30, 0x1C , 0x10, //格式為: 頻率常數, 節拍常數, 頻率常數, 節拍常數,
- 0x20, 0x40, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x10,
- 0x1C, 0x10, 0x18 , 0x40,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x1C, 0x20, 0x18 , 0x20,
- 0x20, 0x80, 0xFF , 0x20,
- 0x30, 0x1C, 0x10 , 0x18,
- 0x20, 0x15, 0x20 , 0x1C,
- 0x20, 0x20, 0x20 , 0x26,
- 0x40, 0x20, 0x20 , 0x2B,
- 0x20, 0x26, 0x20 , 0x20,
- 0x20, 0x30, 0x80 , 0xFF,
- 0x20, 0x20, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x20, 0x1C , 0x10,
- 0x18, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x20, 0x15 , 0x20,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x26, 0x40, 0x20 , 0x20,
- 0x2B, 0x20, 0x26 , 0x20,
- 0x20, 0x20, 0x30 , 0x80,
- 0x20, 0x30, 0x1C , 0x10,
- 0x20, 0x10, 0x1C , 0x10,
- 0x20, 0x20, 0x26 , 0x20,
- 0x2B, 0x20, 0x30 , 0x20,
- 0x2B, 0x40, 0x20 , 0x15,
- 0x1F, 0x05, 0x20 , 0x10,
- 0x1C, 0x10, 0x20 , 0x20,
- 0x26, 0x20, 0x2B , 0x20,
- 0x30, 0x20, 0x2B , 0x40,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x20, 0x15 , 0x20,
- 0x1C, 0x20, 0x20 , 0x20,
- 0x26, 0x40, 0x20 , 0x20,
- 0x2B, 0x20, 0x26 , 0x20,
- 0x20, 0x20, 0x30 , 0x30,
- 0x20, 0x30, 0x1C , 0x10,
- 0x18, 0x40, 0x1C , 0x20,
- 0x20, 0x20, 0x26 , 0x40,
- 0x13, 0x60, 0x18 , 0x20,
- 0x15, 0x40, 0x13 , 0x40,
- 0x18, 0x80, 0x00
- };
-
- void int0() interrupt 1 //采用中斷0 控制節拍
- { TH0=0xd8;
- TL0=0xef;
- n--;
- }
-
- void delay (unsigned char m) //控制頻率延時
- {
- unsigned i=3*m;
- while(--i);
- }
-
- void delayms(unsigned char a) //豪秒延時子程序
- {
- while(--a); //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結果就知道了!
- }
-
- void main()
- { unsigned char p,m; //m為頻率常數變量
- unsigned char i=0;
- TMOD&=0x0f;
- TMOD|=0x01;
- TH0=0xd8;TL0=0xef;
- IE=0x82;
- play:
- while(1)
- {
- a: p=music_tab[i];
- if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到結束符,延時1秒,回到開始再來一遍
- else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續取下一音符
- else {m=music_tab[i++], n=music_tab[i++];} //取頻率常數 和 節拍常數
- TR0=1; //開定時器1
- while(n!=0) Beep=~Beep,delay(m); //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)
- TR0=0; //關定時器1
- }
- }
復制代碼
作者: yzwzfyz 時間: 2019-3-24 07:57
依據樂理定義的時間和你使用的晶振,計算后定出。
作者: HC6800-ES-V2.0 時間: 2019-3-24 09:53
標準A = 440 Hz
高8度音的頻率為原來音頻率的2倍
根據12平均律,高一個八度頻率高一倍,中間的12個音使用對數關系
音高 中央C D E F G A B 高音C
純律 264 297 330 352 396 440 495 528
十二平均律 261.6 293.7 329.6 349.3 392.1 440 493.9 523.2
根據十二平均律作的音階頻率表
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| c4 | #c4 | d4 | #d4 | e4 | f4 | #f4 | g4 | #g4 | a4 | #a4 | b4 |
| 2095.1 | | | | | | | | | | | |
| c3 | #c3 | d3 | #d3 | e3 | f3 | #f3 | g3 | #g3 | a3 | #a3 | b3 |
| 1047.1 | | | | | | | | | | | |
| c2 | #c2 | d2 | #d2 | e2 | f2 | #f2 | g2 | #g2 | a2 | #a2 | b2 |
| 523.31 | | | | | | | | | | | |
| c1 | #c1 | d1 | #d1 | e1 | f1 | #f1 | g1 | #g1 | a1 | #a1 | b1 |
| 261.63 | | | | | | | | | | | |
| c | #c | d | #d | e | f | #f | g | #g | a | #a | b |
| 138.541 | | | | | | | | | | | |
| C | #C | D | #D | E | F | #F | G | #G | A | #A | A |
| 69.2413 | | | | | | | | | | | |
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |