光学  

   你现在的位置:JUNTRY>>主 页>>              今天是:

   

有存储器功能的数字温度计-DS1624技术应用

 

1. DS1624基本原理

  DS1624 是美国 DALLAS 公司生产的集成了测量系统和存储器于一体的芯片。数字接口电路简单,与 I 2 C 总线兼容,且可以使用一片控制器控制多达 8 片的 DS1624 。其数字温度输出达 13 位,精度为 0.03125 ℃ 。 DS1624可工作在最低2.7V电压下,适用于低功耗应用系统。

(1). DS1624 基本特性

◆ 无需外围元件即可测量温度

◆ 测量范围为 - 55 ℃ ~+ 125 ℃ ,精度为 0.03125 ℃

◆ 测量温度的结果以 13 位数字量(两字节传输)给出

◆ 测量温度的典型转换时间为 1 秒 

◆ 集成了 256 字节的 E 2 PROM 非易性存储器

◆ 数据的读出和写入通过一个 2 -线( I 2 C )串行接口完成

◆ 采用 8 脚 DIP 或 SOIC 封装,如图

(2). 引脚描述及功能方框图

其引脚描述如表 所示:

DS1624 的功能结构图如图 所示

 

(3). DS1624 工作原理

温度测量

下图是温度测量的原理结构图

  DS1624在测量温度时使用了独有的在线温度测量技术。它通过在一个由对温度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时钟脉冲的计数值的计算来测量温度。DS1624在计数器中预置了一个初值,它相当于-55℃。如果计数周期结束之前计数器达到0,已预置了此初值的温度寄存器中的数字就会增加,从而表明温度高于-55℃。

  与此同时,计数器斜坡累加电路被重新预置一个值,然后计数器重新对时钟计数,直到计数值为 0。

  通过改变增加的每 1℃内的计数器的计数,斜坡累加电路可以补偿振荡器的非线性误差,以提高精度,任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。

  DS1624通过这些计算可以得到0.03125℃的精度,温度输出为13位,在发出读温度值请求后还会输出两位补偿值。表2给出了所测的温度和输出数据的关系。这些数据可通过2线制串行口连续输出,MSB在前,LSB在后。

表 2  温度与输出数据关系表

温度 数字量输出(二进制) 数字量输出(十六进制)
+ 125 ℃ 0111 , 1101 , 0000 , 0000 7D00H
+ 25.0625 ℃ 0001 , 1001 , 0001 , 0000 1910H
+ 0.5 ℃ 0000 , 0000 , 1000 , 0000 0080H
+ 0 ℃ 0000 , 0000 , 0000 , 0000 0000H
-0.5 ℃ 1111 , 1111 , 1000 , 0000 FF80H
-25.0625 ℃ 1110 , 0110 , 1111 , 0000 E6F0H
-55 ℃ 1100 , 1001 , 0000 , 0000 C900H

由于数据在总线上传输时 MSB在前,所以DS1624读出的数据可以是一个字节(分辨率为1℃),也可以是两个字节,第二个字节包含的最低位为0.03125℃。

表 2 是 13 位温度寄存器中存储温度值的数据格式

表 3  温度值的数据存储格式  
放大

 

其中 S -为符号位,当 S = 0 时,表示当前的测量的温度为正的温度;当 S = 1 时,表示当前的测量的温度为负的温度。 B14 - B3 为当前测量的温度值。最低三位被设置为 0 。

DS1624 工作方式

DS1621的工作方式是由片上的配置/状态寄存器来决定的,如表4,该寄存器的定义如下:

表 4 配置/状态寄存器格式

DONE 1 0 0 1 0 1 1SHOT

其中 DONE为转换完成位,温度转换结束时置1,正在进行转换时为0; 1SHOT 为 温度转换模式选择。 1SHOT 为 1时为单次转换模式,DS1624在收到启动温度转换命令EEH后进行一次温度转换。 1SHOT 为 0时为连续转换模式,此时DS1624将连续进行温度转换,并将最近一次的结果保存在温度寄存器中。该位为非易失性的。

片内 256字节存储器操作

控制器对 DS1624的存储器编程有两种模式:一种是字节编程模式,另一种是页编程模式。

在字节编程模式中,主控制器发送地址和一个字节的数据到 DS1624。

在主器件发出开始( START)信号以后,主器件发送写控制字节即1001A 2 A 1 A 0 0(其中R/W控制位为低电平“0”)。指示从接收器被寻址,DS1624接收后应答,再由主器件发送访问存储器指令(17H)后,DS1624接收后应答,接着由主器件发送的下一个字节字地址将被写入到DS1624的地址指针。主器件接收到来自DS1624的另一个确认信号以后,发送数据字节,并写入到寻址的存储地址。DS1624再次发出确认信号,同时主器件产生停止条件STOP,启动内部写周期。在内部写周期DS1624将不产生确认信号。

在页编程模式中,如同字节写方式,先将控制字节、访问存储器指令( 17H)、字地址发送到DS1624,接着发N个数据字节,其中以8个字节为一个页面。主器件发送不多于一个页面字节的数据字节到DS1624,这些数据字节暂存在片内页面缓存器中,在主器件发送停止信号以后写入到存储器。接收每一个字节以后,低位顺序地址指针在内部加1。高位顺序字地址保持为常数。如果主器件在产生停止条件以前要发送多于一页字的数据,地址计数器将会循环,并且先接收到的数据将被覆盖。像字节写操作一样,一旦停止条件被接收到,则内部写周期将开始。

存储器的读操作

  在这种模式下,主器件可以从 DS1624的EEPROM中读取数据。主器件在发送开始信号之后,主器件首先发送写控制字节1001A 2 A 1 A 0 0,主器件接收到DS1624应答之后,发送访问存储器的指令(17H),收到DS1624的应答之后,接着发送字地址将被被写入到DS1624的地址指针。这时DS1624发送应答信号之后,主器件并没有发送停止信号,而是重新发送START开始信号,接着又发送读控制字节1001A 2 A 1 A 0 1,主器件接收到DS1624应答之后,开始接收DS1624送出来的数据,主器件每接收完一个字节的数据之后,都要发送一个应答信号给DS1624,直到主器件发送一个非应答信号或停止条件来结束DS1624的数据发送过程。

DS1624的指令集

数据和控制信息的写入读出是以表 5和表6所示的方式进行的。在写入信息时,主器件输出从器件(即DS1624)的地址,同时R/W位置0。接收到响应位后,总线上的主器件发出一个命令地址,DS1624接收此地址后,产生响应位,主器件就向它发送数据。如果要对它进行读操作,主器件除了发出命令地址外,还要产生一个重复的启动条件和命令字节,此时R/W位为1,读操作开始。下面对它们的命令进行说明。

  访问存储器指令[ 17H]:该指令是对DS1624的EEPROM进行访问,发送该指令之后,下一个字节就是被访问存储器的字地址数据。

  访问设置寄存器指令[ ACH]:如果R/W位置0,将写入数据到设置寄存器。发出请求后,接下来的一个字节被写入。 如果R/W位置1,将读出存在寄存器中的值。

读温度值指令[ AAH]:即读出最后一个测温结果。DS1624产生两个字节,即为寄存器内的结果。

开始测温指令[ EEH]:此命令将开始一次温度的测量,不需再输入数据。在单次测量模式下,可在进行转换的同时使DS1624保持闲置状态。在连续模式下,将启动连续测温。

停止测温指令[ 22H]:该命令将停止温度的测量,不需再输入数据。此命令可用来停止连续测温模式。发出请求后,当前温度测量结束,然后DS1624保持闲置状态。直到下一个开始测温的请求发出才继续进行连续测量。

表 5  主机对 DS1624 写操作通信格式

I 2 C 通信开始

主器件发送控制字节( DS1624 地址和写操作)

DS1624 应答

主器件发送访问 DS1624 的指令

DS1624 应答

主器件发送的数据字节

DS1624 应答

I 2 C 通信停止

表 6  主机对 DS1624 读操作通信格式

I 2 C 通信开始

主器件发送控制字节( DS1624 地址和写操作)

DS1624 应答

主器件发送访问 DS1624 的指令

DS1624 应答

I 2 C 通信开始

主器件发送控制字节( DS1624 地址和读操作)

DS1624 应答

数据字节 0

主机应答

数据字节 1

主机非应答

I 2 C 通信停止

2. 实验任务

用一片 DS1624 完成本地数字温度的测量,并通过 8 位数码管显示出测量的温度值。其硬件电路图如图 所示

3. 电路原理图

4. 系统板上硬件连线

(1). 把“单片机系统”区域中的 P0.0 - P0.7 用 8 芯排线连接到“动态数码显示”区域中的 ABCDEFGH 端子上。

(2). 把“单片机系统”区域中的 P2.0 - P2.7 用 8 芯排线连接到“动态数码显示”区域中的 S1S2S3S4S5S6S7S8 端子上。

(3). 把 DS1624 芯片插入到“二线总线模块”区域中的 8 脚集成座上,注意芯片不插反。

(4). 把“二线总线模块”区域中的 PIN1 PIN2 分别用导线连接到“单片机系统”区域中的 P1.6 和 P1.7 端子上。

(5). 把“二线总线模块”区域中的 PIN4 PIN5 PIN6 分别用导线连接到“电源模块”区域中的 GND 端子上。

5. 程序设计内容

(1). 由于 DS1624 是 I 2 C 总线结构的串行数据传送,它只需要 SDA 和 SCL 两根线完成数据的传送过程。因此,我们在进行程序设计的时候,也得按着 I 2 C 协议来对 DS1624 芯片数据访问。有关 I 2 C 协议参看有关资料,这里不详述。对于 AT89S51 单片机本身没有 I 2 C 硬件资源,所以必须用软件来模拟 I 2 C 协议过程。

(2). 要从 DS1624 中读取温度值,首先启动 DS1624 的内部温度 A/D 开始转换,对应着有相应的命令用来启动开始温度转换,有关 DS1624 的指令集参考前面的叙述。一般情况下, DS1624 经过一次温度的变换,需要经过 1 秒钟左右的时间,所以等待 1 秒钟后,即可读取内部的温度值,对于读取的温度值,仍然通过 DS1624 的指令集来完成温度的读取。但所有有数据的传送过程必须遵循 I 2 C 协议。

6. C语言源程序

#include <AT89X52.H>

#include <INTRINS.H>

unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00};

unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,

25,28,31,34,38,41,44,48,

50,53,56,59,63,66,69,72,

75,78,81,84,88,91,94,97};

sbit SDA=P1^6;

sbit SCL=P1^7;

unsigned char displaybuffer[8]={0,1,2,3,4,5,6,7};

unsigned char eepromdata[8];

unsigned char temperdata[2];

unsigned char timecount;

unsigned char displaycount;

bit secondflag=0;

unsigned char secondcount=0;

unsigned char retn;

unsigned int result;

unsigned char x;

unsigned int k;

unsigned int ks;

void delay(void);

void delay10ms(void);

void i_start(void);

void i_stop(void);

void i_init(void);

void i_ack(void);

bit i_clock(void);

bit i_send(unsigned char i_data);

unsigned char i_receive(void);

bit start_temperature_T(void);

bit read_temperature_T(unsigned char *p);

void delay(void)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

void delay10ms(void)

{

unsigned int i;

for(i=0;i<1000;i++)

{

delay();

}

}

void i_start(void)

{

SCL=1;

delay();

SDA=0;

delay();

SCL=0;

delay();

}

void i_stop(void)

{

SDA=0;

delay();

SCL=1;

delay();

SDA=1;

delay();

SCL=0;

delay();

}

void i_init(void)

{

SCL=0;

i_stop();

}

void i_ack(void)

{

SDA=0;

i_clock();

SDA=1;

}

bit i_clock(void)

{

bit sample;

SCL=1;

delay();

sample=SDA;

_nop_();

_nop_();

SCL=0;

delay();

return(sample);

}

bit i_send(unsigned char i_data)

{

unsigned char i;

for(i=0;i<8;i++)

{

SDA=(bit)(i_data & 0x80);

i_data=i_data<<1;

i_clock();

}

SDA=1;

return(~i_clock());

}

unsigned char i_receive(void)

{

unsigned char i_data=0;

unsigned char i;

for(i=0;i<8;i++)

{

i_data*=2;

if(i_clock()) i_data++;

}

return(i_data);

}

bit start_temperature_T(void)

{

i_start();

if(i_send(0x90))

{

if(i_send(0xee))

{

i_stop();

delay();

return(1);

}

else

{

i_stop();

delay();

return(0);

}

}

else

{

i_stop();

delay();

return(0);

}

}

bit read_temperature_T(unsigned char *p)

{

i_start();

if(i_send(0x90))

{

if(i_send(0xaa))

{

i_start();

if(i_send(0x91))

{

*(p+1)=i_receive();

i_ack();

*p=i_receive();

i_stop();

delay();

return(1);

}

else

{

i_stop();

delay();

return(0);

}

}

else

{

i_stop();

delay();

return(0);

}

}

else

{

i_stop();

delay();

return(0);

}

}

void main(void)

{

P1=0xff;

timecount=0;

displaycount=0;

TMOD=0x21;

TH1=0x06;

TL1=0x06;

TR1=1;

ET1=1;

ET0=1;

EA=1;

if(start_temperature_T()) // 向 DS1624 发送启动 A/D 温度转换命令,成功则启动 T0 定时 1s 。

{

secondflag=0;

secondcount=0;

TH0=55536/256;

TL0=55536%256;

TR0=1;

}

while(1)

{

if(secondflag==1)

{

secondflag=0;

TR0=0;

if(read_temperature_T(temperdata)) //T0 定时 1s 时间到,读取 DS1624 的温度值

{

for(x=0;x<8;x++)

{

displaybuffer[x]=16;

}

x=2;

result=temperdata[1]; // 将读取的温度值进行数据处理,并送到显示缓冲区

while(result/10)

{

displaybuffer[x]=result%10;

result=result/10;

x++;

}

displaybuffer[x]=result;

result=temperdata[0];

result=result>>3;

displaybuffer[0]=(dotcode[result])%10;

displaybuffer[1]=(dotcode[result])/10;

if(start_temperature_T()) // 温度值数据处理完毕,重新启动 DS1624 开始温度转换

{

secondflag=0;

secondcount=0;

TH0=55536/256;

TL0=55536%256;

TR0=1;

}

}

}

}

}

void t0(void) interrupt 1 using 0 //T0 用于定时 1s 时间到

{

secondcount++;

if(secondcount==100)

{

secondcount=0;

secondflag=1;

}

TH0=55536/256;

TL0=55536%256;

}

void t1(void) interrupt 3 using 0 //T1 定时 1ms 用数码管的动态刷新

{

timecount++;

if(timecount==4) //T1 定时 1ms 到

{

timecount=0;

if (displaycount==5)

{

P0=(displaycode[displaybuffer[7-displaycount]] | 0x80); // 在该位同时还要显示小数点

}

else

{

P0=displaycode[displaybuffer[7-displaycount]];

}

P2=displaybit[displaycount];

displaycount++;

if(displaycount==8)

{

displaycount=0;

}

}

}

 

  · AT89S51单片机试验以及教程 01 闪烁灯

 · AT89S51单片机试验以及教程 02 模拟开关灯

 · AT89S51单片机试验以及教程 03 多路开关状态指示

  · AT89S51单片机试验以及教程 04 广告灯的左移右移

 · AT89S51单片机试验以及教程 05 广告灯(利用取表方式)

  · AT89S51单片机试验以及教程 06 报警产生器

 · AT89S51单片机试验以及教程 07 I/O并行口直接驱动LED显示

 · AT89S51单片机试验以及教程 08 按键识别方法之一

 · AT89S51单片机试验以及教程 09 一键多功能按键识别技术

 · AT89S51单片机试验以及教程 10 00-99计数器

 · AT89S51单片机试验以及教程 11 00-59秒计时器(利用软件延时)

 · AT89S51单片机试验以及教程 12 可预置可逆4位计数器

 · AT89S51单片机试验以及教程 13 动态数码显示技术

  · AT89S51单片机试验以及教程 14 4×4矩阵式键盘识别技术

  · AT89S51单片机试验以及教程 15 定时计数器T0作定时应用技术(一)

  · AT89S51单片机试验以及教程 16 定时计数器T0作定时应用技术(二)

 · AT89S51单片机试验以及教程 17 99秒马表设计

  · AT89S51单片机试验以及教程 18 “嘀、嘀、……”报警声

 · AT89S51单片机试验以及教程 19 “叮咚”门铃

 · AT89S51单片机试验以及教程 20 数字钟

 · AT89S51单片机试验以及教程 21 拉幕式数码显示技术

 · AT89S51单片机试验以及教程 22 电子琴

 · AT89S51单片机试验以及教程 23 模拟计算器数字输入及显示

  · AT89S51单片机试验以及教程 24 8X8 LED点阵显示技术

 · AT89S51单片机试验以及教程 25 点阵式LED“0-9”数字显示技术

 · AT89S51单片机试验以及教程 26 点阵式LED简单图形显示技术

 · AT89S51单片机试验以及教程 27 ADC0809A/D 转换器基本应用技术

 · AT89S51单片机试验以及教程 28 数字电压表

 · AT89S51单片机试验以及教程 29 两点间温度控制

 · AT89S51单片机试验以及教程 30 四位数数字温度计

 · AT89S51单片机试验以及教程 31 6位数显频率计数器

 · AT89S51单片机试验以及教程 32 电子密码锁设计

 · AT89S51单片机试验以及教程 33 4×4键盘及8位数码管显示构成的电子密码锁

 · AT89S51单片机试验以及教程 34 有存储器功能的数字温度计-DS1624技术应用

 · AT89S51单片机试验以及教程 35 DS18B20数字温度计使用

 

 

 

 

以上部分内容转载于网上,如有涉及到版权问题,请即通知本人删除

copyright© 2004-2005 all rights reserved www.JUNTRY(.IK8).com

juntry@126.com