Projetos úteis com PIC em C
-
Upload
paivafrota -
Category
Documents
-
view
9.297 -
download
12
Transcript of 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)
#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_timer0void trata_t0 (){
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();
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 acessoint8 numero = 1;int8 dado;
///////////////////////////////////////////////////////////// tratar interrupção timer0///////////////////////////////////////////////////////////#int_timer0void 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); }}