表6 主机对DS1624读操作通信格式
2. 实验任务
用一片DS1624完成本地数字温度的测量,并通过8位数码管显示出测量的温度值。其硬件电路图如图4.34.4所示
3.电路原理图
图4.34.4
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是I2C总线结构的串行数据传送,它只需要SDA和SCL两根线完成数据的传送过程。因此,我们在进行程序设计的时候,也得按着I2C协议来对DS1624芯片数据访问。有关I2C协议参看有关资料,这里不详述。对于AT89S51单片机本身没有I2C硬件资源,所以必须用软件来模拟I2C协议过程。
(2)要从DS1624中读取温度值,首先启动DS1624的内部温度A/D开始转换,对应着有相应的命令用来启动开始温度转换,有关DS1624的指令集参考前面的叙述。一般情况下,DS1624经过一次温度的变换,需要经过1秒钟左右的时间,所以等待1秒钟后,即可读取内部的温度值,对于读取的温度值,仍然通过DS1624的指令集来完成温度的读取。但所有有数据的传送过程必须遵循I2C协议。
6.C语言源程序
#include
#include
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);
}
上一篇:电子密码锁设计资料