单片机音乐播放器课程设计中音乐代码怎么弄
答案:2信息版本:手机版
解决时间 -10-06 13:16
已解决
-10-06 02:07
单片机音乐播放器课程设计中音乐代码怎么弄
最佳答案
-10-06 02:20
做成两个数组存放数据,一个控制频率,一个控制频率持续时间长短,然后主程序调用数组。
全部回答
1楼
-10-06 03:10
就用单片机和蜂鸣器应该就可以。你控制蜂鸣器的频率改变,这样蜂鸣器发声的“音调”就会不一样,然后再自己慢慢调那些频率,就可以构成一个单片机控制的音乐了。
至于音乐里面的12345671怎么发声,请参考以下资料(采用51单片机):
为了输出准确的音阶频率,我们需要用定时器输出来控制蜂鸣器的驱动,这里用的 t0。
我们再每一次定时器中断溢出时取反 p17 引脚,以形成频率驱动蜂鸣器,定时器 0 工
作在 16 位方式,需要在中断里重新置入初始值。这个值就决定了 p17输出的频率。我们在
程序里先做好了一张表,预先写好了每个音阶的频率需要设置的初始值。到时调入对应的值
进去 t0,不断溢出时就 p17 可以输出对应的频率。
在这个程序里,我们自动地输出 8 个音符,每个音符保持 1 秒钟左右。
―――――――――――――――――――――――
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include //包括一个 52 标准内核的头文件
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
sbit beep=p1^7; //喇叭输出脚
uchar th0_f; //在中断中装载的 t0 的值高 8 位
uchar tl0_f; //在中断中装载的 t0 的值低 8 位
//t0 的值,及输出频率对照表
uchar code freq[36*2]={
0xa9,0xef,//00220hz ,1 //0
0x93,0xf0,//00233hz ,1#
0x73,0xf1,//00247hz ,2
0x49,0xf2,//00262hz ,2#
0x07,0xf3,//00277hz ,3
0xc8,0xf3,//00294hz ,4
0x73,0xf4,//00311hz ,4#
0x1e,0xf5,//00330hz ,5
0xb6,0xf5,//00349hz ,5#
0x4c,0xf6,//00370hz ,6
0xd7,0xf6,//00392hz ,6#
0x5a,0xf7,//00415hz ,7
0xd8,0xf7,//00440hz 1 //12
0x4d,0xf8,//00466hz 1# //13
0xbd,0xf8,//00494hz 2 //14
0x24,0xf9,//00523hz 2# //15
0x87,0xf9,//00554hz 3 //16
0xe4,0xf9,//00587hz 4 //17
0x3d,0xfa,//00622hz 4# //18
0x90,0xfa,//00659hz 5 //19
0xde,0xfa,//00698hz 5# //20
0x29,0xfb,//00740hz 6 //21
0x6f,0xfb,//00784hz 6# //22
0xb1,0xfb,//00831hz 7 //23
0xef,0xfb,//00880hz `1
0x2a,0xfc,//00932hz `1#
0x62,0xfc,//00988hz `2
0x95,0xfc,//01046hz `2#
0xc7,0xfc,//01109hz `3
0xf6,0xfc,//01175hz `4
0x22,0xfd,//01244hz `4#
0x4b,0xfd,//01318hz `5
0x73,0xfd,//01397hz `5#
0x98,0xfd,//01480hz `6
0xbb,0xfd,//01568hz `6#
0xdc,0xfd,//01661hz `7 //35
};
//定时中断 0,用于产生唱歌频率
timer0() interrupt 1
{
tl0=tl0_f;th0=th0_f; //调入预定时值
beep=~beep; //取反音乐输出 io
p2=~p2;
}
//音阶声音自动输出试验
void main(void) // 主程序
{
ulong n;
uchar i;
uchar code jie8[8]={12,14,16,17,19,21,23,24};//1234567`1 八个音符在频率表中的位置
tmod = 0x01; //使用定时器 0 的 16 位工作模式
tr0 = 1;
et0 = 1;
ea = 1;
while(1)
{
for(i=0;i<8;i++) //循环播放 8 个音符
{
tl0_f=freq[jie8[i]*2]; //置一个音符的值
th0_f=freq[jie8[i]*2+1];
for(n=0;n<50000;n++); //延时 1 秒左右
}
}
}
―――――――――――――――――――――――――――――――
请编译,运行。可以听到 8 个音符不断循环输出。
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
大家都在看
推荐资讯