51单片机弹奏《蒲公英的约定》

        作为一个多年的周杰伦粉丝,在学习单片机的过程中,那必须要将jay的歌曲让单片机演奏出来,这里,我将要让单片机演奏的是《蒲公英的约定》。

        作者用的是普中51单片机,蜂鸣器接口是P2^5,如果不一样的话可以在代码中sbit Buzzer=P2^5中将后面的P2^5改为对应的接口。本代码灵感来源于https://blog.csdn.net/m0_63738169/article/details/140933085

剩下的不多说,直接放代码:

#include <REGX52.H>
 
#define SPEED 	500
 
//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P0   0
#define L1  1
#define	L1_ 2
#define	L2  3
#define	L2_	4
#define	L3	5
#define	L4	6
#define	L4_	7
#define	L5	8
#define	L5_	9
#define	L6	10
#define	L6_	11
#define	L7  12
#define M1  13
#define	M1_ 14
#define	M2  15
#define	M2_	16
#define	M3	17
#define	M4	18
#define	M4_	19
#define	M5	20
#define	M5_	21
#define	M6	22
#define	M6_	23
#define	M7  24
#define H1  25
#define	H1_ 26
#define	H2  27
#define	H2_	28
#define	H3	29
#define	H4	30
#define	H4_	31
#define	H5	32
#define	H5_	33
#define	H6	34
#define	H6_	35
#define	H7  36
 
 
sbit Buzzer=P2^5;
 
void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--)
	{
			i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
 
	}
	
}
 
 
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}
 
 
unsigned int FreqTable[]={
	0,
	63777,63872,63969,64054,64140,64216,64291,64360,64426,64489,64547,64607,
	64655,64704,64751,64795,64837,64876,64913,64948,64981,65012,65042,65070,
	65095,65120,65144,65166,65186,65206,65225,65242,65259,65274,65289,65303,
	
};
 
unsigned int code Music[]={
//1
	M3,2,
	M5,2,
	H1,2,
	H3,2,
//2
	H3,6,
	H4,2,
	H2,8,
//3	
	H2,4,
	H5,2,
	M7,2,
	H1,8,
//4
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,4,
//5
	H3,8,
	M3,2,
	M5,2,
	H1,2,
	H3,2,
//6
	H3,6,
	H4,2,
	H2,8,
//7
	H2,4,
	H5,2,
	M7,2,
	H1,8,
//8
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,4,
//9
	H1,4,
	M2,2,
	M4,2,
	M3,2,
	M3,2,    //小学篱
	M4,2,
	M5,4,
//10    
	M5,2,
	M5,2,
	M5,2,
	M5,2,
	M6,2,
	M7,2,
	H1,10,    //笆旁的蒲公英
//11
	H1,2,
	M7,2,
	H2,2,
	M6,2,    //是记忆里
//12
	M6,2,
	M5,2,
	M5,2,
	H2,2,
	H2,2,
	H1,2,
	H3,4,    //有味道的风
//13
	H3,8,
	H1,2,
	H2,2,
	H3,2,
	H3,4,    //景  午睡操场
//14
	H3,2,
	H4,2,
	H3,2,
	H3,2,
	H2,2,
	H3,2,
	H1,10,    //传来蝉的声音
//14
	M6,2,
	M7,2,
	H1,2,
	H2,4,    //多少年后
//15	
	H1,2,
	H1,2,
	M6,4,
	H3,2,
	H3,2,
	H2,10,    //也还是很好听
//16
	P0,2,
	M3,2,
	M4,2,
	M5,4,    //将愿望
//17
	M5,2,
	M5,2,
	M5,2,
	M5,2,
	M6,2,
	M7,2,
	M5,1,
	H2,1,    //折纸飞机寄成
//18
	H1,8,
	H1,2,
	M7,2,
	H2,2,
	M5,1,
	M6,3,    //信  因为我们
//19
	M5,2,
	M5,2,
	H2,4,
	H1,2,
	H3,3,
	H3,9,    //等不到那流星
//20
	H1,2,
	H2,2,
	H3,2,
	H3,4,    //认真投决
//21
	H3,2,
	H4,2,
	H3,2,
	H3,2,
	H2,2,
	H3,2,
	H2,2,    //定命运的硬币
//22
	H1,8,
	M6,2,
	M7,2,
	H1,2,
	H2,4,    //却不知道
//23
	H1,2,
	H1,2,
	M6,4,
	H3,2,
	H3,2,
	H2,10,    //到底能去哪里
//24
	M3,2,
	M5,2,
	H1,2,
	H3,2,    //一起长大
//25
	H3,6,
	H4,2,
	H2,8,    //的约定
//26
	H2,3,
	H5,2,
	M7,2,
	H1,8,    //那样清晰
//27
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,2,
	H3,1,
	H3,9,    //打过勾的我相信
//28
	M3,2,
	M5,2,
	H1,2,
	H3,1,    //说好要一
//29
	H3,6,
	H4,2,
	H2,8,    //起旅行
//30
	H2,4,
	H5,2,
	M7,2,
	H1,8,    //是你如今
//31
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,2,
	H1,2,    //唯一坚持的任
//32
	H1,8,    //性
	
//过度1
	H2,2,
	M3,2,
	M5,2,
	H2,2,
	H1,2,
	M3,2,
	M5,2,
	H1,2,
	M7,2,
	M2,2,
	M3,2,
	M7,2,
	H1,2,
	M2,2,
	M3,2,
	H1,2,
	
	H2,2,
	M3,2,
	M5,2,
	H2,2,
	H1,2,
	M3,2,
	M5,2,
	H1,2,
	M7,2,
	M2,2,
	M3,2,
	M7,2,
	H1,2,
	M2,2,
	M3,2,
	H1,2,
	
	H3,2,
	M4,2,
	M6,2,
	H3,2,
	H2,2,
	M4,2,
	M6,2,
	H2,2,
	H1,2,
	M4,2,
	M6,2,
	H1,2,
	H2,2,
	M4,2,
	M6,2,
	H2,2,
	
	H3,2,
	M4,2,
	M6,2,
	H3,2,
	H2,2,
	M4,2,
	M6,2,
	H2,2,
	H4,2,
	M4,2,
	H6,2,
	H4,2,
	H3,2,
	M3,2,
	M5,2,
	H3,2,
	
//过度2
	H2,2,
	M3,2,
	M5,2,
	H2,2,
	H1,2,
	M3,2,
	M5,2,
	H1,2,
	M7,2,
	M2,2,
	M3,2,
	M7,2,
	H1,2,
	M2,2,
	M3,2,
	H1,2,
	
	H2,2,
	M3,2,
	M5,2,
	H2,2,
	H1,2,
	M3,2,
	M5,2,
	H1,2,
	M7,2,
	M2,2,
	M3,2,
	M7,2,
	H1,2,
	M2,2,
	M3,2,
	H1,2,
	
	H3,2,
	M4,2,
	M6,2,
	H3,2,
	H2,2,
	M4,2,
	M6,2,
	H2,2,
	H1,2,
	M4,2,
	M6,2,
	H1,2,
	H2,2,
	M4,2,
	M6,2,
	H2,2,
	
	H3,2,
	M4,2,
	M6,2,
	H3,2,
	H2,2,
	M4,2,
	M6,2,
	H2,2,
	H4,4,
	H3,4,
	H1,8,
	
//下半段
	P0,2,
	M3,2,
	M4,2,
	M5,4,    //在走廊
	
	M5,2,
	M5,2,
	M5,4,
	M6,2,
	M7,2,
	H1,10,    //上罚站打手心
	
	H1,2,
	M7,2,
	H2,2,
	M5,1,
	M6,3,    //我们却注
	
	M5,2,
	M5,2,
	H2,4,
	H1,2,
	H3,3,
	H3,9,    //意窗边的蜻蜓
	
	H1,2,
	H2,2,
	H3,2,
	H3,4,    //我去到哪
	
	H3,2,
	H4,2,
	H3,4,
	H2,2,
	H3,2,
	H1,10,    //里你都跟很紧
	
	M6,2,
	M7,2,
	H1,2,
	H2,4,    //很多的梦
	
	H1,2,
	H1,2,
	M6,4,
	H3,2,
	H3,2,
	H2,10,    //在等待着进行
	
	M3,2,
	M5,2,
	H1,2,
	H3,2,    //一起长大的
	
	H3,6,
	H4,2,
	H2,8,    //的约定
	
	H2,4,
	H5,2,
	M7,2,
	H1,8,    //那样清晰
	
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,2,
	H3,1,
	H3,9,    //打过勾的我相信
	
	M3,2,
	M5,2,
	H1,2,
	H3,2,    //说好要一
	
	H3,6,
	H4,2,
	H2,8,    //起旅行
	
	H2,4,
	H5,2,
	M7,2,
	H1,8,    //是你如今
	
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,2,
	H1,10,    //唯一坚持的任性
	
	H6,2,
	H5,2,
	H3,2,
	H2,1,
	H1,1,    //一起长大
	
	H3,6,
	H4,2,
	H2,8,    //的约定
	
	H6,2,
	H5,4,
	M7,2,
	H1,8,    //那样真心
	
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,2,
	H3,1,
	H3,9,    //与你聊不完的曾经
	
	M3,2,
	M5,2,
	H1,2,
	H3,2,    //而我已经
	
	H3,6,
	H2,2,
	H2,10,    //分不清
	
	H2,4,
	H5,2,
	M7,2,
	H2,1,
	H1,7,    //你是友情
	
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,4,    //还是错过的爱
	
	H1,8,    //情
	
	M3,2,
	M5,2,
	H1,2,
	H2,2,   
	
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,4,
	
	H1,4,
	P0,2,
	M5,2,
	H1,2,
	H2,2,
	
	H3,2,
	H4,2,
	H5,2,
	H1,2,
	H1,4,
	H2,2,
	
	H1,4,
	M4,4,
	M3,24,
	0xFF,
	//终止标志
 
	
};
 
unsigned int FreqSelect,MusicSelect;
 
void main()
{
	Timer0_Init();
	
	while(1)
	{
		if(Music[MusicSelect]!=0xFF)
		{
			FreqSelect=Music[MusicSelect];
			MusicSelect++;
			Delay(SPEED/4*Music[MusicSelect]);
			MusicSelect++;
			TR0=0;
			Delay(5);
			TR0=1;
		}
		else
		{
			TR0=0;
			while(1);
		}
		
	}
	
}
 
void Timer0_Routine()	interrupt 1 
{
	if(FreqTable[FreqSelect])
	{
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;
	}
		
		
}

下面是实机演示视频:

51单片机演奏蒲公英的约定演示视频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值