標(biāo)題:
單片機(jī)電子琴設(shè)計(jì)中怎么存音樂(lè)
[打印本頁(yè)]
作者:
Autism
時(shí)間:
2017-6-5 15:57
標(biāo)題:
單片機(jī)電子琴設(shè)計(jì)中怎么存音樂(lè)
五一單片機(jī)中電子琴的中音樂(lè)的那種音律怎么用代碼啊什么表示
作者:
HC6800-ES-V2.0
時(shí)間:
2017-6-5 18:12
這個(gè)問(wèn)題有點(diǎn)復(fù)雜。一個(gè)個(gè)地說(shuō)吧。
首先是音樂(lè)的知識(shí):
第一:音樂(lè)與頻率的關(guān)系——
標(biāo)準(zhǔn)
A = 440 Hz,
高
8
度音的頻率為原來(lái)音頻率的
2
倍。
我們不是搞音樂(lè)的,這個(gè)就不多說(shuō)。
第二:音階與頻率的具體關(guān)系:
音階
Octave0 Octave1 Octave2 Octave3
Do C 262 523 1047 2093
Db 277 554 1109 2217
Re D 294 587 1175 2349
Eb 311 622 1245 2489
Mi E 330 659 1329 2637
Fa F 349 698 1397 2794
Gb 370 740 1480 2960
Sol G 392 784 1568 3136
Ab 415 831 1661 3322
La A
440 880 1760 3520
Bb 466 923 1865 3729
Si B 494 988 1976 3951
有了這些知識(shí),就可以用單片機(jī)控制頻率,讓蜂鳴器發(fā)出音樂(lè)了。
怎么編程呢?
給你一個(gè)程序:
/*
本實(shí)例利用無(wú)源蜂鳴器發(fā)出音樂(lè)聲音。
還用到了定時(shí)計(jì)數(shù)器0
*/
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit voice=P1^5;//蜂鳴器I/O口
uchar code sound[]={0xff,
/*
軟件使用規(guī)則:
下面已經(jīng)定義好了簡(jiǎn)譜對(duì)應(yīng)的頻率數(shù)據(jù)
節(jié)拍數(shù)據(jù)為:
四分之一拍:0x10
四分之二拍:0x20
四分之三拍:0x30
一拍:0x40
一又四分之一拍:0x60
兩拍:0x80
三拍:0xc0
音樂(lè)數(shù)據(jù)是這樣的:兩個(gè)十六進(jìn)制數(shù)據(jù),表達(dá)一個(gè)音符,它包含信息有:第一個(gè)數(shù)據(jù)為音階,第二數(shù)據(jù)為節(jié)拍,一定是成對(duì)放置。
*/
//此后為音樂(lè)樂(lè)譜,全部為3拍
0x60,0xc0,//低音階1,2,3,4,5,6,7
0x55,0xc0,
0x4c,0xc0,
0x48,0xc0,
0x40,0xc0,
0x39,0xc0,
0x33,0xc0,
0x30,0xc0,//中音階1,2,3,4,5,6,7
0x2b,0xc0,
0x26,0xc0,
0x24,0xc0,
0x20,0xc0,
0x1c,0xc0,
0x19,0xc0,
0x18,0xc0,//高音階1,2,3,4,5,6,7
0x15,0xc0,
0x13,0xc0,
0x12,0xc0,
0x10,0xc0,
0x0e,0xc0,
0x0d,0xc0,
0x26,0x20,0x2b,0x20,0x26,0x80,0xff,0x20,0x2b,0x20,0x26,0x20,0x26,0x10,//兩只蝴蝶
0x2b,0x10,0x30,0x80,0xff,0x40,0x39,0x20,0x30,0x20,0x2b,0x40,0x2b,0x20,
0x26,0x20,0x2b,0x20,0x30,0x20,0x39,0x20,0x39,0x10,0x30,0x10,0x40,0x80,
0x40,0x80,0x26,0x20,0x2b,0x20,0x26,0x80,0xff,0x20,0x2b,0x20,0x26,0x20,
0x26,0x10,0x2b,0x10,0x30,0x80,0xff,0x40,0x39,0x20,0x30,0x20,0x2b,0x40,
0x2b,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x39,0x20,0x30,0x20,0x2b,0xc0,
0x26,0x20,0x2b,0x20,0x26,0x80,0xff,0x20,0x2b,0x20,0x26,0x20,0x26,0x10,
0x2b,0x10,0x30,0xc0,0x39,0x20,0x30,0x20,0x2b,0x40,0x2b,0x20,0x26,0x20,
0x2b,0x20,0x30,0x20,0x39,0x20,0x39,0x10,0x30,0x10,0x40,0xc0,0x26,0x20,
0x20,0x20,0x20,0x80,0xff,0x20,0x20,0x20,0x1c,0x20,0x20,0x20,0x26,0xc0,
0x2b,0x20,0x2b,0x20,0x2b,0x60,0x2b,0x20,0x26,0x20,0x2b,0x20,0x30,0x20,
0x39,0x20,0x39,0x20,0x30,0x20,0x30,0x20,0x30,0xc0,0xff,0x40,0xff,0x40,
0xff,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x18,0x20,0x19,0x20,0x19,0x20,
0x1c,0x20,0x26,0x20,0x2b,0x20,0x2b,0x20,0x26,0x20,0x26,0x80,0xff,0x20,
0x26,0x20,0x26,0x20,0x20,0x20,0x1c,0x40,0x1c,0x40,0xff,0x20,0x39,0x20,
0x26,0x20,0x2b,0x20,0x2b,0xc0,0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x20,
0x20,0x40,0xff,0x20,0x18,0x40,0x19,0x20,0x1c,0x20,0x1c,0x10,0x19,0x10,
0x26,0x40,0xff,0x20,0x1c,0x20,0x1c,0x20,0x19,0x20,0x1c,0x20,0x20,0x20,
0x26,0x20,0x2b,0x20,0xff,0x20,0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x80,
0xff,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,0x18,0x20,0x19,0x20,0x19,0x20,
0x1c,0x20,0x26,0x20,0x2b,0x20,0x2b,0x20,0x26,0x20,0x26,0x80,0xff,0x20,
0x26,0x20,0x26,0x20,0x20,0x20,0x1c,0x40,0x1c,0x40,0xff,0x20,0x39,0x20,
0x26,0x20,0x2b,0x20,0x2b,0xc0,0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x20,
0x20,0x40,0xff,0x20,0x18,0x40,0x19,0x20,0x1c,0x20,0x1c,0x10,0x19,0x10,
0x26,0x40,0xff,0x20,0x1c,0x20,0x1c,0x20,0x19,0x20,0x1c,0x20,0x20,0x20,
0x26,0x20,0x2b,0x20,0xff,0x20,0x40,0x40,0x39,0x20,0x30,0xc0,0xff,0xc0,
0xff,0xc0,//休止符
,0x00};
uchar zdjs=0, jp;//jp為節(jié)拍變量,
void del(yj);//yj為音階變量,延時(shí)為了樂(lè)音高低
void main(void)
{
uint dpjs=0;//讀數(shù)據(jù)的指針
uchar yj;
TMOD=0x01;//定時(shí)器0,工作方式1:16位定時(shí)器(0~65535),定時(shí)器模式,由運(yùn)行控制位TR0開啟
IE=0x82;//中斷允許寄存器設(shè)置,等于以下分別的設(shè)置:EA=1總中斷允許,ET0=1定時(shí)器中斷0允許;
TH0=0xd8;//給定時(shí)器賦初值,即定時(shí)時(shí)間的長(zhǎng)短:12MHz下10ms
TL0=0xf0;
TR0=1;//啟動(dòng)定時(shí)器0
while(1)
{
zdjs=0;//節(jié)拍長(zhǎng)短的計(jì)數(shù)器計(jì)數(shù)變量
dpjs++; yj=sound[dpjs];
dpjs++; jp=sound[dpjs];
while(zdjs!=jp)
{
if(yj!=0xff)
{
if(yj!=0)
{
voice=!voice;
del(yj);
}
else
{
dpjs=0;
break;
}
}
else
{
voice=1;
del(jp);
}
}
}
}
void time0() interrupt 1
{
TH0=0xd8;//定時(shí)10ms,12M
TL0=0xf0;
zdjs++;
}
void del(yj)
{
uchar yj2=2;
while(yj!=0)
{
while(yj2!=0)
{
yj2--;
}
yj2=2;
yj--;
}
}
好了,電子音樂(lè)已經(jīng)可以通過(guò)51單片機(jī)進(jìn)行演奏了。
還可以有其它的演奏辦法:
第一:上述程序不是唯一的,只要能控制好蜂鳴器發(fā)聲音的頻率,就可以發(fā)出音樂(lè)。
第二:還可以通過(guò)電子電路的設(shè)計(jì),通過(guò)雙穩(wěn)態(tài)電路(模擬電路)或其它芯片,可以得到發(fā)音樂(lè)的結(jié)果。小孩玩的電子琴,就是這樣來(lái)的。網(wǎng)上很多資料,這里不多說(shuō)了。
兩只蝴蝶簡(jiǎn)譜011.jpg
(67.42 KB, 下載次數(shù): 156)
下載附件
2017-6-5 18:10 上傳
作者:
Longan.Wang
時(shí)間:
2023-5-15 11:11
當(dāng)然用數(shù)組存放!如果數(shù)據(jù)太多,外掛Flash!
作者:
coody_sz
時(shí)間:
2023-5-15 16:27
可以參考MIDI。
或者自己定義,節(jié)拍速率,音符、時(shí)值。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1