Ⅰ 单片机播放音乐里的音乐代码是怎么得到的有什么软件能将歌曲直接转换成16进制代码
把简谱中每个唱名对应的频率找出来,比如C调的1对应264Hz左右。
然后把这些频率通过公式转换成初值再换算成十六进制。
比如你用的是定时的工作方式1,则可以这位算:(假设晶振是12MHz)
X=2^16-10^6/(264*2)=63642因为要计算的是半周期对应的初值,所以频率就是2倍。
十六进制就是:F89A
好像没有什么软件吧,有的话告诉我一声哦。
Ⅱ 51music单片机音乐代码生成器中的蜂鸣接口是什么意思还有1---后面的四节拍怎么输入
#include<reg51.h>
sbit speaker=P1^6; //(单片机音乐代码生成器中的蜂鸣接口,就是一个IO脚)
unsigned char timer0h,timer0l,time;
//生日歌,这三个字节一组,分别定义:旋律(1234567)、高低音(低音、中音、高音)、节奏(长度)
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
// 音阶频率表 高八位,也就是发音对应频率的高八位
code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
// 音阶频率表 低八位,也就是发音对应频率的低八位
code unsigned char FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, };
void delay(unsigned char t) //延时程序
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{ ; } }
TR0=0;
}
void t0int() interrupt 1 //定时器0中断服务程序,控制声音打频率
{ TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song() //启动演奏当前频率
{ TH0=timer0h; //当前频率的高八位
TL0=timer0l; //当前频率的低八位
TR0=1; //启动定时器0
delay(time); //延时当前频率的演奏时间
}
void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1 EA=1; ET0=1;//IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<75)
{ //音乐数组长度 ,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1; //取当前节奏的频率地址
timer0h=FREQH[k]; //取当前频率高八位
timer0l=FREQL[k]; //取当前频率低八位
time=sszymmh[i+2]; //取当前频率的时长
i=i+3; //三个字节一组
song(); //演奏当前频率,共75/3,25个曲调。
}
}
}
//程序的设计思路就是将一首乐曲分成三个变量来控制,分别是曲调、所在音区、时长。而控制曲调的因素也就是频率又分成高八位和第八位两个表,每演奏一个曲调,就根据该曲调的三个变量来取值。
Ⅲ 51music单片机音乐代码生成器怎么用
试了一下,感觉速度很正常,没有快很多的感觉。
这个软件应该是以12M晶振的51单片机为基础,针对那些以四分之一音符为一拍的音乐而设计的,如果晶振频率过快,或者音乐以二分之一音符为一拍的,那样设计结果都会比预想的快。
如果想让他慢下来有两个方法,一个是修改晶振频率,另一个就是找到程序中void delay(uchar p)函数,修改函数内i,j变量的类型并且修改循环的参数,让这个延时函数的时间变长。
符号的输入要看符号的含义了,这种软件不可能面面俱到的。
Ⅳ 用11.0592m晶振的51单片机的蜂鸣器音乐代码生成软件
音符频率(Hz)
低1DO262
#1DO#277
低2RE294
#2RE#311
低3M330
低4FA349
#4FA#370
低5SO392
#5SO#415
低6LA440
#6466
低7SI494
中1DO523
#4FA#740
中5SO784
#5SO#831
中6LA880
#66LA#932
中7SI988
高1DO1046
#1DO#1109
高2RE1175
#2RE#1245
高3M1318
高4FA1397
#4FA#1480
高5SO1568
#5SO#1661
高6LA1760
#61865
高7SI1967
初值计算公式:65536-460800/Fr
Ⅳ 能提供几首单片机的歌曲代码用蜂鸣器唱的
#include <reg52.h>
#include <intrins.h>
//本例采用89C52, 晶振为11.0592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码.
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
sbit out=P2^3;
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) out=~out,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
TR0=0; //关定时器1
}
}
Ⅵ 单片机音乐程序代码
T0H EQU30H
T0LEQU31H
ORG0000H
LJMPMAIN
ORG000BH
LJMPT0ISR
ORG0030H
MAIN:
MOVSP,#5FH
MOVTMOD,#01H
SETBET0
SETBEA
LOOP:
MOVDPTR,#FREQ
MOVA,P2 ;控制高中低音区
MOVR1,#0
ANLA,#03H
JBACC.0,LOOP01
MOVR1,#14
SJMPLOOP0
LOOP01:
JBACC.1,LOOP0
MOVR1,#28
LOOP0:
JBP0.0,LOOP1 ;控制音频1234567
MOVA,R1
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP1:
JBP0.1,LOOP2
MOVA,R1
ADDA,#2
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#2
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP2:
JBP0.2,LOOP3
MOVA,R1
ADDA,#4
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#4
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP3:
JBP0.3,LOOP4
MOVA,R1
ADDA,#6
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#6
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP4:
JBP0.4,LOOP5
MOVA,R1
ADDA,#8
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#8
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP5:
JBP0.5,LOOP6
MOVA,R1
ADDA,#10
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#10
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP6:
JBP0.6,LOOP7
MOVA,R1
ADDA,#12
MOVCA,@A+DPTR
MOVT0H,A
INCDPTR
MOVA,R1
ADDA,#12
MOVCA,@A+DPTR
MOVT0L,A
LJMPLOOP
LOOP7:
CLRTR0
LJMPLOOP
;-----------------------------
T0ISR:
CLRTR0
MOVTH0,T0H
MOVTL0,T0L
SETBTR0
CPLP3.0
RETI
;-----------------------------
FREQ:
DB0F2H,03DH ;低音1
DB0F3H,0BDH ;低音2
DB0F5H,014H ;低音3
DB0F5H,0B1H ;低音4
DB0F6H,0D0H ;低音5
DB0F7H,0D1H ;低音6
DB0F8H,0B5H ;低音7
DB0F9H,01EH ;中音1
DB0F9H,0DEH ;中音2
DB0FAH,08AH ;中音3
DB0FAH,0D8H ;中音4
DB0FBH,068H ;中音5
DB0FBH,0E8H ;中音6
DB0FCH,05AH ;中音7
DB0FCH,08FH ;高音1
DB0FCH,0EFH ;高音2
DB0FDH,045H ;高音3
DB0FDH,06CH ;高音4
DB0FDH,0B4H ;高音5
DB0FDH,0F4H ;高音6
DB0FEH,029H ;高音7
;-----------------------------
END
Ⅶ 怎么样将歌曲直接转成单片机代码,有专门的工具吗我要用的是《我爱北京天安门》
一般的单片机没那个能力,楼主想多了?
Ⅷ 求一个用C语言编写的51单片机音乐程序代码。
#include <reg52.h>
sbit speaker=P2^2;
unsigned char timer0h,timer0l,time;
//生日歌
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,
5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,
4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4};
// 音阶频率表 高八位
code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
} ;
// 音阶频率表 低八位
code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
void delay(unsigned char t)
{
unsigned char t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++)
{
;
}
}
TR0=0;
}
void t0int() interrupt 1
{
TR0=0;
speaker=!speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void song()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
void main(void)
{
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1
EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断
while(1)
{
i=0;
while(i<75){ //音乐数组长度 ,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
}
Ⅸ 51music 单片机音乐代码生成器 1.0绿色版怎么用
根据简谱点击音符和时长,也就是点一个间符,再点这个音符的时长,完成一个音符的输入,输完全部音符后点生成代码,把代码复制到程序中编译就行