Decodificador DTMF MT8870 
El decodificador DTMF MT8870 consta de un PIC16F628A operando a partir de su 
oscilador interno de 4MHz. Se genera una interrupción debida al Timer0 cada 50 ms 
(0,050 segundos) que se toma como base de tiempo para contabilizar los diferentes 
intervalos necesarios para el funcionamiento del circuito. 
El propósito de este decodificador DTMF MT8870 es activar y desactivar el pin RB0(6) 
por medio de una clave ingresada por el teclado del teléfono. La clave de activación es 
1973, la clave de desactivación es 1974. Si el circuito se apaga por cualquier motivo, al 
encenderlo nuevamente se restablece el último estado que tenía el pin RB0. 
Además, al ingresar la clave 3579 el pin RB1(7) se activa durante 10 segundos. Al 
ingresar los dígitos el PIC espera 3 segundos. Si no se ingresa un nuevo dígito el PIC 
efectúa la tarea correspondiente. Si se ingresan menos o más de 4 dígitos el PIC no 
efectúa ninguna acción. Para ingresar una nueva clave simplemente hay que esperar más 
de 3 segundos. Cada 12 horas se enciende el pin RB2(8) por un lapso de 1 hora. 
Debido a que el simulador Proteus no incluye este dispositivo dentro de sus librerías los 
circuitos se deben implementar de forma real para realizar las pruebas de 
funcionamiento. Para comprobar la correcta operación del DTMF MT8870 se puede 
armar un circuito muy simple como se indica en el probador para el MT8870, más 
abajo en Información complementaria. 
Código en lenguaje C (mikroC PRO) 
//DTMF.c 
//Microcontrolador: PIC16F628A. 
//Oscilador interno: 4MHz 
char tecla[12], i=0, j, num_cifras, conteo=0, m=0, estado=0, pin=0, 
p=0; 
int k=0, n=0; 
//Función principal. 
void main(){ 
PORTB=0x00; //Inicialización. 
CMCON=0x07; //Pines RA<3:0> como E/S digital. 
TRISB=0x00; //Puerto B como salida. 
OPTION_REG=0b11010111; //Timer0 como temporizador. Prescaler asignado 
//al Timer0. Prescaler 1:256. 
GIE_bit=1; //Interrupciones habilitadas. 
T0IE_bit=1; //Interrupción del Timer0 habilitada. 
RB0_bit=EEPROM_Read(0x00); //Actualiza el pin RB0 a su último estado. 
//La primera vez que se enciende el PIC, 
el estado del 
//pin RB0 será 1. 
TMR0=61; //Valor inicial del TMR0 (interrupción cada 
50ms). 
while (1){ 
while (RA4_bit==0) ; //Esperar mientras no hay dato disponible.
while (RA4_bit==1) ; //Dato disponible. Esperar mientras RA4 está en 
alto. 
i++; 
estado=1; 
num_cifras=i; 
tecla[i]=PORTA; //Lee el dato disponible y lo almacena. 
conteo=0; 
} 
} 
void interrupt(void){ 
TMR0=61; //Valor inicial del TMR0. 
conteo++; 
if (conteo==60 && estado==1){ 
if (tecla[1]==1 && tecla[2]==9 && tecla[3]==7 && tecla[4]==3 && 
num_cifras==4){ //Clave:1973 
RB0_bit=1; //Activa el pin RB0. 
EEPROM_Write(0x00,1); //Guarda el estado del pin RB0. 
} 
if (tecla[1]==1 && tecla[2]==9 && tecla[3]==7 && tecla[4]==4 && 
num_cifras==4){ //Clave:1974 
RB0_bit=0; //Desactiva el pin RB0. 
EEPROM_Write(0x00,0); //Guarda el estado del pin RB0. 
} 
if (tecla[1]==3 && tecla[2]==5 && tecla[3]==7 && tecla[4]==9 && 
num_cifras==4){ //Clave:3579 
RB1_bit=1; //Activa el pin RB1. 
for (j=1;j<=10;j++) //Espera 10 segundos. 
Delay_1sec(); 
RB1_bit=0; //Desactiva el pin RB1. 
} 
i=0; conteo=0; estado=0; 
} 
if (conteo==60) //Reinicia la variable conteo si no se ha 
pulsado tecla alguna 
conteo=0; //en 3 segundos. 
k++; 
if (k==28800){ //Contabiliza 12 horas (28.800x30x0,050 
segundos). 
k=0; 
m++; 
if (m==30){ 
m=0; 
RB2_bit=1; //Enciende el pin RB2. 
pin=1; //Registra el encendido de RB2. 
} 
} 
if (pin==1){ //Contabiliza 1 hora si RB2 está encendido. 
n++; 
if (n==14400){ //Contabiliza 1 hora (14.400x5x0,050 
segundos). 
n=0; 
p++; 
if (p==5){ 
p=0; 
RB2_bit=0; //Apaga el pin RB2 luego de 1 hora. 
pin=0; 
}
} 
} 
T0IF_bit=0; //Borra la bandera de interrupción. 
} 
Esquema eléctrico del decodificador DTMF MT8870: 
Información complementaria 
 Probador para el MT8870 
 MT8870 DTMF datasheet

Decodificador dtmf mt8870

  • 1.
    Decodificador DTMF MT8870 El decodificador DTMF MT8870 consta de un PIC16F628A operando a partir de su oscilador interno de 4MHz. Se genera una interrupción debida al Timer0 cada 50 ms (0,050 segundos) que se toma como base de tiempo para contabilizar los diferentes intervalos necesarios para el funcionamiento del circuito. El propósito de este decodificador DTMF MT8870 es activar y desactivar el pin RB0(6) por medio de una clave ingresada por el teclado del teléfono. La clave de activación es 1973, la clave de desactivación es 1974. Si el circuito se apaga por cualquier motivo, al encenderlo nuevamente se restablece el último estado que tenía el pin RB0. Además, al ingresar la clave 3579 el pin RB1(7) se activa durante 10 segundos. Al ingresar los dígitos el PIC espera 3 segundos. Si no se ingresa un nuevo dígito el PIC efectúa la tarea correspondiente. Si se ingresan menos o más de 4 dígitos el PIC no efectúa ninguna acción. Para ingresar una nueva clave simplemente hay que esperar más de 3 segundos. Cada 12 horas se enciende el pin RB2(8) por un lapso de 1 hora. Debido a que el simulador Proteus no incluye este dispositivo dentro de sus librerías los circuitos se deben implementar de forma real para realizar las pruebas de funcionamiento. Para comprobar la correcta operación del DTMF MT8870 se puede armar un circuito muy simple como se indica en el probador para el MT8870, más abajo en Información complementaria. Código en lenguaje C (mikroC PRO) //DTMF.c //Microcontrolador: PIC16F628A. //Oscilador interno: 4MHz char tecla[12], i=0, j, num_cifras, conteo=0, m=0, estado=0, pin=0, p=0; int k=0, n=0; //Función principal. void main(){ PORTB=0x00; //Inicialización. CMCON=0x07; //Pines RA<3:0> como E/S digital. TRISB=0x00; //Puerto B como salida. OPTION_REG=0b11010111; //Timer0 como temporizador. Prescaler asignado //al Timer0. Prescaler 1:256. GIE_bit=1; //Interrupciones habilitadas. T0IE_bit=1; //Interrupción del Timer0 habilitada. RB0_bit=EEPROM_Read(0x00); //Actualiza el pin RB0 a su último estado. //La primera vez que se enciende el PIC, el estado del //pin RB0 será 1. TMR0=61; //Valor inicial del TMR0 (interrupción cada 50ms). while (1){ while (RA4_bit==0) ; //Esperar mientras no hay dato disponible.
  • 2.
    while (RA4_bit==1) ;//Dato disponible. Esperar mientras RA4 está en alto. i++; estado=1; num_cifras=i; tecla[i]=PORTA; //Lee el dato disponible y lo almacena. conteo=0; } } void interrupt(void){ TMR0=61; //Valor inicial del TMR0. conteo++; if (conteo==60 && estado==1){ if (tecla[1]==1 && tecla[2]==9 && tecla[3]==7 && tecla[4]==3 && num_cifras==4){ //Clave:1973 RB0_bit=1; //Activa el pin RB0. EEPROM_Write(0x00,1); //Guarda el estado del pin RB0. } if (tecla[1]==1 && tecla[2]==9 && tecla[3]==7 && tecla[4]==4 && num_cifras==4){ //Clave:1974 RB0_bit=0; //Desactiva el pin RB0. EEPROM_Write(0x00,0); //Guarda el estado del pin RB0. } if (tecla[1]==3 && tecla[2]==5 && tecla[3]==7 && tecla[4]==9 && num_cifras==4){ //Clave:3579 RB1_bit=1; //Activa el pin RB1. for (j=1;j<=10;j++) //Espera 10 segundos. Delay_1sec(); RB1_bit=0; //Desactiva el pin RB1. } i=0; conteo=0; estado=0; } if (conteo==60) //Reinicia la variable conteo si no se ha pulsado tecla alguna conteo=0; //en 3 segundos. k++; if (k==28800){ //Contabiliza 12 horas (28.800x30x0,050 segundos). k=0; m++; if (m==30){ m=0; RB2_bit=1; //Enciende el pin RB2. pin=1; //Registra el encendido de RB2. } } if (pin==1){ //Contabiliza 1 hora si RB2 está encendido. n++; if (n==14400){ //Contabiliza 1 hora (14.400x5x0,050 segundos). n=0; p++; if (p==5){ p=0; RB2_bit=0; //Apaga el pin RB2 luego de 1 hora. pin=0; }
  • 3.
    } } T0IF_bit=0;//Borra la bandera de interrupción. } Esquema eléctrico del decodificador DTMF MT8870: Información complementaria  Probador para el MT8870  MT8870 DTMF datasheet