51单片机的简单音乐应用
源程序如下:歌曲为小星星#include"reg51.h"#defineuintunsignedint#defineucharunsignedcharsbitbee=P1...
源程序如下:歌曲为小星星
#include"reg51.h"#define uint unsigned int
#define uchar unsigned char
sbit bee=P1^7;
uchar code tab[]={64580,64684,64777,64820,64898,64968,65030,}; //分别为中音的do~si
uchar code tab1[]={0x14,0x14,0x54,0x54,0x64,0x64,0x58, //歌曲为小星星
0x44,0x44,0x33,0x33,0x22,0x22,0x18,
0x54,0x54,0x44,0x44,0x34,0x34,0x28,
0x54,0x54,0x44,0x44,0x34,0x34,0x28,
0x14,0x14,0x54,0x54,0x64,0x64,0x58,
0x44,0x44,0x33,0x33,0x22,0x22,0x18,};
uint t;
uchar i;
void init(void) interrupt 1{TR0=0;
bee=~bee;
for(i=0;i<21;i=i+2) //把tab1里的值逐个赋给TH0和TL0
{TH0=tab1[i+1];
TL0=tab1[i];
}
TR0=1;
}
void delay(void) //书上说2/4拍得歌曲延迟时间为250ms,则定义定时时长为25ms,到主函数里{ //再用if(t==10)来产生250ms
TH0=0X9E;
TL0=0X58;
t++;
}
void main(void){uchar x=0;
TMOD=0x01;
TR0=1;
EA=1;
ET0=1;
while(1)
{if(t==10)
{for(x=0;x<7;x++)
{bee=tab[x];
delay();
}
x=0;
}
}
}
在proteus的电路图:
请问程序应该怎么改?初学不懂。。。谢谢!! 展开
#include"reg51.h"#define uint unsigned int
#define uchar unsigned char
sbit bee=P1^7;
uchar code tab[]={64580,64684,64777,64820,64898,64968,65030,}; //分别为中音的do~si
uchar code tab1[]={0x14,0x14,0x54,0x54,0x64,0x64,0x58, //歌曲为小星星
0x44,0x44,0x33,0x33,0x22,0x22,0x18,
0x54,0x54,0x44,0x44,0x34,0x34,0x28,
0x54,0x54,0x44,0x44,0x34,0x34,0x28,
0x14,0x14,0x54,0x54,0x64,0x64,0x58,
0x44,0x44,0x33,0x33,0x22,0x22,0x18,};
uint t;
uchar i;
void init(void) interrupt 1{TR0=0;
bee=~bee;
for(i=0;i<21;i=i+2) //把tab1里的值逐个赋给TH0和TL0
{TH0=tab1[i+1];
TL0=tab1[i];
}
TR0=1;
}
void delay(void) //书上说2/4拍得歌曲延迟时间为250ms,则定义定时时长为25ms,到主函数里{ //再用if(t==10)来产生250ms
TH0=0X9E;
TL0=0X58;
t++;
}
void main(void){uchar x=0;
TMOD=0x01;
TR0=1;
EA=1;
ET0=1;
while(1)
{if(t==10)
{for(x=0;x<7;x++)
{bee=tab[x];
delay();
}
x=0;
}
}
}
在proteus的电路图:
请问程序应该怎么改?初学不懂。。。谢谢!! 展开
展开全部
我的百度空间,有用单片机播放音乐的程序。
看楼主的电路,其中,三极管Q1的用法,有些奇特。
可以删除它,把 P1.7 直接连接到扬声器,即可。
复位电路,缺少一个接地的电阻。
看楼主的电路,其中,三极管Q1的用法,有些奇特。
可以删除它,把 P1.7 直接连接到扬声器,即可。
复位电路,缺少一个接地的电阻。
更多追问追答
追问
好的,另外问一个问题。程序有两个中断,一个为更优先的,则应该怎么设置?在不对IP寄存器修改时,是否在要优先的中断服务程序里写“interrupt 0”而另一个中断写“interrupt 2”? 因为默认的优先级是外部中断0大于外部中断1,而中断0用interrupt 0表示、中断1用interrupt 2表示?
追答
有两个中断,一个为更优先的,则应该怎么设置?
--要对 IP 寄存器进行设置。
在不对IP寄存器修改时,是否在要优先的中断服务程序里写“interrupt 0”而另一个中断写“interrupt 2”?
因为默认的优先级是外部中断0大于外部中断1,而中断0用interrupt 0表示、中断1用interrupt 2表示?
--这些不可更改。
展开全部
你得搞清楚音频原理先,如果不了解原理,就算让你做出来个电子音乐也是徒劳,建议你先了解一下 windows 中的 WAV 文件格式以及他的数据,因为 WAV 的数据就是 A/D 转换采集而来,至于频率是少,以多大的精度采样就和 WAV 文件头配置有关,了解这些之后,就可以试着逆向的解释出这些音频信号(根据频率计算中断时间,定时 D/A 转换输出)。然后再去理解更为抽象的电子音乐,这样你才会真的理解音频、音律是怎么回事。
追问
或者麻烦您给个可行的程序吧?我觉得直接看例子比较容易理解。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询