好学天上 发表于 2024-5-29 16:53:05

可以帮我看一下这个温度读出来为什么是0吗

本帖最后由 好学天上 于 2024-5-29 17:56 编辑

按照老师的一样写的,只是有些函数变量命名大小写不一样,不知道为什么读取出来温度都是0


也许存在一些很低级的错误吗只是我看了两三遍还没看出来{:dizzy:}

Lkck8210 发表于 2024-5-29 17:12:25

请把整个Keil项目打包再上传
你现在只上传了个Keil项目

好学天上 发表于 2024-5-29 17:16:26

Lkck8210 发表于 2024-5-29 17:12
请把整个Keil项目打包再上传
你现在只上传了个Keil项目

好的我上传了压缩包

angmall 发表于 2024-5-29 21:08:15

好学天上 发表于 2024-5-29 17:16
好的我上传了压缩包

你的DS18B20 时序不对。
用这个可以读到。


#include "ds18b20.h"

u16 temp;//温度值
bit minusflag; //温度正负,0正1负

/*
void Delay480us()                //@22.1184MHz
{
        unsigned long i;

        i = 2653UL;
        while (i) i--;
}

void Delay60us()                //@22.1184MHz
{
        unsigned long i;

        _nop_();
        _nop_();
        i = 330UL;
        while (i) i--;
}
void Delay1us()                //@22.1184MHz
{
        unsigned long i;

        _nop_();
        i = 4UL;
        while (i) i--;
}
*/
void delay_us(u8 us)
{
        unsigned long edata i;

    do{
      //usrNOP();
      //usrNOP();
        _nop_();
        i = 4UL;
        while (i) i--;
                       
    }while(--us);
}

/*
void ds18b20_Reset(void)//复位
{
        bit flag = 1;
        while(flag)
        {
                DQ = 0;
                Delay480us();
                DQ = 1;
                Delay60us();
                flag = DQ;
                Delay480us();
        }
}

void ds18b20_Write_0(void)//写逻辑0码
{
        DQ = 0;
        Delay60us();
        DQ = 1;
        Delay1us();
        Delay1us();
}

void ds18b20_Write_1(void) //写逻辑1码
{
        DQ = 0;
        Delay1us();
        Delay1us();
        DQ = 1;
        Delay60us();
}


bit ds18b20_Read(void)    //读取电平
{
        bit state;
        DQ = 1;
        Delay1us();
        Delay1us();       
        DQ = 0;
        Delay1us();
        Delay1us();
        DQ = 1;
        Delay1us();
        Delay1us();
        state = DQ;
        Delay60us();
       
        return state;
}

void ds18b20_WriteByte(u8 dat)//写一个字节
{
        u8 i;
        for(i=0;i<8;i++)
        {
                if(dat&0x01)
                        ds18b20_Write_1();
                else
                        ds18b20_Write_0();
                dat >>= 1;
        }
}
u8 ds18b20_ReadByte(void)   //读取一个字节
{
        u8 i;
        u8 dat = 0;
        for(i=0;i++;i<8)
        {
                dat >>= 1;
               
                if(ds18b20_Read())
                        dat |= 0x80;
        }
        return dat;
}
*/
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
    CY = 1;
    while (CY)
    {
      DQ = 0;                     //送出低电平复位信号
      delay_us(240);            //延时至少480us
      delay_us(240);
      DQ = 1;                     //释放数据线
      delay_us(60);               //等待60us
      CY = DQ;                  //检测存在脉冲
      delay_us(240);            //等待设备释放数据线
      delay_us(180);
    }
}

/**************************************
从DS18B20读1字节数据
**************************************/
u8 DS18B20_ReadByte()
{
    u8 i;
    u8 dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
      dat >>= 1;
      DQ = 0;                     //开始时间片
      delay_us(1);                //延时等待
      DQ = 1;                     //准备接收
      delay_us(1);                //接收延时
      if (DQ) dat |= 0x80;      //读取数据
      delay_us(60);               //等待时间片结束
    }

    return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(u8 dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
      DQ = 0;                     //开始时间片
      delay_us(1);                //延时等待
      dat >>= 1;                  //送出数据
      DQ = CY;
      delay_us(60);               //等待时间片结束
      DQ = 1;                     //恢复数据线
      delay_us(1);                //恢复延时
    }
}

u16 ds18b20_ReadTemp(void)    //读取并换算温度,并返回值
{
        u8 tempH;
        u8 tempL;
        u16 temperature;
       
        ds18b20_Reset();
        ds18b20_WriteByte(0xCC);
        ds18b20_WriteByte(0x44);
        while(!DQ);
       
        ds18b20_Reset();
        ds18b20_WriteByte(0xCC);
        ds18b20_WriteByte(0xBE);
       
        tempL = ds18b20_ReadByte();
        tempH = ds18b20_ReadByte();
       
        if(tempH & 0xF8)
        {
                minusFlag = 1;
                temperature = ((tempH<<8) | tempL);
                temperature = (~temperature)+1;
                temperature = temperature*10*0.0625;
        }
        else
        {
                minusFlag = 0;
                temperature = ((tempH<<8) | tempL);
                temperature = temperature*10*0.0625;
        }
        temp = temperature;
        return temperature;
}

angmall 发表于 2024-5-29 21:39:33

找到了。


u8 ds18b20_ReadByte(void)   //读取一个字节
{
      u8 i;
      u8 dat = 0;
       for(i=0;i++;i<8) for(i=0;i<8;i++)
      {
                dat >>= 1;
               
                if(ds18b20_Read())
                        dat |= 0x80;
      }
      return dat;
}

晓飛飛 发表于 2024-5-29 22:47:59

angmall 发表于 2024-5-29 21:39
找到了。




真是细心啊{:4_250:}

好学天上 发表于 2024-5-30 08:57:54

angmall 发表于 2024-5-29 21:39
找到了。




哎呀还真是 我就知道肯定是我敲代码的时候又思维乱飞了 感谢感谢如此细心的你{:handshake:}

angmall 发表于 2024-5-30 19:30:17

好学天上 发表于 2024-5-30 08:57
哎呀还真是 我就知道肯定是我敲代码的时候又思维乱飞了 感谢感谢如此细心的你 ...

很高兴能帮得到你。

敲代码要持之以恒,虚心诚恳的去观察。

好学天上 发表于 2024-5-31 09:29:36

angmall 发表于 2024-5-30 19:30
很高兴能帮得到你。

敲代码要持之以恒,虚心诚恳的去观察。

【乖巧点头】{:biggrin:}
页: [1]
查看完整版本: 可以帮我看一下这个温度读出来为什么是0吗