Giới thiệu
- DTMF (Dual Tone Multi-Frequency) là kỹ thuật báo hiệu viễn thông sử dụng hỗn hợp hai âm thanh thuần túy (sóng thuần túy). Nó được sử dụng trong điện thoại để tạo ra âm quay số.
- Bất cứ khi nào một phím được nhấn, một sự kết hợp của 2 sóng sin (một tần số thấp hơn và một tần số cao hơn) được truyền đi. Có 8 tần số khác nhau, 4 từ tần số cao hơn và 4 từ dải tần số thấp hơn. Điều này cho chúng ta 16 kết hợp khác nhau của tần số thấp hơn và cao hơn để truyền cho 16 phím.
- MT8870 là bộ giải mã DTMF; nó giúp giải mã phím bấm.
- Nó bao gồm phần bộ lọc bandplit giúp tách tín hiệu đầu vào thành tần số thấp hơn và tần số cao hơn và lần lượt giúp xác định phím được nhấn.
- Nó cung cấp đầu ra kỹ thuật số 4 bit. Điều này cho 16 đầu ra có thể cho 16 khóa khác nhau.
- Vi điều khiển có thể đọc 4 bit này để phát hiện phím nào đã được nhấn.
Sơ đồ giao tiếp
Thí dụ
Ở đây, chúng ta sẽ giao diện mô-đun bộ nhận / giải mã DTMF MT8870 đến 8051, sẽ nhận được đầu vào được nhấn từ bàn phím điện thoại di động và hiển thị khóa đã giải mã trên màn hình LCD16x2.
Lập trình cho DTMF
#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 */
}
No comments:
Post a Comment