Вы находитесь на странице: 1из 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
// *********************************************
#include <12f675.h>
#device ADC=10
#use delay(clock=4000000)
#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


//////////////////////////////////////////////////////////////////////
////
// 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_timer0
void trata_t0 ()
{
static boolean led;
t0_conta -= 256; // subtrai 256 da contagem
if (t0_conta<=0) // se a contagem é igual ou menor que zero
{
// soma 15625 ao valor da contagem
t0_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();
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


#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 acesso


int8 numero = 1;
int8 dado;

///////////////////////////////////////////////////////////
// tratar interrupção timer0
///////////////////////////////////////////////////////////
#int_timer0
void trata_t0 ()
{
if (display) {
display = 0;
output_low(pin_a1);
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);
}
}