OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5649|回复: 4

求助 DS18B20 程序问题

[复制链接]

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-6-7
在线时间
2 小时
发表于 2015-9-30 21:53:24 | 显示全部楼层 |阅读模式
5金钱
   
 最近学  DS18B20 的实验,对于第二十八章 DS18B20数字温度传感器实验 中
部分程序代码 不是很懂,请求帮助。在实验代码中,给出了 检测DS18B20是否
存在的 源码,对于这部分不是很懂,代码如下:

//等待 DS18B20 的回应
//返回 1:未检测到 DS18B20 的存在
//返回 0:存在
u8 DS18B20_Check(void)   
{   
u8 retry=0;
DS18B20_IO_IN();//SET PA0 INPUT  
    while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};  
if(retry>=200)return 1;
else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)return 1;    
return 0;
}

 请问这里为什么会用 两个 while 循环,而且 判断条件不一样,谢谢!



最佳答案

查看完整内容[请看2#楼]

就是判断DS18B20_DQ_IN的电平 想看懂,去看DS18B20的数据手册,结合着看.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-30 21:53:25 | 显示全部楼层
就是判断DS18B20_DQ_IN的电平
想看懂,去看DS18B20的数据手册,结合着看.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-6-7
在线时间
2 小时
 楼主| 发表于 2015-9-30 22:40:35 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
恩 好的,谢谢
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2020-3-2
在线时间
18 小时
发表于 2020-4-22 21:01:04 | 显示全部楼层
我的理解是这样的:
//检测DS18B20因进入接收模式而产生的低电平应答脉冲
//返回1:未检测到DS18B20的存在
//返回0:已检测到DS18B20的存在
//单总线上,在复位脉冲后(等待应答脉冲时),总线上处于DS18B20_Reset函数里的DS18B20_DQ_OUT=1(高电平)
//因而所要判断的低电平持续信号应该是在240us(任意一段较长的时间)内,有接之前的高电平的一段不长于240us的低电平(该段低电平即是应答脉冲),再之后总线上又会回到高电平并持续下去
u8 DS18B20_Check(void)      
{
        u8 i=0;
        DS18B20_IO_IN();
        while(DS18B20_DQ_IN==1&&i<240)        //当DS18B20持续为高电平不变(只有后接低电平才会跳出该循环),可由此计算该段高电平时长
        {
                delay_us(1);
                i++;
        }         
        if(i>=240)                            //若240us内都未接收到任何低电平信号,则表示未检测到DS18B20存在
                return 1;                        
        else i=0;                             //若在240秒内的任何高电平信号后一旦开始接低电平 则i清0并开始计算低电平信号时间
        while(DS18B20_DQ_IN==0&&i<240)        //只有再接高电平才会跳出该循环,可由此计算该段低电平时长
        {
                delay_us(1);
                i++;
        }
        if(i>240)                             //若所接收的低电平信号时长大于240us(超时),则表示未检测到DS18B20存在               
                return 1;
        else                                  //符合条件的低电平应答脉冲,函数返回0,表示已检测到DS18B20存在                 
                return 0;
}
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2020-9-27
在线时间
23 小时
发表于 2020-10-30 19:21:50 | 显示全部楼层
renyu 发表于 2020-4-22 21:01
我的理解是这样的:
//检测DS18B20因进入接收模式而产生的低电平应答脉冲
//返回1:未检测到DS18B20的存在 ...

对  探索者板子程序的第一个循环是while (DS18B20_DQ_IN&&retry<200)   200应该改成240
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 13:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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