Projetos úteis com PIC em C

7
Usando Conversor A/D do PIC 12F675 Através deste simples circuito, é demonstrada uma das diversas formas de se usar este PIC de apenas 8 pinos para monitorar uma tensão e passar via comunicação serial para o PC, onde um simples aplicativo, recebe os dados. Alerta-se que no circuito, não é usado um MAX232, já que o PIC apenas envia dados, não recebendo do PC, não estando assim submetido aos 12V da porta serial que podem danificar o PIC. Código fonte Esquema Básico do Circuito // ********************************************* // programa teste de voltimetro com pic 8 pinos // v. 1

Transcript of Projetos úteis com PIC em C

Page 1: Projetos úteis com PIC em C

Usando Conversor A/D do PIC 12F675

Através deste simples circuito, é demonstrada uma das diversas formas de se usar este PIC de apenas 8 pinos para monitorar uma tensão e passar via comunicação serial para o PC, onde um simples aplicativo, recebe os dados. Alerta-se que no circuito, não é usado um MAX232, já que o PIC apenas envia dados, não recebendo do PC, não estando assim submetido aos 12V da porta serial que podem danificar o PIC.

Código fonte

Esquema Básico do Circuito

// *********************************************// programa teste de voltimetro com pic 8 pinos// v. 1// *********************************************#include <12f675.h>#device ADC=10#use delay(clock=4000000)

Page 2: Projetos úteis com PIC em C

#use rs232(baud=2400, bits=8,parity=n,xmit=pin_a1,rcv=pin_a2,invert)#fuses intrc_io,nowdt,put,nobrownout,nomclr#include <regs_12f6xx.h>#rom 0x3ff = { 0x34b4 }

main(){ float valor; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(pin_a4); set_adc_channel(3); delay_ms(2000); puts("Voltimetro: "); valor = read_adc();

while(true) { delay_ms(500); valor = (valor * 488)/100000; printf("%f",valor); delay_ms(1000); puts(" Volts "); delay_ms(100); valor = read_adc(); } }

PRÁTICO RELOGIO COM PIC

Usando o Timer0 do PIC 16F84, facilmente constrói-se um relógio com relativa precisão, tendo em vista o uso de um oscilador a cristal - 4 MHz. O circuito é relativamente simples, usando apenas 2 chaves NA - para ajuste da hora/minuto, assim como um display LCD 2x16 e o próprio microcontrolador.

Código fonte

Esquema Básico do Relógio

Page 3: Projetos úteis com PIC em C

//////////////////////////////////////////////////////////////////////////// PROGRAMA RELOGIO COM TIMER0 DO PIC 16F84// V. 2/////////////////////////////////////////////////////////////////////////

#include <16f84.h>#use delay(clock=4000000)#fuses xt,nowdt,put,noprotect#define lcd_enable pin_b3#define lcd_rs pin_b2#define lcd_d4 pin_b4#define lcd_d5 pin_b5#define lcd_d6 pin_b6#define lcd_d7 pin_b7#include <lcd_acpel.c>

signed long int t0_conta;int8 hora=9, minuto=0, segundo, i;

#int_timer0void trata_t0 (){

Page 4: Projetos úteis com PIC em C

static boolean led;t0_conta -= 256; // subtrai 256 da contagemif (t0_conta<=0) // se a contagem é igual ou menor que zero{

// soma 15625 ao valor da contagemt0_conta += 15625;

segundo++; if (segundo == 60) { segundo = 1; minuto++; if (minuto == 60) { minuto = 1; hora++; if (hora == 24) { hora = 0; } } }

}}

void demora(void){ // funcao de atraso para evitar uso de delay afim de evitar erros no timer0 do PIC for(i==0;i>10000;i++);}

void acertar_m() {if (minuto<59) minuto++; else minuto = 0;delay_ms(300);

}

void acertar_h() {if (hora <23) hora++; else hora = 0;delay_ms(300);}

main(){

t0_conta = 15625;setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64 );enable_interrupts (global | int_timer0);

lcd_init(); delay_ms(500); lcd_putc("\f"); delay_ms(500); lcd_goto_xy(5,1); delay_ms(10); lcd_putc(" - RELOGIO - "); delay_ms(500);

while (true){

if (!input(pin_a2)) acertar_h(); demora(); if (!input(pin_a3)) acertar_m(); demora();

Page 5: Projetos úteis com PIC em C

printf(lcd_putc,"\n%2u:%2u:%2u",hora,minuto,segundo); demora(); }

}

Multiplexando Displays de 7 Segmentos

Através deste simples circuito, é apresenta uma das formas de se multiplexar displays de 7 segmentos, usando um microcontrolador PIC para isto. No projeto proposto, são usados 2 displays que são multiplexados através de um PIC 16F84 que ainda conta com 2 transistores para escolha do display que estará acesso. Foi usada no programa feito em C, a interrupção do TIMER0 de uma forma bastante simples, porém fácil de entender. É necessário, caso adicionado um número maior de indicadores, a alteração dos tempos que cada display é comandado. Espera-se que o objetivo de demonstrar de uma forma prática e didática tenha sido alcançado.

Código fonte

Esquema Básico do Circuito

Page 6: Projetos úteis com PIC em C

#include <16f84.h>#use delay(clock=4000000) // fixa frequencia cristal e apos fusiveis#fuses xt,noprotect,nowdt,put

// declara tabela de valores byte const tabela[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xe7};

int1 display = 1; // variavel boolean para determinar display acessoint8 numero = 1;int8 dado;

///////////////////////////////////////////////////////////// tratar interrupção timer0///////////////////////////////////////////////////////////#int_timer0void trata_t0 (){ if (display) { display = 0; output_low(pin_a1);

Page 7: Projetos úteis com PIC em C

output_high(pin_a2); // liga display das dezenas e desliga unidades output_b(tabela[numero / 10]); // joga dezena para display } else { display = 1; output_low(pin_a2); // liga display das unidades e desliga dezenas output_high(pin_a1); output_b(tabela[numero % 10]); // pega resto da divisao e joga para display }}

///////////////////////////////////////////////////////////// funcao principal do programa///////////////////////////////////////////////////////////main(){ delay_ms(500); setup_timer_0 ( RTCC_INTERNAL | RTCC_DIV_64 ); enable_interrupts (global | int_timer0); while(1) { numero++; if(numero==100) { numero = 1; } delay_ms(500); }}