Red de conocimiento informático - Material del sitio web - Programa de termómetro digital de alta precisión basado en microcontrolador AT89C51, sensor de temperatura DS18B20 y pantalla de cristal líquido LCD1602, programado en lenguaje C

Programa de termómetro digital de alta precisión basado en microcontrolador AT89C51, sensor de temperatura DS18B20 y pantalla de cristal líquido LCD1602, programado en lenguaje C

/***************subrutina ds18b20*************************** */

/**********subfunción de retardo ds18b20 (oscilador de cristal 12MHz)**********/

#includelt;reg51 .hgt;

sbit DQ=P1^2;

#define uchar unsigned char

void delay_18B20(unsigned int i)

{

while(i--);

}

/************función de inicialización ds18b20**** ******** **********/

void Init_DS18B20(void)

{

carácter sin firmar x= 0;

DQ = 1; //Reinicio de DQ

delay_18B20(8); //Retraso leve

DQ = 0 //MCU baja el DQ;

delay_18B20(80); //El retraso exacto es mayor que 480us

DQ = 1; //Tira del autobús alto

delay_18B20(4);

x =DQ; //Después de un ligero retraso, si x=0, la inicialización es exitosa y si x=1, la inicialización falla

delay_18B20(20);

}

/****************ds18b20Leer un byte******************/

char unsigned ReadOneChar(void)

{

uchar i=0

uchar dat = 0; p> for (i=8; igt; 0; i--)

{

DQ = 0; // Da señal de pulso

datgt; ;=1;

DQ = 1; // Dar señal de pulso

if(DQ)

dat|=0x80; delay_18B20(4);

}

return(dat);

}

/********* *********ds18b20 escribe un byte************ *******/

void WriteOneChar(uchar dat)

{

carácter sin firmar i=0

para (i=8; igt; 0; i--)

{

DQ = 0;

DQ = datosmp;

retraso_18B20(5);

DQ = 1; datgt; gt; = 1;

}

}

/***************Leer ds18b20 cuando

Temperatura frontal************/

ReadTemp(void)

{ float val

uchar temp_value, value <; /p>

carácter sin signo a=0;

carácter sin signo b=0;

carácter sin signo t=0;

Init_DS18B20(); /p>

WriteOneChar(0xCC); // Saltar lectura del número de serie

WriteOneChar(0x44); // Iniciar conversión de temperatura

delay_18B20(100); el mensaje es muy importante

Init_DS18B20();

WriteOneChar(0xCC); //Omitir la operación de lectura del número de serie

WriteOneChar(0xBE ); /Leer registros de temperatura, etc. (***Se pueden leer 9 registros) Los dos primeros son temperaturas

delay_18B20(100);

a=ReadOneChar(); el bit bajo del valor de temperatura

b=ReadOneChar(); //Leer el bit alto del valor de temperatura

temp_value=blt;lt;4;

temp_value = (aamp;0xf0)gt;gt;4;

valor=aamp;0x0f;

val=temp_value valor;

return(val );

p>

}

Lo anterior es el controlador para DS18B20. Luego simplemente llame a la función directamente en el programa principal.

Las anteriores son llamadas en el programa principal. Solo mira la de temperatura.

#include "reg51.h"

#include "18b20.h"

#define uchar unsigned char

#define uint unsigned int

uchar code table[]="Bienvenido a"; //Fecha de inicialización y día de la semana

uchar code table1[]="¡Nuestro sistema!" //Hora de inicialización<; /p>

uchar code table2[]="La temperatura es:"; //Tiempo de inicialización

//Los siguientes tres son los pines que definen la pantalla LCD

sbit lcden = P2^2;

sbit lcdwrite=P2^1;

sbit lcdrs=P2^0

char wendu; //Programa de retraso

void delay(uint z)

{ uint x, y

for(x=z; xgt; 0; x-- )

for(y=110; ygt; 0; y--

}

//comando de escritura LCD

); void write_com(uchar com)

{

lcdrs=0

lcden=0

P0=com; >

p>

retraso(5);

lcden=1;

retraso(5);

lcden=0; p>

}

//Datos de escritura en LCD

void write_data(uchar da)

{ lcdrs=1

lcden=0 ;

P0=da;

retraso(5);

lcden=1;

retraso(5);

lcden=0;

}

//Inicialización

void init()

{

uchar num;

lcdwrite=0;

lcden=0;

write_com(0x38); *Matriz de 7 puntos, datos de 8 bits

write_com(0x0c); //Mostrar cursor encendido y apagado

write_com(0x06); //Mover cursor

write_com(0x01 ); // Borrar el contenido de la pantalla LCD

write_com(0x80

for (num=0; numlt; 10; num )

{

p>

write_data(tabla[núm]);

retraso(5);

}

write_com( 0x80 0x40);

para (num=0;numlt;11;num)

{

write_data(table1[num]);

dela

y(5);

}

}

void write_wendu(uchar add, char da)

{

uchar shi, ge;

shi=da/10;

ge=da10;

write_com(0x80 0x40 agregar); p> write_data(0x30 shi);

write_data(0x30 ge);

}

//Función principal

void main ( )

{

uchar num;

init();

retraso(2000); (2000);

delay(2000);

write_com(0x01); //Borrar el contenido de la pantalla LCD

while(1)

{

write_com(0x80);

para (num=0; numlt; 15; num )

{

write_data(table2[num]);

retraso(5);

}

wendu = ReadTemp( ); 2, wendu);

}

}