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

microC

Lder en la programacin de microcontroladores PIC


Sguenos en | Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |

Decodificador DTMF con el MT8870 Ejemplo


Comentarios de nuestros compradores en Mercado Libre

Decodificador DTMF:
El circuito consta de un PIC16F628A operando a partir de su oscilador interno de 4MHz. Se genera una interrupcin 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 propsito es activar y desactivar el pin RB0(6) por medio de una clave ingresada por el teclado del telfono. La clave de activacin es 1973, la clave de desactivacin es 1974. Si el circuito se apaga por cualquier motivo, al encenderlo nuevamente se restablece el ltimo estado que tena el pin RB0. Adems, al ingresar la clave 3579 el pin RB1(7) se activa durante 10 segundos. Al ingresar los dgitos el PIC espera 3 segundos. Si no se ingresa un nuevo dgito el PIC efecta la tarea correspondiente. Si se ingresan menos o ms de 4 dgitos el PIC no efecta ninguna accin. Para ingresar una nueva clave simplemente hay que esperar ms 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 libreras los circuitos se deben implementar de forma real para realizar las pruebas de funcionamiento. Para comprobar la correcta operacin del DTMF MT8870 se puede armar un circuito muy simple como se indica en el probador para el MT8870, ms abajo en Informacin complementaria.

Cdigo 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;

//Funcin principal. void main(){ PORTB=0x00; //Inicializacin. 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; //Interrupcin 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 (interrupcin 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) pulsado tecla alguna conteo=0; k++; //Reinicia la variable conteo si no se ha //en 3 segundos.

if (k==28800){ segundos). k=0; m++; if (m==30){ m=0; RB2_bit=1; pin=1; } } if (pin==1){ n++; if (n==14400){ n=0; p++; if (p==5){ p=0; RB2_bit=0; pin=0; } } } T0IF_bit=0; }

//Contabiliza 12 horas (28.800x30x0,050

//Enciende el pin RB2. //Registra el encendido de RB2.

//Contabiliza 1 hora si RB2 est encendido. //Contabiliza 1 hora (14.400x5x0,050 segundos).

//Apaga el pin RB2 luego de 1 hora.

//Borra la bandera de interrupcin.

Esquema elctrico del decodificador DTMF MT8870:

Informacin complementaria

Probador para el MT8870 MT8870 DTMF datasheet

Copyright microC Quito-Ecuador


Trabajopolis.com

microC
Lder en la programacin de microcontroladores PIC
| Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |

Sguenos en

Reloj con display 7 segmentos - Ejemplo


Comentarios de nuestros compradores en Mercado Libre Reloj de 24 horas con display 7 segmentos. La hora se muestra en formato 14:35 (dos de la tarde y 35 minutos). Dispone de botones para ajuste de horas y minutos. Un botn adicional permite activar la presentacin (encender el display) por un lapso de 1 segundo. Luego de lo cual el display se apaga pero el conteo del tiempo sigue corriendo. Un pin se activa por un lapso de 1 segundo a dos horas diferentes programables por software. Para que los proyectos funcionen correctamente el PIC16F877A se tiene que polarizar de acuerdo al esquema indicado en la polarizacin bsica (ver link ms abajo).

Cdigo en lenguaje C (mikroC)


//reloj7seg.c //Microcontrolador: PIC16F877A //Oscilador: Externo 4MHz (modo HS) //****** //El Proteus 7.5 Professional no acepta la simulacin del puerto E y presenta un mensaje de error //al intentar su simulacin. Se prob un ejemplo bsico para encender un LED el cual //funcion perfectamente en la prctica pero el Proteus generaba el error "Internal Exception: //acces violation in module PIC16.DLL". //****** //Entradas: //AA: Avance Automtico al mantener presionado (tambin avance paso a paso al pulsar y soltar). //Ajuste de HORAS (AA) ->RB7(40) //Ajuste de MINUTOS (AA) ->RC7(26) //ACTIVAR ->RD7(30) //Salidas: //Horas -> Puertos A y B //Minutos -> Puertos C y D //Dos puntos (:) ->RE1(9) //Pulso de 1 segundo -> RE0(8) //Funcin para transformar de binario(decimal) a 7 segmentos: char Bin2_7seg(char digit){ switch (digit){ case 0: return 0x3F; //0x3F es el cdigo 7-segmentos del 0. case 1: return 0x06; //0x06 es el cdigo 7-segmentos del 1. case 2: return 0x5B; case 3: return 0x4F; case 4: return 0x66; case 5: return 0x6D;

case case case case } }

6: 7: 8: 9:

return return return return

0x7D; 0x07; 0x7F; 0x67;

char contador=0,segundos=0,minutos=0,horas=0, minutosBCD, unidades, decenas, horasBCD, j=0; bit activar; void main(){ PORTA=0x00; RE0_bit=0; RE1_bit=0; ADCON1=0x06; //Pines RA<5:0> como E/S digital. PORTB=0x00; //Inicializacin. PORTC=0x00; PORTD=0x00; TRISA=0x00; //Puerto A como salida. TRISB=0x80; //RB7 como entrada. RB<6:0> como salidas. TRISC=0x80; //RC7 como entrada. RC<6:0> como salidas. TRISD=0x80; //RD7 como entrada. RD<6:0> como salidas. TRISE0_bit=0; //RE0 como salida. TRISE1_bit=0; //RE1 como salida. OPTION_REG=0b01010111; //Pull ups habilitados.Timer0 como temporizador. //Prescaler asignado al Timer0. Prescaler 1:256. TMR0=61; 50 ms. GIE_bit=1; T0IE_bit=1; activar=1; while (1){ if (segundos==60){ minutos++; segundos=0; } if (minutos==60){ horas++; minutos=0; } if (horas==24) horas=0; //Encender los displays por 1 segundo al presionar ACTIVAR: if (activar==1){ //Encender los dos puntos ":" : RE1_bit=1; //Transformar los minutos para su presentacin: minutosBCD=Dec2Bcd(minutos); //Transforma de binario a BCD. unidades=0b1111&minutosBCD; //Sacar las unidades. //Valor inicial del TMR0. Interrupcin cada //Interrupciones habilitadas. //Interrupcin del Timer0 habilitada.

decenas=0b11110000&minutosBCD; decenas=decenas>>4; PORTD=Bin2_7seg(unidades); PORTC=Bin2_7seg(decenas);

//Sacar las decenas. //Desplazar 4 bits a la derecha. //Unidades al puerto D. //Decenas al puerto C.

//Transformar las horas para su presentacin: horasBCD=Dec2Bcd(horas); //Transforma de binario a BCD. unidades=0b1111&horasBCD; //Sacar las unidades. decenas=0b11110000&horasBCD; //Sacar las decenas. decenas=decenas>>4; //Desplazar 4 bits a la derecha. PORTB=Bin2_7seg(unidades); //Unidades al puerto B. if (decenas==1) PORTA=Bin2_7seg(decenas); //Decenas al puerto A. if (decenas==2) PORTA=0x3B; //Formar el nmero "2". if (decenas==0) PORTA=0; //Apagar las decenas cuando valgan cero. } else{ PORTA=0; PORTB=0; PORTC=0; PORTD=0; PORTE=0; } //Generar un pulso a una determinada hora, por ejemplo a las 2h01. if (horas==2 && minutos==01 && segundos==0) RE0_bit=1; if (horas==2 && minutos==01 && segundos==1) RE0_bit=0; //Generar un pulso a una determinada hora, por ejemplo a las 15h25. if (horas==15 && minutos==25 && segundos==0) RE0_bit=1; if (horas==15 && minutos==25 && segundos==1) RE0_bit=0; } } void interrupt(void){ //Botn HORAS presionado: if (Button(&PORTB,7,1,0)){ activar=1; horas++; if (horas==24) horas=0; Delay_ms(200); } //Botn MINUTOS presionado: if (Button(&PORTC,7,1,0)){ activar=1; minutos++; if (minutos==60) minutos=0; Delay_ms(200); }

//Botn ACTIVAR presionado: if (Button(&PORTD,7,1,0)) activar=1; //Medir 1 segundo (para el encendido de los displays): if (activar==1){ j++; if (j==20){ j=0; activar=0; } } //Medidor de segundos (para el reloj): TMR0=61; //Valor inicial del TMR0. Interrupcin cada 50 ms. contador++; if (contador==20){ segundos++; contador=0; } T0IF_bit=0; //Borra la bandera de interrupcin. }

Esquema elctrico:

Informacin complementaria

Display 7 segmentos de ctodo comn (k) Polarizacin bsica del PIC16F877A

Copyright microC Quito-Ecuador

microC
Lder en la programacin de microcontroladores PIC
Sguenos en | Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |

Comunicacin PIC a PIC - Ejemplo


Comentarios de nuestros compradores en Mercado Libre

Comunicacin entre dos PICs:


Comunicacin entre dos microcontroladores PIC16F628A usando el mdulo USARTSoftware del compilador mikroC. Consta de dos proyectos, uno para cada PIC: 1. El proyecto PIC a PIC LCD es utilizado para recibir datos y presentarlos en un LCD 2x16. 2. El proyecto PIC a PIC se utiliza para enviar datos.

Cdigo en lenguaje C (mikroC).Primer cdigo fuente:


//PIC_a_PIC_LCD.c //Microcontrolador: PIC16F628A //Oscilador: Interno-4MHz //Este programa se almacena en uno de los dos microcontroladores (U2) y recibe continuamente un //dato (la letra 'r') cada 300 ms por el pin de recepcin RB6(12). El pin de transmisin es //RB7(13). El dato recibido se va presentando en el LCD. //Comunicacin PIC a PIC usando la biblioteca UART por Software (Software UART). //La velocidad de transmisin de 600 Baudios fue seleccionada experimentalmente por un //procedimiento de ensayo y error. El pin RB0(6) se enciende por 1 segundo en el caso de //intentar establecer una velocidad de transmisin muy alta o muy baja. //Declaracin de las 12 variables necesarias para la conexin

//del mdulo LCD. sbit LCD_RS at RA4_bit; sbit LCD_EN at RA6_bit; sbit LCD_D4 at RA0_bit; sbit LCD_D5 at RA1_bit; sbit LCD_D6 at RA2_bit; sbit LCD_D7 at RA3_bit; sbit LCD_RS_Direction sbit LCD_EN_Direction sbit LCD_D4_Direction sbit LCD_D5_Direction sbit LCD_D6_Direction sbit LCD_D7_Direction // Fin de declaracin at at at at at at de TRISA4_bit; TRISA6_bit; TRISA0_bit; TRISA1_bit; TRISA2_bit; TRISA3_bit; variables de conexin.

char error, byte_read; void main(){ CMCON=0x07; //Pines RA<3:0> como E/S digital. PORTB=0x00; TRISB0_bit=0; Lcd_Init(); //Inicializa el LCD. Lcd_Cmd(_LCD_CLEAR); //Borra el display. Lcd_Cmd(_LCD_CURSOR_OFF); //Apaga el cursor. error = Soft_UART_Init(&PORTB, 6, 7, 600, 0); //Inicializa el mdulo UART-Software a 600 Baudios. if (error >0){ RB0_bit=1; Delay_ms(1000); RB0_bit=0; while(1); //Detiene el programa en caso de error. } Delay_ms(100); while(1) { byte_read = Soft_UART_Read(&error); //Recibe un dato y lo guarda en byte_read. if (!error) //Si no hay error. Lcd_Chr_CP(byte_read); //Enva el dato recibido hacia el LCD. Delay_ms(200); } }

Segundo cdigo fuente:


//PIC_a_PIC.c //Microcontrolador: PIC16F628A //Oscilador: Interno-4MHz //Este programa se almacena en uno de los dos microcontroladores (U1) y transmite continuamente un //dato (la letra 'r') cada 300 ms por el pin de transmisin RB6(12). El pin de recepcin es //RB7(13). //Comunicacin PIC a PIC usando la biblioteca UART por Software (Software UART). //La velocidad de transmisin de 600 Baudios fue seleccionada experimentalmente por un //procedimiento de ensayo y error. El pin RB0(6) se enciende por 1

segundo en el caso de //intentar establecer una velocidad de transmisin muy alta o muy baja. char error; void main(){ CMCON=0x07; //Pines RA<3:0> como E/S digital. PORTB=0x00; TRISB0_bit=0; error = Soft_UART_Init(&PORTB, 7, 6, 600, 0); //Inicializa el mdulo UART-Software a 600 Baudios. if (error >0){ RB0_bit=1; Delay_ms(1000); RB0_bit=0; while(1); //Detiene el programa en caso de error. } Delay_ms(100); while (1){ Soft_UART_Write('r'); //Enva el carcter 'r' cada 300 ms. Delay_ms(300); } }

Esquema elctrico de la comunicacin PIC a PIC:

Copyright microC Quito-Ecuador

microC
Lder en la programacin de microcontroladores PIC
Sguenos en | Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |

Tacmetro digital con PIC - Ejemplo


Comentarios de nuestros compradores en Mercado Libre El circuito consta de un PIC16F88, una pantalla LCD 2x16 , un sensor tipo herradura GP3S62 de Sharp, y un regulador de 5V/100mA. El Timer0 del PIC trabaja como contador de las transiciones alto-bajo en el pin RA4/T0CKI durante 1 segundo. Este valor corresponde al nmero de revoluciones por segundo (r.p.s) el cual es transformado a r.p.m y rad/s para su presentacin en el LCD. La lectura se actualiza continuamente cada 2 segundos. Se genera una transicin cada vez que la ranura en el disco giratorio pasa en frente del emisor de luz, es decir una transicin por vuelta.

Cdigo en lenguaje C (mikroC)


//Tacometro.c //El registro OPTION_REG tiene todos sus bits en 1 despus del //encendido por lo tanto el Timer0 acta como contador, //incrementa en transicin descendente y el prescaler //est asignado al WDT. //Declaracin de las 12 variables necesarias para la conexin //del mdulo LCD. sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB6_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction sbit LCD_EN_Direction sbit LCD_D4_Direction sbit LCD_D5_Direction sbit LCD_D6_Direction sbit LCD_D7_Direction // Fin de declaracin

at at at at at at de

TRISB4_bit; TRISB5_bit; TRISB6_bit; TRISB1_bit; TRISB2_bit; TRISB3_bit; variables de conexin.

char texto1[7], texto2[7], numflancos=0; int rpm, rads; void main(){ OSCCON=0x40; //Oscilador interno a 1MHz. ANSEL=0x00; //Pines AN<6:0> como E/S digital. Lcd_Init(); //Inicializa el LCD. Lcd_Cmd(_LCD_CLEAR); //Borra el display. Lcd_Cmd(_LCD_CURSOR_OFF); //Apaga el cursor. Lcd_Out(1,1,"TacometroDigital"); Lcd_Out(2,1,"Wmax=15.300 rpm"); Delay_ms(3000); Lcd_Cmd(_LCD_CLEAR); //Borra el display. while (1) { TMR0=0; //Inicializa el registro TMR0. Delay_1sec(); //Cuenta durante 1 segundo. numflancos=TMR0; //numflancos=velocidad en rps. rpm=60*numflancos; //Transformacin a rpm. rads=6.28*numflancos; //Transformacin a rad/s. IntToStr(rpm,texto1); //Transformacin de rpm a texto. Lcd_Out(1,1,"W[rpm]="); Lcd_Out(1,10,texto1); IntToStr(rads,texto2); //Tramsformacin de rads a texto. Lcd_Out(2,1,"W[rad/s]="); Lcd_Out(2,10,texto2); Delay_ms(1000); //Espera para la nueva medicin. } }

Esquema elctrico del tacmetro digital

Informacin complementaria

GP3S62 datasheet (hoja de referencia)

Copyright microC Quito-Ecuador