新手上路
- 积分
- 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;
} |
|