基于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 条评论

发布
问题