DS18B20溫度傳感器-51單片機控制程序

一.概述

DS18B20數字溫度傳感器提供9-Bit到12-Bit的攝氏溫度測量精度和一個用戶可編程的非易失性且具有過溫和低溫觸發報警的報警功能。DS18B20採用的1-Wire通信即僅採用一個數據線(以及地)與微控制器進行通信,採集數據的精度爲12bit。
該傳感器的溫度檢測範圍爲-55℃至+125℃,並且在溫度範圍超過-10℃至85℃之外時還具有±0.5℃的精度。此外,DS18B20可以直接由數據線供電而不需要外部電源供電。
在這裏插入圖片描述

二.電氣參數
1.特點
  • 供電電壓:3.0V-5.5V。
  • 測量溫度範圍:-55~+125℃
  • 精度:±0.5℃
  • 數據傳輸:“一線總線”的數字方式傳輸
  • 採集精度:可以由用戶自定義爲9-Bits至12-Bits。
2.引腳說明

在這裏插入圖片描述

3.參考電路圖

在這裏插入圖片描述
DS18B20供電一般採用外部供電方式,並且在數據線上並聯一個4.7k的上拉電阻,以增強數據的抗干擾能力。

三.控制時序
1.初始化時序

與DS18B20所有的通信都是由初始化時序開始的,該時序包括從主設備發出的復位脈衝及從DS18B20響應的存在脈衝組成。如圖所示。
在這裏插入圖片描述
當DS18B20響應復位信號的存在脈衝後,則其向主設備表明其在該總線上,並且已經做好操作命令。

/*******************************************************************************
* 函 數 名         : Ds18b20Init
* 函數功能		   : 初始化
* 輸    入         : 無
* 輸    出         : 初始化成功返回1,失敗返回0
*******************************************************************************/
uchar Ds18b20Init()
{
	unsigned char x=0;
  DSPORT = 1;         //DQ復位
  Delay_DS18B20(8);    //稍做延時
  DSPORT = 0;         //單片機將DQ拉低
  Delay_DS18B20(80);   //精確延時,大於480us
  DSPORT = 1;         //拉高總線
  Delay_DS18B20(14);
  x = DSPORT;           //稍做
return x;//初始化成功
}
2.讀時序

寫時段有兩種情況:“寫1”時段和“寫0”時段。主設備通過寫1時段來向DS18B20中寫入邏輯1以及通過寫0時段來向DS18B20中寫入邏輯0。每個寫時段最小必須有60us的持續時間且獨立的寫時段間至少有1us的恢復時間。兩個寫時段都是由主設備通過將1-Wire總線拉低來進行初始化,如圖。
在這裏插入圖片描述
根據以上讀0及1的時序,便可實現讀取一個完整字節的函數,如下:

/*******************************************************************************
* 函 數 名         : Ds18b20ReadByte
* 函數功能		   : 讀取一個字節
* 輸    入         : 無
* 輸    出         : dat
*******************************************************************************/
uchar Ds18b20ReadByte()
{
	unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DSPORT = 0;     // 給脈衝信號
    dat>>=1;
    DSPORT = 1;     // 給脈衝信號
    if(DSPORT)
    dat|=0x80;
    Delay_DS18B20(4);
  }
  return(dat);
}
3.寫時序

僅在讀時段期間DS18B20才能向主設備傳送數據。因此,主設備在執行完讀暫存寄存器[BEh]或讀取供電模式[B4h]後,必須及時地生成讀時段,這樣DS18B20才能提供所需的數據。此外,主設備可以在執行完轉換溫度[指令:44h]或拷貝EEPROM[指令:B8h]命令後生成讀時段,以便獲得在“DS18B20功能命令”表中提到的操作信息。時序如圖:
在這裏插入圖片描述
根據以上寫0及1的時序,便可實現寫入一個完整字節的函數,如下:

/*******************************************************************************
* 函 數 名         : Ds18b20WriteByte
* 函數功能		   : 向18B20寫入一個字節
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
void Ds18b20WriteByte(uchar dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DSPORT = 0;
    DSPORT = dat&0x01;
    Delay_DS18B20(5);
    DSPORT = 1;
    dat>>=1;
  }
}
四.控制程序
1.讀取溫度流程

要讀取一個完整的溫度值,需要根據以上流程進行操作。先對DS18B20進行復位操作,再發送開始轉換指令(指令值:0x44),再發送復位操作,等待DS18B20應答後,發送讀取溫度指令,最後就可以讀取16位的數據(有限位最大爲12位)。
在這裏插入圖片描述

2.讀取溫度程序
/*******************************************************************************
* 函 數 名         : Ds18b20ChangTemp
* 函數功能		   : 讓18b20開始轉換溫度
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void  Ds18b20ChangTemp()
{
	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);		//跳過ROM操作命令		 
	Ds18b20WriteByte(0x44);	    //溫度轉換命令
//	Delay1ms(100);	//等待轉換成功,而如果你是一直刷着的話,就不用這個延時了
}
/*******************************************************************************
* 函 數 名         : Ds18b20ReadTempCom
* 函數功能		   : 發送讀取溫度命令
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void  Ds18b20ReadTempCom()
{	
	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);	 //跳過ROM操作命令
	Ds18b20WriteByte(0xbe);	 //發送讀取溫度命令
}
/*******************************************************************************
* 函 數 名         : Ds18b20ReadTemp
* 函數功能		   : 讀取溫度
* 輸    入         : 無
* 輸    出         : 溫度值
*******************************************************************************/

int Ds18b20ReadTemp()
{
	int temp = 0;
	uchar tmh, tml;

	Ds18b20ChangTemp();			 	//先寫入轉換命令
	Ds18b20ReadTempCom();			//然後等待轉換完後發送讀取溫度命令
	tml = Ds18b20ReadByte();		//讀取溫度值共16位,先讀低字節
	tmh = Ds18b20ReadByte();		//再讀高字節
	temp = tmh;
	temp <<= 8;
	temp |= tml;
	return temp;
}
/*******************************************************************************
* 函 數 名         : GetTemp
* 函數功能		   : 串口輸出溫度值
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
Void GetTemp(void)
{
	int temp;
	float tp; 
	ET0 = 0;
	temp = Ds18b20ReadTemp();
	ET0 = 1;
	if(temp<= 0)				    //當溫度值爲負數
    {
//		temp=temp-1;
//		temp=~temp;
//		tp=temp;
//		temp=tp*0.0625*100+0.5;	
        Uart_SendString("Overrate!\r\n");    //超過量程
    }
 	else
	{			
		tp=temp;//因爲數據處理有小數點所以將溫度賦給一個浮點型變量
		//如果溫度是正的那麼,那麼正數的原碼就是補碼它本身
		temp=tp*0.0625*100+0.5;	
		//留兩個小數點就*100,+0.5是四捨五入,因爲C語言浮點數轉換爲整型的時候把小數點
		//後面的數自動去掉,不管是否大於0.5,而+0.5之後大於0.5的就是進1了,小於0.5的就
		//算加上0.5,還是在小數點後面。
	}
	Uart_SendString("The Current Temperature is: ");
	Uart_SendByte((temp% 10000 / 1000) + 0x30);
	Uart_SendByte((temp% 1000 / 100) + 0x30);
	Uart_SendByte('.');
	Uart_SendByte((temp% 100 / 10) + 0x30);
	Uart_SendByte((temp% 10) + 0x30);
	Uart_SendString("℃\r\n"); 
}

如需DS18B20相關資料及例程, 請關注公衆號,首頁回覆DS18B20獲取資料
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章