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

📄 asuro 020.c

📁 020 Asuro小车示例源码 playing music!!!.rar
💻 C
📖 第 1 页 / 共 5 页
字号:
unsigned char gucTm1NewRldVal;
unsigned char gucTm2IntCnt;
unsigned char gucNewKbdPlyTon;
unsigned char gucDmy;
unsigned char gucTonIdx1;
unsigned char gucTonIdx2;
unsigned char gucSngTonIdx;
bool          gbDuaTonMod;
unsigned char gucNewPlyMod;
unsigned char gucCurPlyMod;
unsigned char gucPrvPlyMod;
//unsigned char gucKeyPlyMod;
unsigned char gucNewKeyPrs;
unsigned char gucPrvKeyPrs;

/*
unsigned char gucMusTonLst[NUMOF_MUSIC_TONES]={
                                  //   C  Cis    D  Dis    E    F  Fis    G  Gis    A  Ais    B
                                                                                           0x02,
                                    0x10,0x1D,0x2A,0x36,0x41,0x4C,0x56,0x60,0x68,0x71,0x79,0x80,
                                    0x87,0x8E,0x95,0x9B,0xA0,0xA5,0xAB,0xAF,0xB4,0xB8,0xBC,0xC0,
                                    0xC3
                                    };
*/
unsigned char gucMusTonLst[NUMOF_MUSIC_TONES]={
                                  //   C  Cis    D  Dis    E    F  Fis    G  Gis    A  Ais    B
                                                                                           0x03,
                                    0x11,0x1E,0x2B,0x37,0x42,0x4D,0x57,0x61,0x69,0x72,0x7A,0x81,
                                    0x88,0x8F,0x96,0x9C,0xA1,0xA6,0xAC,0xB0,0xB5,0xB9,0xBD,0xC1,
                                    0xC4
                                    };

unsigned char gucKeyBrdTonKey[21]={'a','s','e','d','r','f','g','y','h','u','j','i','k','l','p',';','[','\'','\\',0};


/*


                               |- - - - - - - - - - - - - - - - - - - - - - - - - - - - |
                               |                                              20        |
                               |------------------------------------------18------------|
                               |                                      17                |
                               |----------------------------------15--------------------|
                               |                              13                        |
                               |--------------------------12----------------------------|
                               |                      10                                |
                               |-------------------8------------------------------------| etc.
                               |               6                                        | 0x2A
                               |-----------5--------------------------------------------| 0x1D
                               |       3                                                | 0x10
                               |- -1- - - - - - - - - - - - - - - - - - - - - - - - - - | 0x02
                               |                                                        |

*/
  unsigned char gucSg1[NUMOF_SONG1_TONES]=  { 

                                              8,10,12,15,13,13,17,15, 
                                             15,20,19,20,15,12, 8,10,12, 
                                             13,15,17,15,13,12,10,12, 8,  
                                              7, 8,10, 3, 7,10,13,12,10,

                                             12, 8,10,12,15,13,13,17,15,
                                             15,20,19,20,15,12, 8,10,12,
                                              5,15,13,12,10, 8, 3, 8, 7,


                                              8,12,15,20,15,12, 8,12,15,
																							
                                              8, 8, 8,99,255};//unsigned char gucSg2[NUMOF_SONG1_TONES]=  {1,3,5,8,6,6,10,8,8,13,12,13,8,5,1,3,5,6,8,10,8,6,5,3,5,1,0,1,3};
																							
																							
																							
  unsigned char gucSg2[NUMOF_SONG2_TONES]=  {

                                             99,99,99,99,99,99,99,99,
                                             99,99,99,99,99,99,99,99,99,
                                             99,99,99,99,99,99,99,99,99,
                                             99,99,99,99,99,99,99,99,99,
																						 
                                              3, 3, 7, 8, 8, 7, 8, 8,10,
                                             12,12,10,12,12, 8, 5, 5, 8,
                                             10,10, 7, 8, 8, 5,10,10, 1,

                                              0, 0, 8,12,12,15,20,20,10,
																							
                                              0, 0, 0,99,255};//unsigned char gucSg2[NUMOF_SONG1_TONES]=  {1,3,5,8,6,6,10,8,8,13,12,13,8,5,1,3,5,6,8,10,8,6,5,3,5,1,0,1,3};
																						 
																						 
//================================================================================
//	MAIN
//================================================================================
int main(void){

	//set dual-tone mode
	gbDuaTonMod=true;

	//init all ports as inputs and outputs
	vInitAllPortsAsInputsAndOutputs();

	//init tone to be played by keyboard
	gucNewKbdPlyTon=0;

	//init switches for use with interrupt
	vInitSwitchesForUsingWithInterrupts();

	//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();

	//general interrupt enable (start playing)
	SFRX(SREG,GIE_H);

	//define initial play mode
	gucNewPlyMod=PLAY_MODE_SONG_PLAYING_INIT;
	//set previous (dummy) play mode
	gucPrvPlyMod=PLAY_MODE_SONG_PLAYING;
	//init previous pressed key
	gucPrvKeyPrs=KEY1;

	//hang here
	while(1){

		//---check-for-new-state---//

		//if a new statemachine is requested from outside (from switch interrupt)
		if(gucNewPlyMod!=PLAY_MODE_NONE){
		
			//get new play mode
			gucCurPlyMod=gucNewPlyMod;
			
			//clear new play mode
			gucNewPlyMod=PLAY_MODE_NONE;
			
		}
	
		//analyse playmode
		switch(gucCurPlyMod){

			//----------play-mode:-song-playing-init----------//

			//song playing init mode selected
			case PLAY_MODE_SONG_PLAYING_INIT:
			
				//define next play mode (define first, before enabling interrupt, due to this variable is checked in timer2 interrupt handler)
				gucCurPlyMod=PLAY_MODE_SONG_PLAYING;
				
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				
				//set odometers sense connections to output
				SFRX(DDRGC,BOD_LFT_O|BOD_RGT_O);
				
				//set odometers sense connections to low (leds off)
				SFRX(PORTC,BOD_LFT_L|BOD_RGT_L);
				
				//set odo-leds common connection to low
			  SFRX(PORTD,BOD_COM_L);

				//init music playing
				vInitMusicPlaying();

			//exit case
			break;
			
			//----------play-mode:-song-playing-init----------//
			
			//song playing mode selected
			case PLAY_MODE_SONG_PLAYING:
			
			//exit case
			break;

			//----------track-sensors----------//

			//track sensors init selected
			case PLAY_MODE_TRACK_SENSORS_INIT:
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				//init engines for music playing without starting
				vInitEnginesForMusicPlayingWithoutStart();
				//enable tone0 and tone1 by enabling timer0/timer1interrupts (timer2 not needed)
				SFRX(TIMSK,TOIE1_H|TOIE0_H);
				//no start ad-conversion, non-free running
				SFRX ( ADCSRA , ADEN_H  | ADSC_L  | ADFR_L  | ADIF_L  | ADIE_L  | ADPS2_H | ADPS1_H | ADPS0_L );

				//set odometers sense connections to output low (leds off)
				SFRX(DDRGC,BOD_LFT_O|BOD_RGT_O);
				SFRX(PORTC,BOD_LFT_L|BOD_RGT_L);
				//set odo-leds common connection to low
			  SFRX(PORTD,BOD_COM_L);
				
				//define next play mode
				gucCurPlyMod=PLAY_MODE_TRACK_SENSORS;
			//exit case
			break;
				
			//track sensors selected
			case PLAY_MODE_TRACK_SENSORS:
				//select ADC AVCC with external cap., select switches left-tracksensor (ADC3), left justify
				SFRX ( ADMUX  , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L  | MUX2_L  | MUX1_H  | MUX0_H  );
				//start ad-conversion, non-free running
				SFRX ( ADCSRA , ADSC_H ) ;
				//wait here until ad-conversion has finished
				while(SFRS(ADCSRA,ADSC_H));
				//store measured adc light value into timer0
				gucTm0CurRldVal=ADCH;
				//select ADC AVCC with external cap., select switches right-tracksensor (ADC3), left justify
				SFRX ( ADMUX  , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L  | MUX2_L  | MUX1_H  | MUX0_L  );
				//start ad-conversion, non-free running
				SFRX ( ADCSRA , ADSC_H ) ;
				//wait here until ad-conversion has finished
				while(SFRS(ADCSRA,ADSC_H));
				//store measured adc light value into timer0
				gucTm1CurRldVal=ADCH;
			//exit case
			break;

			case PLAY_MODE_ODO_SENSORS_INIT:
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				//init engines for music playing without starting
				vInitEnginesForMusicPlayingWithoutStart();
				//enable tone0 and tone1 by enabling timer0/timer1interrupts (timer2 not needed)
				SFRX(TIMSK,TOIE1_H|TOIE0_H);
				//no start ad-conversion, non-free running
				SFRX ( ADCSRA , ADEN_H  | ADSC_L  | ADFR_L  | ADIF_L  | ADIE_L  | ADPS2_H | ADPS1_H | ADPS0_L );

				//set odometers sense connections to input with no pullup
				SFRX(DDRGC,BOD_LFT_I|BOD_RGT_I);
				SFRX(PORTC,BOD_LFT_N|BOD_RGT_N);
				//set odo-leds common connection to high (odo-tx leds on)
			  SFRX(PORTD,BOD_COM_H);
				
				//define next play mode
				gucCurPlyMod=PLAY_MODE_ODO_SENSORS;
			//exit case
			break;
			case PLAY_MODE_ODO_SENSORS:
				//select ADC AVCC with external cap., select switches left-tracksensor (ADC3), left justify
				SFRX ( ADMUX  , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L  | MUX2_L  | MUX1_L  | MUX0_H  );
				//start ad-conversion, non-free running
				SFRX ( ADCSRA , ADSC_H ) ;
				//wait here until ad-conversion has finished
				while(SFRS(ADCSRA,ADSC_H));
				//store measured adc light value into timer0
				gucTm0CurRldVal=ADCH;
				//select ADC AVCC with external cap., select switches right-tracksensor (ADC3), left justify
				SFRX ( ADMUX  , REFS1_L | REFS0_H | ADLAR_H |RESERVED | MUX3_L  | MUX2_L  | MUX1_L  | MUX0_L  );
				//start ad-conversion, non-free running
				SFRX ( ADCSRA , ADSC_H ) ;
				//wait here until ad-conversion has finished
				while(SFRS(ADCSRA,ADSC_H));
				//store measured adc light value into timer0
				gucTm1CurRldVal=ADCH;
			//exit case
			break;

			case PLAY_MODE_SYNTHESIZER1_INIT:
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				//init engines for music playing without starting
				vInitEnginesForMusicPlayingWithoutStart();
				//enable timer0, timer1 and timer2
				SFRX(TIMSK,TOIE2_H|TOIE1_H|TOIE0_H);
				//define next play mode
				gucCurPlyMod=PLAY_MODE_SYNTHESIZER1;
			//exit case
			break;
			
			case PLAY_MODE_SYNTHESIZER1:
			//exit case
			break;

			case PLAY_MODE_SYNTHESIZER2_INIT:
				//disable all interrupts except switches interrupt
				vDisableAllInterruptsExceptSwitchesInterrupt();
				//init engines for music playing without starting
				vInitEnginesForMusicPlayingWithoutStart();
				//init timer/counter0 reload value
				gucTm0CurRldVal=0x00;
				//init timer/counter1 reload value
				gucTm1CurRldVal=0x00;
				
				//set odometers sense connections to output low (leds off)
				SFRX(DDRGC,BOD_LFT_O|BOD_RGT_O);
				SFRX(PORTC,BOD_LFT_L|BOD_RGT_L);
				//set odo-leds common connection to low
			  SFRX(PORTD,BOD_COM_L);
				
				//prepair timer2 interrupt handler to update reload values
				gucTm2IntCnt=NUMOF_TIMER2_SYNTHESIZER2_INTERRUPTS-1;

⌨️ 快捷键说明

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