基于51单片机的蜂鸣器音乐,李宗盛林忆莲《为你我受冷风吹》

看到最近反馈还挺好的就多发点存货,所用板材51单片机开发板(普中科技),个人还是很喜欢李宗盛的音乐的,于是就有了今天这期为你我受冷风吹的蜂鸣器版(请使用无源蜂鸣器)

下面是主程序,这套模板也可以用于其他的蜂鸣器音乐编程,相关的音调由计算和后期调改(频率试听)得出,由于后期才想起51单片机内存资源相当有限,而音调是无需修改的常量,可以使用关键词CODE实现存储于ROM之中,从而实现所有音调都可以表示,不过实际用处不大,高频蜂鸣器声音非常难听且音调不准,一般都进行降调处理,本次程序已经经过降调处理,音调后三行是要按数值大小前插(如果借用本程序写新的音乐的话)

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

sbit Buzzer=P2^5;

#define SPEED  750

#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
//#define VVL1   37
//#define VVL1_  38
//#define VVL2   39
//#define VVL2_  40
//#define VVL3   41
//#define VVL4   42
//#define VVL4_  43
//#define VVL5   44
//#define VVL5_  45
//#define VVL6   46
//#define VVL6_  47
//#define VVL7   48
//#define VL1   49
//#define VL1_  50
//#define VL2   51
//#define VL2_  52
//#define VL3   53
//#define VL4   54
//#define VL4_  55
//#define VL5   56
//#define VL5_  57
//#define VL6   58
//#define VL6_  59 
//#define VL7   60
#define VH1   37
#define VH1_  38
#define VH2   39
#define VH2_  40
#define VH3   41
#define VH4   42
#define VH4_  43
#define VH5   44
#define VH5_  45
#define VH6   46
#define VH6_  47
#define VH7   48
#define VVH1   49
//#define VVH1_  74
//#define VVH2   75
//#define VVH2_  76
//#define VVH3   77
//#define VVH4   78
//#define VVH4_  79
//#define VVH5   80
//#define VVH5_  81
//#define VVH6   82
//#define VVH6_  83 
//#define VVH7   84
unsigned int code FreqTable[]=
	 {
		 0,		 
	   63810,63911,63968,64054,64140,64215,64291,64360,64425,64524,64547,64607,
     64655,64704,64751,64795,64837,64876,64913,64948,64981,65013,65042,65070, 
	   65095,65120,65143,65166,65187,65206,65224,65242,65259,65274,65289,65303,
		 65316,65323,65334,65346,65356,65366,65376,65385,65393,65401,65409,65451,
		 65464,65429,65435,65440,65446,65450,65456,65460,65464,65468,65471,65475,
		 58447,58858,59224,59629,59984,60240,60527,60834,61063,61347,61564,61790,
		 62018,62221,62402,62582,62744,62903,63045,63185,63320,63441,63558,63671,
     
   };
	 
unsigned int code Music[]={
	
  P,4,
	P,4,
	P,4,
	M6,1,
	M7,1,
	M6,1,
	M5,1,
	
	M3,2,
	M5,1,
	M5,1+4+4,
  M3,1,
	M5,1,
	M5,1,
	M6,1,
	
	M5,2,
	M3,1,
	M2,1+4+4,
	M2,1,
	M3,1,
	M2,1,
	
	M2,1,
	L6,1,
	M1,4,
	M1,2,
	M1,1,
	L6,1,
	M1,4,
	M1,1,
	L6,1,
	
	M1,1,
	M1,1,
	M1,1,
	M1,1,
	M5,2,
	M6,1,
	M3,1+2,
	M2,2,
	M6,1,
	M6,1,
	M6,1,
	M3,1,
	
	M6,2,
	M3,1,
	M5,1+4+2,
	M1,2,
	M3,1,
	M3,1,
	M5,1,
	M3,1,
	
	M5,1,
	M5,1,
	M6,2+1,
	M3,2,
	M2,1+4,
	M5,1,
	M5,1,
	M6,1,
	M5,1,
	
	H1,1,
	M6,1,
	P,2,
	M5,1,
	M5,1,
	M6,1,
	M5,1,
	H1,1,
	M6,1,
	P,2,
	P,1,
	M5,1,
	M6,1,
	M5,1,
	
	H1,1,
	M6,1,
	H1,1,
	M6,1,
	H1,2,
	H1,1,
	H2,1+1,
	H3,1,
	H2,1,
	M5,1+2,
	M5,1,
	M6,1,
	
	H3,1,
	H2,1,
	H3,1,
	H2,1,
	H3,2,
	H5,1,
	H2,1+1,
	H2,1,
	H2,1,
	H2,1,
	H3,2,
	H5,1,
	H1,1,
	
	H1,4+4+4+2,
	H1,1,
	H2,1,
	
	H3,1,
	H2,1,
	H3,1,
	H2,1,
	H3,1,
	H3,2,
	H3,1,
	
	H2,1,
	H2,1,
	H2,1,
	H2,1,
	H6,2,
	H5,2,
	
	H2,2,
	H1,2+2,
	H1,1,
	M7,2,
	M7,1,
	M7,1+1,
	H1,2,
	
	M6,4,
	M5,4+4,
	H3,1,
	H2,1,
	H1,1,
	H2,1,
	
	H3,1,
	H2,1,
	H3,1,
	H2,1,
	H3,2,
	H5,1,
	H2,1+1,
	H2,1,
	H2,1,
	H2,1,
	H3,2,
	H5,1,
	H1,1+4+4+4+2,
	
	H1,1,
	H2,1,//不盼
	
	H3,1,
	H2,1,
	H3,1,
	H2,1,
	H3,1,
	H5,2,
	H1,1,
	H2,1,
	H2,1,
	H2,1,
	H2,1,
	H6,2,
	H5,2,
	
	M7,2,
	H1,2+2,
	H1,2,
	M7,2,
	M7,1,
	H1,1+1,
	M7,2+1,
	
	M5,2,
	M6,4,
	H3,2,
	H2,4,
	P,4,
	P,4,
	P,4,
	M6,1,
	M7,1,
	M6,1,
	M5,1,
	
	M3,2,
	M5,1,
	M5,1+4+4,
	M3,1,
	M5,1,
	M5,1,
	M6,1,
	
	M5,2,
	M3,1,
	M2,1+4+4,
	M3,1,
	M3,1,
	M2,1,
	M1,1,
	
	M2,1,
	L6,1,
	M1,4,
	M1,2,
	M2,1,
	L6,1,
	M1,4,
	M1,1,
	L6,1,
	
	M1,1,
	M1,1,
	M1,1,
	M1,1,
	M5,2,
	M6,1,
	M3,1+2,
	M2,2,
	M2,2+1,
	M3,1,
	
	M2,2,
	M1,2+2,
	M6,2,
	M5,1,
	M3,2,
	M2,1+2+1,
	
	M1,2+4+2,
	M1,1,
	M1,1,
	M2,4+2,
	M3,2,
	
	M2,2,
	M1,2+4+4+4,
  
	
	
	
	
	0xFF,
};

unsigned int FreqSelect=0,MusicSelect;

void main()
{
	 Timer0Init();
	 while(1)
	 {
		  if(Music[MusicSelect]!=0xFF)
		  {
				FreqSelect=Music[MusicSelect];
				MusicSelect++;
				Delay(SPEED/4*Music[MusicSelect]);//这个是音符持续时间
				MusicSelect++;
				TR0=0;
				Delay(5);//这个是换手时间
				TR0=1;//先关计时器延迟5MS然后再打开,中断是用于声音的频率,延时是声音的间隔
			} 
			else
			{
				  TR0=0;
				  while(1);
			}
	 }
}

void Timer0_Routine() interrupt 1
{		static unsigned int T0Count;//static 用于延长函数生命
	  if(FreqTable[FreqSelect])
	  {
	  TL0 = FreqTable[FreqSelect]%256;		//设置定时初值 这里是第一次以后的初值
	  TH0 = FreqTable[FreqSelect]/256;
    Buzzer=!Buzzer;}
	  
}

简单的延时函数(11.0592mhz)

#include<intrins.h>
void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{ 
		_nop_();
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

也可以使用12MHZ区别不大,将NOP删掉即可

定时器段

#include <REGX52.H>

/**
   * @brief  定时器0初始化,1毫秒@11.0592MHZ	 
   * @param  无
   * @retval 无
   */
 void Timer0Init(void)		
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式(按位或)配置第个计时器
	TL0 = 0xCD;		//设置定时初值
	TH0 = 0xD4;		//设置定时初值这里只决定第一次的初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;     //这三行是关于中断的配置
	EA=1;  
	PT0=0;
}

以上就是全部内容了,建议不要久听,对听力影响较大。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值