一:DS18B20介绍:
DS18B20数字温度计提供9到12bit分辨率的温度测量,可以通过可编程非易失性存储单元实现温度的下限和上限报警。DS18B20采用单总线协议与上位机进行通信,只需要一根信号线和一根地线。它的温度测量范围为-55'C~+125'C(-67°Fto +257°F)。在-10°C~70°C范围内的测试精度可以达到土0.4°C。此外它还可以工作在寄生模式下,直接通过信号线对芯片供电,从而不需要额外的供电电源。
每个DS18B20都有一个全球唯一的64位序列号,可以将多个DS18B20串联在同一跟单总线上进行组网,只需要一个处理器就可以控制分布在大面积区域中的多颗DS18B20。这种组网方式特别适合HVAC环境控制,建筑、设备、粮情测温和工业测温以及过程监测控制等应用领域。
二:基本性能
采用单总线接口仅需一个端口引脚进行通信
每颗芯片具有全球唯一的64位的序列号
具有多点分布式测温功能无需外围元器件可通过数据线供电;
供电电压范围为2.5V~5.5V
测度测量范围为-55°Cto+125°C(-67°Fto+257°F)
在-10°C~70°C范围内精确度为+0.4°C温度
分辨率9-12位可选
最高12位精度下,温度转换速度小于750ms具有
用户自定义的非易失性温度报警设置
报警搜索命令识别并标识超过程序设定温度的器件
超强静电保护能力:HBM8000VMM800V
可提供3脚的TO-92封装
三:AI8051的单线控制器
单片机内部集成了一个单总线控制器。单总线控制器支持对WS2812、DS18B20、DHT11等器件的控制,并支持通用红外发送接收模式。单总线支持直接寄存器读写数据,也支持DMA方式读写数据。
DS18B20的内部寄存器
复位信号长度:{OWCFG1,OWCFG2}
时间隙长度:OWCFG3
恢复时间长度:OWCFG4
读写起始信号长度:OWCFG5
读数据有效长度:OWCFG6
存在检测高电平长度:OWCFG7
存在检测低电平长度:OWCFG8
四:软件代码:
4.1 复位DS18B20
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
CY = 1;
while (CY)
{
DQ = 0; //送出低电平复位信号
delay_us(240); //延时至少480us
delay_us(240);
DQ = 1; //释放数据线
delay_us(60); //等待60us
CY = DQ; //检测存在脉冲
delay_us(240); //等待设备释放数据线
delay_us(180);
}
}4.2 DS18B20 读取字节
u8 DS18B20_ReadByte()
{
u8 i;
u8 dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
delay_us(1); //延时等待
DQ = 1; //准备接收
delay_us(1); //接收延时
if (DQ) dat |= 0x80; //读取数据
delay_us(60); //等待时间片结束
}
return dat;
}4.3 DS18B20写入一个字节
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(u8 dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //开始时间片
delay_us(1); //延时等待
dat >>= 1; //送出数据
DQ = CY;
delay_us(60); //等待时间片结束
DQ = 1; //恢复数据线
delay_us(1); //恢复延时
}
}4.4 : 读取DS18B20的数据函数如下所示:
u16 ReadTemperature()
{
u16 TempH, TempL, Temperature;
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
while (!DQ); //等待转换完成
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TempL = DS18B20_ReadByte(); //读温度低字节
TempH = DS18B20_ReadByte(); //读温度高字节
if(TempH & 0xf8) //判断是否位负数
{
MinusFlag = 1; //设置负数标志
Temperature = (TempH<<8) | TempL;
Temperature = ~Temperature + 1;
Temperature *= 0.625; //0.0625 * 10,保留1位小数点
}
else
{
MinusFlag = 0; //清除负数标志
Temperature = (((TempH<<8) | TempL) * 0.625); //0.0625 * 10,保留1位小数点
}
return Temperature;
}五:实物测试如下:

同时将采集到的数据通过串口将数据发出至PC端:

我要赚赏金
