[已解决] DS18B20温度传感器各种奇奇怪怪的问题

在今天这个风和日丽的下午,铁铁遇到了烦心事,那就是,

出现了逻辑上没有问题的问题...

因为铁铁我是第一次碰到这样的情况,就是代码逻辑没得问题,但就是不行,第一次碰到这样的情况多少有些懵逼。

先看一下我的代码:

//定义初始化复位函数
void DS18B20_Reset(void) {
	DS18B20_IO_OUT();	//配置为输出
	DS18B20_DQ_OUT = 0; //拉低
	delay_us(500);	//延时500微秒
	DS18B20_DQ_OUT = 1; //帮上拉电阻拉高
	delay_us(30); //延时30微秒

	u8 retry = 0;
	DS18B20_IO_IN(); //将总线配置为输入,释放控制器,让给外设
	while(DS18B20_DQ_IN && retry < 240) { //检测DS18B20是否在240us以内给低电平应答信号
		retry++;
		delay_us(1);
	}

    if(retry >= 240){
	 printf("Reset Failed.\n");
    }
    else {
	 printf("Reset Successfully.\n");
	}
 //注意这里printf重定向到USART1了,可以直接在串口助手那里看里面的字符串。

}

铁铁我自从写完这个代码,顺利跑起来之后,就没再管过了,我是后续做物联网的时候,这个DS18B20复位函数里面的printf("Reset Successfully.\n")咋串口助手里看的我心烦,我心想没什么用的东西就注释掉吧~

结果一注释不要紧,我陷入了深深的自我怀疑,我是谁,我在哪,我在干什么 (╯‵□′)╯︵┻━┻!!!

注释掉这个printf("Reset Successfully.\n")后,代码竟然跑不起来了!!!!!!

(我小小年纪就能写屎山,好好好)

问题不大,先看看时序图压压惊:

其实从时序图很明显就可以知道,这个🐕输出函数在这里充当了延时函数,当然这是我解决完之后才这样觉着的。。

这是我的解决思路:

1.先定位到底是不是 这个输出函数出现的问题,先针对性的对这个函数进行各种折磨,具体而言就是,注释,在拆开注释,然后换个相同的替代逻辑写一遍,再注释,最终确定了是这个函数出现了问题。

2.既然确定这个函数有问题,我脑子里立马就觉得这个玩意该不会是个充当个“伪延时函数”吧?于是说做就做,然后手动用推挽输出上拉再延时delay_us(30),发现还是报错,就觉着可能不是延时的问题。(这里我犯了个重大错误,就是想当然的觉得延时30微秒就足够了,我当时想着我都帮你上拉电阻给拉上去了,还延时那么长时间干嘛?结果就是各种碰壁之后,又回到了延时函数这里)

3.既然确定是延时函数有问题,就直接delay_us(500),欸,不报错了就~

总结:找到出问题的函数后,不要浮躁,相信自己的总体框架没问题!

既然刚开始就想到是不是输出函数在这里充当了延时函数,为什么不多在延时函数上做文章呢而是跑去找其他问题了呢?

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值