logo microc
    microC®
Líder en la programación de microcontroladores PIC
©2009-2012
Síguenos en    
logo facebook
Inicio La empresa. Contáctanos  | Cómo comprar nuestros productos  | Ofertas | Recursos | Mapa del sitio |
Decodificador DTMF con el MT8870 - Ejemplo
Decodificador DTMF:
El circuito 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 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.

Código en lenguaje C (mikroC).-
//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.
}



Si esta información te ha sido útil
entonces considera la posibilidad
de hacer una contribución para microC.
Tu apoyo es muy importante para seguir adelante.
Muchas gracias.






Información complementaria
Esquema eléctrico del decodificador:
esquema electrico

Copyright © microC
Quito-Ecuador