使用前提,
1,单片机是stc89c52,
2,晶振是12.000
由上图可知:蜂鸣器的BZ端链接在单片机的P15口
废话少说,来代码:
#include <REGX52.H>
#include “Delay.h”
#include “time.h”
sbit Buzzer=P1^5;
unsigned int pinlv[]=
{0,63628,63731,63835,63928,64021,64103,64185,
64260,64331,64400,64463,64524,64580,64633,
64684,64732,64777,64820,64860,64898,64934,
64968,65000,65030,65058,65085,65110,65134,
65157,65178,65198,65217,65235 ,65252 ,65268, 65283,
}; //每一个数字代表着一个音符
unsigned int code music[]={
18,2, //18表示的是65535那些数字中的第18位(就是上一行的矩阵)
18,2, //以1/16拍子为基本单位1,则1/4拍子显示为4,1/8拍子则显示为2
18,2,
18,2,
22,2,
22,2,
22,2,
22,2,
20,2,
20,2,
20,2,
20,2,
25,2,
25,2,
25,2,
25,2,
27,2,
27,2,
27,2,
27,2,
27,2,
27,2,
27,2,
27,2,
20,2,
18,2,
17,2,
13,2,
15,2,
0,2,
15,2,
22,2,
//1行
20,2,
0,2,
18,2,
0,2,
17,2,
0,2,
17,2,
17,2,
20,2,
0,2,
18,2,
17,2,
15,2,
0,2,
15,2,
30,2,
29,2,
30,2,
29,2,
30,2,
15,2,
0,2,
15,2,
30,2,
29,2,
30,2,
29,2,
30,2,
15,2,
0,2,
15,2,
22,2,
//2行
20,2,
0,2,
18,2,
0,2,
17,2,
0,2,
17,2,
17,2,
20,2,
0,2,
18,2,
17,2,
15,2,
0,2,
15,2,
30,2,
29,2,
30,2,
29,2,
30,2,
15,2,
0,2,
15,2,
30,2,
29,2,
30,2,
29,2,
30,2,
18,2,
18,2,
18,2,
18,2,
//3行
22,2,
22,2,
22,2,
22,2,
20,2,
20,2,
20,2,
20,2,
25,2,
25,2,
25,2,
25,2,
27,2,
27,2,
27,2,
27,2,
27,2,
27,2,
27,2,
27,2,
20,2,
18,2,
17,2,
13,2,
15,2,
0,2,
15,2,
22,2,
20,2,
0,2,
18,2,
0,2,
1000}; //1000为结束标注
unsigned char pinlvxuanz,musicselect;
void main()
{ Timer0Init();
while(1)
{
if(music[musicselect]!=1000)
{pinlvxuanz=music[musicselect];
musicselect++;
Delay(5*music[musicselect]);//修改5的大小可以改变音乐的快慢
musicselect++;
TR0=0;
Delay(50);
TR0=1;
}
else
{TR0=0;
while(1);
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
{ TL0 = pinlv[pinlvxuanz]%256; //设置定时初值
TH0 = pinlv[pinlvxuanz]/256; //设置定时初值
Buzzer=!Buzzer;
}
}
以上仅展示主程序
这个程序所需要的模块若打出来的话所需页面太大,如果有需要的话,可在百度网盘下载。
链接:https://pan.baidu.com/s/1BP_GoVxUT9wg5K_WfSym9A
提取码:hb78
能给个小赞吗?您的点赞是我最大的动力,谢谢!!!!!!!