配置DS18B20温度传感器

配置初始化函数

DS18B20的通信协议为单总线通信协议

首先由主机发送一个复位脉冲约480-960us;然后总线被拉高;在15-60us之后传感器向单片机发送一个约60-240us的存在脉冲,然后总线被拉高。

uint8_t DS18B20_Rst(void)
{DS18B20_GPIO_Config ();DS18B20_DQ_1;DS18B20_Mode_Out_PP();DS18B20_DQ_0;Delay_us(750);DS18B20_DQ_1;DS18B20_Mode_IPU();Delay_us(70);if(DS18B20_DQ_IN() == 0){Delay_us(240);if(DS18B20_DQ_IN() == 1)return 0;}else return 1;
}

配置写函数

当主机将数据线从高逻辑级别拉到低逻辑级别时,将启动写入时隙。有两种类型的写时槽:写1时槽和写0时槽。所有写入时隙的持续时间必须至少为60µs,且每个写入周期之间的恢复时间至少为1µs以上。在DQ线下降后,DS18B20在15µs到60µs的窗口中对DQ线进行采样。

如果DQ为高,则会出现Write1。如果DQ为低低,则会出现Write0。

  1. 要使主机生成写1时隙,必须将数据线拉到逻辑低级别,然后释放,允许数据线在写时隙开始后的15µs内拉到高级别。

  2. 要使主机生成写0时隙,必须将数据线拉到逻辑低级别,并在低级别保持60µs。

void Write_Byte(uint8_t dat)
{uint8_t tem = 0,i = 0;DS18B20_Mode_Out_PP();for(i = 0; i < 8;i++){tem = dat & 0x01;dat = dat >> 1;if(tem == 0){DS18B20_DQ_0;Delay_us(70);DS18B20_DQ_1;Delay_us(5);}if(tem == 1){DS18B20_DQ_0;Delay_us(5);DS18B20_DQ_1;Delay_us(60);}}
}

配置读函数

当要从DS18B20读取数据时,主机生成读取时隙。当主机将数据线从逻辑高级级别到逻辑低级别时,启动读取时隙。数据线必须保持在低逻辑级别至少1µs;来自DS18B20的输出数据在读取时隙边缘下降后15µs有效。因此,主机必须将DQ引脚拉低,以便从读取槽的开始读取其15µs的状态。在读取时隙结束时,DQ引脚将通过外部上拉电阻重新拉高。所有读取时间槽的持续时间必须至少为60µs,每个读取时间槽之间的恢复时间至少为1-µs。

uint8_t Read_Byte(void)
{uint8_t dat = 0,num = 0,i = 0;for(i = 0; i < 8;i++){uint8_t num = 0;DS18B20_Mode_Out_PP();DS18B20_DQ_0;Delay_us(15);DS18B20_Mode_IPU();if(DS18B20_DQ_IN() == 0)num = 0;elsenum = 1;Delay_us(50);dat = (num << i) | dat;}return dat;
}

供电配置

要搭配硬件电路使用

void Power_Select(uint8_t value)
{DS18B20_WriteByte(0xB4);if(value == 1)DS18B20_WriteByte(1);if(value == 0)DS18B20_WriteByte(0);
}

读取芯片ID

void DS18B20_ReadId ( uint8_t * ds18b20_id )
{uint8_t uc;DS18B20_WriteByte(0x33);    //发送读取ID的命令for ( uc = 0; uc < 8; uc ++ )ds18b20_id [ uc ] = DS18B20_ReadByte();
}

跳过匹配ROM

static void DS18B20_SkipRom ( void )
{DS18B20_Rst();      DS18B20_WriteByte(0XCC);
}

匹配ROM

static void DS18B20_MatchRom ( void )
{DS18B20_Rst();    DS18B20_WriteByte(0X55);
}

读取温度的两种模式

匹配ROM的情况下

float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
{uint8_t tem_h, tem_l, i;short s_tem;float f_tem;//匹配ROMDS18B20_Rst();     DS18B20_WriteByte(0X55);for(i=0;i<8;i++)DS18B20_WriteByte ( ds18b20_id [ i ] );    DS18B20_WriteByte(0X44);    //启动温度转换。//匹配ROMDS18B20_Rst();     DS18B20_WriteByte(0X55); for(i = 0; i < 8; i++)DS18B20_WriteByte ( ds18b20_id [ i ] ); DS18B20_WriteByte(0XBE);    //从暂存器中读取字节和CRC字节。  tem_l = DS18B20_ReadByte();    //tem_l接受低八位 tem_h = DS18B20_ReadByte(); //tem_h接受高八位s_tem = tem_h << 8;s_tem = s_tem | tem_l;     //s_tem存储温度的初始值//将温度转换为float型、摄氏度if( s_tem < 0 ) f_tem = (~s_tem+1) * 0.0625;  elsef_tem = s_tem * 0.0625;//返回温度的值return f_tem;
}

不匹配ROM的情况下

float DS18B20_GetTemp_SkipRom ( void )
{uint8_t tem_h, tem_l;short s_tem;float f_tem;DS18B20_SkipRom ();DS18B20_WriteByte(0X44);       //启动温度转换。DS18B20_SkipRom ();DS18B20_WriteByte(0XBE);        tem_l = DS18B20_ReadByte();         tem_h = DS18B20_ReadByte(); s_tem = tem_h << 8;s_tem = s_tem | tem_l;if( s_tem < 0 )       f_tem = (~s_tem + 1) * 0.0625;    elsef_tem = s_tem * 0.0625;return f_tem;
}

配置主函数

int main(void)
{   uint8_t uc, ucDs18b20Id [ 8 ];SysTick_Init();LED_GPIO_Config();DS18B20_GPIO_Config();USART_Config();while( DS18B20_Rst() == 1)    printf("\r\n DS18B20初始化成功 \r\n"); printf("\r\n DS18B20初始化失败 \r\n");DS18B20_ReadId ( ucDs18b20Id  );           //读取序列号printf("\r\n序列号为:0x");for ( uc = 0; uc < 8; uc ++ )             //打印序列号printf ( "%.2x", ucDs18b20Id [ uc ] );while(1){    printf ( "温度为: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) );Delay_ms(1000);   }
}

STM32之DS18B20温度传感器相关推荐

  1. STM32驱动DS18B20温度传感器

    简介:STM32F103C8T6驱动DS18B20温度传感器源码介绍. 开发平台:KEIL ARM MCU型号:STM32F103C8T6 传感器型号:DS18B20 特别提示:驱动内可能使用了某些其 ...

  2. STM32单片机学习(11) DS18B20温度传感器实验

    STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口, ...

  3. STM32一线协议-DS18B20温度传感器采样实现

    文章目录 1- DS18B20温度传感器简介 (1)简介 (2)特征 (3)引脚 2- 内部功能结构 (1)64位光刻ROM (2)温度传感器(存放数据形式) (3)配置寄存器 (4)内部存储器 4- ...

  4. 智能温度系统(C51+DS18B20温度传感器+LM016L显示屏)

    单片机课程设计,C51+DS18B20温度传感器+LM016L显示屏 重点在于两个外设的时序控制 模块化的设计结构清晰明了 一.题目 温度测量系统的设计 二.要求 1.温度测量范围:-55℃ ~ 12 ...

  5. 嵌入式设计与开发项目-DS18B20温度传感器程序设计

    嵌入式设计与开发项目-DS18B20温度传感器程序设计 一.实现的功能 二.根据功能实现代码 1.主文件main.c 2.DS18B20的头文件"ds18b20.h" 3.DS18 ...

  6. AutoLeaders控制组——51单片机学习笔记(DS18B20温度传感器、LCD1602、直流电机+PWM)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  7. 【51单片机】AT24C02存储器(I²C总线)/DS18B20温度传感器(单总线)

    目录 一.AT24C02存储器 1.AT24C02存储器介绍 2.存储器简化模型 3.AT24C02存储器原理图 二.I²C总线 1.I²C总线的介绍 2.I²C电路 3.I²C时序图 3.1I²C开 ...

  8. 基于汇编语言的DS18B20温度传感器设计

    1 概述 1.1 课题内容 利用温度传感器DS18B20与MCS-51单片机结合来测量温度,通过一根单总线连接,即可直接读出被测温度,读出或写入信息只需要一根数据线.读出的数据用LED数码管显示,显示 ...

  9. 51单片机使用LCD1602显示DS18B20温度传感器温度

      使用LCD1602显示DS18B20温度传感器温度.关于DS18B20和LCD的原理,我就不再叙述了,大家自行查找,网上可以找到好多.   使用Proteus仿真.(需要仿真和Keil工程文件的可 ...

最新文章

  1. vue 组件以字符串插入_今日分享:vue3多层嵌套组件如何访问到最外层组件的数据?...
  2. centos树莓派版本安装ssh_Raspberry Pi 4B(树莓派4B)远程ssh和jupyter lab环境搭建记录
  3. ABI(Application Binary Interface)
  4. VB2005.Net 环境下使用Jmail组件发送邮件
  5. 11134 - Fabled Rooks
  6. WORD 如何在方框里打勾?
  7. HDU1084 What Is Your Grade?【排序+水题】
  8. GeoHash入门及应用
  9. 解析UML的要点与应用
  10. 毕设题目:Matlab语音隐写
  11. int与byte之间的相互转化
  12. 移动方块java,技术编辑教你解决Java移动方块触碰边界反弹
  13. 三维重建笔记_基于图像的大规模场景三维建模overview
  14. jenkins配置360加固脚本(python版)
  15. 怎么把单个的pdf文件合并在一起?怎么把几个单独的pdf文件合并为一个?
  16. 修復Windows無法存取指定的裝置路徑或檔案
  17. Windows Server 2003 Key
  18. PMP备考错题集-模拟题一
  19. TP5 操作excel 导出
  20. 一些冷门却有用的小知识

热门文章

  1. 苹果官方文档阅读的入门
  2. linux安装ffmpeg版本太多,linux 下载及安装ffmpeg
  3. 如何找到Xcode中下载的Provisioning Profile文件
  4. python学习笔记4-简单代码
  5. Windows无法连接到Group Policy Client服务
  6. 数据看Kobe,请让我以这样的方式说再见
  7. python将双反斜杠“\\“替换成单反斜杠“\“
  8. linkeybpm-联科BPM 使用总结
  9. 贪心——排序不等式——排队打水
  10. 周末直播活动|Jenkins共享库实践