基于 W80X 的 DS18B20 的驱动

发布于 2024-11-18 11: 12: 50

基于 W80x 实现 DS18B20 驱动. 代码如下;

#include "wm_include. h"
#include "temper. h"
 
 
#define DS18B20_SKIP_ROM        0xCC
#define DS18B20_CONVERT_T       0x44
#define DS18B20_READ_SCRATCHPAD    0xBE

static void t_Delay_us (uint16_t num)  
{
    uint32_t i; 
    for (i=0; i  (80*num) ; i++) 
    {
        __NOP () ; 
    }
        
}

static uint8_t DS18B20_IN (void) 
{
    tls_gpio_cfg (WM_IO_PB_00,  WM_GPIO_DIR_INPUT,  WM_GPIO_ATTR_FLOATING) ; 
    return tls_bitband_read (HR_GPIOB_DATA, WM_IO_PB_00-16) ;                   //读取引脚电平
}

static uint8_t DS18B20_LOW (void) 
{
    // tls_gpio_cfg (WM_IO_PB_00,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
    tls_bitband_write (HR_GPIOB_DATA,  WM_IO_PB_00-16,  0) ; 
}

static uint8_t DS18B20_HIGH (void) 
{
    // tls_gpio_cfg (WM_IO_PB_00,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
    tls_bitband_write (HR_GPIOB_DATA,  WM_IO_PB_00-16,  1) ; 
}

static void set_gpio (void) 
{
    tls_gpio_cfg (WM_IO_PB_00,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
}



static uint8_t DS18B20_Init (void) 
{
    uint8_t AckBit; 
 
    DS18B20_LOW () ; 
    t_Delay_us (480) ; 
 
    DS18B20_HIGH () ; 
    t_Delay_us (70) ; 
 
    AckBit = DS18B20_IN () ; 
    t_Delay_us (240) ; 
    if (AckBit) 
    {
        /*打印错误信息*/
        return 1; 
    }
    
    set_gpio () ; 
    return 0; 
}
 
static void DS18B20_WriteBit (uint8_t bit) 
{
    DS18B20_LOW () ; 
    t_Delay_us (10) ; 
    if (bit) 
    {
        DS18B20_HIGH () ; 
    }
    else
    {
        DS18B20_LOW () ;     /*可省略*/
    }
    t_Delay_us (45) ; 
    DS18B20_HIGH () ; 
    t_Delay_us (2) ; 
}

 
static void DS18B20_WriteByte (uint8_t byte) 
{
    uint8_t i; 
    for (i = 0;  i   8;  i++) 
    {
        DS18B20_WriteBit (byte &  (0x01    i) ) ; 
    }
}
 
uint8_t DS18B20_ReadBit (void) 
{
    uint8_t bit; 
 
    DS18B20_LOW () ; 
    t_Delay_us (5) ; 
 
    DS18B20_HIGH () ; 
    t_Delay_us (10) ; 
    
    if (DS18B20_IN () ) 
    {
        bit = 1; 
    }
    else
    {
        bit = 0; 
    }
    t_Delay_us (45) ; 
    set_gpio () ; 
    return bit; 
}
 
void DS18B20_ReadByte (uint8_t *byte) 
{
    uint8_t i; 
    for (i = 0;  i   8;  i++) 
    {
        *byte   = 1;  // 右移一位
        if (DS18B20_ReadBit () ) 
        {
            *byte |= 0x80;  // 设置最高位
        }
    }
}
 
void DS18B20_Tem_Convert (void) 
{
    if (DS18B20_Init ()  == 0) 
    {
        DS18B20_WriteByte (DS18B20_SKIP_ROM) ; 
        DS18B20_WriteByte (DS18B20_CONVERT_T) ; 
    }
    else
    {
        /*打印错误信息*/
        printf ("%s DS18B20_Init ERROR\n", __FUNCTION__) ; 
    }
}
 
void DS18B20_Read_Tem (float* tem) 
{
    uint16_t temValue; 
    uint8_t tem_LSB,  tem_MSB; 
    if (DS18B20_Init ()  == 0) 
    {
        DS18B20_WriteByte (DS18B20_SKIP_ROM) ; 
        DS18B20_WriteByte (DS18B20_READ_SCRATCHPAD) ; 
 
        DS18B20_ReadByte (&tem_LSB) ; 
        DS18B20_ReadByte (&tem_MSB) ; 
 
        temValue =  (tem_MSB    8)  | tem_LSB; 
        
        *tem =  (float) temValue / 16; 
    }
    else
    {
        /*打印错误信息*/
        printf ("%s DS18B20_Init ERROR\n", __FUNCTION__) ; 
    }
}
 
 

#define TEMP_TASK_PRORITY   3

#define TEMP_TASK_STACK_SIZE    1024
static OS_STK TaskStk[TEMP_TASK_STACK_SIZE/4]; 

void user_temp_task (void) 
{
    float temp=0; 
    uint8_t time=10; 
    uint8_t flag=0; 
    uint8_t AckBit; 
    printf ("%s %d \n", __FUNCTION__, __LINE__) ; 
    set_gpio () ; 
    // tls_gpio_cfg (WM_IO_PA_04,  WM_GPIO_DIR_OUTPUT,  WM_GPIO_ATTR_FLOATING) ; 
    while  (1) 
    {
        // tls_os_time_delay (2000) ; 
        DS18B20_Tem_Convert () ; 
        tls_os_time_delay (1000) ; 
        DS18B20_Read_Tem (&temp) ; 
        printf ("temp = %f \n", temp) ; 
        
    }
    
}


void user_temp_task_create (void) 
{
    tls_os_task_create (NULL,  
                      "temperatrue", 
                       user_temp_task, 
                       NULL, 
                        (void *) TaskStk,           /* task's stack start address */
                       TEMP_TASK_STACK_SIZE,  /* task's stack size,  unit: byte */
                       TEMP_TASK_PRORITY, 
                       0) ; 

}
0 条评论

发布
问题