Fork me on GitHub

05/09/12

Projeto 3: Termômetro Digital

Termômetro Digital com PIC16F877A


Esse projeto criado por mim, é um termômetro digital que possui quatro escalas: graus celsius(°C), fahrenheit(°F) , Rankine(°R) e Kelvin(K).


Utiliza um sensor de temperatura LM45 (datasheet) ligado a PORTA.0  que possui a função de conversor Analógico-Digital e um display LCD Alfanumérico 20x2. A escala de medição é de 0-100°C, 32-212°F, 273-373K e 492-671°R. Através da combinação das chaves SW1 e SW2 você alterna entre as escalas.

ESQUEMA




DOWNLOAD
Firmware: termometer.hex;
Arquivo assembly: termometer.asm;
Arquivo de simulação no Proteus: termometer.dsn;

CÓDIGO-FONTE

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

unsigned long value;
unsigned char d1,d2,d3,d4;

void Print()
{
 Lcd_Out(2,1,"Temperatura: ");
 Lcd_Chr_CP(d1+48);
 Lcd_Chr_CP(d2+48);
 Lcd_chr_CP(d3+48);
 Lcd_chr_CP(44);
 Lcd_chr_CP(d4+48);
}

void main()
{
 TRISA  = 0xFF;
 TRISB  = 0b11000000;
 Lcd_Init();
 Delay_ms( 100 );
 Lcd_Cmd( _LCD_CURSOR_OFF );
 Lcd_Out( 1, 3, "MICROCONTROLANDOS" );

while(1)
{
 value = ADC_Read(0);
 value = (value*500/1023)*10;
 
 if (PORTB.F6 == 0 && PORTB.F7 == 0 )
 { 
  d1 = value/1000;
  d2 = (value%1000)/100;
  d3 = ((value%1000)%100)/10;
  d4 = ((value%1000)%100)%10;
  Print();
  Lcd_chr_CP(223);
  Lcd_Out_CP("C");
 }
 else if(PORTB.F6 == 0 && PORTB.F7 == 1 )
 {
  value = (value * 1.79) + 32;
  d1 = value/1000;
  d2 = (value%1000)/100;
  d3 = ((value%1000)%100)/10;
  d4 = ((value%1000)%100)%10;
  Print();
  Lcd_chr_CP(223);
  Lcd_Out_CP("F");
 }
 else if( PORTB.F6 == 1 && PORTB.F7 == 0 )
 {
  value =  value + 273;
  d1 = value/1000;
  d2 = (value%1000)/100;
  d3 = ((value%1000)%100)/10;
  d4 = ((value%1000)%100)%10;
  Print();
  Lcd_Out_CP("K");
 }
 else
 {
  value = (value * 1.8)+ 32 + 460;
  d1 = value/1000;
  d2 = (value%1000)/100;
  d3 = ((value%1000)%100)/10;
  d4 = ((value%1000)%100)%10;
  Print();
  Lcd_chr_CP(223);
  Lcd_Out_CP("R");
 }
 
 Delay_ms(20);
 }
}

8 comentários:

  1. Boa tarde,

    Teria como conversar com você por skype?! Mesmo que apenas em mensagens, gostaria de sanar algumas duvidas sobre conversão AD. Pode ser qlq dia/horário que você estiver disponivel.

    Abraços,
    Tiago.

    ResponderExcluir
  2. Colega achei legal este projeto deste Termometro gostaria de saber o valor do Cristal do CI PIC 16F877A. Tenho interesse em montar este circuito ,o Display tambem qual o código dele?
    Abraços
    Ramazzot.

    ResponderExcluir
    Respostas
    1. Provavelmente o cristal é de 4MHz. O display pode ser qualquer LCD 16x2.

      Excluir
  3. Boa tarde, gostei do seu blog, muita informação de qualidade! Parabéns!!
    Nesse projeto ao simular no Proteus notei que algumas temperaturas ficam com 1º de diferença entre o LM45 e o mostrado no LCD.
    Como resolver isso?

    ResponderExcluir
  4. Bom dia
    o link do arquivo assembly esta off, poderia arrumá-lo por favor
    E parabéns pelo blog, o melhor !!!!
    Obrigado

    ResponderExcluir
  5. boa tarde preciso de ajuda pra fazer um termometro digital de multiplexacao usando 3 display de 7 segmentos

    ResponderExcluir
  6. Boa tarde!
    Meu nome é Carolina, eu faço curso técnico de Automação Industrial. Meu professor iniciou Microcontroladores com a gente na última semana e já nos mandou um trabalho sobre o PIC 16F877A, neste trabalho temos que analisar um circuito com esse microcontrolador e explicá-lo, além de explicar sua programação.
    Me interessei muito por seu projeto e gostaria de apresentá-lo, entretanto, muitos dos comandos ainda são desconhecidos para mim. Você se incomodaria de me expplicar por favor?
    Em caso positivo, meu e-mail é caroljanu114@gmail.com
    Dede já agradeço!
    aguardo retorno!

    ResponderExcluir

Postagens Relacionadas!!