W80x DS18B20測溫度

發布於 2023-08-04 22:20:43
#include "Arduino.h"
#define ONEWIRE_PIN PA2

static uint8_t ds18b20_read_byte(void)
{
    uint8_t i, j, dat;
    dat = 0;
    for (i = 1; i <= 8; i++)
    {
        j = ds18b20_read_bit();
        dat = (j << 7) | dat >> 1;
    }
    return dat;
}

static uint8_t ds18b20_read_bit(void)
{
    pinMode(ONEWIRE_PIN,OUTPUT);
    uint8_t result;
    digitalWrite(ONEWIRE_PIN,LOW);
    delayMicroseconds(2);
    digitalWrite(ONEWIRE_PIN,HIGH);
    delayMicroseconds(12);
    
    pinMode(ONEWIRE_PIN,INPUT);
    if (digitalRead(ONEWIRE_PIN))
    {
        result = 1;
    }
    else
    {
        result = 0;
    }
    delayMicroseconds(50);
    return result;
}

static void ds18b20_write_byte(uint8_t byte)
{
    uint8_t i;
    uint8_t first_bit;
    pinMode(ONEWIRE_PIN,OUTPUT);
    for (i = 1; i <= 8; i++)
    {
        first_bit = byte & 0x01;
        byte = byte >> 1;
        if (first_bit)
        { // write 1
            digitalWrite(ONEWIRE_PIN,LOW);
            delayMicroseconds(2);
            digitalWrite(ONEWIRE_PIN,HIGH);
            delayMicroseconds(60);
        }
        else
        { // write 0
            digitalWrite(ONEWIRE_PIN,LOW);
            delayMicroseconds(60);
            digitalWrite(ONEWIRE_PIN,HIGH);
            delayMicroseconds(2);
        }
    }
}

/*******************************************************************************
 * @biref  Detected presence signal
 * @retval result [1: inexistence,0: existence]
 *******************************************************************************
 */
static uint8_t ds18b20_check(void)
{
    uint8_t result = 1;
    uint8_t retry = 0;
    pinMode(ONEWIRE_PIN,INPUT);
    
   //If the presence of a signal is not detected (always high) 
   and it does not exceed 200 us, the loop is executed.
    while (digitalRead(ONEWIRE_PIN) && retry < 200)
    {
        retry++;
        delayMicroseconds(1);
    }
    //  If the retry exceeds 200, the DS18B20 does not exist.
    if (retry >=  200)
    {
        result = 1;
    }
    else
    {
        retry = 0;

        while (!digitalRead(ONEWIRE_PIN) && retry < 240)
        {
            retry++;
            delayMicroseconds(1);
        }

        if (retry >= 240)
        {
            result = 1;
        }
        else
        {
            result = 0;
        }
    }
    //   Serial.printf("check:%d\n",result); To detect if there is a response.
    return result;
}

static void ds18b20_rst(void)
{
    pinMode(ONEWIRE_PIN,OUTPUT);
    digitalWrite(ONEWIRE_PIN,LOW);
    delayMicroseconds(750);
    digitalWrite(ONEWIRE_PIN,HIGH);
    delayMicroseconds(15);// 15us
}

float ds18b20_get_temp(void)
{
    uint8_t temp;
    uint8_t TL, TH;
    short tem;
    ds18b20_start();
    ds18b20_rst();
    ds18b20_check();
 
    ds18b20_write_byte(0xcc);
    ds18b20_write_byte(0xbe);
   // Read the signal from the DS18B20 sensor.    
    TL = ds18b20_read_byte(); // LSB
    TH = ds18b20_read_byte(); // MSB

    if (TH > 7)
    {
        TH = ~TH;
        TL = ~TL;
        temp = 0;
    }
    else
    {
        temp = 1;
    }
    tem = TH;
    tem <<= 8;
    tem += TL;
    return (float)tem * 0.0625;
}
static void ds18b20_start(void)// ds1820 start convert
{                              
    ds18b20_rst();
    ds18b20_check();
    ds18b20_write_byte(0xcc); // skip rom
    ds18b20_write_byte(0x44); // convert
}
void setup()
{
  Serial.begin(115200);
}
void loop()
{
  float control = ds18b20_get_temp();
  Serial.printf("temp:%f\n",control);
  delay(1000);
} 
0 條評論

發布
問題