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

📄 test.c

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


unsigned char Test_FunPt;
unsigned char ExtSav,OutSav;
unsigned char Test_Link;
unsigned int  Test_dialtime;
void fnTest_Ext(void)
{
  unsigned char i;
  for(i=0;i<OutsideTelNum;i++)          //测试来电显示,DTMF和响铃
  {
    if(bit_is_set(OutsideRingCheck,i))
    {
      Test_FunPt=1;
	  Test_Link=i;
	  Test_dialtime=8000;
	  return;
	 }
   }
 
 switch(ExtTelStateCheck^ExtSav)
 {
  case 0x02:
  if(bit_is_set(ExtTelStateCheck,cExt2Num))//测试450HZ 1
   {   
	 Writesoundway(SigCallID,cExt2Num,OFF);      //
	 Writesoundway(2,Sig450Hz_1,ON); 
	 Writesoundway(2,cExt2Num,ON);
   }
   else
   {
     Writesoundway(SigCallID,cExt2Num,ON);      //
	 Writesoundway(2,Sig450Hz_1,OFF); 
	 Writesoundway(2,cExt2Num,OFF);     
   }
   break;
  case 0x04:
  if(bit_is_set(ExtTelStateCheck,cExt3Num))//测试450HZ 2
   {     
	 Writesoundway(SigCallID,cExt3Num,OFF);      //
	 Writesoundway(3,Sig450Hz_2,ON); 
	 Writesoundway(3,cExt3Num,ON);
   }
   else
   {
      Writesoundway(SigCallID,cExt3Num,ON);      //
	  Writesoundway(3,Sig450Hz_2,OFF); 
	  Writesoundway(3,cExt3Num,OFF);
   }
   break;
  case 0x08:
  if(bit_is_set(ExtTelStateCheck,cExt4Num))//测试回铃声
   {
	 ExtTelRingState=0x80;
	 Writesoundway(SigCallID,cExt4Num,OFF);      //	 
	 Writesoundway(4,WaitRing,ON); 
	 Writesoundway(4,cExt4Num,ON); 
   }
   else
   {
	  ExtTelRingState=0x00;
	  Writesoundway(SigCallID,cExt4Num,ON);      //	  
	  Writesoundway(4,WaitRing,OFF); 
	  Writesoundway(4,cExt4Num,OFF); 
   }
  break;
  case 0x10:
  if(bit_is_set(ExtTelStateCheck,cExt5Num))//测试音乐
   {   
	 Writesoundway(SigCallID,cExt5Num,OFF);      //
	 Writesoundway(5,cX_Music,ON); 
	 Writesoundway(5,cExt5Num,ON); 
   }
   else
   {
	 Writesoundway(SigCallID,cExt5Num,ON);      //
	 Writesoundway(5,cX_Music,OFF); 
	 Writesoundway(5,cExt5Num,OFF); 
   }
   break;
  case 0x20: 
  if(bit_is_set(ExtTelStateCheck,cExt6Num))//测试忙音
   {   
	 Writesoundway(SigCallID,cExt6Num,OFF);      //
	 Writesoundway(Connect_Busy,cExt6Num,ON);
   }
   else
   {
     Writesoundway(SigCallID,cExt6Num,ON);      //
	 Writesoundway(Connect_Busy,cExt6Num,OFF); 
   }
   break;
  default:break;
  }
 ExtSav=ExtTelStateCheck;
}


void fnTest_Out(void)
{
  if (Test_dialtime)
  { 
	--Test_dialtime;
	if(Test_dialtime==5000)
     {
	   SetBit(PORTC,(Line_LedCtr+Test_Link));          
	   Writesoundway(Test_Link,(cX_DTMF1+Test_Link),ON);
	   Writesoundway(Test_Link,cX_Music,ON);  //外线可听到音乐,可用来测试内外是否可通话	
	  }

    if(Test_dialtime==0)                     //5s后关掉音乐,测试响铃
     {
	   Writesoundway(Test_Link,cX_Music,OFF);  
	  }
     return; 
   }


  mDTMF_In=DTMF_Decode(Test_Link+1);

  	switch (mDTMF_In)             //测试响铃
	{
		case 1:              
			ExtTelRingState=0x01; //对方响铃		                             
			break;	
		case 2:
			ExtTelRingState=0x02; //对方响铃		                             
			break;	
		case 3:
			ExtTelRingState=0x04; //对方响铃		                             
			break;	
		case 4:
			ExtTelRingState=0x08; //对方响铃		                             
			break;	
		case 5:
			ExtTelRingState=0x10; //对方响铃		                             
			break;	
		case 6:
			ExtTelRingState=0x20; //对方响铃		                             
			break;
		case cXin:
			Test_FunPt=0;
			ExtTelRingState=0x00;
	        ClrBit(PORTC,(Line_LedCtr+Test_Link));           //外线提示灯亮 
			Writesoundway(Test_Link,cX_Music,OFF);           //外线可听到音乐,可用来测试内外是否可通话
	        Writesoundway(Test_Link,(cX_DTMF1+Test_Link),OFF);	                            
			break;	
		default:		    
			break;
     }
}



const void (*Test_FunTab[]) PROGMEM=
{
 	fnTest_Ext, 
	fnTest_Out,
};


void fnTelRountineTest(void)
{
	void (*pp)(void);
		pp=  (void *) pgm_read_word_near(Test_FunTab+Test_FunPt);
		pp();
}



void test(void)
{
  
  while(bit_is_clear(PINB,Test_Flag1))//PINB3=0  for test
  {   
	  if(bit_is_set( TIFR, OCF0))        // 1ms  
       {    
         SetBit( TIFR, OCF0);    
		 ExtTelCheck();					//分机摘机检测
	     OutsideTelRingCheck();			//外线振铃检测
         fnTelRountineTest();
		 fnOSCRingFK();                 //振铃声,5秒断续,即1秒送、4秒断				
         fnMusic();                     //产生音乐

		  if(++timeover_200ms>=200)     //0.2秒 计时
		  {
			 timeover_200ms=0;
             PORTC^=Create10HZ;         //产生10HZ频繁				 		         
		   }
        wdt_reset();
		}	  
	}
}

⌨️ 快捷键说明

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