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

📄 music.c~

📁 非常适用的万年历程序
💻 C~
字号:
#include "music.h"
/************************************************************
播放音乐使能TIME1之前必须完成以下工作
初始化*pMusic指针,使其指向某一首音乐
初始化maxMusic,使其等于*pMusic指针指向的音乐的数据的个数
初始化音乐播放的次数playCycle
初始化OCR1A,使其对应于第一个音符
初始化第一个音符比较匹配的次数iCompaCycle
初时话iMusicCycle为1
************************************************************/


/************************************************************
Timer1比较匹配中断处理函数
************************************************************/
interrupt [TIM1_COMPA] void Timer1CompaIsr(void)
{
	
	if (--iCompaCycle == 0)                   //比较匹配次数是否到了
	{

		if(iMusicCycle < maxMusic)           // 判断最后一个音符是否已经被播放
		{
			OCR1A = dataOfOCR1A[pMusic[++iMusicCycle]];        //装入下一个音符的数据
			iCompaCycle = counter[pMusic[iMusicCycle]];        
			iCompaCycle = iCompaCycle * pMusic[++iMusicCycle];
																
			if(OCR1A == 2500)						// IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
			{
				TCCR1A = 0x00;
			}
			else if (TCCR1A == 0x00)     //非空音符时,如果PD5引脚已经释放,则与OCR1连接
			{
				TCCR1A = 0x40;
			}

		}
		else if(--playCycle != 0)                              //判断播放次数是否已经为0
		{
			OCR1A = dataOfOCR1A[pMusic[0]];                    //重新装入第一个音符的数据
			iCompaCycle = counter[pMusic[0]] * pMusic[1];
			iMusicCycle = 1;
			 
            if(OCR1A == 2500)		// IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
			{
				TCCR1A = 0x00;
			}
			else if (TCCR1A == 0x00)	//非空音符时,如果PD5引脚已经释放,则与OCR1连接
			{
				TCCR1A = 0x40;
			}

		}
		else
		{
			TCCR1B = 0x08;    //播放结束,关闭TIME1的时钟
		}

	}
}
/************************************************************
函数MusicInit用于初始化音乐播放
************************************************************/
void MusicInit(void)
{
	DDRD.5 = 1;            //设置PD5为输出引脚
   	PORTD.5 = 0;			//
    	TCCR1A = 0x40;		//比较匹配时触发PD5引脚
    	TCCR1B = 0x08;		//CTC模式,先不启动定时器
	TIMSK |= 0x10;			//开放定时器1的比较匹配功能
}
/************************************************************
函数void PlayMusic(unsigned char musicChoose, unsigned char counterChoose)
中musicChoose为选择播放的音乐,counterChoose为播放次数
************************************************************/
void PlayMusic(unsigned char musicChoose, unsigned char counterChoose)
{
	//switch语句把选择的音乐序号对应的音乐数据付给pMusic指针
	switch (musicChoose)
	{
	case 1:
		pMusic = music1;
		maxMusic = maxMusic1;
		break;
	
	case 2:
		pMusic = music2;
		maxMusic = maxMusic2;
		break;

	case 3:
		pMusic = music3;
		maxMusic = maxMusic3;
		break;

	case 4:
		pMusic = music4;
		maxMusic = maxMusic4;
		break;

	case 5:
		pMusic = music5;
		maxMusic = maxMusic5;
		break;

	case 6:
		pMusic = music6;
		maxMusic = maxMusic6;
		break;

	case 7:
		pMusic = music7;
		maxMusic = maxMusic7;
		break;

	case 8:
		pMusic = music8;
		maxMusic = maxMusic8;
		break;

	case 9:
		pMusic = music9;
		maxMusic = maxMusic9;
		break;

	case 10:
		pMusic = music10;
		maxMusic = maxMusic10;
		break;

	};

	playCycle = counterChoose;     //音乐播放次数赋值
	OCR1A = dataOfOCR1A[pMusic[0]];      //第一个音符赋值   
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	
	if(OCR1A == 2500)		// IF语句判断OCR1A中是否是装入了空音符的数据,如果是的话就把PD5释放
	{
	        TCCR1A = 0x00;
	}
	else if (TCCR1A == 0x00)	//非空音符时,如果PD5引脚已经释放,则与OCR1连接
	{
	        TCCR1A = 0x40;
	} 
	
	TCCR1B = 0x0A;     //开启定时器工作
}

void PlayMusic1(unsigned char counter1)
{
	pMusic = music1;
	maxMusic = maxMusic1;
	playCycle = counter1;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic2(unsigned char counter2)
{
	pMusic = music2;
	maxMusic = maxMusic2;
	playCycle = counter2;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic3(unsigned char counter3)
{
	pMusic = music3;
	maxMusic = maxMusic3;
	playCycle = counter3;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic4(unsigned char counter4)
{
	pMusic = music4;
	maxMusic = maxMusic4;
	playCycle = counter4;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic5(unsigned char counter5)
{
	pMusic = music5;
	maxMusic = maxMusic5;
	playCycle = counter5;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic6(unsigned char counter6)
{
	pMusic = music6;
	maxMusic = maxMusic6;
	playCycle = counter6;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic7(unsigned char counter7)
{
	pMusic = music7;
	maxMusic = maxMusic7;
	playCycle = counter7;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic8(unsigned char counter8)
{
	pMusic = music8;
	maxMusic = maxMusic8;
	playCycle = counter8;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic9(unsigned char counter9)
{
	pMusic = music9;
	maxMusic = maxMusic9;
	playCycle = counter9;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

void PlayMusic10(unsigned char counter10)
{
	pMusic = music10;
	maxMusic = maxMusic10;
	playCycle = counter10;
	OCR1A = dataOfOCR1A[pMusic[0]];
	iCompaCycle = counter[pMusic[0]] * pMusic[1];
	iMusicCycle = 1;
	TCCR1B = 0x0A;
}

⌨️ 快捷键说明

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