多點溫度測試

DS18B20溫度傳感器
一、簡介:
在這裏插入圖片描述
圖示有字的一面,注意GND和VCC不要接反。工作電壓3.0v~5.5V,採集溫度-55度到正125度,可編程溫度9-12位,精度分別是0.5度,0.25度,0.125度0.0625度,默認都是12位,12位轉換時間是750ms,9位是93.75ms,電壓負壓特性(不會因電源接反發熱燒壞)。
二、電路連接:
在這裏插入圖片描述
接一個上拉電阻。
三、通信方式:
單總線通信:
單總線是一種具有一個總線主機和一個或若干個從機的系統。嚴格按照器件的時間要求進行復位,寫命令,讀寫數據等。整個過程在一條線上進行。
四、DS18B20的內部結構:
在這裏插入圖片描述
64位光刻ROM,溫度傳感器,非易失性的溫度報警觸發器TH和TL,配置寄存器。出廠前ROM的排列是:開始8位產品類型標號(28H),接着48位是DS18B20全球唯一序列號,最後8位是前面56位的循環冗餘校驗碼。
DS18B20存儲器:
在這裏插入圖片描述
Byte0和Byte1分別存儲溫度寄存器的低字節和高字節,這兩個字節是隻讀的。我們一般只操作這兩個字節。
在這裏插入圖片描述
五、DS18B20的指令:
命令有兩種,一種ROM的指令,一種暫存器的指令。
在這裏插入圖片描述
六、操作時序:
分爲4個步驟:
1.復位:單片機發一個低電平給DS18B20,DS18B20返回一個低電平給單片機,完成喚醒握手。
2.發送ROM命令
3.發送暫存器指令
4.發送數據或接受數據

單個溫度測試代碼:

#include<All.h>
uchar xdata DS18B20_Buffer[2]=0;//保存溫度的數據
void Delay500us()		//@24.000MHz
{
	unsigned char i, j;
	i = 16;
	j = 147;
	do
	{
		while (--j);
	} while (--i);
}
void Delay80us()		//@24.000MHz
{
	unsigned char i, j;
	_nop_();
	_nop_();
	i = 3;
	j = 123;
	do
	{
		while (--j);
	} while (--i);
}
void Delay60us()		//@24.000MHz
{
	unsigned char i, j;
	_nop_();
	i = 2;
	j = 220;
	do
	{
		while (--j);
	} while (--i);
}
void Delay10us()		//@24.000MHz
{
	unsigned char i;
	i = 78;
	while (--i);
}
void Delay2us()		//@24.000MHz
{
	unsigned char i;
	i = 14;
	while (--i);
}
/*********************************
 * @函數名:DS18B20_Reset
 * @描   述:復位
 * @說   明:
 * @參   數:無
 * @返回值:無 
 *********************************/
void DS18B20_Reset()
{
    DS18B20_DQ=0;//總線拉低
	Delay500us();//保持500us
	DS18B20_DQ=1;//短暫拉高
	Delay80us();//80us

	//等待拉低
	Delay500us();//返回一個106us的低電平
	DS18B20_DQ=1;
	_nop_();//短暫拉高
	_nop_();
}
/*********************************
 * @函數名:DS18B20_Write_Com
 * @描   述:寫寄存器指令
 * @說   明:
 * @參   數:dat 要寫入的數據
 * @返回值:無 
 *********************************/
void DS18B20_Write_Com(uchar com)
{
	uchar idata i;
	for(i=0;i<8;i++)
	{
      DS18B20_DQ=0;
	   Delay10us();//先拉低15us
		_nop_();
		DS18B20_DQ=(bit)(com&0x01);//先發低位
		com>>=1;//移位
		Delay60us();//繼續拉低15us
		DS18B20_DQ=1;//短暫拉高
		Delay2us();
	}
}
/*********************************
 * @函數名:DS18B20_Read_Data
 * @描   述:讀數據
 * @說   明:
 * @參   數:無
 * @返回值:dat  讀出的數據 
 *********************************/
uchar DS18B20_Read_Data()
{
	uchar idata i,value;
	for(i=0;i<8;i++)
	{
	 DS18B20_DQ=0;
		Delay10us();
		value>>=1;
	 DS18B20_DQ=1;
		//Ds18B20會返回值。,無論是0還是1,都延遲15us
	 Delay2us();
	//	Delay15us();//先拉低15us
		if(DS18B20_DQ)//是1
			value|=0x80;//最低位
		Delay60us();
	}
return value;
}
/*********************************
 * @函數名:DS18B20_Handle
 * @描   述:溫度處理
 * @說   明:1. 復位 2.發送ROM命令 3.發送暫存器指令 讀RAM 4.數據
 * @參   數:無
 * @返回值:無
 *********************************/
void DS18B20_Handle()
{
	uchar xdata value_High,value_Low;
	float num;//保存小數
    DS18B20_Reset();//復位
	DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作
	//DS18B20_Write_Com(0x33);//讀64位ROM
	DS18B20_Write_Com(0x44);//發送指令44H,啓動溫度轉換
	Delay10us();
	DS18B20_Reset();//復位
	DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作
	DS18B20_Write_Com(0xbe);//發送指令BEH,讀取9字節RAM數據的前兩個數據
	Delay10us();
	value_Low=DS18B20_Read_Data();//先讀低字節Byte0
	value_High=DS18B20_Read_Data();//高字節Byte1
	
	value_High<<=4;//整數的高3位
	value_High+=(value_Low&0xf0)>>4;//整數的低4位
	DS18B20_Buffer[0]=value_High;//整數
	num=(value_Low&0x0f)*0.0625;//小數
	DS18B20_Buffer[1]=(uchar)(num*100);//小數
}

多點測試:(兩個)
步驟:
1.先讀出每個傳感器的唯一ROM序列;

/*********************************
 * @函數名:DS18B20_Read_64Rom
 * @描   述:讀64位的ROM 唯一標識
 * @說   明:
 * @參   數:*buffer 讀出的8個字節的數據
 * @返回值:無
 *********************************/
void DS18B20_Read_64Rom(uchar *buffer)
{
  	uchar i;
    DS18B20_Reset();//復位
	DS18B20_Write_Com(0x33);//讀64位ROM
	for(i=0;i<8;i++) //讀取64個字節
	 buffer[i]=DS18B20_Read_Data();
}

在這裏插入圖片描述
2.用兩個數組存讀出來的序列號:
在這裏插入圖片描述
3.寫入ROm序列號,並啓動轉換溫度:

/*********************************
 * @函數名:DS18B20_Write_Rom
 * @描   述:寫64ROM
 * @說   明:發送匹配ROM命令 0x55再寫入8字節的ROM
 * @參   數:*buffer 要發送的存放ROM的數組
 * @返回值:無
 *********************************/
void DS18B20_Write_Rom(uchar *buffer)
{
	uchar i;
   DS18B20_Write_Com(0x55); //ROM匹配 
	for(i = 0;i < 8;i++)
	DS18B20_Write_Com(buffer[i]); //寫入8個字節的ROM
}
/*********************************
 * @函數名:DS18B20_Handle
 * @描   述:溫度處理
 * @說   明:1. 復位 2.發送ROM命令 3.發送暫存器指令 讀RAM 4.數據
 * @參   數:無
 * @返回值:無
 *********************************/
void DS18B20_Handle(uchar *buffer)
{
	uchar xdata value_High,value_Low;
	float num;//保存小數
    DS18B20_Reset();//復位
	//DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作
	//DS18B20_Write_Com(0x33);//讀64位ROM
    DS18B20_Write_Rom(buffer); //匹配ROM 並寫入64ROM
	DS18B20_Write_Com(0x44);//發送指令44H,啓動溫度轉換
	Delay10us();
	DS18B20_Reset();//復位
	 DS18B20_Write_Rom(buffer); //匹配ROM 並寫入64ROM
	DS18B20_Write_Com(0xbe);//發送指令BEH,讀取9字節RAM數據的前兩個數據
	Delay10us();
	value_Low=DS18B20_Read_Data();//先讀低字節Byte0
	value_High=DS18B20_Read_Data();//高字節Byte1
	
	value_High<<=4;//整數的高3位
	value_High+=(value_Low&0xf0)>>4;//整數的低4位
	DS18B20_Buffer[0]=value_High;//整數
	num=(value_Low&0x0f)*0.0625;//小數
	DS18B20_Buffer[1]=(uchar)(num*100);//小數
}

其他的都和單個測試是一樣的。
測試結果:
在這裏插入圖片描述
另外附上主函數:

/*********************************
 * @函數名:main
 * @描   述:main函數,程序入口
 * @說   明:
 * @參   數:無
 * @返回值:無 
 *********************************/
void main()
{
	//uchar a[8];//存放讀出來的ROM
	Uart1_Init();//串口初始化
	Send_String("多點溫度測試:\n");
  while(1)
	{
	    DS18B20_Handle(DS18B20_Rom1);
		printf("溫度1:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印溫度
        putchar_End();//換行
//		DS18B20_Read_64Rom(a);
//		Send_String(a);
    	Delay1000ms();
		DS18B20_Handle(DS18B20_Rom2);
		printf("溫度2:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印溫度
		Delay1000ms();
		 putchar_End();//換行
	}
}


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