34. 带有存储器功能的数字温度计
时间:11-18
来源:互联网
点击:
电路原理图

图4.34.4
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. C语言源程序
#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)

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)
存储器功能数字温度 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
