Proyectos con el PIC 16F877
Short Description
Download Proyectos con el PIC 16F877...
Description
Proyect Pro yecto o s c on el PIC 16 16F87 F877
1
Proyectos con Pic en lenguaje c: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Encender un led+pulsador 2 secuencias de luces+2 pulsadores Contador Binario de 0-255 mostrado por leds Contador de 0-9 con 7segmentos Secuencia de Luces utilizando Funciones Mostrar un mensaje por una LCD conectada al puerto B Contador con LCD 2x16 conectada por puerto B Medir temperatura con LM35 y mostrarla por LCD 2x16 Mandar un mensaje por Rs232 y mostrarlo por un LCD 2x16 Medir temperatura con LM35 y mandar el valor vía RS232 (serial)
2
Encender un led+pulsador Proyecto 1 Este programa tendrá como tarea: al presionar el pulsador conectado en RA0 se encenderá un led conectado en RB0 por 0.5 seg y luego se apagara, el programa corre continuamente. El PIC a utilizar es el PIC16F84A.Frecuencia de oscilación es 4Mhz. El código c comienza aquí #include " 16f877.h"
// pic a utili zar
#use delay (cloc k=4000000) // Fosc=4Mhz #fuses xt,nowdt ,noprotect // fusib les #byte port_a=5 #byte port_b=6
// declaramos el puerto a en su localidad // declaramos el puerto b en su localidad
void main(void) { set_tri s_a(0b00000001); // progr amamos el pu erto a para que RA0 sea entrada set_tris_b(0b00000000); // programamos el puerto b para q sea salida port_b=0x00; // inici almente todo el puerto b estara apagado while (true) // bucle infini to, o que el progr ama se ejecutara infin itamente { if (input(pin_a0)==0) // preguntamos si RA0 es cero { por t_b=0b00000001; // cuand o se cierr a el pulsado r ejecuta esta tarea delay_ms (500); // la cual es encend er un led con ectado en RB0 port_b=0b00000000; } } } El circuito es el siguiente:
3
2 secuencias de luces+2 pul sadores Proyecto 2 Este programa tendrá como tarea: al presionar el pulsador conectado en RA0 se hará una secuencia de luces por el puerto b, y al presionar el pulsador conectado en RA1 se hará otra secuencia de luces por el puerto b. El programa corre continuamente. Frecuencia de oscilación 4Mhz. El código c comienza aquí #incl ude
// Pic a uti lizar
#use delay(clo ck=4000000) // Cris tal a util izar #fuses xt,nowdt ,noprotect // Fusibles #byte porta=5 #byte portb =6
// Declaro el puerto A en su localidad // Declaro el puerto B en su localidad
int x=100; // Variable "x" igualada a 100 void m ain() { set_tri s_a(0b00000011); set_tris_b(0b00000000); portb =0b00000000;
// pro gram amos para q RA0 y RA1 sean entrad as // prog ramamos para que todo el puerto b sea salida // inici almente todo el puerto b estara apagado
for(;;) // bucle infini to,al igual q "w hile(true)" { if(input (pin_a0)==0) // preguntamos si RA0 es cero " 0" { portb=0b00000001; delay_ms(x); // la " x" posee un valor de 100, el cual esta declarado // al principio con " int x=100; " delay_ms(x); portb=0b00000100; delay_ms(x); portb=0b00001000; delay_ms(x); portb=0b00010000; delay_ms(x); portb=0b00100000; delay_ms(x); portb=0b01000000; delay_ms(x); portb=0b10000000; delay_ms(x); portb=0b00000000; } if(input (pin_a1)==0) { portb=0b11111111; delay_ms(x); portb=0b00000000; delay_ms(x);
// preguntamos si RA1 es cero " 0"
4
portb=0b11111111; delay_ms(x); portb=0b00000000; delay_ms(x); portb=0b11111111; delay_ms(x); portb=0b00000000; delay_ms(x); } } } El circuito es el siguiente:
5
Contador Bi nario de 0-255 mostrado por leds Proyecto 3 Este programa tendrá como tarea: Cada vez que presionemos el pulsador conectado en RA0 se mostrara una cuenta binaria de 0 a 255 a través de unos leds conectados en el puerto B del PIC16F84A. El programa corre continuamente. Frecuencia de oscilación es 4MHz. El código c comi enza aquí #incl ude
// Pic a uti lizar
#use delay(clo ck=4000000) // Crys tal a util izar #fuses xt,nowdt ,noprotect // Fusibles #byte portb =6
// Declaro el Puerto B en su localidad
int A=0;
//constante
void main(void) { set_tris_b(0b00000000); // Programo t odo el Puerto B como salida portb =0b00000000; // Inicialmento todo el Puerto B estara apagado while(true) { if(input (pin_a0)==0) { A++; portb=A; delay_ms(500); if(a==256) { A=0; }
// Bucle Infinito // Pregunto si el pulsador conectado en RA0 es cero " 0" // in cr emen to en 1 a l a co ns tan te " A" // Muestro " A" por el Puerto B // Doy un retardo para q la cuenta se visualice bien // pregunto si " A" es 256,si es correcto igualo " A" a cero " 0" // y el progr ama vuelve a comenzar.
} } } El circuito es el siguiente:
6
7
Cont ador de 0-9 con 7segmentos Proyecto 4 Este programa tendrá como tarea: Cada vez que presionemos el pulsador conectado en RA0 se irá incrementando una cuenta de 0 a 9 y se visualizara por un display 7 segmentos .El programa corre continuamente. Frecuencia de oscilación 4MHz. El código c comi enza aquí #incl ude
// Pic a uti lizar
#use delay(clo ck=4000000) // Cris tal a util izar #fuses xt,nowdt ,noprotect // Fusibles #byte portb =6
// Declaro el Puerto B en su localidad
void main(void) { int A=0;
//constante
set_tris_b(0b00000000); // Programo t odo el Puerto B como salida portb =0b00000000; // Inicialmento todo el Puerto B estara apagado while(true) { if(input (pin_a0)==0) { A++, portb=A; delay_ms(500); if(a==9) { A=255; }
// Bucle Infinito //Pregunto si el pulsador conectado en RA0 es cero "0" // in cr emen to en 1 a l a co ns tan te " A" // Muestro " A" por el Puerto B // Doy un retardo para q la cuenta se visualice bien // pregunto si " A" es 9,si es correcto igualo " A" a " 255" // y el progr ama vuelve a comenzar.
} } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // igualo " A" a " 255" porq ue si la igualo a cero " 0" la // // cuent a empezaria desd e 1 hasta 9, y se necesit a q empiece // // desde 0 hasta 9 // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// El circuito es el siguiente:
8
9
Secuencia de Luces utilizando Funciones Proyecto 5 Este proyecto tiene como tarea : al presionar el pulsador conectado en RA0 se mostrara una secuencia por el puerto B, de igual manera al presionar el pulsador conectado en RA1 se mostrara otra secuencia por el puerto B. El PIC a utilizar es PIC16F84A. Frecuencia de oscilación 4MHz. NOTA: La diferencia que tiene este proyecto con el PROYECTO 2 es que este es realizado con FUNCIONES. El código c comi enza aquí #incl ude
// pic a uti lizar
#use delay(clock=4000000) // cristal a utilizar #fuses xt,nowdt ,noprotect // fusibl es #byte portb =6
// se declara el puerto B en su localidad
void funci on_1(void); void funci on_2(void);
// Declaramos funci on_1 // Declaramos funci on_2
int A; // Variable "A" void main(void) { set_tris_b(0b00000000); // Se programa el puerto B como salida por tb=0b00000000; // Inici almente tod o estara apagado while(true) { if(input (pin_a0)==0) { funcion_1(); } if(input (pin_a1)==0) { funcion_2(); } }
// Bucl e infin ito... //pregunto si el pulsador en RA0 es cero " 0"
//pregunto si el pulsador en RA1 es cero " 0"
} void funcion_1() { portb=0b00011000; delay_ms(200); portb=0b00100100; delay_ms(200); portb=0b01000010; delay_ms(200); portb=0b10000001; delay_ms(200); portb=0b00000000; delay_ms(200); 10
} void funcion_2() { portb=0b11111111; delay_ms(200); portb=0b01111110; delay_ms(200); portb=0b00111100; delay_ms(200); portb=0b00011000; delay_ms(200); portb=0b00000000; delay_ms(200); } El circuito es el siguiente:
11
Mostrar un mensaje por una LCD conectada al puerto B Proyecto 6 Este programa tiene como tarea: mostrar un mensaje por una LCD conectada en el puerto B. El PIC a utilizar es PIC16F84A. Frecuencia de oscilación 4MHz. Nota: la librería "lcdb.c" no viene en el ccs c compiler, por lo que también la dejare para su d escarga, y la pegaran en Mi PC/ Disco Loc al/ Archivo s de Progr ama/ PICC/ Drivers/, y allí pegar la librería lcdb.c El código c comi enza aquí #incl ude #include
// Pic a uti lizar // Libreria para el manejo del LCD por el puerto B
#use delay(clo ck=4000000) // Cris tal a util ziar #fuses XT,NOWDT,NOPROTECT // Fusibles #include // Librería modif icada por uControl.com.ar para poder ser // trabajada por el puerto B y si n la pata "RW" de la LCD //////////////////////////////////////////////////////////////////////////////////////////////////////////// // B2 -- E // B3 ---RS // B4 ---D4 // B5 ---D5 // B6 ---D6 // B7 ---D7 // (Sin 'RW') esta pata del lcd se pone a tierra o masa. /////////////////////////////////////////////////////////////////////////////////////////////////////////// void main(void) { lcd_init(); // inici aliza el lcd lcd_putc(" Proyecto 6"); // Escrib e en la lcd } El circuito es el siguiente:
12
13
Cont ador con LCD 2x16 conectada por puerto B Proyecto 7 Este programa tiene como tarea: al pulsar a P1 se incrementara una cuenta de 0-255 y se mostrara por una pantalla lcd 2x16, de igual manera al presionar a P2 se decrementará dicha cuenta. PIC a utilizar PIC16F877. Frecuencia de oscilación 4MHz. El código C comienza aquí #incl ude #include
// Pic a uti lizar // Libreria para el manejo del LCD por el puerto B
#use delay(clo ck=4000000) // Cris tal a util izar #fuses xt, nowd t, nopro tect // Fusibles #byte portb =0x6
// Declaro el puerto B en su localidad
int A=0; void main(void) { lcd_init(); // Inicia LCD lcd_putc(" Contador\n" ); // Saca texto lcd_putc(" Digital"); // Saca texto delay_ms(2000); // Retardo lcd_putc(" \f"); // Limpi a pantalla lcd_putc(" Conteo\n"); // Saca texto while(true) { if(in put (pin_A0)==0) { A++; delay_ms(500); if(A>=255) { A=0; } } if(in put (pin_A1)==0) { A--; delay_ms(500); if(A==0) { A=255; } }
// Pregunt a si RA0 es cero // Inc rem ent o el co nt eo // Para vis ualizar cor rectament e el con teo // Pregut o si A es mayo r o igu al a 255, // cuando sea igual iguala " A" a cero
// Pregunt a si RA1 es cero // Decr emen ta el co nt eo // Para vis ualizar mejor la cuent a // Pregunt a si A llego a cero, cuand o sea // 0 iguala " A" a 255
lcd_goto xy(2,2); // Acomod a curs or LCD lcd_putc (" "); // Limpi a ese sector de pantalla prin tf(lcd_putc," %3U",A); // Imprime el conteo por la lcd } } 14
El circuito es el siguiente:
15
Medir temperatura con LM35 y mostrarla por LCD 2x16 Proyecto 8 Este programa tiene como tarea: sensar la temperatura con un LM35 y mostrarla por una LCD. PIC a utilizar PIC16F877. Frecuencia de oscilación 4MHz. El código c comi enza aquí: #include " 16f877.h" #device adc=10 //Usa resol uci ón de 10 bit s #use d elay(clo ck=4000000) #fuses xt, no wdt, noput, nobrownout, nolvp, noprotect #include "lcd.c" #use standard_io (D)
//Selecciona el puerto D para el LCD
void main (void) { float temper, medicion; lcd_init(); // Inicia L CD lcd_putc(" Termometro\n" ); // Saca texto lcd_putc(" con LM35" ); // Saca texto delay_ms(2000); lcd_putc(" \f"); // Limpia pantalla lcd_putc(" Temperatura\n" ); // Saca texto lcd_putc(" actual"); // Saca texto delay_ms(1000); lcd_gotox y(14,2); // Acomod a curso r LCD lcd_putc("oC"); whi le (TRUE) { lcd_goto xy(8,2); lcd_putc (" "); lcd_goto xy(8,2);
// Acomod a curso r LCD // Limpi a ese sector de pantalla // Acomod a curso r LCD
setup_adc (adc_clock_internal); setup_adc_ports (all_analog); set_adc_ch annel (0); // Elige canal a medir RA0 delay_us (20); medicion =read_adc (); // Hace conversi ón AD setup _adc (adc_off ); // Apaga ADC temp er=medic ion *(0.48875); // Pasa binari o a °C //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // el " 0.48875" sale de dividi r 5/1023 y el result ado de eso mu ltipli carlo p or 100 // el 5 sale de los 5 voltio s aplicado a el voltage de referencia, los 1023 salen // de los 10 bit de resoluci on del conversor analogi co digit al que seleccion amos. // Si utli zaramos la resoluci on de 8 bits del con versor analogico d igital, la // formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 16
prin tf(lcd_putc," %02.1f" ,temper); // xx.x °C delay_ms (1000); } } El circuito es el siguiente:
17
Mandar un mensaje por RS232 y mostrarlo por un LCD 2x16
Proyecto 9 Este programa tiene como tarea: mandar un mensaje por el puerto Rs232 de la PC al pic16f877A y mostrar dicho mensaje por una LCD 2x16. El código c comienza aquí: // comunicacion RS232 con pic #incl ude #fuses HS, NOWDT, NOPROTECT #use d elay(clo ck=4000000) #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7) // libreria para el manejo del // puerto serie se establece // velocidad de 9600 baudios #include // libreria para el manejo de la lcd char dato_recibido[16]; // aqui va a ir los datos recibido s por rs232 #int_rda void r da_isr() { gets(dato_recibido );
// interrup cion por escritur a en buffer del puerto
// esta instr uccion almacena en la variable los // datos que se esten enviando hasta que llega // la tecla enter
} void m ain() { enable_interrup ts(int_rda);
// se habilita la interrup cion por // escritur a del puerto serial
enable_interrupts(global); set_tris_d(0b00000000); lcd_init(); lcd_gotoxy(1,1); lcd_putc(" com RS232 "); while(TRUE) { lcd_gotoxy(1,2); print f(lcd_putc," %s",dato_recibido); // se manda a lcd lo que se recibio } } El circuito es el siguiente:
18
19
Medir temperatura con LM35 y mandar el valor vía RS232 (serial)
Proyecto 10 Este programa tiene como tarea: sensar la temperatura con un LM35 y mandar el valor a una PC vía Rs232 (serial). PIC a utilizar PIC16F877a. Frecuencia de oscilación 4MHz. El código c comienza aquí: #incl ude
//pic a uti lizar
#device adc=10 #fuses XT, NOWDT
// con verso r ADC de 10 bit s //ordenes para el pro gramado r
#use delay (cloc k=4000000) //Fosc =4Mhz #use rs232(baud=9600,xmit=pi n_c6,rcv =pin_c7, bit s=8, parit y=N) //manejo d el RS232 #include
//libreria manejo lcd
void main(void) { float medicion, temper; setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); lcd_init(); while(true) { set_adc_channel (0); delay_us (20); medicion =read_adc (); temper=(medicion*(0.48875)); prin tf(lcd_putc, " \f Voltage = %02.1fV", temper); prin tf(" Voltage = %01.2fV\r" , temper); delay_ms(50); } } El circuito es el siguiente:
20
21
View more...
Comments