|
本帖最后由 lids 于 2017-5-25 08:44 編輯
開始溫度顯示0,是因為18B20時序不對,修改后正常了,我用的11.0592MHz的晶振,下面是修改過的1820的程序,希望別人不要走彎路
#include "main.h"
#include "DS18B20.h"
//#include "delay.h"
uint tvalue; //溫度值
uchar tflag;
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延時1微秒 11.0592MHz晶振
{
while(i--);
}
/******************************************************************************/
/*************ds1820復位***************/
void ds1820rst()
{
unsigned char x=0;
D18b20 = 1; //DQ復位
// delayus(10); //延時 開始用這個延時,時序不對,溫度顯示0
delay_18B20(4);
D18b20 = 0; //DQ拉低
// delayus(400); //精確延時大于480us
delay_18B20(100);
D18b20 = 1; //拉高
// delayus(200);
delay_18B20(100);
}
uchar ds1820rd()/*讀數據*/
{ 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)/*寫數據*/
{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()/*讀取溫度值并轉換*/
{
uchar a,b;
ds1820rst();
ds1820wr(0xcc); //*跳過讀序列號*/
ds1820wr(0x44); //*啟動溫度轉換*/
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);//溫度值擴大10倍,精確到1位小數
return(tvalue);
}
|
|