Micro C
Micro C
Micro C
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; }
Informacin complementaria
microC
Lder en la programacin de microcontroladores PIC
| Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |
Sguenos en
6: 7: 8: 9:
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.
//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
microC
Lder en la programacin de microcontroladores PIC
Sguenos en | Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |
//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 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); } }
microC
Lder en la programacin de microcontroladores PIC
Sguenos en | Inicio | La empresa. Contctanos | Cmo comprar nuestros productos | Ofertas | Recursos | sitio |
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
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. } }
Informacin complementaria