詳解溫度感測器DS18B20程式設計與使用
阿新 • • 發佈:2018-12-15
DS18B20是由DALLAS半導體公司推出的一種的“一線匯流排”介面的溫度感測器, 與傳統的熱敏電阻等測溫元件相比,它是一種新型的體積小、適用電壓寬、與微處理器介面簡單的數字化溫度感測器。
1.測量溫度範圍:-55~+125℃
2.精度:±0.5℃
3.資料傳輸:“一線匯流排”的數字方式傳輸
圖1 硬體連線圖
DS18B20共有6種訊號型別:復位脈衝、應答脈衝、寫0、寫1、讀0和讀1
1.復位操作:
引腳拉低——延時480-960us——引腳高——延時15-60us
圖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 紅框為應答操作時序
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 讀操作
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 紅框為寫操作
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 紅框為寫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();
return DS18B20_Check();
}
10.獲取溫度值
圖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)
return tem; //返回溫度值
else
return -tem;
}
參考文獻:
STM32F103開發指南-標準庫版本_V1.1
DS18B20資料手冊