|
/***********18B20復(fù)位函數(shù)**********/
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; //清標(biāo)志位,表示ds1820不存在
DQ=1;
return;
d1: delay(45); //延時(shí)500us
flag=1;
DQ=1; //置標(biāo)志位,表示ds1820存在
}
/**********18B20寫命令函數(shù)*********/
//向 1-WIRE 總線上寫一個(gè)字節(jié)
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個(gè)字節(jié)函數(shù)********/
//從總線上讀取一個(gè)字節(jié)
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);
}
/***********讀出溫度函數(shù)**********/
Read18B20()
{
RST18B20(); //總線復(fù)位
if(!flag) //判斷ds1820是否存在?若ds18b20不存在則返回
return;
//Write1Byte18B20(0xCC); // Skip ROM
//Write1Byte18B20(0x44); // 發(fā)轉(zhuǎn)換命令
//delay(70);
Write1Byte18B20(0xCC); //發(fā)Skip ROM命令
Write1Byte18B20(0xBE); //發(fā)讀命令
temp_data[0]=Read1Byte18B20(); //溫度低8位
temp_data[1]=Read1Byte18B20(); //溫度高8位
RST18B20();
Write1Byte18B20(0xCC); // Skip ROM
Write1Byte18B20(0x44); // 發(fā)轉(zhuǎn)換命令
}
/***********溫度數(shù)據(jù)處理函數(shù)**********/
DealTempData()
{
unsigned char n=0,m;
if(temp_data[1]>127)//負(fù)溫度求補(bǔ)碼
{
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時(shí)都不顯示
{
time2[9]=0x20;
if(n)//負(fù)溫度時(shí)最高位顯示"-"
{
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) //延時(shí)1ms
{
unsigned char i,j;
for(i=0;i<time;i++)
{
for(j=0;j<250;j++);
}
}
|
|