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*************************** */ p>
/**********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); p>
}
/****************ds18b20Leer un byte******************/
char unsigned ReadOneChar(void)
{
uchar i=0
uchar dat = 0; p> for (i=8; igt; 0; i--) p>
{
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;
}
} p>
/***************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()
{ p>
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);
}
}