1.
DS1624是美国DALLAS公司出产的集成了丈量体系和存储器于一体的芯片。数字接口电路简略,与I2C总线兼容,且能够运用一片操控器操控多达8片的DS1624。其数字温度输出达13位,精度为0.03125℃。DS1624可作业在最低2.7V电压下,适用于低功耗使用体系。
(1).DS1624根本特性
◆无需外围元件即可丈量温度
◆丈量规模为-55℃~+125℃,精度为0.03125℃
◆丈量温度的成果以13位数字量(两字节传输)给出
◆
◆集成了256字节的E2PROM非易性存储器
◆数据的读出和写入经过一个2-线(I2C)串行接口完结
◆选用8脚DIP或SO%&&&&&%封装,如图2.34.1
图2.34.1
(2).引脚描绘及功用方框图
其引脚描绘如表1所示:
DS1624的功用结构图如图4.34.2所示:
图4.34.3是温度丈量的原理结构图
DS1624在丈量温度时运用了独有的在线温度丈量技能。它经过在一个由对温度高度灵敏的振荡器决议的计数周期内对温度低灵敏的振荡器时钟脉冲的计数值的核算来丈量温度。DS1624在计数器中预置了一个初值,它相当于-55℃。假如计数周期完毕之前计数器到达0,已预置了此初值的温度寄存器中的数字就会添加,然后标明温度高于-55℃。
与此一起,计数器斜坡累加电路被从头预置一个值,然后计数器从头对时钟计数,直到计数值为0。
经过改动添加的每1℃内的计数器的计数,斜坡累加电路能够补偿振荡器的非线性差错,以进步精度,恣意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。
DS1624经过这些核算能够得到0.03125℃的精度,温度输出为13位,在宣布读温度值恳求后还会输出两位补偿值。表2给出了所测的温度和输出数据的联系。这些数据可经过2线制串行口接连输出,MSB在前,LSB在后。
温度
数字量输出(二进制)
数字量输出(十六进制)
+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位温度寄存器中存储温度值的数据格局
高八位字节低八位字节
S
B14
B13
B12
B11
B10
B9
B8
B7
B6
B5
B4
B3
0
0
0
其间S-为符号位,当S=0时,表明当时的丈量的温度为正的温度;当S=1时,表明当时的丈量的温度为负的温度。B14-B3为当时丈量的温度值。最低三位被设置为0。
DS1621的作业方法是由片上的装备/状况寄存器来决议的,如表4,该寄存器的界说如下:
DONE
1
0
0
1
0
1
1SHOT
其间DONE为转化完结位,温度转化完毕时置1,正在进行转化时为0;1SHOT为温度转化形式挑选。1SHOT为1时为单次转化形式,DS1624在收到发动温度转化指令EEH后进行一次温度转化。1SHOT为0时为接连转化形式,此刻DS1624将接连进行温度转化,并将最近一次的成果保存在温度寄存器中。该位为非易失性的。
操控器对DS1624的存储器编程有两种形式:一种是字节编程形式,另一种是页编程形式。
在字节编程形式中,主操控器发送地址和一个字节的数据到DS1624。
在主器材宣布开端(START)信号今后,主器材发送写操控字节即1001A2A1A00(其间R/W操控位为低电平“0”)。指示从接纳器被寻址,DS1624接纳后应对,再由主器材发送拜访存储器指令(17H)后,DS1624接纳后应对,接着由主器材发送的下一个字节字地址将被写入到DS1624的地址指针。主器材接纳到来自DS1624的另一个承认信号今后,发送数据字节,并写入到寻址的存储地址。DS1624再次宣布承认信号,一起主器材发生中止条件STOP,发动内部写周期。在内部写周期DS1624将不发生承认信号。
在页编程形式中,好像字节写方法,先将操控字节、拜访存储器指令(17H)、字地址发送到DS1624,接着发N个数据字节,其间以8个字节为一个页面。主器材发送不多于一个页面字节的数据字节到DS1624,这些数据字节暂存在片内页面缓存器中,在主器材发送中止信号今后写入到存储器。接纳每一个字节今后,低位次序地址指针在内部加1。高位次序字地址坚持为常数。假如主器材在发生中止条件曾经要发送多于一页字的数据,地址计数器将会循环,而且先接纳到的数据将被掩盖。像字节写操作相同,一旦中止条件被接纳到,则内部写周期将开端。
存储器的读操作
在这种形式下,主器材能够从DS1624的EEPROM中读取数据。主器材在发送开端信号之后,主器材首要发送写操控字节1001A2A1A00,主器材接纳到DS1624应对之后,发送拜访存储器的指令(17H),收到DS1624的应对之后,接着发送字地址将被被写入到DS1624的地址指针。这时DS1624发送应对信号之后,主器材并没有发送中止信号,而是从头发送START开端信号,接着又发送读操控字节1001A2A1A01,主器材接纳到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坚持搁置状况。直到下一个开端测温的恳求宣布才继续进行接连丈量。
用一片DS1624完结本地数字温度的丈量,并经过8位数码管显现出丈量的温度值。其硬件电路图如图4.34.4所示
3.
4.
(1).把“单片机体系”区域中的P0.0-P0.7用8芯排线连接到“动态数码显现”区域中的ABCDEFGH端子上。
(2).把“单片机体系”区域中的P2.0-P2.7用8芯排线连接到“动态数码显现”区域中的S1S2S3S4S5S6S7S8端子上。
(3).把DS1624芯片刺进到“二线总线模块”区域中的8脚集成座上,留意芯片不插反。
(4).把“二线总线模块”区域中的PIN1PIN2分别用导线连接到“单片机体系”区域中的P1.6和P1.7端子上。
(5).把“二线总线模块”区域中的PIN4PIN5PIN6分别用导线连接到“电源模块”区域中的GND端子上。
5.
(1).因为DS1624是I2C总线结构的串行数据传送,它只需求SDA和SCL两根线完结数据的传送进程。因而,咱们在进行程序设计的时分,也得按着I2C协议来对DS1624芯片数据拜访。有关I2C协议参看有关材料,这儿不胪陈。关于AT89S51单片机自身没有I2C硬件资源,所以有必要用软件来模仿I2C协议进程。
(2).要从DS1624中读取温度值,首要发动DS1624的内部温度A/D开端转化,对应着有相应的指令用来发动开端温度转化,有关DS1624的指令集参阅前面的叙说。一般情况下,DS1624经过一次温度的改换,需求经过1秒钟左右的时刻,所以等候1秒钟后,即可读取内部的温度值,关于读取的温度值,依然经过DS1624的指令集来完结温度的读取。但一切有数据的传送进程有必要遵从I2C协议。
6.
#include
#include
unsignedcharcodedisplaybit[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsignedcharcodedisplaycode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsignedcharcodedotcode[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};
sbitSDA=P1^6;
sbitSCL=P1^7;
unsignedchardisplaybuffer[8]={0,1,2,3,4,5,6,7};
unsignedchareepromdata[8];
unsignedchartemperdata[2];
unsignedchartimecount;
unsignedchardisplaycount;
bitsecondflag=0;
unsignedcharsecondcount=0;
unsignedcharretn;
unsignedintresult;
unsignedcharx;
unsignedintk;
unsignedintks;
voiddelay(void);
voiddelay10ms(void);
voidi_start(void);
voidi_stop(void);
voidi_init(void);
voidi_ack(void);
biti_clock(void);
biti_send(unsignedchari_data);
unsignedchari_receive(void);
bitstart_temperature_T(void);
bitread_temperature_T(unsignedchar*p);
voiddelay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
voiddelay10ms(void)
{
unsignedinti;
for(i=0;i<1000;i++)
{
delay();
}
}
voidi_start(void)
{
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
voidi_stop(void)
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
delay();
}
voidi_init(void)
{
SCL=0;
i_stop();
}
voidi_ack(void)
{
SDA=0;
i_clock();
SDA=1;
}
biti_clock(void)
{
bitsample;
SCL=1;
delay();
sample=SDA;
_nop_();
_nop_();
SCL=0;
delay();
return(sample);
}
biti_send(unsignedchari_data)
{
unsignedchari;
for(i=0;i<8;i++)
{
SDA=(bit)(i_data&0x80);
i_data=i_data<<1;
i_clock();
}
SDA=1;
return(~i_clock());
}
unsignedchari_receive(void)
{
unsignedchari_data=0;
unsignedchari;
for(i=0;i<8;i++)
{
i_data*=2;
if(i_clock())i_data++;
}
return(i_data);
}
bitstart_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);
}
}
bitread_temperature_T(unsignedchar*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);
}
}
voidmain(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;
}
}
}
}
}
voidt0(void)interrupt1using0//T0用于守时1s时刻到
{
secondcount++;
if(secondcount==100)
{
secondcount=0;
secondflag=1;
}
TH0=55536/256;
TL0=55536%256;
}
voidt1(void)interrupt3using0//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;
}
}
}