Sensor Temperatura

Inicialmente utilizamos esta programação pois só contínhamos um sensor (temperatura).

#include <16f876a.h>
#use delay(clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOLVP
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <math.h>

byte const tabela[]= {

 

0b00000000, //0
0b00010001, //1
0b00100010, //2
0b00110011, //3
0b01000100, //4
0b01010101, //5
0b01100110, //6
0b01110111, //7
0b10001000, //8
0b10011001, //9

};

byte const tabela1[]= {

//c0,c1,c2,c3,c4,c5,c6,c7// so esta ligado do c2->c5
0b00000000, //0
0b00000100, //1
0b00001000, //2
0b00001100, //3
0b00010000, //4
0b00010100, //5
0b00011000, //6
0b00011100, //7
0b00100000, //8
0b00100100, //9

};

 

 

#ifndef pino_1w
#define pino_1w pin_a3   // define o pino RD0 como comunicação 1-wire
#endif

#inline
void seta_saida_1w(void)
// coloca a saída em la impedância
{
output_float(pino_1w);
}

#inline
limpa_saida_1w (void)
// coloca a saída em nível 0
{
output_low (pino_1w);
}

boolean reset_1w(void)
// reseta os dispositivos no barramento
{
boolean presente;
limpa_saida_1w ();
delay_us(480);
seta_saida_1w ();
delay_us(60);
presente = input (pino_1w);
delay_us (240);
return (presente);
// 0 = dispositivo presente
// 1 = nenhum dispositivo detectado
}

void alimenta_barramento_1w (void)
// força o barramento em nível alto
// utilizado com dispositivos alimentados no modo parasita
{
output_high (pino_1w);
delay_ms(1000);
seta_saida_1w();
}

boolean le_bit_1w (void)
// lê um bit do barramento 1-wire
{
// dá um pulso na linha, inicia quadro de leitura
limpa_saida_1w ();  // coloca saida em zero
seta_saida_1w ();  // retorna a saída a um
delay_us (15);   // aguarda o dispositivo colocar
// o dado na saída
return (input(pino_1w)); // retorna o dado
}

void escreve_bit_1w (boolean bit)
// escreve um bit no barramento 1-wire
{
limpa_saida_1w ();
if (bit) seta_saida_1w (); // coloca dado 1 na saida
delay_us (120);
seta_saida_1w ();
}

byte le_byte_1w (void)
// lê um byte do barramento 1-wire
{
byte i, dado = 0;
// lê oito bits iniciando pelo bit menos significativo
for (i=0;i<8;i++)
{
if (le_bit_1w ()) dado|=0x01<<i;
delay_us(90);  // aguarda o fim do quadro de leitura
// do bit atual
}
return (dado);
}

void escreve_byte_1w (char dado)
// escreve um byte no barramento 1-wire
{
byte i, temp;
// envia o byte iniciando do bit menos significativo
for (i=0; i<8; i++)
{
temp = dado>>i; // desloca o dado 1 bit à direita
temp &= 0x01;  // isola o bit 0 (LSB)
escreve_bit_1w (temp); // escreve o bit no barramento
}
}

int calc_crc(int *dados, int quantidade)
{
int shift_reg=0, data_bit, sr_lsb, fb_bit, i, j;

for (i=0; i<quantidade; i++)  // loop de bytes
{
for(j=0; j<8; j++) // loop de bits
{
data_bit = (dados[i]>>j)&0x01;
sr_lsb = shift_reg & 0x01;
fb_bit = (data_bit ^ sr_lsb) & 0x01;
shift_reg = shift_reg >> 1;
if (fb_bit)
{
shift_reg = shift_reg ^ 0x8c;
}
}
}
printf("CRC Funcao = %dn", shift_reg);
return(shift_reg);
}

// PROGRAMA PRINCIPAL//////////////////////////

void main(void)
{
int buffer[9], conta;
float temp,valor2;
long int temp1;
int c,d,u,m;

while (true)
{

reset_1w ();
escreve_byte_1w (0xcc);  // comando skip ROM
escreve_byte_1w (0x44);  // inicia conversão da temperatura

 

reset_1w ();   // reseta o dispositivo
escreve_byte_1w (0xcc); // comando skip ROM
// comando de leitura da memória de rascunho
escreve_byte_1w (0xbe);
// efetua a leitura dos nove bytes da memória de rascunho

for (conta = 0; conta<9; conta++)
{buffer[conta]=le_byte_1w ();
}

temp1=((long)(buffer[1]<<8) + buffer[0]>>1);

valor2=temp1/10;
d=(int)floor(valor2);

valor2=((temp1) - (10*d));
u=(int)floor(valor2);

printf("%d%d Cn",d,u);

//output_bit(pin_b4,1);
//delay_us(900);
output_c(tabela1[u]);
delay_ms(25);
//output_bit(pin_a1,0);

//output_bit(pin_a2,1);
//delay_us(900);
//      output_b(tabela[d]);
delay_ms(25);

//output_bit(pin_a2,0);

}
}