void delay1(uint t)
{
while(--t);
}
void init_18b20()
{
uchar flag;
DQ=1;
delay1(10); //延時
DQ=0;
delay1(500); //*延時,要求精度,要求大于480us*
DQ=1;
delay1(200); //*延時,要求精度,要求大于15us*
flag=DQ; //DQ管腳送出60-240us的0脈沖,以示初始化成功
delay1(10); //延時
}
//**************************************************************************************************
//寫一個字節函數
//**************************************************************************************************
void write_byte(uchar t)
{
uchar i;
for(i=0;i<8;i++) //循環8次寫入1字節
{
DQ=0; //數據線置低
delay1(10); //延時
DQ=t&0x01; //發送1位數據,最低位開始
delay1(50); //*延時,要求精度*
DQ=1; //數據線置高
t=t>>1; //右移1位
}
}
//**************************************************************************************************
//讀一個字節函數
//**************************************************************************************************
uchar read_byte()
{
uchar i,value=0;;
for(i=0;i<8;i++) //循環8次讀取1字節
{
value=value>>1; //右移1位
DQ=0; //數據線置低
delay1(10); //延時
DQ=1; //數據線置高
delay1(10); //延時
if(DQ==1)value=value|0x80;//判斷接收的1位數據是否為1
delay1(50); //*延時,要求精度*
}
return(value);
}
//**************************************************************************************************
//數據處理子函數
//**************************************************************************************************
//**************************************************************************************************
//溫度采集函數
//**************************************************************************************************
uint get_temp()
{
uint dat;
uchar wenl,wenh;
init_18b20(); //復位
write_byte(0xcc); //不進行編號匹配
write_byte(0x44); //進行溫度轉換
init_18b20(); //復位
write_byte(0xcc); //不進行編號匹配
write_byte(0xbe); //發讀命令
wenl=read_byte(); //溫度低八位
wenh=read_byte(); //溫度高八位
dat=(wenh<<8)+wenl; //數據高低8位合并
return(dat); //返回測量結果
}
void chuli(uint temp)
{
uint y,t;
uchar ge,shi;
if(temp&0x8000) //判斷是否為負數
{
temp=~temp+1;//取反加1
LCD_PutString(180,40,"-",0x0000,0x7FFF);
t=(int)(temp*0.0625);
}
else
{
LCD_PutString(180,40,"+",0x0000,0x7FFF);
t=(int)(temp*0.0625+0.05);
}
}
|