一、传感器
DS18B20传感器(半双工):
1.量程(测量范围)-55 - 125℃
2.精度(误差):±0.5℃
3.分辨率: 9位:0.5°C; 10位:0.25°C; 11位:0.125°C; 12位:0.0625°C。
4.接口 :GPIO
5.电压:5V

GPIO单总线:线与特性。 拉高:释放总线。 作为数据接收方时,需要释放总线
1.初始化(复位)
2.ROM操作命令(跳过ROM:0xCC)
3.存储器操作命令
4.执行/数据(44h:转换温度;BE:读取温度)
复位→发送0xCC跳过ROM→发送0x44,开启温度转换→延时→复位→发送0xCC跳过ROM→发送0xBE读取温度→读取2字节温度(s18b20 -> 51|读操作)

①主机将总线拉低480us-960us,代表发送了复位脉冲
②主机释放总线,ds18b20需要再15-60us内检测引脚是否为高电平
③主机再60-240us内检测引脚是否为低电平,如果是低电平,代表ds18b20回复了存在脉冲
④主机释放总线,引脚呈现高电平
cs
#include <reg51.h>
#include "ds18b20.h"
#include "delay.h"
#include <intrins.h>
#define DQ_HIGH (P3 |= (1 << 7))
#define DQ_DOWN (P3 &= ~(1 << 7))
#define DQ_CHECK ((P3 & (1 << 7)) != 0)
int ds18b20_reset(void)
{
int time = 0;
//复位脉冲
DQ_DOWN;
Delay10us(70);
DQ_HIGH;
Delay10us(6);
//等待低电平到来
while(DQ_CHECK && time < 30)
{
Delay10us(1);
time++;
}
if(time >= 30)
{
return -1;
}
//等待高电平到来
time = 0;
while(!DQ_CHECK && time < 30)
{
Delay10us(1);
time++;
}
if(time >= 30)
{
return -1;
}
return 1;
}
//向de18b20发送一个字节数据
void write_de18b20(unsigned char dat)
{
for(i = 0;i < 8;i++)
{
if(dat & 1)
{
DQ_DOWN;
_nop_();
_nop_();
DQ_HIGH;
Delay10us(5);
}
else
{
DQ_DOWN;
Delay10us(6);
DQ_HIGH;
}
dat >>= 1;
}
}

写0时序:主机将总线拉低至少60us,不超过120us,ds18b20在60us内采样引脚电平,若是
低电平,则代表主机发送了bit0主机释放总线,引脚变为高电平。
写1时序:主机将总线拉低大于1us释放总线,引脚变为高电平ds18b20在45us内对引脚的电
平进行采样,若是高电平,代表主机发送了bit1。

读时序:
主机将总线拉低大于1us,
释放总线,引脚呈现高电平,
主机再15us内对引脚电平进行采样,
若采到一个低电平,代表ds18b20发送了bit0。