⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 音乐程序.c

📁 用单片机AT89C2051实现的音乐播放程序
💻 C
字号:
//单片机音乐程序
//AT89C2051-24PI
//11.0592M晶振
//单路输出

#include<AT892051.H>

#define SYSTEM_OSC   11059200//12000000 //定义晶振频率12000000HZ
#define SOUND_SPACE  4/5;    //定义普通音符演奏的长度分率,//每4分音符间隔
sbit    BeepIO =P1^0;       //定义输出管脚
unsigned int  code FreTab[12]  = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表
unsigned char code SignTab[7]  = { 0,2,4,5,7,9,11 };           //1~7在频率表中的位置
unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };      
unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存 
unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存
//**************************************************************************
void InitialSound(void)
{
 	BeepIO = 1;
 	Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值  (10ms的初装值)
 	Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值 
 	TH1 = Sound_Temp_TH1;
 	TL1 = Sound_Temp_TL1;
 	TMOD  |= 0x11;
 	ET0    = 1;
 	ET1    = 0;						                                                      
 	TR0    = 0;
 	TR1    = 0;
 	EA     = 1;
}
void BeepTimer0(void) interrupt 1 //音符发生中断
{
 	BeepIO = !BeepIO;
 	TH0    = Sound_Temp_TH0;
 	TL0    = Sound_Temp_TL0;
}
//**************************************************************************/
void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)
{
 	unsigned int NewFreTab[12];  //新的频率表
 	unsigned char i,j;
 	unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;
 	unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;
 	for(i=0;i<12;i++)     // 根据调号及升降八度来生成新的频率表 
 	{
  		j = i + Signature;
 		 if(j > 11)
  		{
  		 j = j-12;
  		 NewFreTab[i] = FreTab[j]*2;
 	 }
 	 else
  		 NewFreTab[i] = FreTab[j];
  		if(Octachord == 1)
  		 NewFreTab[i]>>=2;
 		 else if(Octachord == 3)
  		 NewFreTab[i]<<=2;
	 }         
 
 	SoundLength = 0;
	while(Sound[SoundLength] != 0x00) //计算歌曲长度
 	{
  		SoundLength+=2;
 	}
 	Point = 0;
 	Tone   = Sound[Point]; 
 	Length = Sound[Point+1];    // 读出第一个音符和它时时值
 
 	LDiv0 = 12000/Speed;    // 算出1分音符的长度(几个10ms)  
 	LDiv4 = LDiv0/4;      // 算出4分音符的长度 
 	LDiv4 = LDiv4-LDiv4*SOUND_SPACE;  // 普通音最长间隔标准 
 	TR0   = 0;
 	TR1   = 1;
 	while(Point < SoundLength)
 	{
 	 	SL=Tone%10;         //计算出音符 
 	 	SM=Tone/10%10;         //计算出高低音 
 	 	SH=Tone/100;         //计算出是否升半 
 	 	CurrentFre = NewFreTab[SignTab[SL-1]+SH];  //查出对应音符的频率  
 	 if(SL!=0)
 	 {
 		  if (SM==1) CurrentFre >>= 2;   //低音 
 		  if (SM==3) CurrentFre <<= 2;   //高音
 		  Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值
  		  Sound_Temp_TH0 = Temp_T/256; 
  		  Sound_Temp_TL0 = Temp_T%256; 
 		  TH0 = Sound_Temp_TH0;  
		  TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿 
 	 }
 		 SLen=LengthTab[Length%10];  //算出是几分音符
 		 XG=Length/10%10;    //算出音符类型(0普通1连音2顿音) 
 		 FD=Length/100;
 		 LDiv=LDiv0/SLen;    //算出连音音符演奏的长度(多少个10ms)
 	 if (FD==1) 
 		  LDiv=LDiv+LDiv/2;
 	 if(XG!=1) 
  	 	{if(XG==0)             //算出普通音符的演奏长度 
   	 		{if (SLen<=4) 
    		 	LDiv1=LDiv-LDiv4;
    		else
    			 LDiv1=LDiv*SOUND_SPACE;  }
  			else
   				 LDiv1=LDiv/2;}   //算出顿音的演奏长度 
  			else
  				 LDiv1=LDiv;
 	if(SL==0) LDiv1=0;
  		 LDiv2=LDiv-LDiv1;   //算出不发音的长度 
    if (SL!=0)
  	{
  		 TR0=1;
  		 for(i=LDiv1;i>0;i--)  //发规定长度的音 
  		 {
  		  		while(TF1==0);
  		 		TH1 = Sound_Temp_TH1;
    	  		TL1 = Sound_Temp_TL1;
    	  		TF1=0;
  		 }
 	 }
  if(LDiv2!=0)
 	 {
  		 TR0=0; BeepIO=1;
  		 for(i=LDiv2;i>0;i--)  //音符间的间隔
   		{
   			 while(TF1==0);
   			 TH1 = Sound_Temp_TH1;
   			 TL1 = Sound_Temp_TL1;
   			 TF1=0;
  		 }
 	 }
  	     Point+=2; 
 		 Tone=Sound[Point];
 		 Length=Sound[Point+1];
 	}
 	BeepIO = 1;
}

//#endif
//**************************************************************************
//#endif
// 
//以下为曲谱编码文件,自己可以根据规则,对照简谱编写曲谱编码表,我已经做好了一个应用程序,
//只需将简谱输入进去,
//技下载(址),此东东绝对是搞电子设计在校大学生泡MM的巨佳手段,呵呵。
//附录:
//挥着翅膀的女孩
unsigned char code Music_Girl[]={ 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03,
                                  0x16,0x03, 0x17,0x03, 0x17,0x03, 0x17,0x03, 0x18,0x03,
                                  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03,
                                  0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02,
                                  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03,
                                  0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03,
                                  0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03, 0x18,0x03,
                                  0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03,
                                  0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03,
                                  0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02,
                                  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
                                  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
                                  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
                                  0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03,
                                  0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03,
                                  0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03,
                                  0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03,
                                  0x1B,0x03, 0x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66,
                                  0x1A,0x03, 0x19,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x00, 0x1A,0x03, 0x1A,0x03, 0x1A,0x03, 0x1B,0x03,	
                                  0x1B,0x03, 0x1A,0x03, 0x19,0x03, 0x19,0x02, 0x17,0x03,		 
                                  0x15,0x17, 0x15,0x03, 0x16,0x03, 0x17,0x03, 0x18,0x03,  
                                  0x17,0x04, 0x18,0x0E, 0x18,0x03, 0x17,0x04, 0x18,0x0E,
                                  0x18,0x66, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03,
                                  0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66,
                                  0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x66, 0x1F,0x04, 0x1B,0x0E, 0x1B,0x03, 0x19,0x03,
                                  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
                                  0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04,
                                  0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 
                                  0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0x19,0x03,
                                  0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03,
                                  0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x00, 0x18,0x02,
                                  0x18,0x03, 0x1A,0x03, 0x19,0x0D, 0x15,0x03, 0x15,0x02,
                                  0x18,0x66, 0x16,0x02, 0x17,0x02, 0x15,0x00, 0x00,0x00 };
unsigned char code Music_Two[] ={ 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
                                  0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
                                  0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
                                  0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03,
                                  0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01,
                                  0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
                                  0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01,
                                  0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03,
                                  0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02,
                                  0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03,
                                  0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03,
                                  0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01,
                                  0x16,0x03, 0x16,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03,
                                  0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0D, 0x15,0x00,
                                  0x19,0x03, 0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03,
                                  0x1B,0x03, 0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03,
                                  0x16,0x0D, 0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03,
                                  0x1A,0x02, 0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03,
                                  0x16,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03,
                                  0x19,0x02, 0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E,
                                  0x1B,0x04, 0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E,
                                  0x1B,0x04, 0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03,
                                  0x17,0x0D, 0x16,0x03, 0x17,0x03, 0x19,0x01, 0x19,0x03,
                                  0x19,0x03, 0x1A,0x03, 0x1F,0x03, 0x1B,0x03, 0x1B,0x03,
                                  0x1A,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x03, 0x16,0x03,
                                  0x17,0x01, 0x17,0x03, 0x17,0x03, 0x19,0x03, 0x1A,0x02,
                                  0x1A,0x02, 0x10,0x03, 0x17,0x0D, 0x16,0x03, 0x16,0x01,
                                  0x17,0x03, 0x19,0x03, 0x19,0x03, 0x17,0x03, 0x19,0x03,
                                  0x1F,0x02, 0x1B,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
                                  0x17,0x02, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
                                  0x17,0x16, 0x1A,0x03, 0x1A,0x03, 0x1A,0x0E, 0x1B,0x04,
                                  0x1A,0x03, 0x19,0x03, 0x17,0x03, 0x16,0x03, 0x0F,0x02,
                                  0x10,0x03, 0x15,0x00, 0x00,0x00 };
void main(void)                      
{
/*
//    设置定时器--------------------------------------
          TMOD   =  0x11;         // TMOD: 定时器1:模式1:16位;定时器2:模式1:16位   //
          TCON   =  0x50;       // TCON: 定时器 1运行;      定时器 2运行         //
      //    设置并开启中断: 
           IP  = 0x08;             //中断优先寄存器IP:|D7_x |x|x  
      //    |PS|PT1|PX1|PT0|D0_PX0|
          IE  = 0x88;             //中断允许寄存器
      //    IE:|D7_EA|x|ET2|ES|ET1|EX1|ET0|D0_EX0|//	  */

	  P1_0=0;
      InitialSound();
  while(1)
  {		
  Play(Music_Two,11,2,300);
  Play(Music_Girl,11,2,300);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -