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

📄 asuro 020.c

📁 020 Asuro小车示例源码 playing music!!!.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
				//---these-inits-are-not-really-neccessary---//
				//reset all prescalers
				vResetAllTimersPrescalers();
				//init timer0 counter
				TCNT0=0x00;
				//init timer1 counter
				TCNT1=0x00;
				//init timer2 counter
				TCNT2=0x00;

				//define next play mode
				gucCurPlyMod=PLAY_MODE_SYNTHESIZER2;
				//enable timer0, timer1 and timer2
				SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
			//exit case
			break;
			
			case PLAY_MODE_SYNTHESIZER2:
			//exit case
			break;

			//playing mode selected
			case PLAY_MODE_KEYBOARD_PLAYING_INIT:
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				//switch left engine off
				SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
				//switch right engine off
				SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
				//init engines for music playing
				vInitEnginesForMusicPlayingWithoutStart();
				//init usart
				vInitUsartRx2400B8N1UsingRxInterrupt();
				//enable usart receive interrupt
				SFRX(UCSRB,RXCIE_H);
				//define next playing mode
				gucCurPlyMod=PLAY_MODE_KEYBOARD_PLAYING;
				//prepair timer2 interrupt to execute it's functions immediately on first entry
				gucTm2IntCnt=NUMOF_TIMER2_KEYBOARD_INTERRUPTS-1;
				//enable music playing by enabling overflow interrupts for
				SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
			//exit case
			break;

			//playing mode selected
			case PLAY_MODE_KEYBOARD_PLAYING:
			//exit case
			break;

			//playing mode selected
			case PLAY_MODE_ALL_OFF_INIT:
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				//switch left engine off
				SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
				//switch right engine off
				SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
				//switch all leds off
				vAllLedsOff();
				//set timer0 to range 3 (low range)
				//SFRX(TCCR0 ,CS00_H);
				//set timer1 to range 3 (low range)
				//SFRX(TCCR1B,CS10_H);
				//define next playing mode
				gucCurPlyMod=PLAY_MODE_ALL_OFF;
			//exit case
			break;

			//playing mode selected
			case PLAY_MODE_ALL_OFF:
			//exit case
			break;
			
		}//switch
		
	}//while

	//exit function
	return 0;
	
}
//================================================================================
//	DISABLE ALL INTERRUPTS EXCEPT SWITCHES INTERUPT
//================================================================================
void vDisableAllInterruptsExceptSwitchesInterrupt(void){

	//disable overflow interrupts for timer/counter0,1,2
	SFRX(TIMSK,TOIE2_L|TOIE1_L|TOIE0_L);

	//disable usart receive interrupt
	SFRX(UCSRB,RXCIE_L);

	//disable ad-converter ready interrupt
	SFRX(ADCSRA,ADIE_L);

	//disable uart receive (else still rx data in buffer when ir-data is received)
	SFRX(UCSRB,RXEN_L);

}
//================================================================================
//	INIT ENGINES FOR MUSIC PLAYING WITHOUT START
//================================================================================
void vInitEnginesForMusicPlayingWithoutStart(void){

	//clear timer/counter0 overflow interrupt counter
	gucTm0IntCnt=0;
	//clear timer/counter1 overflow interrupt counter
	gucTm1IntCnt=0;
	//clear timer/counter2 overflow interrupt counter
	gucTm2IntCnt=0;

	//init timer/counter0, used for generating tones by left engine
	//vInitTimerCounter0();
	//init timer/counter1, used for generating tones by right engine
	//vInitTimerCounter1();
	//init timer/counter2, used for tone duration and tone sequence control
	//vInitTimerCounter2();

	//switch left engine off
	SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
	//switch right engine off
	SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
	
	//set left engine speed-control on (full)
  SFRX ( PORTB , SPD_LFT_H ) ;
	//set right engine speed-control on (full)
  SFRX ( PORTB , SPD_RGT_H ) ;
	
}
//================================================================================
//	INIT MUSIC PLAYING
//================================================================================
void vInitMusicPlaying(void){

	//init engines for music playing without starting
	vInitEnginesForMusicPlayingWithoutStart();

	//clear song current-tone index
	gucSngTonIdx=0;

	//prepair timer2 interrupt to execute it's functions immediately on first entry
	gucTm2IntCnt=NUMOF_TIMER2_INTERRUPTS-1;

	//clear any eventually pending timer/counter0,1,2 interrupt
	SFRX(TIFR,TOV2_H|TOV1_H|TOV0_H);

	//start music playing by enabling overflow interrupts for
	// - timer/counter0 (left  engine, tone1)
	// - timer/counter1 (right engine, tone2)
	// - timer/counter2 tone duration and tone sequence control
	SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
}
//################################################################################
// interrupt handler, timer/counter0 overflow
// enable bit: register TIMSK bit TOIE0
// #define SIG_OVERFLOW0 _VECTOR(9)
// pdf table 18, vector number decimal 10
// tone playing control is directly controlled either by interrupt enable or by gucTonIdxn variable!
//################################################################################
SIGNAL(SIG_OVERFLOW0){
	//reload counter0 with predefined reload value
	TCNT0=gucTm0CurRldVal;
	//if left engine drives forward
	if(SFRS(PORTD,REV_LFT_H)){
		//make left engine drive reverse
		SFRX(PORTD,REV_LFT_L|FWD_LFT_H);
	}
	//if left engine drives reverse
	else{
		//make left engine drive forward
		SFRX(PORTD,REV_LFT_H|FWD_LFT_L);
	}
}
//################################################################################
// interrupt handler, timer/counter1 overflow
// enable bit: register TIMSK bit TOIE1
// #define SIG_OVERFLOW1 _VECTOR(8)
// pdf table 18, vector number decimal 09
// tone playing control is directly controlled either by interrupt enable or by gucTonIdxn variable!
//################################################################################
SIGNAL(SIG_OVERFLOW1){
	//reload counter1 with predefined reload value
	TCNT1=gucTm1CurRldVal;
	//if right engine drives forward
	if(SFRS(PORTB,REV_RGT_H)){
		//make right engine drive reverse
		SFRX(PORTB,REV_RGT_L|FWD_RGT_H);
	}
	//if right engine drives reverse
	else{
		//make right engine drive forward
		SFRX(PORTB,REV_RGT_H|FWD_RGT_L);
	}
}
//================================================================================
//	STOP TONE0
//================================================================================
void vStopTone0(void){
	//immediately stop timer0 by disabling timer0 interrupt
	SFRX(TIMSK,TOIE0_L);
	//switch left engine off (because engine is always set/left to forward or reverse by interrupt handler)
	SFRX(PORTD,REV_LFT_H|FWD_LFT_H);
}
//================================================================================
//	START TONE0
//================================================================================
void vStartTone0(void){
	//get tone-code for left engine from tone-codes list
	gucTm0CurRldVal=gucMusTonLst[gucTonIdx1];
	//start playing tone by left engine (by enabling timer0 interrupt)
	SFRX(TIMSK,TOIE0_H);
}
//================================================================================
//	STOP TONE1
//================================================================================
void vStopTone1(void){
	//immediately stop timer1 by disabling timer1 interrupt
	SFRX(TIMSK,TOIE1_L);
	//switch right engine off (because engine is always set/left to forward or reverse by interrupt handler)
	SFRX(PORTB,REV_RGT_H|FWD_RGT_H);
}
//================================================================================
//	START TONE1
//================================================================================
void vStartTone1(void){
	//get tone-code for right engine from tone-codes list
	gucTm1CurRldVal=gucMusTonLst[gucTonIdx2];
	//start playing tone by right engine (by enabling timer1 interrupt)
	SFRX(TIMSK,TOIE1_H);
}	
//################################################################################
// interrupt handler, timer/counter2 overflow
// enable bit: register TIMSK bit TOIE2
// #define SIG_OVERFLOW2 _VECTOR(4)
// pdf table 18, vector number decimal 05
//################################################################################
SIGNAL (SIG_OVERFLOW2){


	//count interrupts tone-duration counter)
	gucTm2IntCnt++;
	
	//analyse playmode
	switch(gucCurPlyMod){
		
		//playing mode selected
		case PLAY_MODE_SONG_PLAYING:
			//if tone-play duration reached max (specific interrupt limit (tone-play duration) reached
			if(gucTm2IntCnt==NUMOF_TIMER2_INTERRUPTS){
				//clear tone-duration counter
				gucTm2IntCnt=0;
				//toggle all leds at random
				vToggleAllLedsAtRandom();
				//get next song-tone-index for left engine
				gucTonIdx1=gucSg1[gucSngTonIdx];
				//get next song-tone-index for right engine
				gucTonIdx2=gucSg2[gucSngTonIdx];
				//prepair for selecting next tone
				gucSngTonIdx++;
				//if no more tones need to be played
				if(gucTonIdx1==255){
					//define next play mode
					gucNewPlyMod=PLAY_MODE_ALL_OFF_INIT;
				//exit function
				return;
				}
				//if more tones need to be played
				else{
					//if a silent tone must be played by the left engine
					if(gucTonIdx1==99){
						//stop (left engine) tone0
						vStopTone0();
					}//if
					//if an audible tone must be played by the left engine
					else{
						//start (left engine) tone0
						vStartTone0();
					}//else
					//if a silent tone must be played by the right engine
					if(gucTonIdx2==99){
						//stop (right engine) tone1
						vStopTone1();
					}//if
					//if an audible tone must be played by the right engine
					else{
						//start (right engine) tone1
						vStartTone1();
					}
				}//else
			}//if
			//end case
			break;	

			//playing mode selected
			case PLAY_MODE_SYNTHESIZER1:

⌨️ 快捷键说明

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