一、DS18B20简介
1.DS18B20是由达拉斯半导体公司生产的可编程分辨率的单总线数字温度计。
2.特征
a>通过单总线协议进行通信。
b>每个器件有唯一的64位的序列号存储在内部存储器中。
c>多点分布式测温应用。
d>通过数据线供电,供电范围为3.0 ~ 5.5 V。
e>测温范围为-55 ~ +125℃,其中在-10 ~ +85℃范围内精确度为 ±5 ℃。 ????
f>温度计分辨率可以被使用者选择为 9 ~ 12位。
g>最多在750 ms内将温度转换为12位数字。
3.工作状态下的两种供电方式
4.内部结构图
DS18B20内部 = 64位ROM(地址序列码) + 9字节暂存器。
9字节暂存器包括:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。
9字节暂存器结构图如下所示,
byte 0 : 温度 LSB (50h)
byte 1 : 温度 MSB(05h) EEPROM
byte 2 : TH用户定义字节1 <---> TH用户字节1
byte 3 : TL用户定义字节2 <---> TL用户字节2
byte 4 : 配置寄存器 <---> 配置寄存器
byte 5 : 保留位(FFh)
byte 6 : 保留位(0Ch)
byte 7 : 保留位(10h)
byte 8 : CRC校验位
64位ROM结构 = 8位CRC + 48位序列号 + 8位系列码(CRC产生器产生)。
5.转换精度
9-bit: 0.5 ℃
10-bit:0.25 ℃
11-bit: 0.125 ℃
12-bit: 0.0625 ℃(默认)
二、DS18B20的使用
1.启动温度转化的步骤:复位、发出跳过ROM命令(CCH)、发出启动温度转换命令(44H)。
2.DS18B20的使用代码如下:(仅供参考)
#include <reg52.h>
#include "./delay/delay.h"
#include <intrins.h>
#include <stdio.h>
#include "./LCD1602/LCD1602.h"
bit ack = 0;
sbit ds = P1^0;
void ds_reset()
{
ds = 1;
ds = 0;
delay_us(200);
delay_us(200);
ds = 1;
delay_us(30);
if(0 == ds)
{
ack = 1;
}
else
{
ack = 0;
}
delay_us(200);
delay_us(100);
}
void ds_send_byte(unsigned char byte)
{
unsigned char i;
for(i = 0; i < 8; i++)
{
ds = 0;
_nop_();
_nop_();
ds = byte & 0x01;
byte >>= 1;
delay_us(30);
ds = 1;
}
}
bit ds_read_bit()
{
bit tmp;
ds = 1;
ds = 0;
_nop_();
_nop_();
ds = 1;
tmp = ds;
delay_us(30);
return tmp;
}
unsigned char ds_read_byte()
{
unsigned char i,j,k;
for(i = 0; i < 8; i++)
{
j = ds_read_bit();
k = (j << 7) | (k >> 1);
}
return k;
}
void main()
{
unsigned char a;
unsigned int b,tmp;
float temperature;
unsigned char disbuf[20];
lcd1602_init();
while(1)
{
ds_reset();
ds_send_byte(0xcc);
ds_send_byte(0x44);
ds_reset();
ds_send_byte(0xcc);
ds_send_byte(0xbe);
a = ds_read_byte();
b = ds_read_byte();
tmp = (b << 8) | a;
temperature = (float)tmp * 0.0625;
sprintf(disbuf,"temp is %.3f",temperature);
lcd1602_dis_str(0,0,disbuf);
}
}
来源:CSDN
作者:EmbededDriver
链接:https://blog.csdn.net/u012308586/article/details/103454487