標(biāo)題:
stc89c52單片機(jī)ds18b20傳感器,仿真能夠獲取溫度,但是實(shí)物卻是0
[打印本頁(yè)]
作者:
21312232213
時(shí)間:
2023-5-11 14:41
標(biāo)題:
stc89c52單片機(jī)ds18b20傳感器,仿真能夠獲取溫度,但是實(shí)物卻是0
stc89c52單片機(jī)ds18b20傳感器,仿真能夠獲取溫度,但是實(shí)物卻是0,測(cè)試過(guò)傳感器沒(méi)有問(wèn)題。
溫度獲取代碼:
/*溫度函數(shù)*/
void delay_18B20(unsigned int i) //延時(shí)1微秒
{
while(i--);
}
/*ds1820復(fù)位*/
void ds1820rst(void)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay_18B20(40); //延時(shí)
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時(shí)大于480us
DQ = 1; //拉高
delay_18B20(40);
}
/*讀數(shù)據(jù)*/
uchar ds1820rd(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //給脈沖信號(hào)
dat>>=1;
DQ = 1; //給脈沖信號(hào)
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/*寫數(shù)據(jù)*/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*讀取溫度值并轉(zhuǎn)換*/
unsigned int get_temp(void)
{
unsigned int tvalue=0;
uchar a,b;
ds1820rst();
delay_18B20(1);
ds1820wr(0xcc); //跳過(guò)讀序列號(hào)/
ds1820wr(0x44);
delay_18B20(1); //啟動(dòng)溫度轉(zhuǎn)換/
ds1820rst();
ds1820wr(0xcc); //跳過(guò)讀序列號(hào)/
ds1820wr(0xbe); //讀取溫度/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff) ; // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625); //溫度值擴(kuò)大10倍,精確到1位小數(shù)
return(tvalue);
}
作者:
21312232213
時(shí)間:
2023-5-11 14:51
連接單片機(jī)sbit DQ=P3^1;
作者:
lkc8210
時(shí)間:
2023-5-11 14:57
30塊包郵的邏輯分析儀,你值得擁有
作者:
wc86110
時(shí)間:
2023-5-11 16:17
仿真≠實(shí)物,只有軟硬件完美結(jié)合才會(huì)沒(méi)問(wèn)題
作者:
人中狼
時(shí)間:
2023-5-11 21:56
代碼有問(wèn)題,確定這個(gè)代碼在仿真里能用??
作者:
wulin
時(shí)間:
2023-5-12 11:33
代碼沒(méi)有什么問(wèn)題,可能是晶振不合適,延時(shí)函數(shù)可能不準(zhǔn)確導(dǎo)致18b20時(shí)序不準(zhǔn)所致。下面是在TX-1C實(shí)驗(yàn)板上測(cè)試,串口返回的數(shù)據(jù),晶振11.0592MHz,
/*溫度函數(shù)*/
void delay_18B20(unsigned int i) //12MHz T=i*9+16us
{
while(i--);}
無(wú)標(biāo)題.jpg
(79.52 KB, 下載次數(shù): 20)
下載附件
2023-5-12 16:28 上傳
下面是測(cè)試程序,樓主代碼部分沒(méi)有任何改動(dòng)
#include<reg51.H>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit DQ=P2^2;
uchar data dis_buf[]="000.0\n"; //緩存數(shù)組
uint temp;
uchar i;
/*溫度函數(shù)*/
void delay_18B20(unsigned int i)//延時(shí)1微秒
{
while(i--);
}
/*ds1820復(fù)位*/
void ds1820rst(void)
{
unsigned char x=0;
DQ = 1; //DQ復(fù)位
delay_18B20(40); //延時(shí)
DQ = 0; //DQ拉低
delay_18B20(100); //精確延時(shí)大于480us
DQ = 1; //拉高
delay_18B20(40);
}
/*讀數(shù)據(jù)*/
uchar ds1820rd(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //給脈沖信號(hào)
dat>>=1;
DQ = 1; //給脈沖信號(hào)
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
/*寫數(shù)據(jù)*/
void ds1820wr(uchar wdata)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
/*讀取溫度值并轉(zhuǎn)換*/
unsigned int get_temp(void)
{
unsigned int tvalue=0;
uchar a,b;
ds1820rst();
delay_18B20(1);
ds1820wr(0xcc); //跳過(guò)讀序列號(hào)/
ds1820wr(0x44);
delay_18B20(1); //啟動(dòng)溫度轉(zhuǎn)換/
ds1820rst();
ds1820wr(0xcc); //跳過(guò)讀序列號(hào)/
ds1820wr(0xbe); //讀取溫度/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff); // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
return(tvalue);
}
void InitUART(void)
{
PCON = 0x00;
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
void main()
{
InitUART();
while(1)
{
temp=get_temp();
dis_buf[0]=temp/1000%10+'0';
dis_buf[1]=temp/100%10+'0';
dis_buf[2]=temp/10%10+'0';
dis_buf[4]=temp%10+'0';
for(i=0;i<6;i++)
{
SBUF=dis_buf[i];
while(!TI);
TI=0;
}
delay_18B20(50000);
}
}
復(fù)制代碼
作者:
人中狼
時(shí)間:
2023-5-12 13:50
if(tvalue<0x0fff) ; // tflag=0;
else tvalue=0; // {tvalue=~tvalue+1;tflag=1;}
tvalue=tvalue*(0.625); //溫度值擴(kuò)大10倍,精確到1位小數(shù)
不太理解這一段
作者:
名字不是重點(diǎn)
時(shí)間:
2023-5-12 14:06
代碼有問(wèn)題:
if(tvalue<0x0fff) ;
else tvalue=0;
//有這樣的語(yǔ)法嗎?
作者:
rayin
時(shí)間:
2023-5-12 17:01
核對(duì)軟件時(shí)候,不要忘記查下硬件線路有沒(méi)問(wèn)題, 與18B20數(shù)據(jù)腳相連的腳是不是軟件定義的那個(gè)IO口.不要焊錯(cuò)線了.
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1