/***********18B20复位函数**********/
RST18B20(void)
{
unsigned char i;
DQ=1;_nop_();_nop_();
DQ=0; //
delay(50); // 550us
DQ=1; //
delay(6); // 66us
for(i=0;i<0x30;i++)
{
if(!DQ)
goto d1;
}
flag=0; //清标志位,表示ds1820不存在
DQ=1;
return;
d1: delay(45); //延时500us
flag=1;
DQ=1; //置标志位,表示ds1820存在
}
/**********18B20写命令函数*********/
//向 1-WIRE 总线上写一个字节
void Write1Byte18B20(unsigned char val)
{
unsigned char i;
for (i=8; i>0; i--) //
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DQ=val&0x01; //最低位移出
delay(6); //66us
val=val/2; //右移一位
}
DQ=1;
delay(1);
}
/*********18B20读1个字节函数********/
//从总线上读取一个字节
unsigned char Read1Byte18B20(void)
{
unsigned char i;
unsigned char value=0;
for (i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DQ=1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DQ)
value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
/***********读出温度函数**********/
Read18B20()
{
RST18B20(); //总线复位
if(!flag) //判断ds1820是否存在?若ds18b20不存在则返回
return;
//Write1Byte18B20(0xCC); // Skip ROM
//Write1Byte18B20(0x44); // 发转换命令
//delay(70);
Write1Byte18B20(0xCC); //发Skip ROM命令
Write1Byte18B20(0xBE); //发读命令
temp_data[0]=Read1Byte18B20(); //温度低8位
temp_data[1]=Read1Byte18B20(); //温度高8位
RST18B20();
Write1Byte18B20(0xCC); // Skip ROM
Write1Byte18B20(0x44); // 发转换命令
}
/***********温度数据处理函数**********/
DealTempData()
{
unsigned char n=0,m;
if(temp_data[1]>127)//负温度求补码
{
temp_data[1]=(256-temp_data[1]);
temp_data[0]=(256-temp_data[0]);
n=1;
}
time2[13]=ditab[temp_data[0]&0x0f]+'0';
time2[12]='.';
m=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//
if(n)
{
m-=16;
}
time2[9]=m/100+'0';
time2[11]=m%100;
time2[10]=time2[11]/10+'0';
time2[11]=time2[11]%10+'0';
if(time2[9]=='0')//最高位为0时都不显示
{
time2[9]=0x20;
if(n)//负温度时最高位显示"-"
{
time2[9]='-';
}
if(time2[10]=='0')
{
if(n)
{
time2[10]='-';
time2[9]=0x20;
}
else
time2[10]=0x20;
if(time2[11]=='0'&&time2[13]=='0')
time2[11]=time2[12]=0x20;
}
}
}
delay1ms(unsigned char time) //延时1ms
{
unsigned char i,j;
for(i=0;i<time;i++)
{
for(j=0;j<250;j++);
}
}
|