Cómo programar el sensor de temperatura DS18B20
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^2;
sbit wela=P2^7;
sbit dula=P2^6;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P2^5;
tabla de códigos uchar[]={ "Temperatura actual:"};
uchar date[2]={0};
uchar table1[4]={0};
uint temp ;uchar end;
retraso nulo(uint x)
{uint i,j;
for(i=x;i>0;i-- )
for(j=110;j>0;j--) ;}
void nops(uint x)
{
for(;x>0;x--) _nop_(); }
void write_byte(uchar num)
{
uchar i;
bit m;
for(i=0;i<8;i++)
{
m=num&0x01;
num>>=1;
DQ=1;
DQ=0;
nops(11);
DQ=m;
nops(40);
DQ=1;
_nop_();
}
}
/*************************************** ************************************
* Nombre de la función: read_byte()
* Función: Leer datos de 18B20
* Parámetro de entrada: Ninguno
* Parámetro de salida: Ninguno
* Valor de retorno: Uno palabra leída Datos de sección
**************************************** *******************************/
uchar read_byte()
{
uchar i,num;
bit m;
for(i=0;i<8;i++)
{
DQ=1;
_nop_();
_nop_();
DQ=0;
nops(10 );
DQ=1;
nops(10);
m=DQ;
num>> =1;
if(m)
{ num|=0x80;}
nops(25);
DQ=1 ;
}
retorno(
núm);
}
/********************************* ***** *******************************************
* Nombre de la función: DS18b20_init ()
* Función: 18B20 reset
* Parámetro de entrada: Ninguno
* Parámetro de salida: Ninguno
* Valor de retorno: Ninguno
********************************** ********* *************************/
void DS18b20_init()
{
DQ=1;
nops(1);
DQ=0;
nops(750);
DQ= 1;
while(DQ==1) ;
nops(420);
DQ=1;
} p>
/************************************ ************ *************************
* Nombre de la función: get_temp ()
* Función: Obtener valor de temperatura
* Parámetro de entrada: Ninguno
* Parámetro de salida: Ninguno
* Valor de retorno: Temperatura de doble byte de 18B20
************************************* ************** *******************/
void get_temp()
{
uchar a,b;
DS18b20_init();
write_byte(0xCC); // Enviar comando Saltar ROM
write_byte(0x44); // Enviar comando de conversión
delay(20);
DS18b20_init();
write_byte(0xCC); comando
write_byte(0xBE); / /Enviar comando de lectura
a=read_byte(); //inferir 8 bits
b=read_byte(); /alto 8 bits
temp=b <<8;
temp|=a;
}
void chuli() / /Discretiza la temperatura y guarda 17 grados como 1,7 p>
{
uchar wendu,tt;
wendu=temp*0.0625;
tt=wendu;
tabla1 [0]=tt/100;
tt=tt%100
tabla1[1]=tt/10; ;
tt=tt%10;
tabla1[2]=tt;
}
/****** ******************* ********************************** **********/
// programa de visualización 1602 //
void write_com(uchar com)
{
lcdrs=0;
P0=com;
retraso(5);
lcden=1;
retraso(5);
lcden =0; }
void write_data(uchar fecha)
{
lcdrs=1;
P0=fecha;
retraso(5);
lcden=1;
retraso(5);
lcden=0 }
void init1602()
{
wela=1;
P0=0;
wela=0;
lcdrw=0;
}
/*************************** * ***********************************/
void main() p >
{uchar i;
init1602();
write_com(0x38);//Modo de visualización
write_com(0x0f);// en pantalla, cursor, parpadeando
write_com(0x06);//La dirección del puntero y el cursor aumentan automáticamente en 1
write_com(0x80);//Dirección inicial del puntero
while(table[i]!='\0')
{write_data(table[i++]);
delay(10 }
while(1)
{ write_com(0x80x40);//Dirección inicial del puntero
get_temp();
chuli();
for(i=0;i<4;i++)
{ write_data(table1[i++]+0x30);
retraso(10);
}
}
}