OpenEdv-开源电子网

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

昨晚熬到2点,做了一个DS18B20的单总线,终于可以在一条总线上自动搜索ROM和读取多个温度了,不过有个Bug请大家帮忙看看

[复制链接]

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2015-1-27
在线时间
4 小时
发表于 2015-11-12 21:23:13 | 显示全部楼层 |阅读模式
昨晚熬到2点,做了一个DS18B20的单总线,终于可以在一条总线上自动搜索ROM和读取多个温度了,不过有个Bug请大家帮忙看看
Bug说明:
#define MAXNUM 5
在上面的宏定义中,MAXNUM是我定义的总线上最多挂多少个DS18B20的,但是我发现,当后面的数值小于等于4的时候都可以正常读
出ROM和温度值,当后面的
数值大于等于5的时候就不行了。大家帮帮忙。

编译环境:MDK5


实验30 18B20数字温度传感器实验.zip

361.67 KB, 下载次数: 2762

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-4-25
在线时间
11 小时
发表于 2019-5-12 23:39:36 | 显示全部楼层
搜出来的ID是一样的呢。。。程序是楼主自己写的么?
回复 支持 1 反对 0

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-10-17 22:09:21 | 显示全部楼层
阳光2260 发表于 2018-10-17 08:53
谢谢回复!你说的也是一个方法。不过我使用另外一种方法,读ROM来判断。

应答是第一步,这一步没过,后面读寄存器都是失败的
回复 支持 1 反对 0

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-11-13 11:47:59 | 显示全部楼层
注意发帖,求助帖不要发成分享帖了

仿真一下,把问题局限到一个小范围贴图,直接上工程需要很大耐心去帮忙
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-11-13 20:50:05 | 显示全部楼层
不错,这个bug,可以仿真找下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2015-6-21
在线时间
34 小时
发表于 2015-12-2 15:17:09 | 显示全部楼层
兄弟你这个怂恿什么显示的?
努力吧,骚年
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11532
金钱
11532
注册时间
2014-4-1
在线时间
1313 小时
发表于 2015-12-2 17:35:24 | 显示全部楼层
回复【4楼】好好学:
---------------------------------

普通串口软件,汉字是下位机传上来的,然后上位机按“字符”来识别。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-3-14
在线时间
3 小时
发表于 2016-3-14 12:05:52 | 显示全部楼层
是循环判断除了问题。要对栈顶值进行初始化。我试过了,可以完全通过。
u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)  
{   
    unsigned char k,l=0,ConflictBit,m,n,i;  
    unsigned char BUFFER[MAXNUM-1]={0};  //****初始化栈顶值为0,这样就可以保证循环的判断****或者在循环外对 BUFFER[0]=0;
    unsigned char ss[64];
                unsigned char s=0;  
    u8 num = 0;      
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2015-11-8
在线时间
5 小时
发表于 2016-3-16 16:03:15 | 显示全部楼层
cloudsunny 发表于 2016-3-14 12:05
是循环判断除了问题。要对栈顶值进行初始化。我试过了,可以完全通过。
u8 DS18B20_SearchROM(u8 (*pID)[8 ...

请问你是怎么用多个DS18B20测出的温度
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-3-14
在线时间
3 小时
发表于 2016-3-21 14:51:27 | 显示全部楼层
爱已欠费199581 发表于 2016-3-16 16:03
请问你是怎么用多个DS18B20测出的温度

就是下载了楼主的源程序改的。单总线搜索ROM ,匹配ROM读取每个传感器的温度值。
回复 支持 反对

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2016-4-10 23:49:41 | 显示全部楼层
ds18b20 多个挂载一条总线,读取错,还有一种原因是总线供电问题,也就是常说的总线驱动能力的问题。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
20
金钱
20
注册时间
2016-3-31
在线时间
4 小时
发表于 2016-4-18 11:54:18 | 显示全部楼层
请问你的多个1820与单片机是怎么连接的
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2016-6-30
在线时间
74 小时
发表于 2016-9-15 11:39:29 | 显示全部楼层
上午我也苦恼了半天  看到楼主发的资料 恍然大悟   感谢!
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2016-8-15
在线时间
55 小时
发表于 2016-9-15 11:55:12 | 显示全部楼层
祝中国健儿奥运好成绩
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-10-27
在线时间
10 小时
发表于 2016-10-28 20:57:45 | 显示全部楼层
cloudsunny 发表于 2016-3-14 12:05
是循环判断除了问题。要对栈顶值进行初始化。我试过了,可以完全通过。
u8 DS18B20_SearchROM(u8 (*pID)[8 ...

大神,怎么改啊,我怎么试,在串口都不能显示温度,搜索不到DS18B20
回复 支持 反对

使用道具 举报

16

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
853
金钱
853
注册时间
2016-4-7
在线时间
151 小时
发表于 2016-12-13 11:18:32 | 显示全部楼层
我也试过这个单总线,发现有一个现象,就是在进行序列匹配的时候不能发生中断,否则读出来的就是错误数据
回复 支持 反对

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2017-6-12
在线时间
84 小时
发表于 2018-10-16 10:29:44 | 显示全部楼层
楼主,我使用你的程序,单总线上只接一个DS18B20的话,返回个数也为0,这是什么原因啊?
另外,我主要是想检测单总线上有没有接DS18B20,请问有没有什么好的方法啊?
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-10-17 00:31:03 | 显示全部楼层
阳光2260 发表于 2018-10-16 10:29
楼主,我使用你的程序,单总线上只接一个DS18B20的话,返回个数也为0,这是什么原因啊?
另外,我主要是想 ...

复位下获取有没有应答即可知道。
回复 支持 反对

使用道具 举报

14

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
407
金钱
407
注册时间
2017-6-12
在线时间
84 小时
发表于 2018-10-17 08:53:52 | 显示全部楼层
Acuity 发表于 2018-10-17 00:31
复位下获取有没有应答即可知道。

谢谢回复!你说的也是一个方法。不过我使用另外一种方法,读ROM来判断。
回复 支持 反对

使用道具 举报

32

主题

883

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4031
金钱
4031
注册时间
2015-11-14
在线时间
545 小时
发表于 2018-10-19 20:42:13 | 显示全部楼层
有可能是驱动能力的问题,强上拉试试,或者严格按照时序来操作
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-11-2
在线时间
32 小时
发表于 2018-12-22 21:31:47 | 显示全部楼层
感谢楼主分享,F1的程序已经成功移植到F4上面,节省了很多时间。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2019-5-31
在线时间
20 小时
发表于 2019-8-13 17:29:40 | 显示全部楼层
请问,多个传感器怎么和开发板相接呢
回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2019-7-21
在线时间
61 小时
发表于 2019-8-16 17:15:46 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-9-1
在线时间
2 小时
发表于 2019-9-11 17:34:54 | 显示全部楼层
学习研究一下!赞
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2019-4-28
在线时间
58 小时
发表于 2019-11-25 10:55:30 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-5 12:51:40 | 显示全部楼层
有谁可以说一下多路IO口,每个口挂多个18B20的思路
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2020-12-18
在线时间
4 小时
发表于 2021-1-21 16:16:44 | 显示全部楼层
出现这种序列号是什么出错了呀? 55 55 55 55 55 55 55 D5
回复 支持 反对

使用道具 举报

3

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2019-7-21
在线时间
61 小时
发表于 2021-3-28 19:23:13 | 显示全部楼层

学习研究一下
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2024-6-5
在线时间
63 小时
发表于 昨天 10:50 | 显示全部楼层
为什么把读取温度的函数放在任务里执行就会读出错误温度    void led0_task(void *p_arg)
{
        OS_ERR err;
        while(1)
        {
                LED0 = !LED0;
    Temp = DS18B20_ReadDesignateTemper(ID_Buff[0]);  
    printf("\r\n 第1个DS18B20温度为:%.2f ℃",Temp/100.0);
                OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_PERIODIC,&err);//延时500ms
        }
},仿真看id读取是没问题的
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 22:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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