-1-
PROYECTOS CON PIC Y SIMULACION EN PROTEUS Por: Jorge Arturo Rodriguez Hernandez Email:
[email protected]
-2-
Este libro fue creado para la necesidad de hacer nuevos programas usando el compilador CCS C y unido a MPLAB IDE. Proyecto #1
Crear un Proyecto en Mplab
Al abrir el programa de Mplab nos iremos a dar un click en < Project>
Debe de aparecer una ventana donde nos saluda “WELCOME” y damos un click en nos mencionara que estamos en el primer paso “Step One”. 1.-Step One: Elegir el PIC a usar
-3En seste caso se usara el pic16f628a. 2.-Step Two: Elegir el compilador a usar.
Aquí usaremos el compilador CCS C.exe. 3.-Step Three: Lugar donde se grabara el proyecto.
-44.-Step Four: Agregar más proyectos
Aquí por lo general solo se da click en next. Despues de esto solo se da en terminar “Finish” y ya esta el lugar de trabajo.
Source Files.- Aquí aparecerá la hoja de trabajo osea la hoja donde estamos escribiendo el código Header Files.- Aquí parecera los archivos “.H”. Son las características que contiene el PIC. Object Files.- Aparecen las salidas al compilar. Other Files.- Aparecen las salidas al compilar.
-5Después de hacer el lugar de trabajo debemos de crear una hoja en blanco y luego grabarla en la misma carpeta donde se creo la hoja de trabajo con la extensión “.c”
. Ahora simple mente debemos incluir la hoja en blanco a Source Files para cuando se compile no cause error.
-6Ahora bien ya para terminar como el compilador fue adherido a MPLAB hay que configurarlo, hay que indicarle donde estan los archivos .h y los driver si e sque maneja en su programita. Haremos click en < build option>
Ahora buscamos donde dice mostrar directorios < show directories> y seleccionamos incluir y hacemos click en new, y buscamos donde esta intalado el CCS C, (PICC) y elegimos driver y lo agregamos y otra vez hacemos click en new y agregamos devices y listo para programar!!!
-7Proyecto#2
Parpadeo Parpadeo de un LED
En el pin B0 del puerto B del PIC, encendera un led por 1 segundo y apagara por un 1 segundo es un simple parpadeo de un LED. El diagrama es el siguiente.
En código siguiente no se usa el Master Clean. //Autor: J.A.R.H //Despripcion: //Despripci on: Parpadeo Parpadeo de un led en en el // PIN B0 #include <16F628A.h> #include<16F628A.h> #fuses INTRC_IO,NOWDT,NOLVP,NOMCLR,NOPROTECT #use delay(clock=4000000)
void main(void main(void){ ){ SET_TRIS_B(0x00); do{ do { output_high(PIN_B0); delay_ms(1000); output_low(PIN_B0); delay_ms(1000); }while while(TRUE); (TRUE); }
-8-
Projecto#3
Contador de 00 a 99
Este es un circuito que pone aprueba el timer0 del pic, se usan dos display de ánodo común, cada vez que le picamos al push botón incrementara hasta llegar a 99 y luego se reseteara a 00. El circuito es el siguiente
El programa //------------------------------- //--------------------------------------- //AUTOR:JORGE ARTURO RODRIGUEZ RODRIGUEZ HERNANDEZ //TITLE;CONTADOR //TITLE ;CONTADOR //DATE:22/JULIO/'09 //DATE:22/JUL IO/'09 //-------------------- //------------------------------------------------- //CONFIGURACION/////////////////// //CONFIGURACION/////////////////// #include<16f628a.h> #include <16f628a.h> #fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=4000000) //DEFINIMOS E/S E/S #define EN1 PIN_A0 #define EN2 PIN_A1 #define PUSH PIN_A2 //ARREGLO PARA MOSTRAR EL NUMERO DEL 0 AL 9
-9-
int mostrar[]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001, 0b10010010,0b10000011,0b11111000,0b00000000,0b00011000}; //VARIABLES int N1,N2; //FUNCION DE CONFIGURACION void config(void config(void){ ){ set_tris_b(0x00); set_tris_a(0x04); setup_comparator(NC_NC_NC_NC); setup_timer_0(RTCC_INTERNAL setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_ |RTCC_DIV_2|RTCC_8_BIT); BIT); //overflow cada cada 5mS aprox aprox set_timer0(0); //overflow=escala //overflow=e scala x clock x (256-timer0) (256-timer0) } //INTERRUPCION POR TIMER0 TIMER0 #INT_TIMER0 #INT_TIMER 0 void TIMER(void TIMER(void){ ){ output_low(EN1); output_b(mostrar[N2]); output_high(EN2); delay_us(520); output_low(EN2); output_b(mostrar[N1]); output_high(EN1); } //INICIO DEL PROGRAMA void main(void main(void){ ){ config(); N1=0; N2=0; enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); while(TRUE){ while (TRUE){ delay_us(5);
- 10 while(~input(PUSH)); while(~input(PUSH)); while(input(PUSH)); while (input(PUSH)); N2++; if (N2==10){ (N2==10){ N2=0; N1++; if (N1==10){ (N1==10){ N1=0; } } } }
- 11 Proyecto#4
Contador descendente de MM:SS
Al introducir el tiempo deseado ya sea hasta 59:59 por el botón “PUSH”, entonces al presionar el botón “PUSH2” iniciara a descender.
El programa se muestra a continuación /////////////////////////////////////// //////////////////////////////// /////// //AUTOR:JORGE ARTURO RODRIGUEZ RODRIGUEZ HERNANDEZ //TITLE;CONTROL //TITLE ;CONTROL DE 4 DISPLAY //DATE:31/JULIO/2009 //DATE:31/JUL IO/2009 //////////////////////////////// //////////////// /////////////////////// /////// //CONFIGURACION/////////////////// //CONFIGURACION/////////////////// #include<16F628A.h> #include <16F628A.h> #fuses HS,NOWDT,NOLVP,NOMCLR,NOPROTECT #use delay(clock=20000000) //definiciones //definicio nes del cada cada display 1 al 4 #define #define #define #define #define #define
EN1 PIN_A0 EN2 PIN_A1 EN3 PIN_A2 EN4 PIN_A3 PUSH PIN_A4 PUSH2 PIN_A5
- 12 //variable que contiene contiene la decodificacion decodificacion para para mostrar cada cada numero en el display //de 7 segmentos segmentos int mostrar[]={0b01000000,0b01111001,0b00100100,0b00110000,0b00011001, 0b00010010,0b00000011,0b01111000,0b00000000,0b00011000}; //definicion //definicio n de variables variables a usar signed int MEN1=0,MEN2=0,SEN3=0,SEN4=0; int i; long j; int OVERFLOW; //funcion: que que establece los puertos puertos como I/O establece establece el timer0 timer0 con 6.5536mS 6.5536mS void config(void config( void){ ){ set_tris_a(0x30); set_tris_b(0x80); setup_comparator(NC_NC_NC_NC); setup_timer_0(RTCC_INTE setup_timer_0(RTCC_INTERNAL|RTCC_DIV_ RNAL|RTCC_DIV_128|RTCC_8_BI 128|RTCC_8_BIT); T); //overflow //overflow 6.5536mS setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //overflow setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //overflow 13.1072mS 13.1072mS set_timer0(0); } #INT_TIMER 0 #INT_TIMER0 void TIMER0(void TIMER0(void){ ){ OVERFLOW++; if (OVERFLOW>152){ (OVERFLOW>152){ OVERFLOW=0; SEN4--; if (SEN4<0){ (SEN4<0){ SEN4=9; SEN3--; if (SEN3<0){ (SEN3<0){ SEN3=5; MEN2--; if (MEN2<0){ (MEN2<0){ MEN2=9; MEN1--; if (MEN1<0){ (MEN1<0){ MEN1=0; } } }
- 13 } } } #INT_TIMER 1 #INT_TIMER1 void TIMER1(void TIMER1(void){ ){ output_bit(EN1,0); output_bit(EN2,0); output_bit(EN3,0); output_b(mostrar[SEN4]); output_bit(EN4,1); delay_ms(6); output_bit(EN1,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[SEN3]); output_bit(EN3,1); delay_ms(6); output_bit(EN1,0); output_bit(EN3,0); output_bit(EN4,0); output_b(mostrar[MEN2]); output_bit(EN2,1); delay_ms(6); output_bit(EN3,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[MEN1]); output_bit(EN1,1); } //RUTINA DE TEMPORIZACION TEMPORIZACION ANTIREBOTE void TIEMPO(void TIEMPO(void){ ){ for(i=1;i<=100;i++){ for (i=1;i<=100;i++){ delay_ms(1); } } //rutina de temporizac temporizacion ion de vizualizacion vizualizacion void TIEMPO1(void TIEMPO1( void){ ){ for(j=1;j<=1000;j++){ for (j=1;j<=1000;j++){ delay_us(1); } }
- 14 void main(void main(void){ ){ config(); MAIN: disable_interrupts(INT_TIMER0); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); //EN ESTA RUTINA RUTINA INTRODUCES EL TIMEPO TIMEPO do{ do { if (~input(PUSH)){ (~input(PUSH)){ TIEMPO(); SEN4++; if (SEN4>=10){ (SEN4>=10){ SEN4=0; SEN3++; if (SEN3>=6){ (SEN3>=6){ SEN3=0; MEN2++; if (MEN2>=10){ (MEN2>=10){ MEN2=0; MEN1++; if (MEN1>=6){ (MEN1>=6){ MEN1=0; } } } } } }while while(input(PUSH2)); (input(PUSH2)); disable_interrupts(INT_TIMER1); enable_interrupts(INT_TIMER0); //EN ESAT RUTINA RUTINA EMPIEZA A DECREMENTAR DECREMENTAR EL TIEMPO TIEMPO PUESTO ANTERIORMENTE do{ do { output_bit(EN1,0); output_bit(EN2,0); output_bit(EN3,0); output_b(mostrar[SEN4]); output_bit(EN4,1); TIEMPO1(); output_bit(EN1,0); output_bit(EN2,0);
- 15 output_bit(EN4,0); output_b(mostrar[SEN3]); output_bit(EN3,1); TIEMPO1(); output_bit(EN1,0); output_bit(EN3,0); output_bit(EN4,0); output_b(mostrar[MEN2]); output_bit(EN2,1); TIEMPO1(); output_bit(EN3,0); output_bit(EN2,0); output_bit(EN4,0); output_b(mostrar[MEN1]); output_bit(EN1,1); TIEMPO1(); }while while(MEN1!=0 (MEN1!=0 || MEN2!=0 || SEN3!=0 || SEN4!=0); disable_interrupts(GLOBAL); delay_ms(1000); goto MAIN; }
- 16 Proyecto#5 Proyecto# 5
Cronometro
Este es un simple cronometro al presionar el botón de inicio correrá hasta ser pausado con el botón Fin.
El programa se muestra. #include <16F628A.h> #include<16F628A.h> #fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT #use delay(clock=20000000) #define LCD_DATA_PORT getenv("SFR:PORTB") getenv("SFR:PORTB") #define LCD_ENABLE_PIN PIN_B0 #define LCD_RS_PIN PIN_B1 #define LCD_RW_PIN PIN_B2 #define LCD_DATA0 PIN_B4 #define LCD_DATA1 PIN_B5 #define LCD_DATA2 PIN_B6 #define LCD_DATA3 PIN_B7 #include #include #define INICIO #defineFIN #define FIN #defineRESET #define RESET
PIN_A0 PIN_A1 PIN_A2
int MILISEGUNDOS=0; int H1=0,M1=0,M2=0,S1=0,S2=0; int OVERFLOW=0;
- 17 -
void CONFIG(void CONFIG(void){ ){ SET_TRIS_A(0xE7); //R0:R2 COMO SALIDAS, SALIDAS, RA5:RA7 COMO ENTRADAS SETUP_COMPARATOR(NC_NC_NC_NC); SETUP_TIMER_0(RTCC_INT SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_25 ERNAL|RTCC_DIV_256|RTCC_8_BIT 6|RTCC_8_BIT); ); //OVERFLOW CADA APROX 0.7168mS 0.7168mS SET_TIMER0(240); } #INT_TIMER 0 #INT_TIMER0 void TIMER0(void TIMER0(void){ ){ OVERFLOW++; if (OVERFLOW>9){ (OVERFLOW>9){ OVERFLOW=0; MILISEGUNDOS++; if (MILISEGUNDOS>=100){ (MILISEGUNDOS>=100){ S1++; MILISEGUNDOS=0; if (S1==10){ (S1==10){ S2++; S1=0; if (S2==6){ (S2==6){ S2=0; M1++; if (M1==10){ (M1==10){ M2++; M1=0; if (M2==6){ (M2==6){ H1++; } } } } } } SET_TIMER0(240); } void main(void main(void){ ){ CONFIG(); //LLAMAMOS CONFIG(); //LLAMAMOS A LA FUNCION FUNCION DE CONFIGURACION DEL PIC lcd_init();
//INICIALIZAMOS //INICIALIZ AMOS EL LCD
- 18 disable_interrupts(INT_TIMER0); disable_interrupts(GLOBAL);
//TIMER0 OFF //INTERRUPTIONES //INTERRUPTI ONES
OFF
lcd_gotoxy(1,1); lcd_putc(" *STOPWATCH* \n"); do{ do { if (!input(INICIO)){ (!input(INICIO)){ MILISEGUNDOS=0; S1=0; S2=0; M1=0; M2=0; H1=0; enable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); do{ do { lcd_gotoxy(1,2); printf(lcd_putc," %u:%u%u:%u%u.%u "H1,M2,M1,S2,S1,MILISEGUNDOS); }while while(input(FIN)); (input(FIN)); disable_interrupts(INT_TIMER0); disable_interrupts(GLOBAL); } }while while(TRUE); (TRUE); } //FIN
- 19 Proyecto#6
Password analoga analoga
Es una contraseña análoga, donde se usa un teclado conectado a varias resistencias de un 1k y solo una línea será que se conecte al pin análogo del microcontrolador.
El programa es el siguiente //////////////////////////////// /////////////////////////////////////// /////// //AUTOR:JORGE ARTURO RODRIGUEZ RODRIGUEZ HERNANDEZ //TITLE;CONTRASENA //TITLE;CONTRASENA //DATE:18/JUNIO/'09 //DATE:18/JUNIO/'09 //////////////////////////////// /////////////////////////////////////// /////// //CONFIGURACION/////////////////// //CONFIGURACION/////////////////// #include<16f887.h> #fuses INTRC_IO,NOWDT,N INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,N OLVP,MCLR,NOPROTECT,NOPUT OPUT #use delay(clock=8000000) #include int LEER_TECLADO; int TECLADO[]={"0123456789#*"}; int UNO,DOS,TRES,CUATRO; int UNO_P,DOS_P,TRES_P,CUATRO_P UNO_P,DOS_P,TRES_P,CUATRO_P;;
- 20 int GOA,i; void config(void){ write_eeprom(0x04,1); write_eeprom(0x05,2); write_eeprom(0x06,3); write_eeprom(0x07,4); set_tris_a(0x01); set_tris_c(0x00); setup_comparator(NC_NC_NC_NC); setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(sAN0); output_low(PIN_C0); lcd_putc("\fCOMPILED lcd_putc("\fCOMPILED ON\n"); lcd_putc(__DATE__); delay_ms(2000); } ADC(int VALOR_ADC){ NO_PULSADO: delay_ms(10); VALOR_ADC=read_adc(); if(VALOR_ADC>140){ goto NO_PULSADO; } else if(VALOR_ADC<24){ VALOR_ADC=1; } else if(VALOR_ADC<43){ VALOR_ADC=2; } else if(VALOR_ADC<60){ VALOR_ADC=3; } else if(VALOR_ADC<74){ VALOR_ADC=4; } else if(VALOR_ADC<88){ VALOR_ADC=5; } else if(VALOR_ADC<98){ VALOR_ADC=6; } else if(VALOR_ADC<108){ VALOR_ADC=7; }
- 21 else if(VALOR_ADC<114){ VALOR_ADC=8; } else if(VALOR_ADC<122){ VALOR_ADC=9; } else if(VALOR_ADC<128){ VALOR_ADC=0; } else if(VALOR_ADC<137) i f(VALOR_ADC<137){ { VALOR_ADC=10; } else if(VALOR_ADC<140){ VALOR_ADC=11; } return(VALOR_ADC); } void ESCRIBIR_PASSWORD(void){ for(i=0;i<=3;i++){ delay_ms(500); LEER_TECLADO=ADC(LEER_TECLADO); write_eeprom(i,LEER_TECLADO); lcd_putc(TECLADO[LEER_TECLADO]); } delay_ms(500); } void CAMBIAR(void){ CAMBIAR(void){ lcd_putc("\fESCRIBE lcd_putc("\fESCRIBE AHORA\n"); ESCRIBIR_PASSWORD(); UNO=read_eeprom(0x00); DOS=read_eeprom(0x01); TRES=read_eeprom(0x02); CUATRO=read_eeprom(0x03); write_eeprom(0x04,UNO); write_eeprom(0x05,DOS); write_eeprom(0x06,TRES); write_eeprom(0x07,CUATRO); lcd_putc("\fCAMBIADO"); delay_ms(1000); }
- 22 -
void CHEKAR(void){ UNO=read_eeprom(0x00); DOS=read_eeprom(0x01); TRES=read_eeprom(0x02); CUATRO=read_eeprom(0x03); UNO_P=read_eeprom(0x04); DOS_P=read_eeprom(0x05); TRES_P=read_eeprom(0x06); CUATRO_P=read_eeprom(0x07); } void main(void){ lcd_init(); config(); AGAIN: do{ lcd_putc("\fCHANGE->(*)\n"); lcd_putc("ENTER-->(#)"); GOA=ADC(GOA); switch (GOA){ case 10: lcd_putc("\fPASSWORD:\n"); ESCRIBIR_PASSWORD(); goto CHEK; case 11: lcd_putc("\fESCRIBE EL\n"); lcd_putc("PASSWORD lcd_putc("PASSWORD 1ERO"); delay_ms(800); lcd_putc("\fTYPE lcd_putc("\fTYPE NOW\n"); ESCRIBIR_PASSWORD(); CHEKAR(); if(UNO==UNO_P && DOS==DOS_P && TRES==TRES_P && CUATRO==CUATRO_P){ lcd_putc("\fCORRECTO"); delay_ms(1000); CAMBIAR(); } else lcd_putc("\fINCORRECTO"); delay_ms(1000); break; } }while(TRUE);
- 23 -
CHEK:
CHEKAR();
if(UNO==UNO_P && DOS==DOS_P && TRES==TRES_P && CUATRO==CUATRO_P){ lcd_putc("\fCORRECTO"); output_high(PIN_C0); } else lcd_putc("\fINCORRECTO"); delay_ms(3000); output_low(PIN_C0); goto AGAIN; }
- 24 Proyecto#7
4-Sensores 4-Sensores
Este es un simple circuito que capta 4 sensores de humedad y los proyecta en un LCD.
El programa es el siguiente //////////////////////////////// /////////////////////////////////////// /////// //AUTOR:JORGE ARTURO RODRIGUEZ RODRIGUEZ HERNANDEZ //TITLE;SENSORES //TITLE;SENSORES //DATE:28/AGOSTO/'09 //DATE:28/AGOSTO/'09 //////////////////////////////// /////////////////////////////////////// /////// //CONFIGURACION/////////////////// //CONFIGURACION/////////////////// #include<16F886.h> #device ADC=8 #fuses INTRC_IO,NOWDT,N INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT OLVP,MCLR,NOPROTECT #use delay(clock=8000000) #include #include int PLANTA1,PLANTA2,PLANTA3,PL PLANTA1,PLANTA2,PLANTA3,PLANTA4; ANTA4; short DONE; int KEY; void config(void){ set_tris_a(0x0F);
- 25 set_tris_b(0xF0); port_b_pullups(0xF0); setup_adc(ADC_CLOCK_INTE setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD); RNAL|VSS_VDD); setup_adc_ports(s setup_adc_ports(sAN0|sAN1|sAN2|sAN3) AN0|sAN1|sAN2|sAN3);; setup_comparator(NC_NC_NC_NC); disable_interrupts(GLOBAL); } void ADC_HECHO(void){ ADC_HECHO(void){ while(DONE!=1){ DONE=adc_done(); } } void main(void){ config(); lcd_init(); kbd_init(); START: lcd_gotoxy(1,1); lcd_putc("\f------SENSORES------"); lcd_gotoxy(1,2); lcd_putc("ENTRAR A MEDIR LOS"); lcd_gotoxy(1,3); lcd_putc("SENSORES:"); lcd_gotoxy(9,4); lcd_putc("YES(A)"); do{ KEY=kbd_getc(); if(KEY!=0){ if(KEY=='A') break; } }while(TRUE); lcd_gotoxy(1,1); lcd_putc("\f------SENSORES------"); do{ set_adc_channel(0); delay_us(50); ADC_HECHO();
- 26 PLANTA1=read_adc(); set_adc_channel(1); delay_us(50); ADC_HECHO(); PLANTA2=read_adc(); set_adc_channel(2); delay_us(50); ADC_HECHO(); PLANTA3=read_adc(); set_adc_channel(3); delay_us(50); ADC_HECHO(); PLANTA4=read_adc(); PLANTA1=2*PLANTA1; PLANTA2=2*PLANTA2; PLANTA3=2*PLANTA3; PLANTA4=2*PLANTA4; lcd_gotoxy(1,2); printf(lcd_putc,"1.printf(lcd_putc,"1.- %u C 2.- %u C ",PLANTA1,PLANTA2); ",PLANTA1,PLANTA2); lcd_gotoxy(1,3); printf(lcd_putc,"3.printf(lcd_putc,"3.- %u C 4.- %u C ",PLANTA3,PLANTA4); ",PLANTA3,PLANTA4); KEY=kbd_getc(); if(KEY!=0) goto START; }while(TRUE); }
- 27 -
01:11:09,8:14 01:11:09,8:14 pm Vol. 1.0