找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 759|回复: 0
收起左侧

ds18b20,程序在32上可以用,在stm8上,有串口看,温度一直是0. 求帮助

[复制链接]
ID:412073 发表于 2019-11-4 12:20 | 显示全部楼层 |阅读模式
#include "stm8s.h"
#include "ds18b20.h"

/*void delay_us(u16 i)//延时子程序 精确延时
{
  TIM3_DeInit();
  TIM3_TimeBaseInit(TIM3_PRESCALER_1,1);
  while(i--)
  {
    TIM3_Cmd(ENABLE);
    while(TIM3_GetFlagStatus(TIM3_FLAG_UPDATE)!=1);
    TIM3_ClearFlag(TIM3_FLAG_UPDATE);
    TIM3_Cmd(DISABLE);
}
}*/
void delay_us(u32 i)
{
  u32 h;
  i=i*5/4;
  for(h=i;h>0;h--);
}

u8 DS18B20_Read_Byte(void)
{
    u8 i=0;
    u8 TempData=0;

    for(i=0;i<8;i++)
    {
        TempData>>=1;

        DZX_O;
        DZX_L;
        delay_us(2);
        DZX_H;
        DZX_I;
        delay_us(2);

        if(DZX_V==1)
        {
            TempData=TempData|0x80;
        }
        delay_us(40);
    }
    return TempData;
}

void DS18B20_Write_Byte(u8 dat)
{
    u8 i=0;

    DZX_O;

    for(i=0;i<8;i++)
    {
        DZX_L;
        delay_us(10);

        if((dat&0x01)==1)
        {
            DZX_H;
        }
        else
        {
            DZX_L;
        }
        delay_us(40);
        DZX_H;
        dat>>=1;
    }   
}

void DS18B20_Reset(void)
{
    DZX_O;
    DZX_L;
    delay_us(480);
    DZX_H;
    delay_us(60);   
}

float DS18B20_Get_wd(void)
{
    u8 TL=0,TH=0;
    u16 temp=0;
    float wd=0;

    DS18B20_Reset();
    DS18B20_Write_Byte(0xCC);
    DS18B20_Write_Byte(0x44);
    //delay_us(800);

    DS18B20_Reset();
    DS18B20_Write_Byte(0xCC);
    DS18B20_Write_Byte(0xBE);

    TL=DS18B20_Read_Byte();
    TH=DS18B20_Read_Byte();
    DS18B20_Reset();

    temp=TH;
    temp=(temp<<8)|TL;

    if((temp&0xF800)==0xF800)//负温度
    {   
        temp=~temp;
        temp=temp+1;
        wd=temp*(-0.0625);      
    }
    else
    {   
        wd=temp*0.0625;
    }

    return wd;
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表