DS18B20是由DALLAS半導體公司推出的一種的“一線總線”接口的溫度傳感器, 與傳統的熱敏電阻等測溫元件相比,它是一種新型的體積小、適用電壓寬、與微處理器接口簡單的數字化溫度傳感器。
1.測量溫度范圍:-55~+125℃
2.精度:±0.5℃
3.數據傳輸:“一線總線”的數字方式傳輸
1.png (6 KB, 下載次數: 56)
下載附件
2019-3-24 12:13 上傳
圖1 硬件連接圖
DS18B20共有6種信號類型:復位脈沖、應答脈沖、寫0、寫1、讀0和讀1
1.復位操作:
引腳拉低——延時480-960us——引腳高——延時15-60us
2.png (41.01 KB, 下載次數: 49)
下載附件
2019-3-24 12:13 上傳
圖2 紅框為復位操作時序
void DS18B20_Rst(void)
{
DS18B20_IO_OUT();
DS18B20_DQ_OUT=0;
delay_us(750);
DS18B20_DQ_OUT=1;
delay_us(15);
}
2.應答操作
將引腳設置為輸入模式——判斷引腳低電平時間是否大于60us、小于240us——返回應答結果
3.png (42.04 KB, 下載次數: 45)
下載附件
2019-3-24 12:13 上傳
圖3 紅框為應答操作時序
u8 DS18B20_Check(void)
{
u8retry=0;
DS18B20_IO_IN(); //SET PG11 INPUT
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200)return1;
elseretry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)return1;
return0;
}
3. 讀0、讀1操作
將引腳設置為輸出模式——引腳拉低——延時2us——引腳拉高——設置為輸入模式——延時2us——讀取引腳狀態——返回讀取結果
4.jpg (21.66 KB, 下載次數: 53)
下載附件
2019-3-24 12:13 上傳
圖4 讀操作
u8 DS18B20_Read_Bit(void)
{
u8 data;
DS18B20_IO_OUT(); //SET PG11 OUTPUT
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
DS18B20_IO_IN(); //SET PG11 INPUT
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
4.寫1操作
設置引腳為輸出模式——引腳拉低——延時2us——引腳拉高——延時大于60us
5.png (44.29 KB, 下載次數: 52)
下載附件
2019-3-24 12:13 上傳
圖5 紅框為寫操作
void DS18B20_Write_Zero(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
DS18B20_DQ_OUT=0;
delay_us(2);
DS18B20_DQ_OUT=1;
delay_us(60);
}
5.寫0操作
設置引腳為輸出模式——引腳拉低——延時60-120us——引腳拉高——延時2us
6.png (39.65 KB, 下載次數: 59)
下載附件
2019-3-24 12:13 上傳
圖6 紅框為寫1操作
void DS18B20_Write_One(void)
{
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
DS18B20_DQ_OUT=0;
delay_us(60);
DS18B20_DQ_OUT=1;
delay_us(2);
}
基本的操作完成后,再寫4個功能函數
6.讀取一個字節
u8 DS18B20_Read_Byte(void)
{
u8 i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
7.寫一個字節
void DS18B20_Write_Byte(u8 dat)
{
u8 j;
u8 testb;
DS18B20_IO_OUT(); //SET PG11 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)
DS18B20_Write_One();
else
DS18B20_Write_Zero();
}
}
8.開始讀取數據
void DS18B20_Start(void)
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc); // skiprom
DS18B20_Write_Byte(0x44); //convert
}
9.初始化DS18B20
u8 DS18B20_Init(void)
{
GPIO_Init(); //此引腳需根據相應的單片機進行配置
DS18B20_Rst();
returnDS18B20_Check();
}
10.獲取溫度值
7.png (5.17 KB, 下載次數: 49)
下載附件
2019-3-24 12:13 上傳
圖7 程序流程圖 short DS18B20_Get_Temp(void)
{
u8 temp;
u8 TL,TH;
short tem;
DS18B20_Start (); //開始轉換
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc); //skip rom
DS18B20_Write_Byte(0xbe); //convert
TL=DS18B20_Read_Byte(); //LSB
TH=DS18B20_Read_Byte(); //MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0;//溫度為負
}else temp=1;//溫度為正
tem=TH; //獲得高八位
tem<<=8;
tem+=TL;//獲得底八位
tem=(double)tem*0.625;//轉換
if(temp)returntem; //返回溫度值
elsereturn -tem;
}
參考文獻:
STM32F103開發指南-標準庫版本_V1.1
DS18B20數據手冊
|