//---------------------------------
//
// DS1624测温程序
//
//------------------------------------
#include <AT89X52.H>
#include <INTRINS.H>
//
//----------变量定义------------------
//
sbit SDA=P1^0; //IIC数据线,P1.0
sbit SCL=P1^1; //IIC时钟线,P1.1
unsigned char temperdata[2]; //温度值
unsigned char secondcount=0; //秒计数器
bit secondflag=0; //秒定时到达标志
//
//----------函数预定义------------------
//
void delay(void);
void IIC_start(void);
void IIC_stop(void);
void IIC_init(void);
void IIC_ack(void);
bit IIC_clock(void);
bit IIC_send(unsigned char i_data);
unsigned char IIC_receive(void);
bit start_temperature_T(void);
bit read_temperature_T(unsigned char *p);
//
//----------主函数预定义------------------
//
void main(void)
{
P1=0xff;
TMOD=0x21;
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的温度值
{
if(start_temperature_T()) //温度值数据处理完毕,重新启动DS1624开始温度转换
{
secondflag=0;
secondcount=0;
TH0=55536/256;
TL0=55536%256;
TR0=1;
}
}
}
}
}
//------------------------------------
//
// 定时器中断程序,1S定时
//
//------------------------------------
void T0_1ms(void) interrupt 1 using 0 //T0用于定时1s时间到
{
secondcount++;
if(secondcount==100)
{
secondcount = 0;
secondflag = 1;
}
TH0=55536/256;
TL0=55536%256;
}
//------------------------------------
//
// 短延时
//
//------------------------------------
void delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//------------------------------------
//
// IIC启动函数
//
//------------------------------------
void IIC_start(void)
{
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
//------------------------------------
//
// IIC停止函数
//
//-----------------------------------
void IIC_stop(void)
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
delay();
}
//------------------------------------
//
// IIC初始化函数
//
//-----------------------------------
void IIC_init(void)
{
SCL=0;
IIC_stop();
}
//------------------------------------
//
// IIC应答函数
//
//-----------------------------------
void IIC_ack(void)
{
SDA=0;
IIC_clock();
SDA=1;
}
//------------------------------------
//
// IIC读取数据位
//
//-----------------------------------
bit IIC_clock(void)
{
bit sample;
SCL=1;
delay();
sample=SDA;
_nop_();
_nop_();
SCL=0;
delay();
return(sample);
}
//------------------------------------
//
// IIC发送字节函数
//
//-----------------------------------
bit IIC_send(unsigned char i_data)
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA = (bit)(i_data & 0x80);
i_data = i_data<<1;
IIC_clock();
}
SDA=1;
return(~IIC_clock());
}
//------------------------------------
//
// IIC接收字节数据函数
//
//-----------------------------------
unsigned char IIC_receive(void)
{
unsigned char i_data=0;
unsigned char i;
for(i=0;i<8;i++)
{
i_data*=2;
if(IIC_clock()) i_data++;
}
return(i_data);
}
//------------------------------------
//
// 启动温度测量函数
//
//-----------------------------------
bit start_temperature_T(void)
{
IIC_start();
if(IIC_send(0x90)) //关键就是这里 求解释下呗 函数到这里在脑里都走不动了 不理解
{
if(IIC_send(0xee))
{
IIC_stop();
delay();
return(1);
}
else
{
IIC_stop();
delay();
return(0);
}
}
else
{
IIC_stop();
delay();
return(0);
}
}
//------------------------------------
//
// 读取温度测量结果函数函数
//
//-----------------------------------
bit read_temperature_T(unsigned char *p)
{
IIC_start();
if(IIC_send(0x90))
{
if(IIC_send(0xaa))
{
IIC_start();
if(IIC_send(0x91))
{
*(p+1) = IIC_receive();
IIC_ack();
*p = IIC_receive();
IIC_stop();
delay();
return(1);
}
else
{
IIC_stop();
delay();
return(0);
}
}
else
{
IIC_stop();
delay();
return(0);
}
}
else
{
IIC_stop();
delay();
return(0);
}
}
|