蜂鸣器播放音乐《好运来》^_^

初学单片机,为提高学习兴趣,并且对所学知识的总结与应用,也顺便做笔记,

源码(仅供参考)

 

#include <REGX52.h>
#include "Delay.h"

sbit Buzz = P1^5;

#define SPEED	400     //播放速度,值为四分音符的时长(ms)

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P	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


unsigned char MusicSelect , FreqSelect;

//索引与频率对照表
code unsigned int  FreqTable_H[] = {
0,
0xF8,0xF8,0xF9,0xF9,0xFA,0xFA,0xFA,0xFB,0xFB,0xFB,0xFB,0xFC,
	
0xFC,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFE,

0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,

};//定时器计时高位 休止符(0) 低调(1~12) 中调(13~24) 高调(25~36)

code unsigned int  FreqTable_L[] = {
0,
0x8C,0xF3,0x5B,0xB8,0x15,0x67,0xB9,0x04,0x4B,0x90,0xCF,0x10,
	
0x44,0x79,0xAC,0xDC,0x09,0x34,0x5C,0x82,0xA6,0xC8,0xE8,0x06,

0x22,0x3D,0x56,0x6E,0x85,0x9A,0xAE,0xC1,0xD3,0xE4,0xF4,0x03,

};//定时器计时低位 休止符(0) 低调(1~12) 中调(13~24) 高调(25~36)


/*乐谱好运来*/
code unsigned char Music[] = {
M6,2+1+1,H1,2,H1,2,
M6,4+2,M6,2,
M5,2,M3,2,M5,2,H1,2,
M6,4,0,4,
M6,2,H1,2,H1,2+1,H1,1,
H1,4,M5,4,
M6,2,M5,2,M2,2,M5,2,
M3,4+2,M2,2,
M3,2,M2,2,M1,2,M3,2,
M2,4+2,M3,2,
M6,2,M5,2,M3,2,M6,2,
M6,2,M5,4+2,
	
M6,2,H1,2,H1,2,M6,1,
H2,2,H2,2,H2,2,H1,2,
M6,4,M5,2,H1,2,
M6,4+4,
M6,4+4,                //
M6,4,H3,2+1,H2,1,
H2,4,H1,2,M6,2,
M5,2,H1,2,
M6,4,M6,4,
M6,4,H2,4,
H1,4,M6,2,M5,2,
M2,4,M5,2,M6,2,
M5,2,M3,4+2,

M3,4,M6,2+1,M5,1,M6,4,M6,2,M5,2,
M6,4,H2,2+1,H1,1,
H2,4,H2,4,
H1,2+1,H1,1,H1,2,H2,2,
H3,2,H3,2,H2,2,H1,2,
M5,4,H1,2+1,M6,1,
M6,4,M6,4,
M6,4,M6,4,//
H2,4,H2,4,
H2,4,H2,4,

H3,4,H3,4,
H3,4,H3,4,
M6,4,M6,4,
M6,4,M6,4,
M6,4,M6,4,
M6,4,M6,4,
0,4,M5,2,M5,2,
M6,4,M6,4,

0xFF   //停止标志位
};


void Timer0Init()
{
		
		TMOD |= 0x01;
		TL0 = 0x18;
		TH0 = 0xFC;
		TR0 = 1;
		ET0 = 1;
		EA = 1;
}


void main()
{
		Timer0Init();
		while(1)
		{
			if(Music[MusicSelect]!=0xFF)   //判断是否等于终止标志位
			{
					FreqSelect = Music[MusicSelect];  //获取音符对应的频率
					MusicSelect++;                    //MusicSelect++转换至音符长度
					delay(SPEED/4*Music[MusicSelect]);//选择音符对应的时间长度(时值)
					MusicSelect++;                   //MusicSelect++转换至下一个音符
					TR0 = 0;
					delay(5);                         //音符间短暂停顿
					TR0 = 1;
			}	
			else                           //如果是停止标识符清零重新播放
			{
					TR0 = 0;
					MusicSelect = 0;
			}				
		}
	
}


void Timer0_Routine() interrupt 1
{
		if(FreqSelect)   //判断是否为休止符
		{
				/*取对应频率值的重装载值到定时器*/
				TL0 = FreqTable_L[FreqSelect];   //设置定时器初值
				TH0 = FreqTable_H[FreqSelect];	 //设置定时器初值
				Buzz = !Buzz;//翻转蜂鸣器IO口
		}
}

 

  • 5
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不惑梦蝶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值