Red de conocimiento informático - Conocimiento sistemático - Cómo programar el sensor de temperatura DS18B20

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;

}

/************************************ ************ *************************

* 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

{

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()

{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);

}

}

}