找回密码
 立即注册
查看: 343|回复: 8

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

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-03-29 17:35:27

7

主题

62

回帖

537

积分

高级会员

积分
537
发表于 2024-5-29 16:53:05 | 显示全部楼层 |阅读模式
本帖最后由 好学天上 于 2024-5-29 17:56 编辑

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


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

22.DS18B20温度读取.zip

356.66 KB, 下载次数: 41

好好学习天天向上
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-5-29 17:12:25 | 显示全部楼层
请把整个Keil项目打包再上传
你现在只上传了个Keil项目
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-03-29 17:35:27

7

主题

62

回帖

537

积分

高级会员

积分
537
发表于 2024-5-29 17:16:26 | 显示全部楼层
Lkck*** 发表于 2024-5-29 17:12
请把整个Keil项目打包再上传
你现在只上传了个Keil项目

好的我上传了压缩包
好好学习天天向上
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:528
  • 最近打卡:2025-05-08 00:28:04

10

主题

1163

回帖

5203

积分

论坛元老

积分
5203
发表于 2024-5-29 21:08:15 | 显示全部楼层
好学*** 发表于 2024-5-29 17:16
好的我上传了压缩包

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


  1. #include "ds18b20.h"
  2. u16 temp;  //温度值
  3. bit minusflag; //温度正负,0正1负
  4. /*
  5. void Delay480us()                //@22.1184MHz
  6. {
  7.         unsigned long i;
  8.         i = 2653UL;
  9.         while (i) i--;
  10. }
  11. void Delay60us()                //@22.1184MHz
  12. {
  13.         unsigned long i;
  14.         _nop_();
  15.         _nop_();
  16.         i = 330UL;
  17.         while (i) i--;
  18. }
  19. void Delay1us()                //@22.1184MHz
  20. {
  21.         unsigned long i;
  22.         _nop_();
  23.         i = 4UL;
  24.         while (i) i--;
  25. }
  26. */
  27. void delay_us(u8 us)
  28. {
  29.         unsigned long edata i;
  30.     do{
  31.         //usrNOP();
  32.         //usrNOP();
  33.         _nop_();
  34.         i = 4UL;
  35.         while (i) i--;
  36.                        
  37.     }while(--us);
  38. }
  39. /*
  40. void ds18b20_Reset(void)  //复位
  41. {
  42.         bit flag = 1;
  43.         while(flag)
  44.         {
  45.                 DQ = 0;
  46.                 Delay480us();
  47.                 DQ = 1;
  48.                 Delay60us();
  49.                 flag = DQ;
  50.                 Delay480us();
  51.         }
  52. }
  53. void ds18b20_Write_0(void)  //写逻辑0码
  54. {
  55.         DQ = 0;
  56.         Delay60us();
  57.         DQ = 1;
  58.         Delay1us();
  59.         Delay1us();
  60. }
  61. void ds18b20_Write_1(void) //写逻辑1码
  62. {
  63.         DQ = 0;
  64.         Delay1us();
  65.         Delay1us();
  66.         DQ = 1;
  67.         Delay60us();
  68. }
  69. bit ds18b20_Read(void)    //读取电平
  70. {
  71.         bit state;
  72.         DQ = 1;
  73.         Delay1us();
  74.         Delay1us();       
  75.         DQ = 0;
  76.         Delay1us();
  77.         Delay1us();
  78.         DQ = 1;
  79.         Delay1us();
  80.         Delay1us();
  81.         state = DQ;
  82.         Delay60us();
  83.        
  84.         return state;
  85. }
  86. void ds18b20_WriteByte(u8 dat)  //写一个字节
  87. {
  88.         u8 i;
  89.         for(i=0;i<8;i++)
  90.         {
  91.                 if(dat&0x01)
  92.                         ds18b20_Write_1();
  93.                 else
  94.                         ds18b20_Write_0();
  95.                 dat >>= 1;
  96.         }
  97. }
  98. u8 ds18b20_ReadByte(void)   //读取一个字节
  99. {
  100.         u8 i;
  101.         u8 dat = 0;
  102.         for(i=0;i++;i<8)
  103.         {
  104.                 dat >>= 1;
  105.                
  106.                 if(ds18b20_Read())
  107.                         dat |= 0x80;
  108.         }
  109.         return dat;
  110. }
  111. */
  112. /**************************************
  113. 复位DS18B20,并检测设备是否存在
  114. **************************************/
  115. void DS18B20_Reset()
  116. {
  117.     CY = 1;
  118.     while (CY)
  119.     {
  120.         DQ = 0;                     //送出低电平复位信号
  121.         delay_us(240);              //延时至少480us
  122.         delay_us(240);
  123.         DQ = 1;                     //释放数据线
  124.         delay_us(60);               //等待60us
  125.         CY = DQ;                    //检测存在脉冲
  126.         delay_us(240);              //等待设备释放数据线
  127.         delay_us(180);
  128.     }
  129. }
  130. /**************************************
  131. 从DS18B20读1字节数据
  132. **************************************/
  133. u8 DS18B20_ReadByte()
  134. {
  135.     u8 i;
  136.     u8 dat = 0;
  137.     for (i=0; i<8; i++)             //8位计数器
  138.     {
  139.         dat >>= 1;
  140.         DQ = 0;                     //开始时间片
  141.         delay_us(1);                //延时等待
  142.         DQ = 1;                     //准备接收
  143.         delay_us(1);                //接收延时
  144.         if (DQ) dat |= 0x80;        //读取数据
  145.         delay_us(60);               //等待时间片结束
  146.     }
  147.     return dat;
  148. }
  149. /**************************************
  150. 向DS18B20写1字节数据
  151. **************************************/
  152. void DS18B20_WriteByte(u8 dat)
  153. {
  154.     char i;
  155.     for (i=0; i<8; i++)             //8位计数器
  156.     {
  157.         DQ = 0;                     //开始时间片
  158.         delay_us(1);                //延时等待
  159.         dat >>= 1;                  //送出数据
  160.         DQ = CY;
  161.         delay_us(60);               //等待时间片结束
  162.         DQ = 1;                     //恢复数据线
  163.         delay_us(1);                //恢复延时
  164.     }
  165. }
  166. u16 ds18b20_ReadTemp(void)    //读取并换算温度,并返回值
  167. {
  168.         u8 tempH;
  169.         u8 tempL;
  170.         u16 temperature;
  171.        
  172.         ds18b20_Reset();
  173.         ds18b20_WriteByte(0xCC);
  174.         ds18b20_WriteByte(0x44);
  175.         while(!DQ);
  176.        
  177.         ds18b20_Reset();
  178.         ds18b20_WriteByte(0xCC);
  179.         ds18b20_WriteByte(0xBE);
  180.        
  181.         tempL = ds18b20_ReadByte();
  182.         tempH = ds18b20_ReadByte();
  183.        
  184.         if(tempH & 0xF8)
  185.         {
  186.                 minusFlag = 1;
  187.                 temperature = ((tempH<<8) | tempL);
  188.                 temperature = (~temperature)+1;
  189.                 temperature = temperature*10*0.0625;
  190.         }
  191.         else
  192.         {
  193.                 minusFlag = 0;
  194.                 temperature = ((tempH<<8) | tempL);
  195.                 temperature = temperature*10*0.0625;
  196.         }
  197.         temp = temperature;
  198.         return temperature;
  199. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:528
  • 最近打卡:2025-05-08 00:28:04

10

主题

1163

回帖

5203

积分

论坛元老

积分
5203
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-08 01:06:54
已绑定手机

35

主题

2111

回帖

2259

积分

荣誉版主

积分
2259
发表于 2024-5-29 22:47:59 | 显示全部楼层

真是细心啊
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-03-29 17:35:27

7

主题

62

回帖

537

积分

高级会员

积分
537
发表于 2024-5-30 08:57:54 | 显示全部楼层

哎呀还真是 我就知道肯定是我敲代码的时候又思维乱飞了 感谢感谢如此细心的你
好好学习天天向上
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:528
  • 最近打卡:2025-05-08 00:28:04

10

主题

1163

回帖

5203

积分

论坛元老

积分
5203
发表于 2024-5-30 19:30:17 | 显示全部楼层
好学*** 发表于 2024-5-30 08:57
哎呀还真是 我就知道肯定是我敲代码的时候又思维乱飞了 感谢感谢如此细心的你 ...

很高兴能帮得到你。

敲代码要持之以恒,虚心诚恳的去观察。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:95
  • 最近打卡:2025-03-29 17:35:27

7

主题

62

回帖

537

积分

高级会员

积分
537
发表于 2024-5-31 09:29:36 | 显示全部楼层
angm*** 发表于 2024-5-30 19:30
很高兴能帮得到你。

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

【乖巧点头】
好好学习天天向上
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-8 02:16 , Processed in 0.187898 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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