下面是我写的ds1624的温度芯片程序 但是不能检测温度。请高手指点。
#include<reg52.h>
#include<intrins.h>
#include"ds1624.h"
#include"LCD.h"
void delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void i_start() //I2C开始通信
{
i_sda = 1;
delay();
i_scl = 1;
delay();
i_sda = 0;
delay();
}
void i_stop() //I2C结束通信
{
i_scl = 1;
delay();
i_sda = 0;
delay();
i_sda = 1;
delay();
}
/* 向从机发送数据和应答信号
**
*/
bit send_i_dat(uchar dat)
{
uchar date,i;
i_scl = 0;
delay();
date = dat;
for(i = 0;i<8;i++)
{
if(date&0x80)
i_sda = 1;
else
i_sda = 0;
date = date<<1;
i_scl = 0;
delay();
i_scl = 1;
delay();
i_scl = 0;
delay();
}
i_scl = 0;
delay();
i_sda = 1; //释放总线
delay();
if(i_ack()) //检测应答
return 1;
else
return 0;
}
/*应答函数 sda为低表示应答 高为非应答
*/
uchar i_ack()
{
bit ack;
i_scl = 0;
delay();
ack = i_sda;
delay();
i_scl = 1;
delay();
i_scl = 0;
delay();
return ack;
}
//主机接受一字节后发送应答信号
void send_ack(bit a)
{
i_sda = 0;
i_scl = 0;
delay();
i_sda = a;
delay();
i_scl = 1;
delay();
}
//主机接收信号
uchar i_receive(bit b)
{
uchar i,r_dat = 0,j; //接收的数据
i_sda = 1;
delay();
i_scl = 0;
delay();
for(i = 0;i<8;i++)
{
j = i_sda;
r_dat |= j;
i_scl = 0;
delay();
i_scl = 1;
delay();
i_scl = 0;
delay();
r_dat = r_dat<<1;
}
i_sda = 1; //释放总线
delay();
send_ack(b);
return r_dat;
}
//开始转换温度
uchar start_temperature()
{
i_start();
if(send_i_dat(0x90))
{
delay();
if(send_i_dat(0xee))
{
delay();
i_stop();
return 1;
}
else
{
i_stop();
return 0;
}
}
else
{
i_stop();
return 0;
}
}
//读取温度值
uchar read_temperature(uchar *p)
{
i_start();
if(send_i_dat(0x90))
{
delay();
if(send_i_dat(0xaa))
{
delay();
i_start();
if(send_i_dat(0x91))
{
*(p+1) = i_receive(0);
*p=i_receive(1);
i_stop();
delay();
return(1);
}
}
}
else
{
i_stop();
delay();
return(0);
}
}
以下是主程序
i_scl = 0;
i_stop();
while(1)
{
start_temperature();
if(flag == 1)
{
read_temperature(a);
temper = dat_transform(a);
xs(temper,2,0);
}
}
|