|
本帖最后由 lids 于 2017-5-25 08:44 編輯
開始溫度顯示0,是因?yàn)?8B20時(shí)序不對,修改后正常了,我用的11.0592MHz的晶振,下面是修改過的1820的程序,希望別人不要走彎路
#include "main.h"
#include "DS18B20.h"
//#include "delay.h"
uint tvalue; //溫度值
uchar tflag;
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延時(shí)1微秒 11.0592MHz晶振
{
while(i--);
}
/******************************************************************************/
/*************ds1820復(fù)位***************/
void ds1820rst()
{
unsigned char x=0;
D18b20 = 1; //DQ復(fù)位
// delayus(10); //延時(shí) 開始用這個(gè)延時(shí),時(shí)序不對,溫度顯示0
delay_18B20(4);
D18b20 = 0; //DQ拉低
// delayus(400); //精確延時(shí)大于480us
delay_18B20(100);
D18b20 = 1; //拉高
// delayus(200);
delay_18B20(100);
}
uchar ds1820rd()/*讀數(shù)據(jù)*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{ D18b20 = 0; //給脈沖信號
dat>>=1;
D18b20 = 1; //給脈沖信號
if(D18b20)
dat|=0x80;
// delayus(40);
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
{unsigned char i=0;
for (i=8; i>0; i--)
{ D18b20 = 0;
D18b20 = wdata&0x01;
// delayus(40);
delay_18B20(10);
D18b20 = 1;
wdata>>=1;
}
}
read_temp()/*讀取溫度值并轉(zhuǎn)換*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc); //*跳過讀序列號*/
ds1820wr(0x44); //*啟動溫度轉(zhuǎn)換*/
ds1820rst();
ds1820wr(0xcc); //*跳過讀序列號*/
ds1820wr(0xbe); //*讀取溫度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625);//溫度值擴(kuò)大10倍,精確到1位小數(shù)
return(tvalue);
}
|
|