Ir ao conteúdo
  • Cadastre-se

pic 16f877a lm35 7seg


Posts recomendados

Boa tarde me ajudem por favor to ficando louco , há uma semana to tentando fazer um termômetro com pic16f877a lm35 display de 7segmentos

não consigo fazer a programação em mikro c ele não mostra os números no display,  se alguém puder corregir eu agredece sou novo no clube e espero ficar por muito tempo.

int lm35;
float temp;
int uni=0;
int dez=0;

void main()
{
 TRISA = 1;
 TRISB = 0;
 TRISC = 0;
 PORTB = 0;
 PORTC = 0;
 PORTA.RA1 =0;
 ADC_Init();

  while(1)
  {

    lm35 = ADC_read(0);
    temp = (lm35/150);

    {
     if(temp==6.82)
    PORTC = 0x06;
    PORTB = 0x3F;
    }
     {
     if(temp==13.64)
    PORTC = 0x5B;
    PORTB = 0x3F;
    }
    {
     if(temp==20.46)
    PORTC = 0x4F;
    PORTB = 0x3F;
    }
        {
     if(temp==28.28)
    PORTC = 0x66;
    PORTB = 0x3F;
    }
     {
     if(temp==34.1)
    PORTC = 0x6d;
    PORTB = 0x3F;
    }
    {
     if(temp==40.92)
    PORTC = 0x7d;
    PORTB = 0x3F;
    }
     {
     if(temp==47.74)
    PORTC = 0x07;
    PORTB = 0x3F;
    }
        {
     if(temp==54.56)
    PORTC = 0x7f;
    PORTB = 0x3F;
    }
     {
     if(temp==61.38)
    PORTC = 0x67;
    PORTB = 0x3F;
    }
    {
     if(temp==68.2)
    PORTC = 0x3F;
    PORTB = 0x06;
    }
  }

}

termometro.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

 Não queime a etapa do pisca led de forma alguma.

Por partes...

Aprenda a escrever no display 7seg primeiro. Tem zilhões de exemplos na net talvez neste forum ou até mesmo pode vir como exemplo com seu compilador

Dica: seu mc tem bastante pinos: pode usar um display por porta: faça com 3

Link para o comentário
Compartilhar em outros sites

acho que o seu problema ta em umas coisas bobas, por exemplo o MCLR, se no mikroC estiver habilitado no proteus ele vai fica esperando um resistor de pull-up (fica resetando e por isso ele não funciona), não se liga displays sem resistor, no simulador provavelmente funciona, mas o correto é por um resistor pra cada segmento, e dependendo da versão do seu proteus e de como ta a configuração no mikroC tenha outras coisas como oscilador e etc.

 

esse site tem uns tutoriais legais:

http://microcontrolandos.blogspot.com.br/

Link para o comentário
Compartilhar em outros sites

RESOLVI ACHEI UM NA NET E MODIFIQUEI DO MEU JEITO  ERA PARA DISPLAY DE 6 DIGITOS MODIFIQUEI PARA 4 OK 100% MUITO OBRIGADO PELA ATENÇÃO. E SERVE PARA VARIOS PICS 16F873A,16F877A,16F882  E MAIS ALGUNS


 unsigned short num;   //num = numeros 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ;
 unsigned short mask(unsigned short num)//mask mostra os numeros de 0 a 9 (num)
 {
  switch (num)//indentifica os numeros de 0 a 9
   {
     case 0 : return 0x40; //define e mostra os numeros dec para hexa 0 = 0x40
     case 1 : return 0x79;
     case 2 : return 0x24;
     case 3 : return 0x30;
     case 4 : return 0x19;
     case 5 : return 0x12;
     case 6 : return 0x02;
     case 7 : return 0x78;
     case 8 : return 0x00;
     case 9 : return 0x10;
   }
 }

char valor;  //
unsigned short shifter;
unsigned short j;
unsigned short portd_index;
unsigned int i;
unsigned short portc_array[4];
float temino,temp;

void interrupt()

{
 PORTB = 0;
 PORTC = portc_array[portd_index];
 PORTB = shifter;
 TMR0 = 0;
 INTCON = 0x20;
 
 shifter <<= 1;
 if (shifter > 32u)
 shifter = 1;

 portd_index++ ;
 if (portd_index > 5u)
 portd_index = 0;
}

void main()

{
 OPTION_REG = 0x80;
 TMR0 =   0;
 INTCON =0xA0;
 ADCON1 =0x80;
 CMCON = 0x07;// desliga os comparadores
 
 TRISA = 0x01;
 TRISB = 0;
 TRISC = 0;
 
 PORTA = 0;
 PORTB = 0;
 PORTC = 0;
 
 portd_index = 0;
 shifter = 1;
 i  = 0;
 j = 0;

 while (1)
 {
  temp = ADC_Read(0); //seleciona a entrada a ser lida RA0/AN0 =(lm35)
  temp = temp*5.0/1023.0;//temperatura a ser lida em bits(150) *5 / 1023(10bits)
  temino = temp*1000.0; //
  i= temino;// numero (27) a ser mostrado em graus celsius

  j = i / 100u; // divid 27 por 100  = 0,27
  valor = mask(j);
  portc_array[3] = valor;//mostra o numero (2) da temperatura no diplay 1
 
  j = (char)(i / 10u)% 10u;
  valor = (mask(j)|0x80);
  portc_array[2] = valor; //mostra o numero (7) de temperatura no diplay 2
 
  portc_array[1] = 0x1C;//mostra no display 3 a bolinha da grau celsius
  portc_array[0] = 0x46;//mostra no display 4 o C do grau celsius
  delay_ms(1000); //tempo de reinicialização ou atualização do programa
  }
  while (1);

}

 

16F873A LM35 7SEG 4DIG 32.png

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...