1 1
Pro
Proyectos con Pic en lenguaje c:
Proyectos con Pic en lenguaje c:
1.
1.
Encender un led+pulsador
Encender un led+pulsador
2.
2.
2 secuencias de luces+2 pulsadores
2 secuencias de luces+2 pulsadores
3.
3.
Contador Binario de 0-255 mostrado por leds
Contador Binario de 0-255 mostrado por leds
4.
4.
Contador de 0-9 con 7segmentos
Contador de 0-9 con 7segmentos
5.
5.
Secuencia de Luces utilizando
Secuencia de Luces utilizando Funciones
Funciones
6.
6.
Mostrar un mensaje por una
Mostrar un mensaje por una LCD conectada al puerto B
LCD conectada al puerto B
7.
7.
Contador con LCD 2x16 conectada por puerto B
Contador con LCD 2x16 conectada por puerto B
8.
8.
Medir temperatura con LM35 y mostrarla por LCD 2x16
Medir temperatura con LM35 y mostrarla por LCD 2x16
9.
9.
Mandar un mensaje por Rs232 y mostrarlo por un LCD 2x16
Mandar un mensaje por Rs232 y mostrarlo por un LCD 2x16
10.
3
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 // declaramos el puerto a en su localidad #byte port_b=6 // 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;
} } }
2 secuencias de luces+2 pulsadores
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 <16f877.h> // Pic a uti lizar #use delay(clo ck=4000000) // Cris tal a util izar #fuses xt,nowdt ,noprotect // Fusibles
#byte porta=5 // Declaro el puerto A en su localidad #byte portb =6 // Declaro el puerto B en su localidad int x=100; // Variable "x" igualada a 100
void m ain() {
set_tri s_a(0b00000011); // pro gram amos para q RA0 y RA1 sean entrad as set_tris_b(0b00000000); // prog ramamos para que todo el puerto b sea salida portb =0b00000000; // 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; }
5 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:
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 <16f877.h> // 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) // Bucle Infinito
{
if(input (pin_a0)==0) // Pregunto si el pulsador conectado en RA0 es cero " 0" {
A++; // incr emen to en 1 a l a co ns tan te " A" portb=A; // Muestro " A" por el Puerto B
delay_ms(500); // Doy un retardo para q la cuenta se visualice bien
if(a==256) // pregunto si " A" es 256,si es correcto igualo " A" a cero " 0" { // y el progr ama vuelve a comenzar.
A=0; } } } } El circuito es el siguiente:
Contador 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 <16f877.h> // 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) // Bucle Infinito
{
if(input (pin_a0)==0) //Pregunto si el pulsador conectado en RA0 es cero "0" {
A++, // in cr emen to en 1 a l a co ns tan te " A" portb=A; // Muestro " A" por el Puerto B
delay_ms(500); // Doy un retardo para q la cuenta se visualice bien if(a==9) // pregunto si " A" es 9,si es correcto igualo " A" a " 255" { // y el progr ama vuelve a comenzar.
A=255; } } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 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:
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 <16f877.h> // 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); // Declaramos funci on_1
void funci on_2(void); // 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) // Bucl e infin ito...
{
if(input (pin_a0)==0) //pregunto si el pulsador en RA0 es cero " 0" {
funcion_1(); }
if(input (pin_a1)==0) //pregunto si el pulsador en RA1 es cero " 0" { funcion_2(); } } } void funcion_1() { portb=0b00011000; delay_ms(200);
11 } 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:
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 <16F877.h> // Pic a uti lizar
#include <lcdb.c> // 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 <lcdb.c> // 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 }
Contador 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 <16f877.h> // Pic a uti lizar
#include <lcdb.c> // 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) // Pregunt a si RA0 es cero {
A++; // Inc rem ent o el co nt eo
delay_ms(500); // Para vis ualizar cor rectament e el con teo if(A>=255) // Pregut o si A es mayo r o igu al a 255, { // cuando sea igual iguala " A" a cero
A=0; }
}
if(in put (pin_A1)==0) // Pregunt a si RA1 es cero {
A--; // Decr emen ta el co nt eo
delay_ms(500); // Para vis ualizar mejor la cuent a
if(A==0) // Pregunt a si A llego a cero, cuand o sea { // 0 iguala " A" a 255
A=255; }
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); // Acomod a curso r LCD
lcd_putc (" "); // Limpi a ese sector de pantalla lcd_goto xy(8,2); // 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
17
prin tf(lcd_putc," %02.1f" ,temper); // xx.x °C delay_ms (1000);
} }
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 <16F877A.h>
#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 <lcd.c> // libreria para el manejo de la lcd
char dato_recibido[16]; // aqui va a ir los datos recibido s por rs232 #int_rda // interrup cion por escritur a en buffer del puerto void r da_isr()
{
gets(dato_recibido ); // 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);
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 <16f877A.h> //pic a uti lizar
#device adc=10 // con verso r ADC de 10 bit s #fuses XT, NOWDT //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<lcd.c> //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); }
}