Hola, estamos haciendo un proyecto final, de un reloj que muestra horas y minutos y tambien muestra la temperatura pero con displays de 7 segmentos. Utilizamos el
PIC16f876, y para hacer la transmision de datos utilizamos el integrado 74HC164.
El tema de la temporizacion del reloj lo tenemos ya solucionado, pero tenemos problemas con el sensor de temperatura.
Estamos utilizando un LM35, y hemos acotado el rango de temperatura de 0ºC a 50ºC.
No somos capaces a avanzar y a conseguir que la salida del LM35 (hamos solucionado la tension de salida para adecuarla a la escala de temperaturas con 2 LM324), no sabemos como enviarlo apra que nos aparazca en los displays correspondientes a las Horas. Muestro reloj solo tendra 4 displays, 2 para las horas y 2 para los minutos.
Os dejo el programa (es de momento solo un esqueleto ya que vamos haciendolo por aprtes y os subo una foto del diseño en proteus....) Muchisimas gracias y haber si podeis ayudarme!
PROGRAMA EN C
#include <16f876.h>
#byte PA=0x05
#byte PB=0x06
#byte PC=0x07
#DEVICE ADC=8
#FUSES NOWDT,HS,NOPUT,NOPROTECT
#USE delay(clock=20000000)
#DEFINE EDAT PIN_C0
#DEFINE CLK PIN_C1
#DEFINE LEDS PIN_B3
#DEFINE TEMP PIN_A0
int traduce7seg(int display)
{
switch(display)
{
case 0: return 0b11111100;Break;
case 1: return 0b01100000;Break;
case 2: return 0b11011010;Break;
case 3: return 0b11110010;Break;
case 4: return 0b01100110;Break;
case 5: return 0b10110110;Break;
case 6: return 0b10111110;Break;
case 7: return 0b11100000;Break;
case 8: return 0b11111110;Break;
case 9: return 0b11100110;Break;
}
}
int Enviar_Dato_serie(int dato)
{
int i;
for(i=0;i<8;i++)
{
if(!bit_test(dato,i)) output_low(EDAT);
if(bit_test(dato,i)) output_high(EDAT);
output_low(CLK);
delay_us(1);
output_high(CLK);
}
}
parpadeo_led(int parpadeo)
{
output_high(PIN_B3);//SE ENCIENDE el LED
delay_ms(200);//RETARDO 200ms.
output_low(PIN_B3);//Apago el LED
delay_ms(200);//RETARDO 200ms.
}
char traducetemp(char displaytemp)
{
switch(displaytemp)
{
case 0: return 0b11000110;Break;//muestra los º
}
}
char traducetemp2(char displaytemp2)
{
switch(displaytemp2)
{
case 0: return 0b10011100;Break;//muestra la C
}
}
void main (void)
{
float tv,tr,y; //variables de ecuacion
int16 value;
int mcontador=0,munidades=0,mdecenas=0,hunidades=0,hdecenas=0,hcontador=0;
set_tris_a(0b00011111);
set_tris_b(0b00000001);
set_tris_c(0b00011000);
PA=0;
PB=0;
PC=0;
setup_port_a(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(10);
{
value = read_adc();
tv=5.0*value /256.0;
y=41.0*tv-0;
}
while(1)
{
parpadeo_led(1);
Enviar_dato_serie(traducetemp2(munidades));
Enviar_dato_serie(traducetemp(mdecenas));
Enviar_dato_serie(read_adc());
Enviar_dato_serie(read_adc());
}
}