8. Un solo bus y DB18B20 realizan la medición de temperatura

1. El concepto básico de la comunicación de 1 cable

En el sistema de comunicación en serie suele haber:
línea de señal de reloj, línea de señal de datos, línea de señal de control, línea de alimentación del equipo

  • UART: VCC GND TXD (pin de transmisión del puerto serie) RXD (pin de recepción del puerto serie)
  • USART: VCC GND TXD RXD SCK (señal de reloj)
  • SPI: VCC GND CS (pin de selección de chip) MOSI MISO SCK
  • I2C: VCC GND SDA (línea de datos en serie) SCK (línea de reloj en serie)

Ventajas y desventajas:

  1. La capacidad de conducción del autobús es deficiente y será inestable si supera un cierto número.
  2. La distancia no es larga, el bus 1-Wire es más adecuado para distancias medias y cortas y velocidades bajas
  3. Como la integración de hardware de primera línea es relativamente simple, la complejidad del software aumenta

2. Introducción del sensor de temperatura DS18B20

  • 1. Apariencia
    Inserte la descripción de la imagen aquí
  • 2. Modo de fuente de alimentación Fuente de alimentación en modo
    parásito Modo de fuente de alimentación
    Inserte la descripción de la imagen aquí
    Inserte la descripción de la imagen aquí
    externa (se debe considerar la caída de voltaje)
    Inserte la descripción de la imagen aquí
  • 3. Circuito interno
    Contiene unidad de fuente de alimentación, unidad ROM, unidad de control de lógica de memoria, unidad de conversión de temperatura, unidad de registro de alta velocidad, etc.
    Inserte la descripción de la imagen aquí
    DS18B20 solo puede leer pero no escribir, con alarma de alta temperatura, -10 ° -40 °
1) instrucciones de funcionamiento de la ROM

Hay 5 instrucciones relacionadas con el funcionamiento de la ROM en el dispositivo DS18B20, como se muestra a continuación:

Inserte la descripción de la imagen aquí
(Leer y saltar se usan más, otros se usan menos)

2) Instrucciones funcionales

Además de las instrucciones de la ROM, hay instrucciones funcionales
Inserte la descripción de la imagen aquí
(que se utilizan principalmente para la conversión de temperatura y la lectura del bloc de notas)

3. Formato de datos y conversión de DS18B20

  1. El problema de la tasa de asignación de conversión
    está controlado por los dos bits del bit 6 y el bit 5 en el registro de configuración.
    Inserte la descripción de la imagen aquí
  2. El problema de almacenamiento del valor de temperatura Los
    5 bits superiores del byte superior son los bits de signo, que están representados por S en la figura. Si el valor de temperatura es positivo, los bits S son todos 0, si es negativo, los bits S son todos 1
    Inserte la descripción de la imagen aquí
  • Pregunta 1: ¿Por qué necesitamos 5 bits de signo?

No es necesario ocupar tantos bits y el rango de temperatura medible es relativamente estrecho Para el procesamiento de datos se utilizan 5 bits de signo.

  • Pregunta 2: Independientemente del bit de signo, ¿todos los demás son solo 11 bits?

Los 5 bits superiores se combinan en un bit de signo, es decir, la resolución de 12 bits se refiere al bit S + los 11 bits restantes.
La parte del bit 0-bit 3 es la parte decimal, el bit 4-bit 19 es la parte entera y el bit 11-bit 15 es el bit de signo. Para una resolución de conversión de 12 bits, todos los bits del sensor de temperatura son válidos; para una resolución de conversión de 11, el bit 0 no es válido; para una resolución de 10, el bit 0 y el bit 1 no son válidos; para 9 La resolución de bits, bit 2, bit 1, bit 0 no es válido.

  • Pregunta 3: ¿Cómo lidiar con la temperatura negativa?

La temperatura negativa se opera de acuerdo con el código de complemento, por lo que si es -55 ° y debe almacenarse, la respuesta correcta no es 0b1111101101110000 o 0xFB70, sino que se muestra como 0b1111110010010000 o 0xFC90 de acuerdo con el código de complemento. (Código de complemento = código inverso +1, código inverso = código fuente invertido)

  • Pregunta 4: ¿Cómo convertir la temperatura a la temperatura Celsius correcta?

Temperatura real = número de copias * resolución mínima

Ejemplo de formato de conversión de valor de temperatura: configuración de
Inserte la descripción de la imagen aquí
umbral de temperatura alta y umbral de temperatura baja (menos utilizado)
Inserte la descripción de la imagen aquí
Cuando el valor de temperatura muestreado real excede el límite de temperatura alta o es menor que el umbral de temperatura baja, el dispositivo DS18B20 enviará una señal de alarma a esta vez.

4. Diagrama de tiempos de DS18B20

El dispositivo DS18B20 utiliza un estricto protocolo de comunicación de bus único de 1 cable para garantizar la integridad y validez de los datos. El primero es enviar la secuencia de inicialización, el segundo es enviar el comando ROM y el tercero es enviar el comando de función.
Inserte la descripción de la imagen aquí

  • Pregunta: ¿Cómo escribir un comando al esclavo, es decir, cómo hacerle saber al esclavo si escribimos 1 o 0, para que pueda enviar datos de 1 byte?

Para un byte de datos, hay bits altos y bajos, y el envío de datos debe enviar primero el bit bajo y luego enviar el bit alto. Preste atención al intervalo de tiempo entre escribir 0 y escribir 1. Operar en el intervalo de tiempo correcto es la garantía de una comunicación correcta entre el maestro y el esclavo.

1) Dos operaciones de escritura desde el host
  • Operación 1: Intervalo de tiempo de escritura 1
    Inserte la descripción de la imagen aquí
  • Operación 2: Intervalo de tiempo al escribir 0
    Inserte la descripción de la imagen aquí
2) Dos operaciones de respuesta del esclavo (el maestro lee 0 y lee 1)

Inserte la descripción de la imagen aquí
Preste atención al tiempo, el muestreo del host debe estar dentro de los 15 microsegundos

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

5. Proceso de funcionamiento de DS18B20

  1. Reinicio
    Primero que nada, debemos reiniciar el chip ds18b20 El reinicio es
    una señal de bajo nivel de al menos 480uS desde el controlador (microcontrolador) al bus único ds18b20. Cuando 18B20 recibe esta señal de reinicio, enviará un
    pulso de presencia de chip después de 15 ~ 60uS .
  2. Pulso existente
    Una vez finalizado el nivel de reinicio, el controlador debe elevar el bus único de datos hacia arriba para recibir el
    pulso existente después de 15 ~ 60uS . El pulso existente es una señal de bajo nivel de 60 ~ 240uS. En este punto, las partes de la comunicación han llegado a un acuerdo básico y el
    siguiente paso será la comunicación de datos entre el controlador y el 18B20. Si
    no hay tiempo suficiente para restablecer el nivel bajo o el circuito de bus único está roto, no se recibirá el pulso de presencia Preste atención al manejo de situaciones inesperadas durante el diseño.
  3. El controlador de ROM envía comandos
    después de que los dos lados terminaron el saludo que más desea comunicar, un total de cinco comandos de ROM, cada ciclo de trabajo solo dice
    que las instrucciones de ROM de tira se leen datos de ROM, especifique el chip correspondiente, salta la ROM, el chip búsqueda, búsqueda de chip de alarma. La
    instrucción ROM tiene una longitud de 8 bits y su función es operar la ROM de fotolitografía de 64 bits en el chip. Su objetivo principal es distinguir
    y procesar múltiples dispositivos conectados a un bus. Es cierto que se pueden conectar varios dispositivos a un solo bus al mismo tiempo, y
    se pueden distinguir por el número de identificación único en cada dispositivo . Generalmente, cuando solo se conecta un solo chip 18B20, el comando ROM se puede omitir ( nota:
    el salto aquí es El comando ROM no es no enviar el comando ROM, sino usar un "comando de salto" único). Los comandos de la ROM
    se describen en detalle a continuación.
  4. El controlador envía la instrucción de operación de memoria
    Después de que la instrucción de ROM se envía al 18B20, la instrucción de operación de memoria se envía inmediatamente (sin interrupciones). Las
    instrucciones de funcionamiento también son de 8 bits, y hay un total de 6. Las instrucciones de funcionamiento de la memoria son escribir datos de RAM, leer datos de RAM,
    copiar datos de RAM a EEPROM, conversión de temperatura, copiar el valor de alarma en EEPROM a RAM y cambiar el modo de operación .
    La función de la instrucción de operación de la memoria es instruir al 18B20 para que haga qué tipo de trabajo es la clave para el control del chip.
  5. Ejecución o lectura y escritura de datos Una vez completada
    una instrucción de operación de memoria, se llevará a cabo la ejecución de la instrucción o lectura y escritura de datos Esta operación depende de la
    instrucción de operación de memoria . Si se ejecuta el comando de conversión de temperatura, el controlador (microcontrolador) debe esperar a que el 18B20 ejecute su comando, y el
    tiempo de conversión general es 500uS. Si ejecuta instrucciones de lectura y escritura de datos, debe seguir estrictamente la secuencia de lectura y escritura del 18B20 para operar.
    Debe prestar atención a:
    cambiar las instrucciones de funcionamiento de la memoria, esperar el tiempo de conversión de temperatura de 500uS. El segundo ciclo se reinicia, omite la
    instrucción de la ROM, ejecuta la instrucción de operación de la memoria para leer la RAM, leer los datos (hasta 9 bytes, puede detenerse a la mitad, leer solo el
    valor de temperatura simple, leer los primeros 2 bytes. Puede). Otros procedimientos operativos son similares, por lo que no los presentaré aquí.

6. Código de referencia

/****************************************************************/
//设备初始化时序产生函数DS18B20_reset(),无形参和返回值
/****************************************************************/
void DS18B20_reset(void)
{
  u8 x;
  DS18B20_DQ_DDR(1);
  DS18B20_DQ=1;
  delay(1700);
  DS18B20_DQ=0;
  delay(1700);
  DS18B20_DQ=1;
  delay(65);
  DS18B20_DQ_DDR(0);
  delay(65);
  x=PI_IDR_IDR4;
  printf("|[1].开始检测DS18B20......\r\n");
  while(x);
  printf("|[2].DS18B20检测成功\r\n");
  delay(1150);//控制器等待至少480us
}

/****************************************************************/
//设备DQ引脚方向性配置函数DS18B20_DQ_DDR(),有形参ddr无返回值
/****************************************************************/
void DS18B20_DQ_DDR(u8 ddr)
{
  if(ddr==1)	//配置为输出方式
  {
    PI_DDR_DDR4=1;
    PI_CR1_C14=1;
    PI_CR2_C24=0;
  }
  else			//配置为输入方式
  {
    PI_DDR_DDR4=0;
    PI_CR1_C14=1;
    PI_CR2_C24=0;
  }
}

/****************************************************************/
//设备初始化函数DS18B20_init(),无形参和返回值
/****************************************************************/
void DS18B20_init(void)
{
  DS18B20_reset();
  delay(1000);
  DS18B20_Wbyte(0xCC);//写ROM指令(跳过ROM)
  DS18B20_Wbyte(0x44);//写功能指令(温度转换)
  printf("|[3].启用温度转换\r\n");
}

/****************************************************************/
//设备写一个字节函数DS18B20_Wbyte(),有形参xbyte无返回值
/****************************************************************/
void DS18B20_Wbyte(u8 xbyte)
{
  u8 i,x=0;
  DS18B20_DQ_DDR(1);
  for(i=0;i<8;i++)	//8次循环实现逐位写入
  {
    x=xbyte & 0x01; //从最低位取值到最高位
    if(x)			//写“1”
    {
      DS18B20_DQ=0;
      delay(30);
      DS18B20_DQ=1;
      delay(100);
      DS18B20_DQ=1;
    }
    else			//写“0”
    {
      DS18B20_DQ=0;
      delay(30);
      DS18B20_DQ=0;
      delay(100);
      DS18B20_DQ=1;
    }
    xbyte=xbyte>>1;	//右移一位实现逐位移出
  }
}

/****************************************************************/
//设备读字节函数DS18B20_Rbyte(),无形参有返回值rbyte
/****************************************************************/
u8 DS18B20_Rbyte(void)
{
  u8 rbyte=0,i=0,tempbit=0;
  for(i=0;i<8;i++)	//8次循环实现逐位拼合
  {
    tempbit=DS18B20_Rbit();	//读取单个位
    rbyte=rbyte>>1;			//右移实现将高低位排列
    rbyte=rbyte|tempbit;	//或运算移入数据
  }
  return rbyte;
}

/****************************************************************/
//设备读取单个位函数DS18B20_Rbit(),无形参有返回值rbit
/****************************************************************/
u8 DS18B20_Rbit(void)
{
  u8 rbit=0,x=0;
  DS18B20_DQ_DDR(1);
  DS18B20_DQ=0;
  delay(30);
  DS18B20_DQ=1;
  DS18B20_DQ_DDR(0);
  delay(20);
  x=PI_IDR_IDR4;
  if(x)
    rbit=0x80;
  delay(150);
  return rbit;
}

/****************************************************************/
//设备温度获取和转换函数DS18B20_get_Temperature(),无形参和返回值
/****************************************************************/
void DS18B20_get_Temperature(void)
{
  u8 msb_byte=0,lsb_byte=0;	//msb是温度值高位,lsb是温度值低位
  DS18B20_reset();			//初始化时序
  delay(1000);				//等待初始化稳定
  DS18B20_Wbyte(0xCC);		//写ROM指令(跳过ROM)
  DS18B20_Wbyte(0xBE);		//写功能指令(读暂存器)
  delay(1000);				//等待配置稳定
  printf("|[4].开始温度读取操作\r\n");
  lsb_byte=DS18B20_Rbyte();	//读取第一个低位数据字节
  msb_byte=DS18B20_Rbyte();	//读取第二个高位数据字节
  Tem_u16=msb_byte;			
  Tem_u16=Tem_u16<<8;		
  Tem_u16=Tem_u16|lsb_byte;	
  if(Tem_u16<=0x07FF)		//温度值正负判断
  {
    flag=1;					//温度值为正(最高能测到125摄氏度)
    Tem_f=Tem_u16*0.0625;	//乘以0.0625最小分辨值得到12位温度实际值
    Tem_u16=(u16)(Tem_f+0.5);//4舍5入得到温度整数值
  }
  else
  {
    flag=0;					//温度值为负(最低能测到-55摄氏度)
    Tem_u16=~(Tem_u16-1);	//此时数据是补码形式
    //采用“补码-1”再按位取反的方法得到对应原码
    Tem_f=Tem_u16*0.0625;//乘以0.0625最小分辨值得到12位温度实际值
    Tem_u16=(u16)(Tem_f+0.5);//4舍5入得到温度整数值
  }
}

Hice un diseño de curso de computadora de un solo chip, me di cuenta de DB18B20 para obtener la temperatura y luego use LCD1602 para mostrarla, e imprímalo a través del puerto serie, si está interesado, puede descargar el código

Supongo que te gusta

Origin blog.csdn.net/weixin_44751294/article/details/111572558
Recomendado
Clasificación