温度传感器
综述
Figure1 展示了DS18B20的结构图。内部64位ROM用于存储设备唯一的串号。scratchpad包含一个2字节的温度寄存器,用于存储由温度传感器件发送来的数字输出。另外,scratchpad还提供了用于访问1个字节的最大值警报触发寄存器和1个字节的最小值警报触发寄存器的接口(TH和TL),和一个字节的配置寄存器。配置寄存器允许用户设置温度转数字值的分辨率(9位—12位)。TH、TL和配置寄存器都是EEPROM,所以,当断电时他们将保持数据不丢失。
DS18B20采用DALLAS公司独特的单总线协议,使总线传输只需一根控制信号。因为所有的设备都通过三态或漏极开路端口链接到总线控制线需要一个弱上拉电阻(the DQ pin in the case of the DS18B20).在此单总线系统中,微控制器(主控机)通过每个芯片内部的64位串号来区分和寻址。单总线协议包含了一个详细的关于命令和“time slots”的说明(在单总线系统的数据手册中有所介绍)。
DS18B20另外的一个特色是,它具备在没有外部电源的情况下正常工作的能力。当总线为高电平时,电源被接有上拉电阻的DQ引脚所取代。当总线为低电平时,高总线信号也可以指示内部(Cpp)给设备提供电源(The high bus signal also charges an internal capacitor (CPP), which then supplies power to the device when the bus islow.)。这是一种被称为备用电源的单总线供电方式。作为一个备胎,DS18B20也可以通过VDD直接作为外部电源。
DS18B20 区块图 Figure 1
操作
DS18B20的核心是它的直接转换数字温度传感器件。温度传感器件的分辨率可由用户定义为9、10、11、12位,显然,伴随分辨率的增加,可识别的温度增益单位分别为0.5C、0.25C、0.125C和0.0625C。默认分辨率为12位。DS18B20上电后即进入闲置状态,要让它进行一个温度测量和A/D转换,控制者必须发出一个转换命令T [44h]。当其数据转换完毕后,将把数据存入scratchpad中的2字节温度寄存器中,接着DS18B20会从新进入闲置状态。如果DS18B20使用外部电源供电,在转换命令T发出后不久,控制者可以发出“read time slots”,此时如果DS18B20传回0进则表示转换正在进行,传回1表示转换结束。如果DS18B20使用备用电源供电(parasite power),这种方式将不适用,因为在整个的温度转换过程中,由于上拉电阻的作用,总线一定是高电平。总线需要备用电源的情况在数据手册的 POWERING THE DS18B20 处有说明。
DS18B20的输出温度被校正为百分率,温度数据被存储为一个16位数(由温度寄存器扩展两位而来)。标志位S表示温度是正值还是负值:S=0表示正值,S=1表示负值。如果DS18B20分辨率被设置为12位,则温度寄存器所有位都将包含有效数据。分辨率设为11位,则bit0(最低位)无定义;分辨率设为10位,则bit1和bit0都无定义;分辨率设为9位,则bit2、bit1、bit0都无定义。
温度寄存器格式 Figure 2
温度/数据 关联 Table 2
操作——警告信号
在DS18B20提交了一次温度值后,该温度值需要比较一下定义在一个字节的TH和TL寄存器(see Figure3)中的两个补充警告触发值。标志位S表示温度值是正或者负值:S=0代表正值,相反S=1代表负值。TH和TL可以通过scratchpad中的第二和第三字节访问到。
TH 和 TL 寄存器格式 Figure 3
Only bits 11 through 4 of the temperature register are used in the TH and TL comparison since TH and TL are 8-bit registers.如果测量的温度小于等于TL或大于TH的值,一个警告标志将在DS18B20内产生,每次温度测量结束后,该标志都会更新;因此,如果警告标志产生,这个标志将停止下一次的温度转换。
主控设备可以通过发送警告搜索命令[ECh],来检查DS18B20的警告标志状态。任何一个DS18B20s都有该标志,它将应答你发出的查询命令,所以控制者可以知道芯片是否已经触发了警告标志。If an alarm condition existsand the TH or TL settings have changed, another temperatur e conversion should be done to validate the alarm condition.
AC ELECTRICAL CHARACTERISTICS
电源
DS18B20可以通过VDD脚接外部电源,或者它可以使用备用电源模式,备用电源模式保证DS18B20在没有外部供应的情况下工作。对于需要远程温度感知或者非常严格的空间限制下的应用程序非常有用。Figure1 展示了DS18B20的备用电源控制电路,当单总线为高电平时,备用电源控制电路汲取由DQ管脚输送的能量(就是给电容充电)。当总线为高电平,汲取的电荷一方面提供给芯片工作用,另外一方面存储进备用电源(Cpp)以备总线为低电平时再取用。当DS18B20工作于备用电源模式,VDD管脚必须接地。
在备用电源模式,单总线和Cpp可以提供足够电流给DS18B20进行大部分的操作。。。。。。
SUPPLYING THE PARASITE-POWERED DS18B20 DURING TEMPERATURE CONVERSIONS Figure 4
POWERING THE DS18B20 WITH AN EXTERNAL SUPPLY Figure 5
1-WIRE SIGNALING
DS18B20使用严格的单总线传输协议来确保数据的完整性。该协议定义了几个信号:复位脉冲、存在脉冲、写0脉冲、写1脉冲、读0脉冲、读1脉冲。除了存在冲,其他脉冲都由控制者发出。
INITIALIZATION PROCEDURE: RESET AND PRESENCE PULSES
DS18B20的所有传输开始于一个初始化序列,其中包含一个复位脉冲,紧随复位脉冲的是由DS18B20发回的存在脉冲,当DS18B20对复位脉冲回应存在脉冲时,表示总线现在已经准备好了,放马来吧。
在初始化序列中,总线的控制者通过把总线拉低(至少持续480us)来发送(Tx)复位脉冲。总线控制者接着释放总线并进入接受模式(Rx)。当总线被释放,5K的上拉电阻使总线至高。当DS18B20发现出现一个上升沿,它等待15us—60us接着通过将总线拉低(60us—240us)来传送一个存在脉冲。
DS18B20 MEMORY MAP Figure 7
INITIALIZATION TIMING Figure 13
READ/WRITE TIME SLOTS
The bus master writes data to the DS18B20 during write time slots and reads data from the DS18B20 during read time slots. One bit of data is transmitted over the 1-Wire bus per time slot.
WRITE TIME SLOTS
有两种写时序:“Write 1”和“Write 0”,总线控制者使用 Write 1 时序写一个逻辑1给DS18B20,使用 Write 0 时序写一个逻辑0给DS18B20。所有的写时序至少持续60us,最少1us的恢复时序在单独的一个写操作中。每一种写时序通过主控将总线拉低进行表示(see Figure14)。
为了生成一个写1时序,在把总线拉低后,总线的控制者必须在15us内将其释放。为生成一个写0时序,在总线被拉低后,总线的控制者必须继续保持拉低状态(至少持续60us)。
DS18B20采样单总线在一个时间段内(15us—60us),在控制者开始总线时序后。如果在采样时间段内,总线是高电平,则1被写入DS18B20,如果总线为低,则0被写入DS18B20
READ/WRITE TIME SLOT TIMING DIAGRAM Figure 14
READ TIME SLOTS
当控制者发出读时序时,DS18B20可以只传送数据。因此,控制者在发出一个读Scratchpad[BEh]或读电源支持[B4h]命令后,必须直接生成读时序,所以DS18B20可以提供要求的数据。另外,控制者在发出转换命令T[44h]或Recall EE [B8h]命令后,可以生成读时序。。。。。。
所有的读时序必须持续至少60us,恢复时间至少持续1us。控制者通过把总线拉低至少1us然后释放来表示一个度时序的产生。在控制者开始读时序后,DS18B20将开始通过总线发送1或0。The DS18B20 transmits a 1 by leaving the bus high and transmits a 0 by pulling the bus low.当传送0,DS18B20在时序的结尾将释放总线(总线将被拉高)。Output data from the DS18B20 is valid for 15 us after the falling edge that initiated the read time slot.因此,控制者必须在15us内释放总线并且采样总线状态,在时序的开始时。
DETAILED MASTER READ 1 TIMING Figure 15
Figure 15 illustrates that the sum of Tinit , Trc, and Tsample must be less than 15us for a read time slot.
Figure 16 shows that system timing margin is maximized by keeping Tinit and Trc as short as possible and by locating the master sample time during read time slots towards the end of the 15 us period
单总线时序
1、初始化(复位和存在脉冲)
由控制者将总线拉低(>480us),释放总线;当器件检测到上升沿时,等待15~60us,器件再将总线拉低(60~240us)。控制者检测到此存在脉冲后,表明器件已经做好读/写准备。
2、写
一个单独的写时序至少要持续60us(<120us). 上升沿至少持续1us
写1:控制者将总线拉低(<15us),释放总线
写0:控制者拉低后,要继续保持低调平(>60us)
器件的总线取样时间在 第15us—第60us之间(取样的大范围),在此区间采样的一小段时间内,如果总线为高表示写1,总线为低表示写0
3、读
一个单独的读时序至少要持续60us(<120us).上升沿至少持续1us
一个读的标志:控制者拉低总线(>1us),释放总线,此时器件才开始回传数据。
传1:总线拉高
传0:总线拉低(器件)。(在一个独立时序的最后,将总线拉回高)
数据有效:从控制者拉低总线开始15us内有效,因此,主控者采样应在15us之内,采到高电平表示1,踩到低电平表示0。
DS18B20 OPERATION EXAMPLE 1
In this example there are multiple DS18B20s on the bus and they are using parasite power. The bus master initiates a temperature conversion in a specific DS18B20 a nd then reads its scratchpad and recalculates the CRC to verify the data.
DS18B20 OPERATION EXAMPLE 2
In this example there is only one DS18B20 on the bus and it is using parasite power. The master writes to the TH, TL, and configuration registers in the DS18B20 scratchpad and then reads the scratchpad and recalculates the CRC to verify the data. The master then copies the scratchpad contents to EEPROM.
关于85度问题
DS18B20默认12位分辨率,在手册的 AC ELECTRICAL CHARACTERISTICS 下已经说明,不同分辨率所需要的转换时间不同,12位分辨率一般在500—750ms之间,很多人写程序,发送完转换指令[44h],就直接读,由于DS18B20默认上电温度寄存器的值为85,第一次读由于转换时间不足,读回的是85.一旦转换时间够长,则新的数据将覆盖85,然后传回。
/*DS18B20刚上电温度寄存器的值是85C*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
sbit D1 = P1^0;
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep = P2^3;
sbit DS = P2^2; // 单总线
uint temp; // 温度变量
uchar flag1; // 正负标记
void display(uint temp); // 数码管温度显示
void delay(uint); // 延时函数(ms级别)
void delay3us(uchar); // 延时函数(3us单位级别)
void dsreset(); // 初始化总线(复位脉冲和存在脉冲)
bit read_bit(); // 读一位
uchar read_byte(); // 读一字节
void write_byte(uchar dat); // 写一字节
void temp_change(); // 令DS18B20转换一次温度
uint get_temp(); // 获取温度
uchar i;
void init();
void main()
{
init();
temp_change();
delay(600); // 12位分辨率,转换时间最大750ms,我们给他600ms吧,最少应该不少于500ms(只要时间够了就不会出现85现象)
TR0 = 1;
while(1)
{
temp_change();
delay(600);
}
}
void init()
{
TMOD = 0x01;
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
EA = 1;
ET0 = 1;
}
void timer0() interrupt 1
{
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256;
display(get_temp());
}
void delay(uint sec)
{
uint x,y;
for (x = sec * 32;x > 0;x--)
for(y = 2;y > 0;y--);
}
void delay3us(uchar us)
{
while(--us);
}
void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula=1;
P0=table[A1]; //显示百位
dula=0;
wela=1;
P0=0x7e;
wela=0;
delay(1);
dula=1;
P0=table1[A2]; //显示十位
dula=0;
wela=1;
P0=0x7d;
wela=0;
delay(1);
dula=1;
P0=table[A3]; //显示个位
dula=0;
wela=1;
P0=0x7b;
wela=0;
delay(1);
}
void dsreset() //复位脉冲的低电平至少持续480us
{
DS = 0;
delay(1); //延时一毫秒
DS = 1;
delay(1); //延时一下
}
bit read_bit() // 一个读的标志是控制者拉低总线(<15us),再释放总线
{
bit dat;
DS = 0;
delay3us(1); // 低电平维持3us
DS = 1;
delay3us(1);
dat = DS; // 从总线读回一位
delay3us(3);
DS = 1; // 读0时,在用户取样过后,最后将总线释放(时序图中要求,但实测此步可省)
return dat;
}
uchar read_byte()
{
uchar i,j,dat;
dat = 0;
for (i = 0;i < 8;i ++)
{
j = read_bit();
dat = (j << 7) | (dat >> 1); //读时先发最低位,我们需要反向变换一下
}
return dat;
}
void write_byte(uchar dat)
{
uchar j;
bit testb;
for (j = 1;j <= 8;j++)
{
testb = dat & 0x01;//一位一位写,先写最低位
dat = dat >> 1;
if (testb) //写1 ,控制者拉低总线(<15us)
{
DS = 0;
delay3us(2); // 低电平维持大约6us
DS = 1;
delay3us(3); // 延时一下
}else{ // 写0 ,控制者拉低后,要继续保持低电平(>60us且<120us)
DS = 0;
delay3us(21); // 低电平维持大约60+us
DS = 1;
delay3us(3); // 小延时下
}
}
}
void temp_change()
{
dsreset(); // 初始化总线,做好进行下一步的准备
delay(1);
write_byte(0xcc); // 跳过器件验证这一步 (通常是先发送[55h]命令通知总线器件下一步要进行器件的匹配(因为可能有多个器件),紧接着发送64位串号确定某个)
write_byte(0x44); // 发送转换温度命令
}
uint get_temp()
{
float tt;
uchar a,b;
dsreset(); // 初始化总线,做好进行下一步的准备
delay(1);
write_byte(0xcc); // 跳过器件验证这一步
write_byte(0xbe); // 发出读scrathpad命令
a = read_byte(); // 首先读回LS Byte
b = read_byte(); // 再次读回MS Byte
temp = b;
temp <<= 8;
temp = temp | a; // 进行两个字节的拼装,最后由一个16位数决定
tt = temp * 0.0625; // 默认分辨率为12位,查表可知最小可查增益为0.0625摄氏度
temp = tt * 10 + 0.5; //四舍五入保留小数点后一位,传回一个整数,以便在display()显示,在display()中再除10,分离整数部分和小数点部分
return temp;
}
posted on 2012-04-06 09:10 hicjiajia 阅读(2218) 评论(0) 编辑 收藏 举报