TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: nitro en 08 de Diciembre de 2013, 00:34:16

Título: termometro con display 7 segmentos
Publicado por: nitro en 08 de Diciembre de 2013, 00:34:16
Hola. Este es mi primer mensaje en el foro, aunque lo visito desde hace varios años.
Hace un par de meses compenze a progrmar los pic en c (antes lo hacia en ensamblador).
Ahora estoy queriendo hacer un termometro con un lm35 y mostrarlo en un par de display de 7 segmentos usando un pic 16f877.
El problema es que me trabe en la parte en la que hay que mostrar la temperatura en el display.
Hasta obtener el valor de la temperatura esta todo bien pero como hago para convertir el valor que me el convertidor a/d y mostrarlo en el display?

Aqui va el codigo hasta donde yo pude llegar. Quien me pueda ayudar bienvenido sea. Saludos.

#include <16f877a.h>
#device adc=10
#fuses xt, nowdt
#use delay (clock=4M)

void main ()
{
   INT16 q;
   FLOAT p;
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   
   FOR (;;)
   {
      set_adc_channel(0);
      delay_us(20);
      q=read_adc();
      p=5.0*q/1024.0;
     
      //aqui deberia comenzar la parte del codigo para mostrar el valor p en los display
     
   }
}
Título: Re: termometro con display 7 segmentos
Publicado por: bagmel en 16 de Diciembre de 2013, 23:40:59
amigo el valor que almacenas en la variable Float lo debes dividir con este codigo:

total=24;
uni=total%10;  //separo la unidad
dece=(total%100)/10;//separo la decena

hay otra manera y mucho mas facil pero no recuerdo cuando lo encuentre y recuerde jajaja te los pongo aqui
Título: Re: termometro con display 7 segmentos
Publicado por: Diego E. en 17 de Diciembre de 2013, 09:23:55
Hola, otra forma de hacerlo

Código: CSS
  1. //definicion de variables
  2.  
  3. char cadena_ad[4];
  4. long temperatura;
  5. int const segmentos[]={ 0b11111100,
  6.                                         0b01100000,
  7.                                         0b11011010,
  8.                                         0b11110010,
  9.                                         0b01100110,
  10.                                         0b10110110,
  11.                                         0b10111110,
  12.                                         0b11100100,
  13.                                         0b11111110,
  14.                                         0b11110110,};
  15.                                                
  16.  
  17.  
  18. //descomponer el binario completo en variables                                         
  19. sprintf(cadena_ad, "%03d", temperatura);
  20.  
  21.  
  22.  
  23. ///////////////////////////////////////////////////////////////
  24. //rutina de display
  25. void display()
  26. {
  27.         portb = segmentos[cadena_ad[0] - 0x30];
  28.         bit_set(d1);}  
  29.         delay_ms(1);
  30.         bit_clear(d1);
  31.        
  32.         portb = segmentos[cadena_ad[1] - 0x30];
  33.         bit_set(d2);}  
  34.         delay_ms(1);
  35.         bit_clear(d2);
  36.        
  37.         portb = segmentos[cadena_ad[2] - 0x30];
  38.         bit_set(d3);}  
  39.         delay_ms(1);
  40.         bit_clear(d3);
  41.        
  42. }

Saludos