使用51单片机蜂鸣器播放音乐 求keil程序

希望能给陈慧娴飘雪的51单片机蜂鸣器播放音乐程序 源给keil程序和hex文件,我的51单片机蜂鸣器口P1.5。有问题私聊

//主程序查音符码,将不同的初值装入定时器,定时器每中断一次,P3.7取反一次,形成不同频率的方波
//11代表低音哆 21代表高音哆 1代表中音哆
//12代表低音来 22代表高音来 2代表中音来,是不是翻译乐谱很方便
#include<reg52.h>
sbit SPK = P3^7; //P3.7外接扬声器,可以改成你所说的P1^5

#define uint unsigned int;
#define uchar unsigned char;
uint x,y;
uint i,j,k;
//以下是根据歌谱转来的音乐代码 3代表中音咪 1个全音被分成4个1/4 音符
//小燕子第一句 3,5,21,6,5,5,5,5, 21是高音哆 ,后面4个5,是因为这个音节占4拍
uchar code MUSIC[]={3,5,21,6,5,5,5,5, 3,5,6,21,5,5,5,5, 21,21,21,23,22,22,21,21, 22,21,6,21,5,5,5,5, 3,3,5,6,6,5,6, 21,21,22,5,6,6,6,6, 3,3,1,1,2,2,2,2,2,
2,2,2,3,5,5,5,5, 21,21,2,3,5,5,5,5, 2,1,16,1,15,15,15,15, 0,0,0,0,16,16,1,1, 15,15,16,16,1,1,1,1, 5,5,6,6,4,4,3,3, 2,2,2,2,2,2,5,5, 5,5,2,2,4,4,3,3, 2,2,1,2,4,4,4,4,
16,16,1,1,2,2,4,4, 2,1,16,1,15,15,15,15, 16,16,16,16,15,15,15,15, 15,15,15,15,15,15,15,15, 0,0,5,5,5,5,0,0, 5,5,5,5,4,4,4,4,
5,5,5,5,2,2,2,2, 2,2,5,5,4,4 ,4,4, 16,16,1,1,2,2,2,2, 4,4,2,2,2,2,4,4, 5,5,5,5,5,5,6,6, 21,21,21,21,6,6,21,21,
21,21,6,6,5,5,5,5, 5,5,6,6,5,5,4,4, 2,2,2,2,2,2,5,5, 5,5,2,2,4,4,3,3, 2,2,1,2,4,4,4,4, 16,16,1,1,2,2,4,4,
2,1,16,1,15,15,15,15, 16,16,16,16,15,15,15,15, 5,5,6,6,5,5,6,6, 5,5,4,4,5,5,5,5, 1,1,2,2,1,1,2,2, 15,15,16,16,1,1,1,1,
5,5,6,6,5,5,6,6, 21,21,6,6,5,5,5,5, 1,1,2,2,1,1,2,2, 15,15,16,16,1,1,1,1, 5,5,6,6,5,5,4,4, 5,5,5,5,1,1,2,2, 15,15,16,16,1,1,1,1,
5,5,6,6,5,5,5,5, 1,1,2,2,1,1,1,1, 5,5,6,6,5,5,5,5, 1,1,2,2,1,1,1,1, 5,5,5,5,1,1,1,1, 5,5,5,5,1,1,1,1, 5,5,5,5,1,1,5,5,
1,1,5,5,1,1,5,5, 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, 0,0,1,1,1,1,0,0, 5,5,5,5,4,4,4,4, 5,5,5,5,2,2,2,2, 2,2,5,5,4,4,4,4,
6,6,1,1,2,2,2,2, 4,4,2,2,2,2,4,4, 5,5,5,5,5,5,6,6, 21,21,21,21,6,6,21,21, 21,21,6,6,5,5,5,5, 5,5,6,6,5,5,4,4, 2,2,2,2,2,2,5,5,
5,5,2,2,4,4,3,3, 2,2,1,22,4,4,4,4, 16,16,1,1,2,2,4,4, 4,4,6,6,5,5,5,5, 5,5,5,5,5,5,5,5, 6,6,6,6,5,5,5,5};

uchar code table[] = { 0,0xfc,0xfc,0xfd,0xfd,0xfd,0xfd,0xfe,0,0,0, //定时半周期的初始值中音123 4 5 67高8位
//三个0是补位码,为了使表格整齐,便于按规律查询 首个0是休止符11个
0xf8,0xf9,0xfa,0xfa,0xfb,0xfb,0xfc,0,0,0, //低音1 2 3 4 5 67高8位 10个
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xff, //高音1 2 3 4 5 67高8位 7个
0,0x44,0xad,0x0a,0x34,0x82,0xc8,0x06,0,0,0, //中音123 4 5 67低8位 10个
0x89,0x59,0x13,0x68,0x04,0x90,0x0c,0 ,0,0, //低音1 2 3 4 5 6 7低8位10个
0x22,0x56,0x85,0x9a,0xc1,0xe4,0x03}; //高音1 2 3 4 5 6 7低8位 7个

void delay(i) //晶振12MHZ时延时1ms
{
for(j=i;j>0;j--)
for(k=121;k>0;k--);
}

void TIM0_ISR() interrupt 1
{
SPK=!SPK;//定时取反,形成方波
TH0=table[x]; //重新载入定时半周期的初始值
TL0=table[x+28];//为什么加28 11+10+7=28
}

void main(void)
{
TMOD|=0x01;
EA=1;
ET0=1;
while(1)
{
y=0;
while(y<592)//此乐谱里面有592个音符
{
x=MUSIC[y];//查乐谱表
TH0=table[x]; //查不同音节的定时器初值
TL0=table[x+28];
TR0=1; //打开定时器
if(y>72)//两首曲子不同节奏,延时不同
{
delay(125); //延时125ms
}
else
{
delay(250); //延时250ms
}
y++;
TR0=0;
}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-02-10
21代表高音哆 1代表中音哆
//12代表低音来 22代表高音来 2代表中音来,是不是翻译乐谱很方便
#include
sbit SPK = P3^7; //P3.7外接扬声器,可以改成你所说的P1^5
#define uint unsigned int;
#define uchar unsigned char;
uint x,y;
uint i,j,k;
第2个回答  2020-02-05
,,,,,,,。。。。。。。。。。。
相似回答