📄 gen_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 + -