0°

(十四)51进阶:MT8870 DTMF与8051连接教程

介绍

  • DTMF(双音多频)是一种电信信令技术,它使用两种纯音(纯正弦波)声音的混合。它在手机中用于生成拨号音。
  • 每当按下一个键时,就会发送2个正弦波(较低频率和较高频率之一)的组合。有8种不同的频率,4种来自较高频率范围,4种来自较低频率范围。这为我们提供了16种不同的低频和高频组合,可以传输16个按键。
  • MT8870是DTMF解码器; 它有助于解码按下的键。
  • 它由bandsplit滤波器部分组成,有助于将输入信号分成较低频率和较高频率,从而有助于识别按下的按键。
  • 它提供4位数字输出。这为16个不同的键提供了16种可能的输出。
  • 微控制器可以读取这4位以检测按下了哪个键。

电路连接原理图

(十四)51进阶:MT8870 DTMF与8051连接教程

DTMF解码器与8051接口

例程

在这里,我们将MT8870 DTMF接收器/解码器模块连接到8051,它将从手机键盘接收按键输入并在LCD16x2显示器上显示解码键。

/*
 * Interfacing DTMF with 8051
 * https://www.qutaojiao.com
 */

#include<stdio.h>
#include<reg52.h>
#include<LCD_16x2_8-bit_Header_File.h>

#define DTMF_Input_Read P2

void External_Interrupt_Init();

volatile char Key_detect;		/* flag to check Tone is received or not */

void main()
{   
	unsigned char DTMF_Key;		/* variable to store detected key */           
	LCD_Init();
	LCD_Clear();
	DTMF_Input_Read = 0xff;		/* set port as input */
	LCD_String_xy(0,0,"DTMF Key:");
	External_Interrupt_Init();
	Key_detect = 0;
	while(1)
	{
		MSdelay(1);
		if(Key_detect)                /* Key_detect = 1 indicates Tone Received*/
		{
			Key_detect = 0;
			LCD_Command(0xc0);
			DTMF_Key = 0;
			DTMF_Key = (DTMF_Input_Read & 0x0f);
			switch(DTMF_Key)  /* detect received key*/
			{
				case 0x01: LCD_Char('1');
				           break;
				case 0x02: LCD_Char('2');
					   break;
				case 0x03: LCD_Char('3');
					   break;
				case 0x04: LCD_Char('4');
					   break;
				case 0x05: LCD_Char('5');
					   break;
				case 0x06: LCD_Char('6');
					   break;
				case 0x07: LCD_Char('7');
					   break;
				case 0x08: LCD_Char('8');
					   break;
				case 0x09: LCD_Char('9');
					   break;
				case 0x0A: LCD_Char('0');
					   break;
				case 0x0B: LCD_Char('*');
					   break;
				case 0x0C: LCD_Char('#');
					   break;
			}
		}
	}
}


void External_Interrupt_Init()				
{
	EA  = 1;		/* Enable global interrupt */
	EX0 = 1;      		/* Enable Ext. interrupt0 */			
	IT0 = 1;      		/* Select Ext. interrupt0 on falling edge */ 	
}
/* ISR is used to check tone is received or not */
											
void External0_ISR() interrupt 0    
{
	Key_detect = 1;		/* Toggle pin on falling edge on INT0 pin */
}

本教程完整程序下载:

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论