tecmikro logo
Programación de microcontroladores PIC en mikroC PRO
Email: tecmikro@gmail.com   Cel. 098 743 8877   Telf. 243 0352 Quito-Ecuador


Decodificador DTMF MT8870 con PIC16F628A

 

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.

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 la Información complementaria.

Ejemplo en mikroC PRO con el PIC16F628A

//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:

decodificador dtmf mt8870

Información complementaria

 


eBook en formato PDF "Cómo programar microcontroladores PIC"

Guía básica para programar microcontroladores PIC en mikroC PRO. Disponible en formato PDF. A la venta por tan sólo US$12.00

¡Cómpralo ya!