hi
我發現在溫度試驗中,根據給的ds18b20芯片資料,其應該是8位傳感器,其給出的溫度的例子為:
溫度 高位 低位
+125 0x00 0xFA
+25 0x00 0x32
+0.5 0x00 0x01
0 0x00 0x00
-0.5 0xFF 0xFF
-25 0xFF 0xCE
-55 0xFF 0x92
根據上表,程序似乎采集溫度程序似乎應該這樣寫:
if (temph > 0) // 負號處理
{
templ = (~templ)+1;
f = 1;
}
tempdf = templ & 0x1; // tempdf > 0 代表0.5度
tempint = templ>>1;
但是這樣在實際板子上顯示結果不正確。
通過讀程序,發現templ的低4位是小數,temph的低4位加上templ的高4位組成溫度值的整數部分,因此應該是十二位的溫度傳感器,不知道我的理解對不對?
如果正確請提供板子上溫度傳感器的正確資料,謝謝!
另外,程序在22.1184MHz晶振下工作正常,在11.0592MHz下LED數碼管不停閃爍,不知道是什么原因?
資料難道有誤?待我仔細看看.
我一共了提供了 3個以上的 ds18b20 程序,其中有一個c語言寫的精度是0.5度,其他的精度都是0.1攝氏度晶振 都是11.0592 或者是12m 的 .
hi
溫度試驗的源程序:
void read_ds1820() //讀
{
uchar delay,i,j,k,temp,temph,templ;
j=2; //讀2位字節數據
do
{
for(i=8;i>0;i--) //一個字節分8位讀取
{
temp>>=1; //讀取1位右移1位
TMDAT=0; //數據線置低電平
delay=1;
while(--delay); //延時2us
TMDAT=1; //拉高總線
delay=4;
while(--delay); //延時8us
if(TMDAT)temp|=0x80; //讀取1位數據
delay=25;
while(--delay); //讀取1位數據后延時50us
}
if(j==2)templ=temp; //讀取的第一字節存templ
else temph=temp; //讀取的第二字節存temph
}while(--j);
f=0; //初始溫度標志為正
if((temph&0xf8)!=0x00) //若溫度為負的處理,對二進制補碼的處理
{
f=1; //為負溫度f置1
temph=~temph;
templ=~templ;
k=templ+1; // 下面幾行代碼應該在判斷是否溢出,當templ取反恰好等于255時,加1將溢出,此時templ將為零
templ=k;
//我覺得是否可以根據PSW.Cy來判斷溢出,if (CY != 0)作為判斷條件
if(k>255) // 當k>255時判斷為溢出情況,所以k似乎應該聲明為short型
{
temph++;
}
}
tempdf=templ&0x0f; //將讀取的數據轉換成溫度值,整數部分存tempint,小數部分存tempdf,這里可以看出,小數部分是低字節的低4位
templ>>=4;
temph<<=4;
tempint=temph|templ; // 溫度整數部分是高字節的低4位在加上低字節的高4位
}
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |