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

📄 main.c

📁 单片机FM收音机芯片(cs1100)程序
💻 C
📖 第 1 页 / 共 2 页
字号:

        stcflag=Temp[0]&0x04; // STC bit
				if(stcflag == 0x00)
					stcflag = 0;
				else
					stcflag = 1;
        loop++;
	      _delay_ms(1);
     }
     while((!stcflag)&&(loop!=0x1f));

      if(stcflag)  //STC=1
      {
          rssi=Temp[1];
	  			snr=Temp[2];
          fd=Temp[5];
          st=Temp[0]&0x01;

				/*	PutChar('r'); PutChar(':'); PutAscii(rssi); PutChar(' ');
					PutChar('s'); PutChar(':'); PutAscii(snr);  PutChar(' ');
					PutChar('f'); PutChar(':'); PutAscii(fd);
					PutChar(0x0d);
					PutChar(0x0a);
					*/
          if(fd>127)
          {
             fd = 256 - fd;
          }
          if(rssi>=176 && snr<=152 && fd<=10) //seek threshold judgement
          {
          			seekover=1; //a valid frequency

          			/*#if 0
          	    if(*pryFD <= -30)  //Note seek direction is seek up
	              {
	                	if(TunerFrequency == ISSUE_CHANNEL) //ISSUE_CHANNEL is an interfere frequency
	                	{
	  	            			if (st==0x01)     //Note: now Reg03[6] must be set 0
	  	              	      {
	  	              	      		 seekover=1; //a valid frequency 
	  	              	    	}
	  	              		else
	  	              	      {
	  	              	    	  	seekover=0; //a invalid frequency
	                					}
	                	}
	                	else
	                			{
	                					seekover=1;
	         	    			  }
	              }
	  				   else
	         	    {
	         	    		seekover=0;
	         	    }
	         	    #endif*/
         }
         else
         {
            	seekover=0;
         }
          //*pryFD = fd; //save current frequency's fd
      }
	  	return seekover;
}

void FM_SEEK_up(void)
{
		unsigned int temp;
		signed short pryFD = -50;

		CS1100ControlData[1] &= 0xbf;				//Reg03[6]=0;set MONO=0;     seek up

		sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_write_byte_to_device(CS1100ControlData[1]);
		sim_iic_stop();

		while(FREQUENCY < 10800)
		{
				FREQUENCY = FREQUENCY + 10;    //frequency = frequency+100KHz;
				if(CS1100_FMSeek_TuneMethod(FREQUENCY,&pryFD) == 1)
				{
					temp = FREQUENCY;				//find a valid frequency
					CS1100_FMTune(temp);
					return ;
				}
				else if(CS1100_FMSeek_TuneMethod(FREQUENCY,&pryFD) == 0)
				{
					FREQUENCY = FREQUENCY + 10;    //frequency = frequency+100KHz;
				}
		}
		if(FREQUENCY > ISSUE_CHANNEL) FREQUENCY = 8750;
		CS1100ControlData[1] |= 0x40;				//Reg03[6]=1;set MONO = 1;
		CS1100ControlData[0] &= 0xdf; //mute off    ?????

		sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_write_byte_to_device(CS1100ControlData[1]);
		sim_iic_stop();
}

void FM_SEEK_down(void)
{
		unsigned int temp;
		signed short pryFD = -50;

		CS1100ControlData[1] &= 0xbf;

		sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_write_byte_to_device(CS1100ControlData[1]);
		sim_iic_stop();

		while(FREQUENCY > 8750)
		{
				FREQUENCY = FREQUENCY - 10;    //frequency = frequency-100KHz;
				if(CS1100_FMSeek_TuneMethod(FREQUENCY,&pryFD) == 1)
				{
					temp = FREQUENCY;				//find a valid frequency
					CS1100_FMTune(temp);
					return ;
				}
				else if(CS1100_FMSeek_TuneMethod(FREQUENCY,&pryFD) == 0)
				{
					FREQUENCY = FREQUENCY - 10;    //frequency = frequency-100KHz;
				}
		}
		if(FREQUENCY < ISSUE_CHANNEL_1) FREQUENCY = 10800;
		CS1100ControlData[1] |= 0x40;				//Reg03[6]=1;set MONO = 1;
		CS1100ControlData[0] &= 0xdf; //mute off    ?????

		sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_write_byte_to_device(CS1100ControlData[1]);
		sim_iic_stop();
}

void CS1100_FM_SET_volume(unsigned int volume)
{
		unsigned int temp;
		if(volume > 0x0f)
			{
			   volume = 0x0f;
			}

		CS1100ControlData[2]&= 0xc3;  //0xc3=11000011
		temp = (volume<<2);
		temp &= 0x3c; //0x3c=00111100
		CS1100ControlData[2] |= temp;
		
		sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_write_byte_to_device(CS1100ControlData[1]);
		sim_iic_write_byte_to_device(CS1100ControlData[2]);
		sim_iic_stop();
}

void CS1100_FMPowerdown(void)
{
	  CS1100ControlData[0] |= 0x20;  // mute on
	  CS1100ControlData[0] |= 0x80;  // power down
	  sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_stop();
}

void CS1100_FMPowerup(void)
{
		CS1100ControlData[0] &= 0xdf;  // mute off
		CS1100ControlData[0] &= 0x7f;  // mute on
		sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		sim_iic_write_byte_to_device(CS1100ControlData[0]);
		sim_iic_stop();
}

void CS1100_FM_PAMode(void)
{
		unsigned char i;
	  CS1100ControlData[2]  |= 0x80; // line-in PA mode on
	  CS1100ControlData[14] |= 0x38; // power down not used blocks
	  CS1100ControlData[15] |= 0x68; // power down not used blocks
	  sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		for(i = 0; i < 16; i++)
		{
				sim_iic_write_byte_to_device(CS1100ControlData[i]);
		}
		sim_iic_stop();
}

void CS1100_FM_TunerMode(void)
{
		unsigned char i;	
		CS1100ControlData[2]  &= 0x7f; // line-in PA mode off
		CS1100ControlData[14] &= 0xc7; // power on blocks
		CS1100ControlData[15] &= 0x97; // power on blocks
		
	  sim_iic_start();
		sim_iic_write_byte_to_device(0x20);
		for(i = 0; i <	16; i++)
		{
				sim_iic_write_byte_to_device(CS1100ControlData[i]);
		}
		sim_iic_stop();
}

void ProcessSerialData(void)
{
	  unsigned char i;
	  if(TEST_BIT(g_ucByteFlag0, b_serial_frame_head_byte))
	  {
	  	switch(g_ucSerialReceBuf)
	  	{
	  		case 'w':												//write control register 0 - 13    FM_tuner init
    
    			CS1100ControlData[0]  = 0xe4;
    			CS1100ControlData[1]  = 0xd8;
    			CS1100ControlData[2]  = 0x3e;
    			CS1100ControlData[3]  = 0x26;
	  			CS1100ControlData[4]  = 0x1f;
	  			CS1100ControlData[5]  = 0x80;
	  			CS1100ControlData[6]  = 0x38;   //Reference clock is from 32.768KHz external clock input:   CS1100ControlData[6]  = 0x28;  CS1100ControlData[15] = 0x00;// 
	  			CS1100ControlData[7]  = 0x53;
	  			CS1100ControlData[8]  = 0xb3;
	  			CS1100ControlData[9]  = 0xb3;
	  			CS1100ControlData[10] = 0xaa;
	  			CS1100ControlData[11] = 0xf0;
	  			CS1100ControlData[12] = 0x8b;
	  			CS1100ControlData[13] = 0xaa;
	  			CS1100ControlData[14] = 0xc0;
	  			CS1100ControlData[15] = 0x04;
	  			CS1100ControlData[16] = 0x25;
	  			CS1100ControlData[17] = 0x35;
	  			CS1100ControlData[18] = 0xff;
	  			CS1100ControlData[19] = 0xfd;
	  			CS1100ControlData[20] = 0x92;
	  			CS1100ControlData[21] = 0x0f;
	  			CS1100ControlData[22] = 0x44;
	  			CS1100ControlData[23] = 0x00;
	  			CS1100ControlData[24] = 0x84;
	  			CS1100ControlData[25] = 0x50;
	  			CS1100ControlData[0] &= 0x7f; //power up
    
	  			sim_iic_start();
	  			sim_iic_write_byte_to_device(0x20);
	  			for(i=0; i<26; i++) sim_iic_write_byte_to_device(CS1100ControlData[i]);
	  			sim_iic_stop();
    
	  			CS1100ControlData[0] &= 0xdf;  // mute off
    
	  			sim_iic_start();
	  			sim_iic_write_byte_to_device(0x20);
	  			sim_iic_write_byte_to_device(CS1100ControlData[0]);
	  			sim_iic_stop();

	  	  break;

	  		case 'u':				//manual seek up
	  			frequency_1 += 10;
	  			if(frequency_1 > 10800) frequency_1 = 10800;
	  			CS1100_FMTune(frequency_1);
    
	  			sim_iic_start();
	  			sim_iic_write_byte_to_device(0x21);
    
	  			for(i=0; i<6; i++)
	  			{
	  				sim_iic_read_byte_from_device();
	  			}
	  			sim_iic_stop();

	      break;

	      case 'd':			//manual seek down
	      	frequency_1 -= 10;
	      	if(frequency_1 < 8750) frequency_1 = 8750;
	      	CS1100_FMTune(frequency_1);

	      	sim_iic_start();
	  			sim_iic_write_byte_to_device(0x21);

	  			for(i=0; i<6; i++)
	  			{
	  				sim_iic_read_byte_from_device();
	  			}
	  			sim_iic_stop();
	      break;

	      case 'a':			//auto seek up
	      	CS1100ControlData[1] |= 0x80;

	      	sim_iic_start();
	  			sim_iic_write_byte_to_device(0x20);
	  			sim_iic_write_byte_to_device(CS1100ControlData[0]);
	  			sim_iic_write_byte_to_device(CS1100ControlData[1]);
	  			sim_iic_stop();

	      	FM_SEEK_up();
	      break;

	      case 'b':			//auto seek down
	      	CS1100ControlData[1] &= 0x7f;
	      	
	      	sim_iic_start();
	  			sim_iic_write_byte_to_device(0x20);
	  			sim_iic_write_byte_to_device(CS1100ControlData[0]);
	  			sim_iic_write_byte_to_device(CS1100ControlData[1]);
	  			sim_iic_stop();

	      	FM_SEEK_down();

	      case 'j':			//volume++

	      	if(volume_count != 0x0f)
	  				{
	  				    volume_count++;
	  				}
	  			CS1100_FM_SET_volume(volume_count);
	      break;

	      case 'k':				//volume--

	      	if(volume_count != 0)
	  				{
	  						volume_count--;
	  				}
	  				CS1100_FM_SET_volume(volume_count);
	      break;

	      case 'p':				//power_down_on_select
	      		CS1100_Power_down_up_count++;
	  				if(CS1100_Power_down_up_count == 255)
	  						CS1100_Power_down_up_count = 1;
	  				if(CS1100_Power_down_up_count%2 == 1)
	  					{	
	  							CS1100_FMPowerdown();
	  					}
	  				else if(CS1100_Power_down_up_count%2 == 0)
	  					{
	  							CS1100_FMPowerup();
	  					}
	      break;

	      case 'm':					//Line_in_mode and tuner_mode select
	      		CS1100_PA_TUNER_MODE_count++;
	  				if(CS1100_PA_TUNER_MODE_count == 255)
	  				CS1100_PA_TUNER_MODE_count = 1;
	  				if(CS1100_PA_TUNER_MODE_count%2 ==1)
	  					{
	  							CS1100_FM_PAMode();
	  					}
	  				else if(CS1100_PA_TUNER_MODE_count%2 == 0)
	  					{
	  					 	  CS1100_FM_TunerMode();
	  					}
	      break;

	  	}
	  	CLEAR_BIT(g_ucByteFlag0, b_serial_frame_head_byte);
	  }
}

void Init_Funcation(void)
{
    port_init();
    uart_init();
    sei();
}

int main(void)
{
    Init_Funcation();
    frequency_1 = 8750;
    while(1)
    {
        ProcessSerialData();
    }
    return 0;
}

⌨️ 快捷键说明

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