Modelo de sensor de temperatura
1.Conocimientos básicos del ds18B20
El termómetro digital DS18B20 es un dispositivo de 1 cable producido por DALLAS Company. Tiene las características de circuito simple y tamaño pequeño. Por lo tanto, es muy conveniente utilizarlo para formar un sistema de medición de temperatura. El circuito es simple y muchos de estos termómetros digitales se pueden colgar en una línea de comunicación.
Características de los productos 1 y DS18B20
(1), solo se requiere un puerto para la comunicación.
(2) Cada dispositivo en ds 18b 20 tiene un número de serie único.
(3) En aplicaciones prácticas, la medición de temperatura se puede lograr sin ningún componente externo.
(4)El rango de temperatura de medición es -55 ℃. c a +125. entre c.
(5) Los usuarios pueden elegir la resolución del termómetro digital entre 9 y 12 dígitos.
(6), Configuración de alarma de límite superior e inferior de temperatura interna.
2. Introducción del pin DS18B20
La disposición de los pines del DS18B20 en el paquete TO-92 se muestra en la Figura 1 y la descripción de la función del pin se muestra en la Tabla 1.
(Vista inferior) Figura 1
Tabla 1 Descripción detallada de la función del pin DS18B20
Número de serie
Nombre
Descripción de la función del pin
1
GND
Señal enana
2
Ice Queen (Dairy Queen)
Pin de entrada/salida de datos. Pin de interfaz de bus único de drenaje abierto. Cuando se utiliza para fuentes de alimentación parásitas, también puede alimentar el dispositivo.
Tres
VDD
Pin VDD opcional. Este pin debe estar conectado a tierra cuando se opera con suministros parásitos.
3. Cómo utilizar DS 18B20
Dado que DS18B20 utiliza un protocolo de bus de 1 cable, que implementa la transmisión bidireccional de datos en una línea de datos, pero para el microcontrolador AT89S51, el hardware no admite un solo protocolo de bus. Por lo tanto, debemos utilizar software para simular la secuencia del protocolo de bus único para completar el acceso al chip DS18B20.
Debido a que DS18B20 lee y escribe datos en la línea de E/S, tiene requisitos de tiempo estrictos para leer y escribir bits de datos. DS18B20 tiene un protocolo de comunicación estricto para garantizar la exactitud e integridad de la transmisión de datos. El protocolo define el tiempo de varias señales: tiempo de inicialización, tiempo de lectura y tiempo de escritura. Todas las secuencias de temporización utilizan el host como dispositivo maestro y el dispositivo de bus único como dispositivo esclavo. Cada comando y transferencia de datos comienza cuando el host inicia activamente una secuencia de escritura. Si se requiere que el dispositivo de bus único envíe datos de vuelta, después del comando de escritura, el host debe iniciar una secuencia de lectura para completar la recepción de datos. Los datos y comandos se transfieren en little endian.
Restablecer tiempo de DS18B20
Leer tiempo de DS18B20
El tiempo de lectura de DS18B20 se divide en dos procesos: lectura de tiempo 0 y lectura de tiempo 1.
Para DS18B20, después de desconectar el bus único del host, el bus único debe liberarse dentro de 15 segundos para que el DS18B20 pueda transmitir datos al bus único. DS18B20 requiere al menos 60 us para completar una secuencia de lectura.
Tiempo de escritura de DS18B20
El tiempo de escritura de DS18B20 todavía se divide en dos procesos: tiempo de escritura 0 y tiempo de escritura 1.
DS18B20 tiene diferentes requisitos para escribir secuencia 0 y secuencia 1. Al escribir una secuencia 0, el bus único debe bajarse durante al menos 60 us para garantizar que el DS18B20 pueda muestrear correctamente el nivel "0" en el bus IO entre 15 us y 45 us. Al escribir una secuencia 1, el bus único debe ser
4 Tareas experimentales
El sistema de medición de temperatura consta de un DS18B20. La precisión de la medición de la temperatura alcanza los 0,1 grados y el rango de temperatura de medición es de -20 grados a +100 grados, que se muestra mediante un tubo digital de 8 dígitos.
5. Esquema del circuito
6. Conexión del hardware en la placa del sistema
(1). El área "Sistema" .0-P0.7 está conectada al terminal ABCDEFGH en el área "Pantalla digital dinámica".
(2) Utilice un cable de 8 núcleos para conectar P2.0-P2.7 en el área "Sistema MCU" al terminal S1S2S3S4S5S6S7S8 en el área "Pantalla digital dinámica".
(3) Inserte el chip DS18B20 en cualquier zócalo del área del "bus único de cuatro vías". Tenga cuidado de no invertir las señales de alimentación y tierra.
(4) Conecte el terminal DQ correspondiente al área "Bus único de cuatro vías" al terminal P3.7/RD en el área "Sistema de chip único".
Programa fuente en lenguaje 7.c
#i incluye & ltAT89X52.
H & gt
#i incluye & ltINTRINS.h & gt
Código de caracteres sin firmar displaybit[]={0xfe, 0xfd, 0xfb, 0xf7,
0xef , 0xdf, 0xbf, 0x7f};
Código de caracteres sin firmar displaycode[]={0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
p>
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71, 0x00, 0x 40};
Código de puntos sin firmar[32 ]= {0,3,6,9,12,16,19,22,
25,28,31,34,38,41,44,48,
50 ,53 ,56,59,63,66,69,72,
75,78,81,84,88,91,94,97};
Recuento de visualización de caracteres sin firmar ;
Displaybuf de caracteres sin firmar[8]={16, 16, 16, 16, 16, 16, 16}
Recuento de tiempo de caracteres sin firmar
Datos de lectura de caracteres sin firmar[8];
sbit dq=p3^7;
bit sflag
pulso de reinicio de bit (no válido)
{
Carácter sin firmar I;
DQ = 0;
for(I = 255;I>0;I-);
p>DQ = 1;
para(I = 60;I>0;I-);
Retorno (DQ);
para (I = 200; i>0;i-);
}
void writecommandtods 18b 20 (comando de carácter sin firmar)
{
Carácter sin firmar I;
Carácter sin signo j;
for(I = 0;i<8;i++)
{
if((command & amp0x01)= =0)
{
DQ = 0;
for(j = 35; j & gt0 ;j-);
DQ = 1;
}
Otro
{
DQ = 0 ;
for(j = 2;j & gt0;j-);
DQ = 1;
for(j = 33;j & gt0; j-);
}
command=_cror_(command, 1);
}
}
Lectura de caracteres sin firmar de ds18b20(void)
{
Carácter sin firmar I;
Carácter sin firmar j;
Carácter sin firmar Temperatura;
temp = 0;
for(I = 0;i<8;i++)
{
temp=_cror_ (temp, 1
DQ = 0; /p>
_ nop _();
_ nop _();
DQ = 1;
for(j = 10;j & gt0;j-);
si (DQ==1)
{
temp = temp | /p>
Otro
{
temp = temp | 0x00
}
for(j = 200;j & gt0;j-);
}
Regreso (temporal);
}
Gerente general no válido (no válido)
{
TMOD = 0x 01;
TH0 =(65536-4000)/256;
TL0 =(65536-4000)% 256;
ET0 = 1; p >
EA = 1;
mientras(resetpulse()).
escribircommandtods 18b 20(0x cc);
escribircommandtods 18b 20(0x 44);
TR0 = 1;
mientras( 1)
{
}
}
void t0(void) usa 0 para interrumpir 1
{
Carácter sin signo x;
Resultado entero sin signo
TH0 = (65536-4000)/256
TL0 = ( 65536-4000)% 256;
if(displaycount==2)
{
P0 = código de visualización[display buf[display count]]| 80;
}
Otro
{
P0 = código de visualización [display buf[display count]];
}
P2 = bit de visualización[recuento de visualización];
recuento de visualización++;
if(displaycount==8)
{
recuento de visualización = 0;
}
recuento de tiempo++;
if(recuento de tiempo==150)
{
recuento de tiempo = 0;
mientras(resetpulse()).
writecommandtods 18b 20(0x cc);
writecommandtods 18b 20(0x be);
leer datos[0]= readdatafromds 18b 20();
leer datos[1]= leerdatosfromds 18b 20();
for(x = 0; x & lt8;x++)
{
display buf[x]= 16;
}
sflag = 0;
if((leer datos[1]&0xf8)! = 0x00)
{
sflag = 1;
leer datos[1]= ~ leer datos[1];
leer datos [0]= ~ leer datos[0];
Resultado = leer datos[0]+1;
leer datos[0]=resultado;
if(resultado>255)
{
leer datos[1]++;
}
}
leer datos[1]= leer datos[1]& lt;& lt4;
readdata[1]= leer datos[1]& 0x70
x = leer datos[0];
x = x & gt& gt4;
x = x & amp0x0f
leer datos[1]= leer datos[1]| >
x = 2;
resultado = leerdatos[1]
mientras(resultado/10)
{ p>
mostrar buf[x]=resultado% 10;
result=result/10;
x++;
}
mostrar buf[ x]=resultado;
if(sflag==1)
{
mostrar buf[x+1]= 17;
}
x = leer datos[0]&0x0f
x = x & lt& lt1;
mostrar buf[0 ]=(código de puntos[ x])% 10;
mostrar buf[1]=(código de punto[x])/10;
mientras(resetpulse()).
escribircomandostods 18b 20(0x cc);
escribircommandtods 18b 20(0x 44);
}
}