Вы находитесь на странице: 1из 3

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.

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

Вам также может понравиться