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

📄 soundintel.c

📁 一个完整的用用AVR单片机开发的电话交换机程序 希望对想学习AVR开发人有帮助
💻 C
字号:
#include "main.h"

//*************音乐**************/
unsigned int mBitTm;
unsigned char mNoteCn;
unsigned int  Musicfrequency;


const unsigned int MusicalScale[56] PROGMEM=
{440,494,523,440,523,494,440,494,330,494,523,578,
 494,578,523,494,440,659,880,784,880,784,698,659,
 578,659,440,698,578,659,523,494,330,523,494,440,
 659,880,784,880,784,698,659,578,659,440,698,578,
 659,523,494,330,523,494,440,0
};


const unsigned int MusicalTime[56] PROGMEM=
{
  600,200,600,200,400,200,200,400,400,600,200,600,
  200,400,200,200,800,400,400,400,200,200,400,200,
  200,400,400,400,200,600,200,200,200,200,200,800,
  400,400,400,200,200,400,200,200,400,400,400,200,
  600,200,200,200,200,200,800,0
};

void fnMusic(void)//产生音乐
{
  if(++Musictime_1ms>=mBitTm) 
 {
    Musictime_1ms=0;
    Musicfrequency = pgm_read_word_near(MusicalScale + mNoteCn);      		   
    OCR1A=4000000/Musicfrequency;
	mBitTm = pgm_read_word_near(MusicalTime+mNoteCn);
	if (++mNoteCn >= 57) 
	{
	  mNoteCn=0;             
     }
  }
}
/*************来电显示*************/
unsigned char FSKFlag;
#define LogicOne   4000000/1200
#define LogicZero  4000000/2200
unsigned char tFSKPhoneNumber[11]=
{
 0x04,0x09,0x30,0x38,0x30,0x31,0x31,
 0x30,0x30,0x30,0x30
};

void fnSFSKBit(void)
{
  SetBit(PORTD,5);		
  while (bit_is_clear(TIFR,OCF1A)); // O/P H to L	
  SetBit(TIFR,OCF1A);
  ClrBit(PORTD,5);
  while (bit_is_clear(TIFR,OCF1A)); // O/P H to L	
  SetBit(TIFR,OCF1A);
}



void fnTxFSKCallID(void)
{
  unsigned char mFSKDATA;
  unsigned char mTxBit;
  unsigned char mCS;
  unsigned char j,i;

	TCNT1 =0;
	SetBit(TIFR,OCF1A);

	for (i=0;i<150;i++)
	{		

		OCR1A = LogicZero;
        fnSFSKBit();
		OCR1A = LogicZero;
        fnSFSKBit();

		OCR1A = LogicOne;
		fnSFSKBit();

	}
	for (i=0;i<180;i++)
	{

		OCR1A = LogicOne;
		fnSFSKBit();

	}
	mCS=0;
	for (i=0; i<11; i++)
	{
		OCR1A = LogicZero;
        fnSFSKBit();
		OCR1A = LogicZero;
        fnSFSKBit();		
	
		mFSKDATA= tFSKPhoneNumber[i];
		mCS-=mFSKDATA;

		mTxBit = 1;
		
		for (j =0; j<8; j++)
		{
 			if ( mFSKDATA & mTxBit)  
			  { 	
			   OCR1A = LogicOne;
			   fnSFSKBit();
			   }
			else
			 { 		
				OCR1A = LogicZero;
				fnSFSKBit();
				OCR1A = LogicZero;
				fnSFSKBit();
				}
        mTxBit <<=1;
		}

		OCR1A = LogicOne;
		fnSFSKBit();
		
	}
    
		OCR1A = LogicZero;
        fnSFSKBit();
		OCR1A = LogicZero;
        fnSFSKBit();		
	
		mFSKDATA= mCS;
		mTxBit = 1;
		
		for (j =0; j<8; j++)
		{
 			if ( mFSKDATA & mTxBit)  
			  { 	
			   OCR1A = LogicOne;
			   fnSFSKBit();
			   }
			else
			 { 		
				OCR1A = LogicZero;
				fnSFSKBit();
				OCR1A = LogicZero;
				fnSFSKBit();
				}
        mTxBit <<=1;
		}
		OCR1A = LogicOne;
		fnSFSKBit();

}
/**********************************/

/***********振铃*************/
void fnOSCRingFK(void)//振铃声,5秒断续,即1秒送、4秒断
{
 unsigned char i,mRot;
  
 mRot=1;
 if(ExtTelRingState)
  {   
  	 if (ExtTelRingState^mExtTelRSTSav)  // if Ring is just start
	 {
		FSKFlag=1;                       //内部来电显示标志
		for(i=0;i<cExtTelNum;i++)
	 	{     
	    	if( !(ExtTelRingState & mRot) )
	    	{ 
		  		Writesoundway(SigCallID,i,OFF);      //连接响铃
		 	}
			else
			{
		  		Writesoundway(SigCallID,i,ON);      //连接响铃	
						
			}       
	   		mRot<<=1;
	  	 }  
 	  }
     
	 timeover_RingFK++;
     if(timeover_RingFK==1000)
     {
		ClrBit(PORTD,OSCRingFK); 
		if(!OutsideRingCheck && FSKFlag)        //内部来电显示,避开外部来电显示
		{
		  FSKFlag=0;
		  Writesoundway(SigCallID,cX_Music,ON);
		  fnTxFSKCallID();                        
		  Writesoundway(SigCallID,cX_Music,OFF);
         }

      }
      else if(timeover_RingFK>=5000)
     {	       
		SetBit(PORTD,OSCRingFK);
        timeover_RingFK=0;
	  }
  }
  else  // No Ring Request
  {
	 ClrBit(PORTD,OSCRingFK);
     timeover_RingFK=5000;

	 if(mExtTelRSTSav ||(mExtTelSCheckSav^ExtTelStateCheck))
	 {
		for(i=0;i<cExtTelNum;i++)
	 	{
	      if(!(ExtTelStateCheck & mRot) && !(ExtTelFlashState & mRot))//挂机
	     	{
              Writesoundway(SigCallID,i,ON);      //连接响铃 
		  	}   	
	      mRot<<=  1;
	  	}
	 }
 }
   mExtTelSCheckSav =ExtTelStateCheck;
   mExtTelRSTSav = ExtTelRingState;
}
/**********************************/

⌨️ 快捷键说明

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