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

📄 music_song.h

📁 单片机音乐播放程序
💻 H
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************************************************
Copyright (C), 2006, Shenzhen University,college of information engneering.
File Name:		music_lift.c
Author:		    ZHOU DongYong 
Version:		Version 1.0
Start:			dec 11,2006
Last update:	dec 20,2006
Description:	car music and organ control programme
******************************************************************************************************************/




sbit BeepIO = P3^0;  //定义输出管脚

#define SYSTEM_OSC   11059200//12000000 //定义晶振频率12000000HZ
#define SOUND_SPACE  4/5   //定义普通音符演奏的长度分率,//每4分音符间隔

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 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
	 {
	    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;

⌨️ 快捷键说明

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