• No se han encontrado resultados

Proyectos con el PIC 16F877

N/A
N/A
Protected

Academic year: 2021

Share "Proyectos con el PIC 16F877"

Copied!
21
0
0

Texto completo

(1)

1 1

Pro

(2)

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)

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;

} } }

(4)

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)

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:

(6)

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:

(7)
(8)

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:

(9)
(10)

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)

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:

(12)

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 }

(13)
(14)

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)

15

(16)

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)

17

prin tf(lcd_putc," %02.1f" ,temper); // xx.x °C delay_ms (1000);

} }

(18)

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

(19)
(20)

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); }

}

(21)

Referencias

Documento similar