你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

再玩DS18B20

[复制链接]
freeelectron 发布时间:2019-1-11 19:37
本帖最后由 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







收藏 2 评论11 发布时间:2019-1-11 19:37

举报

11个回答
sincomaster 回答时间:2019-1-12 08:44:11
谢谢分享
andey 回答时间:2019-1-12 15:46:49
提示: 作者被禁止或删除 内容自动屏蔽
epochal 回答时间:2019-1-13 08:39:00
谢谢分享!
freeelectron 回答时间:2019-1-14 09:02:33
freeelectron 回答时间:2019-1-14 09:02:47
freeelectron 回答时间:2019-1-14 09:02:58
STMCU-管管 回答时间:2019-1-25 13:09:27
谢谢分享!
xujiantj 回答时间:2019-1-29 11:10:57
谢谢分享
armfanscherry 回答时间:2019-4-8 17:12:46
谢谢分享
STM1024 回答时间:2019-4-8 20:00:16
支持一下~~
ikxlf 回答时间:2019-7-26 13:36:01
我写了一个ds18b20的万能通用代码,只是一时找不到了,不过话又说回来18b20成本太贵  用这个是在不爽

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版