|
|
修改了部分語(yǔ)句,未必符合樓主需求,就算提供一個(gè)思路。
- void DS18B20_Read_Celsius_Drive()
- {
- static xdata u16 count=0;//為了利用狀態(tài)機(jī)進(jìn)行復(fù)位
- // float num;//定義一個(gè)浮點(diǎn)數(shù)的變量
- u16 temp;
- u8 TempH,TempL;
- bit negative;//負(fù)數(shù)標(biāo)志
- u8 xdata Value_High,Value_Low;//定義兩個(gè)高低位的變量,用以保存
- count++;
- switch(count)
- {
- case 1: DS18B20_DQ=0;break;//count=1,第一步把DQ拉低
- case 35: DS18B20_DQ=1;break;//根據(jù)圖顯示,然后拉高
- case 60:
- DS18B20_Write_Reg(0xcc);//開(kāi)始寫入指令
- DS18B20_Write_Reg(0x44);//同上
- break;
- case 4000: DS18B20_DQ=0;break;
- case 4035: DS18B20_DQ=1;break;
- case 4060:
- DS18B20_Write_Reg(0xcc);
- DS18B20_Write_Reg(0xbe);//發(fā)送指令BE
- Value_Low=DS18B20_Read_Data();//然后開(kāi)始讀取兩次數(shù)據(jù),步驟6
- Value_High=DS18B20_Read_Data();
- temp=Value_High<<8|Value_Low;
- if(temp&0x8000)
- {
- negative=1; //負(fù)號(hào)標(biāo)志
- temp=~temp; //取反加1
- temp +=1;
- }
- else negative=0; //正數(shù)
- TempH=temp>>4; //分解出整數(shù)
- TempL=temp&0x0F; //分解出小數(shù)
- TempL=TempL*6/10; //保留一位小數(shù)
- if(negative==1)
- DS18B20_Read_Buffer[0]=0x40;//顯示負(fù)號(hào)
- else if(TempH/100==0)//小于100
- DS18B20_Read_Buffer[0]=0; //百位消隱
- else
- DS18B20_Read_Buffer[0]=smgdu[TempH/100]; //顯示百位溫度
-
- if((TempH/100==0)&&((TempH%100)/10==0))
- DS18B20_Read_Buffer[1]=0; //十位消隱
- else
- DS18B20_Read_Buffer[1]=smgdu[(TempH%100)/10]; //顯示十位溫度
- DS18B20_Read_Buffer[2]=smgdu[(TempH%100)%10]|0x80;//顯示個(gè)位溫度,帶小數(shù)點(diǎn)
- DS18B20_Read_Buffer[3]=smgdu[TempL]; //顯示小數(shù)溫度1位
- if(TempH>=preset && negative==0)//溫度超過(guò)正預(yù)設(shè)值,LED燈亮
- led=0;
- else led=1;
- // Value_High<<=4;//高字節(jié)左移四位,剩下一個(gè)藍(lán)三個(gè)紅
- // Value_High+=(Value_Low&0xf0)>>4;//先將低字節(jié)高四位取出來(lái)11110000,再右移四位,然后加上高字節(jié)的四位
- // DS18B20_Read_Buffer[0]=Value_High;//整數(shù)部分已經(jīng)保存好了
- // num=(Value_Low&0x0f)*0.0625;
- // DS18B20_Read_Buffer[1]=(u8)(num*100);
- break;
- case 8000: count=0;break;
- }
- }
復(fù)制代碼 |
|