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

📄 gen_dtmf.c

📁 dtmf的编解码代码
💻 C
字号:
/* ============================================================================*/ 
/*          Copyright (C) 2004 YINXING TECHNOLOGY CO., LTD                     */ 
/*                          All Rights Reserved.                               */ 
/* ----------------------------------------------------------------------------*/ 
/* ============================================================================*/ 



#include "board.h"

extern int  TelNum[64];
extern int  NowTel;     
extern int  NumIndex;
extern char DTMF_NUMBER[];
extern int IsOver;

int  A1,B=0xc000,C1,A2,C2;
int  IIR_y1n_2,IIR_y1n_1,IIR_y1n,IIR_y2n_2,IIR_y2n_1,IIR_y2n; 

int  Now_Delay,Tel_Delay=1000; /*  60ms*fs=500  */

void set_freq_coff(int);


int gen_dtmf()
{
   NumIndex=0;
   Now_Delay=Tel_Delay; 
   
   NowTel=TelNum[NumIndex++];
   if(NowTel == 0xffff)
       return(-1);       /* not press any key, input again */
   set_freq_coff(NowTel);
   
   pllx100();
   start_ac01();
   
   return(0);
   
}


/*   TELPHONE number for freqency (Hz)   */        
/*-----------------------------------------------------*/
/*         1209    1336    1477   1633                 */
/*   697     1       2       3      A                  */
/*   770     4       5       6      B                  */
/*   852     7       8       9      C                  */ 
/*   941     *       0       #      D                  */
/*-----------------------------------------------------*/
 
/* the coff. for freqency (Hz)  fs=8.333333 kHz */
/*           A       B        C
    697   0x6eba  0xc000   0x201b
    770   0x6b07  0xc000   0x2319
    852   0x667c  0xc000   0x2657
    941   0x611c  0xc000   0x2957
    1209  0x4e66  0xc000   0x3296
    1336  0x445e  0xc000   0x361b
    1477  0x387f  0xc000   0x396d
    1633  0x2aa1  0xc000   0x3c58
*/    

void set_freq_coff(int telnumber)
{   int *imr;
    
    switch(telnumber)
    { 
       case 1: A1=0x6eba;C1=0x201b;
               A2=0x4e66;C2=0x3296;
               IIR_y1n_1=0x1bc6<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x15cc<<1;IIR_y2n_2=C2<<1;
               break;
       case 0: A1=0x611c;C1=0x29b1;
               A2=0x445e;C2=0x361b;
               IIR_y1n_1=0x1fa1<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x1ce6<<1;IIR_y2n_2=C2<<1;
               break;
       case 2: A1=0x6eba;C1=0x201b;
               A2=0x445e;C2=0x361b;
               IIR_y1n_1=0x1bc6<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x1ce6<<1;IIR_y2n_2=C2<<1;
               break;
       case 3: A1=0x6eba;C1=0x201b;
               A2=1.4906e+004;C2=1.4591e+004;
               IIR_y1n_1=0x1bc6<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=6637<<1;IIR_y2n_2=C2<<1;
               break;
       case 4: A1=0x6b07;C1=0x2319;
               A2=0x4e66;C2=0x3296;
               IIR_y1n_1=0x1d59<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x15cc<<1;IIR_y2n_2=C2<<1;
               break;
       case 5: A1=0x6b07;C1=0x2319;
               A2=0x445e;C2=0x361b;
               IIR_y1n_1=0x1d59<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x1ce6<<1;IIR_y2n_2=C2<<1;
               break;
       case 6: A1=0x6b07;C1=0x2319;
               A2=1.4906e+004;C2=1.4591e+004;
               IIR_y1n_1=0x1d59<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=6637<<1;IIR_y2n_2=C2<<1;
               break;
       case 7: A1=0x667c;C1=0x2657;
               A2=0x4e66;C2=0x3296;
               IIR_y1n_1=0x1eb3<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x15cc<<1;IIR_y2n_2=C2<<1;
               break;
       case 8: A1=0x667c;C1=0x2657;
               A2=0x445e;C2=0x361b;
               IIR_y1n_1=0x1eb3<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=0x1ce6<<1;IIR_y2n_2=C2<<1;
               break;
       case 9: A1=0x667c;C1=0x2657;
               A2=1.4906e+004;C2=1.4591e+004;
               IIR_y1n_1=0x1eb3<<1;IIR_y1n_2=C1<<1;
               IIR_y2n_1=6637<<1;IIR_y2n_2=C2<<1;
               break;

       case 0xffff:      /* DTMF generate is over */
             imr=(int *)IMR_ADDR;
             *imr &= 0xffdf;    /* bit5->BXINT0, bit4->BRINT0 */
                                /* close McBSP0 send int !  */
             DTMF_NUMBER[NumIndex>>1]='\0';
             IsOver=0x0ffff;
             
             break;                     
    }           

}


void interrupt transmit()
{   int *prt;
    
    if(Now_Delay==0)
    {   
       Now_Delay=Tel_Delay;        /*  load time conter for 60ms  */
       NowTel=TelNum[NumIndex++];  /*  get next telphone number  */
       set_freq_coff(NowTel);
    }
    if(NowTel == 0xff)
    {  prt=(int *)DXR10_ADDR;
       *prt=0;
        goto end_transmit;       /*  if not signal, silence  */ 
    }
    iir_to_dtmf();                

end_transmit:
    Now_Delay--;
    return;
}

⌨️ 快捷键说明

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