请选择 进入手机版 | 继续访问电脑版
查看: 733|回复: 8

[原创] 再玩DS18B20

[复制链接]

该用户从未签到

66

主题

1485

帖子

92

蝴蝶豆

版主

最后登录
2019-3-25
发表于 2019-1-11 19:37:43 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2019-1-11 19:39 编辑

        2012年刚学51单片机的时候,玩过DS18B20,忘的差不多了。最近再次用到,记一片流水账,加深理解,以防又忘掉。

1、整体把握
(1)读写数据都是低位先行;
(2)默认12bit,可以配置为9101112bit,精度0.50.250.1250.0625
3)符号位S0,表示正值,符号位s1表示负值。
0.png

2、芯片检测
1.png
  1. static uint8_t DS18B20_Check(void)
  2. {
  3.   uint8_t retry=0;
  4.   
  5.   while(DS18B20_DQ_READ()&&retry<200)
  6.   {
  7.     retry++;
  8.     _delay_us(1);
  9.   }
  10.   if(retry>=200)
  11.   {
  12.     return 0;//未检测到设备
  13.   }
  14.   else
  15.   {
  16.     retry=0;
  17.   }
  18.   
  19.   while(!DS18B20_DQ_READ()&&retry<240)
  20.   {
  21.     retry++;
  22.     _delay_us(1);
  23.   }
  24.   
  25.   if(retry>=240)
  26.   {
  27.     return 0;//未检测到设备
  28.   }
  29.   else
  30.   {
  31.     return 1;   //检测到设备
  32.   }
  33. }
复制代码

3、写数据
(1)所有的写逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->低);
(2)所有的写(写1位)最少持续60us,相邻两个写之间大于1us
(3)DS18B20在第写信号产生之后的15us-60us之间采样。
2-1.png
2.png
  1. static void DS18B20_Write_Byte(uint8_t dat)
  2. {
  3.     uint8_t j, testb;
  4.    
  5.     for (j=1;j<=8;j++)
  6.     {
  7.         testb=dat&0x01;
  8.         dat=dat>>1;
  9.         if (testb)
  10.         {
  11.             DS18B20_DQ_LOW(); // Write 1
  12.             _delay_us(2);                           
  13.             DS18B20_DQ_HIGH();
  14.             _delay_us(60);            
  15.         }
  16.         else
  17.         {
  18.             DS18B20_DQ_LOW(); // Write 0
  19.             _delay_us(60);            
  20.             DS18B20_DQ_HIGH();
  21.             _delay_us(2);                          
  22.         }
  23.     }
  24. }
复制代码
4、读数据
所有的读逻辑,都是有主机拉低总线再释放总线开始(总线电平:高->->高);
在主机产生读信号之后(下降沿),15us之内读取DS18B20

3-1.png

3.png
  1. static uint8_t DS18B20_Read_Bit(void)
  2. {
  3.   uint8_t dat;
  4.   
  5.   DS18B20_DQ_LOW();
  6.   _delay_us(2);
  7.   DS18B20_DQ_HIGH();
  8.   _delay_us(10);

  9.   if(DS18B20_DQ_READ())
  10.   {
  11.     dat=1;
  12.   }
  13.   else
  14.   {
  15.     dat=0;
  16.   }
  17.   _delay_us(45);
  18.   return dat;
  19. }

  20. static uint8_t DS18B20_Read_Byte(void)
  21. {
  22.    uint8_t i,j,dat;     
  23.    dat=0;
  24.    for (i=1;i<=8;i++)
  25.    {
  26.       j=DS18B20_Read_Bit();
  27.       dat=(j<<7)|(dat>>1);
  28.    }   
  29.    return dat;
  30. }
复制代码

5DS18B20命令
4.png







回复

使用道具 举报

该用户从未签到

25

主题

476

帖子

78

蝴蝶豆

金牌会员

最后登录
2019-3-25
发表于 2019-1-12 08:44:11 | 显示全部楼层
谢谢分享
回复

使用道具 举报

该用户从未签到

29

主题

1210

帖子

71

蝴蝶豆

论坛元老

最后登录
2019-3-25
发表于 2019-1-12 15:46:49 | 显示全部楼层
感谢分享  
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1489

帖子

3

蝴蝶豆

金牌会员

最后登录
2019-3-25
发表于 2019-1-13 08:39:00 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

该用户从未签到

66

主题

1485

帖子

92

蝴蝶豆

版主

最后登录
2019-3-25
 楼主| 发表于 2019-1-14 09:02:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

66

主题

1485

帖子

92

蝴蝶豆

版主

最后登录
2019-3-25
 楼主| 发表于 2019-1-14 09:02:47 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

66

主题

1485

帖子

92

蝴蝶豆

版主

最后登录
2019-3-25
 楼主| 发表于 2019-1-14 09:02:58 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

307

主题

1043

帖子

0

蝴蝶豆

管理员

最后登录
2019-3-25
发表于 2019-1-25 13:09:27 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

该用户从未签到

3

主题

230

帖子

0

蝴蝶豆

高级会员

最后登录
2019-3-25
发表于 2019-1-29 11:10:57 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2019-3-26 04:55 , Processed in 0.106435 second(s), 9 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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