stm32-DS18B20原理及代码解读
目录
一、基础知识
1.功能:高精度温度检测
2.应用范围
3.硬件电路连接
二、底层代码原理分析
步骤1
步骤2
步骤3
一、基础知识
1.功能:高精度温度检测
测量范围:为-55°C 到+125°C。在-10°C 到+85°C 范围内 最大误差为±0.4 °C
内置功能:可以设定数字转换精度 和测温速度,可自行设置报警值,可编程的 ID 序列号。
2.应用范围
便携应用,手机与穿戴设备 ,温度监控 , 粮情监测 , 智能家电系统 , 水温测量 ,建筑、设备或机房内部温度监测系统 , 过程监测和控制系统
3.硬件电路连接



二、底层代码原理分析
访问 DS18B20 的传输序列如下:
步骤 1 初始化
步骤 2 ROM 指令(跟随任意必需的数据 交换)
步骤 3 DS18B20 功能指令(跟随任意必 需的数据交换)
步骤1
初始化 通过单线总线的所有执行(处理)都从一个初 始化序列开始。初始化序列包括一个由总线控制器 发出的复位脉冲和跟随其后由从机发出的存在脉 冲。 存在脉冲让总线主机知道从设备(如 DS18B20)在总线上且已准备好运行。
当 DS18B20 发送存在脉冲以响应复位脉冲,其向 主机表明它挂在总线上,并且已经准备好运行。在 初始化序列过程中,主机通过将单总线拉低至少 480 µs 来发出复位脉冲。总线主机随后释放总线进入接收模式。当总线被释放后,5kΩ 上拉电阻会把 总线拉高。当 DS18B20 检测到这个上升沿,它等待 15µs 到 60µs 然后通过把单总线拉低 60µs 到 240µs 来发出存在脉冲。

由此我们得到初始化代码:
主机发送
void DS18B20_Rst(void)
{ DS18B20_IO_OUT(); //SET PG11 OUTPUTDS18B20_DQ_OUT=0; //拉低DQdelay_us(750); //拉低750usDS18B20_DQ_OUT=1; //DQ=1 delay_us(38); //38US
}
从机响应
u8 DS18B20_Check(void)
{ u8 retry=0;DS18B20_IO_IN(); while (DS18B20_DQ_IN);while (!DS18B20_DQ_IN&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1; return 0;
}
步骤2
ROM 指令(跟随任意必需的数据交换)
当总线主机检测到存在脉冲,就可以发布 ROM 指令。这些指令运作于每个从设备唯一的 64 位 ROM 编码而且如果有多个从设备挂在单总线 上,主机可以单独寻址特定的从设备。这些指令也 使得主机可以决定总线上有多少什么类型的设备, 以及是否有任何设备满足了报警条件。共有 5 个 ROM 指令,每个 8 位长。主设备必须在发布 DS18B20 的功能指令之前发布一个合适的 ROM 指令
想了解如何发一个ROM指令,我们先要了解如何发一个位。
“写 1”时隙和“写 0”时隙。 总线主机通过写1 时隙把一个逻辑1写入DS18B20, 通过写 0 时隙把一个逻辑 0 写入 DS18B20。所有 写时隙必须持续最少 60µs,并且两个写时隙之间至 少有 1µs 的恢复时间。
要产生写 1 时隙,把单总线拉低之后,总线主机 必须在 15µs 内释放单总线。总线被释放后,5kΩ 上 拉电阻会把总线拉高。要产生一个写 0 时隙,把单 总线拉低之后,总线主机必须在整个时隙期间持续 保持总线低(至少 60µs)。

由此得到代码:
void DS18B20_Write_Bite(u8 dat) { DS18B20_IO_OUT();switch()case dat:{DS18B20_DQ_OUT=0; // Write 1delay_us(7); DS18B20_DQ_OUT=1;delay_us(60);break;} case dat:{DS18B20_DQ_OUT=0; // Write 0delay_us(90); DS18B20_DQ_OUT=1;delay_us(7);break;}
}
我们简单升级优化一下代码(写入一个字节):
void DS18B20_Write_Byte(u8 dat) { u8 j;u8 testb;DS18B20_IO_OUT(); //SET PG11 OUTPUT;for (j=1;j<=8;j++) {testb=dat&0x01;dat=dat>>1;if (testb) {DS18B20_DQ_OUT=0; // Write 1delay_us(7); DS18B20_DQ_OUT=1;delay_us(60); }else {DS18B20_DQ_OUT=0; // Write 0delay_us(90); DS18B20_DQ_OUT=1;delay_us(7); }}
}
那如何读呢?
读时隙的产生是通过主机拉低单总线至少 1µs 然后释放总线来实现 ,主机发起读时隙之后,DS18B20 会开 始在总线上传输 1 或 0。DS18B20 通过保持总线高 发送 1 并通过拉低总线发送 0。当传输 0 的时候, DS18B20 会在时隙结束时释放总线,之后总线会被 上拉电阻拉回高空闲状态。DS18B20 的输出数据在 启动时隙的下降沿后 15µs 之内有效。所以,主机必 须在时隙启动之后 15µs 之内释放总线并采样总线 状态。

所以我们得到代码:
u8 DS18B20_Read_Bit(void)
{u8 data;DS18B20_IO_OUT(); DS18B20_DQ_OUT=0; delay_us(2);DS18B20_DQ_OUT=1; delay_us(5);DS18B20_IO_IN();
// delay_us(1);if(DS18B20_DQ_IN)data=1;else data=0; delay_us(50); return data;
}
根据手册我们可以得知不同ROM 操作指令的作用按需求发送。
步骤3
DS18B20 功能指令
当总线主机使用一个 ROM 指令寻址一个它希 望与之通讯的 DS18B20 之后,主机可以发布 DS18B20 的功能指令之一。这些指令允许主机从 DS18B20 的暂存器写或读数据,发动温度转换以及 了解供电模式
根据手册我们可以得知不同DS18B20 功能指令的作用按需求发送。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
