写了一个18B20的程序,可不管怎么样显示都为0,求解。。程序如下:
#define DS18b20_H (PORTD|=(1<<PD6))
#define DS18b20_L (PORTD&=~(1<<PD6))
void Delayus(uint US)
{
uint i;
US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
void Delayms(uint MS)
{
uint i,j;
for( i=0;i<MS;i++)
for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
}
void DS18b20_Init(void)
{
DDRD|=0X40;
DS18b20_L;
Delayus(500);
DS18b20_H;
DDRD&=0XBF;
Delayus(500);
}
uchar read_18b20_byte(void)
{
uchar i;
uchar dat1,dat;
dat=0x00;
for(i=0;i<8;i++)
{
DDRD|=0X40;
DS18b20_L;
Delayus(3);
DS18b20_H;
DDRD&=0xBF;
Delayus(10);
dat=dat>>1;
dat1=(PIND&0X40);
if(dat1!=0x00)
{
dat|=0x80;
}
Delayus(60);
}
return dat;
}
void write_18b20_byte(uchar date)
{
uchar i;
uchar j;
DDRD|=0X40;
for(i=0;i<8;i++)
{
j=date&0x01;
if(j!=0x00)
{
DS18b20_L;
Delayus(20);
DS18b20_H;
Delayus(80);
}
else
{
DS18b20_L;
Delayus(90);
DS18b20_H;
Delayus(10);
}
date=date>>1;
}
}
uint GetTemp(void)
{
uchar a,b;
float tt;
DS18b20_Init();
write_18b20_byte(0xcc);
write_18b20_byte(0x44);
Delayms(5);
DS18b20_Init();
write_18b20_byte(0xcc);
write_18b20_byte(0xbe);
a=read_18b20_byte();
b=read_18b20_byte();
if(b>127)
{
zf=1;
a=~a+1;
b=~b;
}
else
{
zf=0;
}
temp=b;
temp=temp<<8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
|