打印
[C语言]

在实际项目中大家如何处理DS18B20的延时的?

[复制链接]
3004|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whirt_noob|  楼主 | 2016-9-20 11:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
w522930954| | 2016-9-20 11:14 | 只看该作者
都是us级别的延时 ,而且时序比较严格的情况下  都是用nop。。不影响数码管刷新啊。

使用特权

评论回复
板凳
yuanquan12345| | 2016-9-20 11:14 | 只看该作者
感觉裸编程的版主的延时方法合理。

使用特权

评论回复
地板
aozima| | 2016-9-20 11:26 | 只看该作者
主频几十M以内的直接NOP即可。
再高主频的或有流水线的芯片,最好是利用硬件 timer

使用特权

评论回复
5
ningling_21| | 2016-9-20 11:37 | 只看该作者
数码管在中断中扫描,延时就用函数就可以

使用特权

评论回复
6
dirtwillfly| | 2016-9-20 14:15 | 只看该作者
uS级就直接delay,mS级用定时器

使用特权

评论回复
7
whirt_noob|  楼主 | 2016-9-21 16:38 | 只看该作者
w522930954 发表于 2016-9-20 11:14
都是us级别的延时 ,而且时序比较严格的情况下  都是用nop。。不影响数码管刷新啊。 ...

我的影响了。。。。

使用特权

评论回复
8
whirt_noob|  楼主 | 2016-9-21 16:39 | 只看该作者
yuanquan12345 发表于 2016-9-20 11:14
感觉裸编程的版主的延时方法合理。

手里有本他的书,回头翻翻去

使用特权

评论回复
9
whirt_noob|  楼主 | 2016-9-21 16:42 | 只看该作者
aozima 发表于 2016-9-20 11:26
主频几十M以内的直接NOP即可。
再高主频的或有流水线的芯片,最好是利用硬件 timer ...

但是读取18B20的那段时间怎么处理才能不影响数码管的扫描?

使用特权

评论回复
10
whirt_noob|  楼主 | 2016-9-21 16:46 | 只看该作者
ningling_21 发表于 2016-9-20 11:37
数码管在中断中扫描,延时就用函数就可以

在读取18B20的那段时间,最少也要90多ms,读取18B20的时候不关中断就读不出来,关了中断数码管有闪烁,
这个怎么处理?求大神告知

使用特权

评论回复
11
ningling_21| | 2016-9-21 18:15 | 只看该作者
whirt_noob 发表于 2016-9-21 16:46
在读取18B20的那段时间,最少也要90多ms,读取18B20的时候不关中断就读不出来,关了中断数码管有闪烁,
...

用状态机的机制去读取温度,就解决了

使用特权

评论回复
12
renwocai| | 2016-9-21 19:15 | 只看该作者
ningling_21 发表于 2016-9-21 18:15
用状态机的机制去读取温度,就解决了

愿闻其详

使用特权

评论回复
13
john_lee| | 2016-9-21 20:06 | 只看该作者
怎么没人说用“UART”访问1-wire啊?如果有一个多余的UART,这就是最完美的方法,没有之一。
dallas在文档中早就记载了。

使用特权

评论回复
14
ayb_ice| | 2016-9-22 10:33 | 只看该作者
关键的地方关中断,

使用特权

评论回复
15
ningling_21| | 2016-9-22 10:53 | 只看该作者
本帖最后由 ningling_21 于 2016-9-22 10:55 编辑

if ( stat ==0)
{
   复位器件   stat=1;

}
else if ( stat==1)
{
  发送读温度命令
stat =2;

}

else if( stat==2)
{
   读温度
   stat=3;
}

....

使用特权

评论回复
16
mcu5i51| | 2016-9-24 08:49 | 只看该作者
whirt_noob 发表于 2016-9-21 16:46
在读取18B20的那段时间,最少也要90多ms,读取18B20的时候不关中断就读不出来,关了中断数码管有闪烁,
...

1820操作时要关中断,不过不是关中断后就读取全部数据,而是关中断-》读写一个位-》开中断;这样子,对中断最多只有几十us的延时,多数可以接受

使用特权

评论回复
17
w522930954| | 2016-9-27 10:29 | 只看该作者
ms级别的用定时器时标,
time_interrupt()  //1ms  延时
{
      time_flag++;
}

void Func()
{
      if(time_flag < 10)
            return;
      ...

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远保持一颗充满激情的心

16

主题

286

帖子

8

粉丝