发送程序
程序执行后,将以DTMF方式发送预存在数组W_BUF中的7位数码(5135535)。
#include #define uc unsigned char #define ui unsigned int /* 子函数(子程序)说明 */ void initialize(void); void tran_init(void); void transmit(uc data *p,uc count); void delay(ui l); /* 主函数(主程序) */ void main(void) { uc data w_buf[7]; SP=0x5f; /* 预存数码5135535 */ w_buf[0]=5; w_buf[1]=1; w_buf[2]=3; w_buf[3]=5; w_buf[4]=5; w_buf[5]=3; w_buf[6]=5; initialize(); tran_init(); transmit(w_buf,7); initialize(); for(;;);} /* MT8880初始化子函数 */ void initialize(void) { P1=0x3f; /* 读SR */ P1=0x20; /* CRA=0000 */ P1=0x20; /* CRA=0000 */ P1=0x28; /* CRA=1000 */ P1=0x20; } /* CRB=0000 */ /* 发送初始化子函数 */ void tran_init(void) { P1=0x29; /* CRA=1001 */ P1=0x21; } /* CRB=0001 */ /* 发送操作子函数 */ void transmit(uc data *p,uc count) { uc i; for (i=0;i delay(6000); /* 延时 */ P1=0x3f; }}/* 读SR */ /* 延时子函数 */ void delay(ui l) { ui i; for (i=0;i 程序利用单片机的INT0以中断方式接收DTMF信号,接收的7位数码存入数组R_BUF中。 #include #define uc unsigned char uc data i,r_buf[7]; /* 子函数(子程序)说明 */ void initialize(void); void rece_init(void); /* 主函数(主程序) */ void main(void) { SP=0x5f; i=0; initialize(); rece_init(); for(;;);} /* MT8880芯片初始化子函数 */ void initialize(void) { P1=0x3f; /* 读SR */ P1=0x20; /* CRA=0000 */ P1=0x20; /* CRA=0000 */ P1=0x28; /* CRA=1000 */ P1=0x20; } /* CRB=0000 */ /* 接收初始化子函数 */ void rece_init(void) { P1=0x24; /* CRA=0100 */ IT0=1; /* 边沿触发 */ IE=0x81; } /* 允许中断,开中断 */ /* 接收中断服务程序 */ void int0(void) interrupt 0 using 1 { P1=0x3f; /* 读SR */ P1=0x1f; /* 读RDR */ r_buf[i++]=P1&0x0f; } /* 保存 */ 必须知道各种信号音的特性。各种信号音特性如下。 ● 拨号音:450±25Hz连续蜂音。 ● 忙音:0.35s断0.35s通的450 ±25Hz蜂音,音段周期为0.7s。 ● 回铃音:4s断ls通的450±25Hz蜂音,音段周期为5s。 信号音判断的实现原理是:由于电话系统信号音的拨号音、回铃音和忙音的音源频率均为450Hz(±25Hz)的正弦波,只是断续比不同且在时间上有明显的差异(拨号音为450Hz±25Hz连续信号,忙音为0.35s通0.35s断,回铃音为1s通4s断)。要判断信号音,首先应将处理DTMF信号的MT8880芯片设置为呼叫处理模式,使电话呼叫过程中的各种信号音经MT8880滤波、限幅后得到方波,并由MT8880的IRQ端输出。然后对MT8880输出的IRQ信号计数5秒,拨号音的计数下限为(450-25)×5=2125,计数上限为(450+25)×5=2375,即计数范围为2125~2375。同理,忙音的计数范围为1041~1212,回铃音的计数范围为425~475,无信号音的计数应为零。但在实际编程中,需要考虑一定的计时计数误差,并且使程序简化,因此采用不同信号音相邻计数界限的中间值为区分不同的信号音。同时,为合理利用FPGA硬件资源,中间值应尽量选为2的n次方(整数)。最后设定为计数值大于1792为拨号音,在1024~1791之间的忙音,在256~1023之间的回铃音,小于255为无信号音。