天天看點

STM32學習之DS18B20

使用者函數主要是bsp_ds18b20()函數的編寫,其中涉及到單總線的讀寫,在DS18B20中根據時序可以得到讀寫函數:

static uint8_t DS18B20_Read_Bit(void)
{
	uint8_t dat;
	
	/* 讀0和讀1的時間至少要大于60us */	
	DS18B20_Mode_Out_PP();
	/* 讀時間的起始:必須由主機産生 >1us <15us 的低電平信号 */
	DS18B20_DATA_OUT(LOW);
	Delay_us(10);
	
	/* 設定成輸入,釋放總線,由外部上拉電阻将總線拉高 */
	DS18B20_Mode_IPU();
	//Delay_us(2);
	
	if( DS18B20_DATA_IN() == SET )
		dat = 1;
	else
		dat = 0;
	
	/* 這個延時參數請參考時序圖 */
	Delay_us(45);
	
	return dat;
}

/*
 * 從DS18B20讀一個位元組,低位先行
 */
uint8_t DS18B20_Read_Byte(void)
{
	uint8_t i, j, dat = 0;	
	
	for(i=0; i<8; i++) 
	{
		j = DS18B20_Read_Bit();		
		dat = (dat) | (j<<i);
	}
	
	return dat;
}

/*
 * 寫一個位元組到DS18B20,低位先行
 */
void DS18B20_Write_Byte(uint8_t dat)
{
	uint8_t i, testb;
	DS18B20_Mode_Out_PP();
	
	for( i=0; i<8; i++ )
	{
		testb = dat&0x01;
		dat = dat>>1;		
		/* 寫0和寫1的時間至少要大于60us */
		if (testb)
		{			
			DS18B20_DATA_OUT(LOW);
			/* 1us < 這個延時 < 15us */
			Delay_us(8);
			
			DS18B20_DATA_OUT(HIGH);
			Delay_us(58);
		}		
		else
		{			
			DS18B20_DATA_OUT(LOW);
			/* 60us < Tx 0 < 120us */
			Delay_us(70);
			
			DS18B20_DATA_OUT(HIGH);			
			/* 1us < Trec(恢複時間) < 無窮大*/
			Delay_us(2);
		}
	}
}
      

  另外延時的時序采用了滴答定時器來實作延時,在移植他人程式時除了移植bsp_ds18b20.c還要移植bsp_SysTick.c (當然延時函數可以自己寫),滴答定時器中使用了1us中斷一次,是以在中斷服務檔案中需要添加程式有:

extern void TimingDelay_Decrement(void);
void SysTick_Handler(void)
{
	TimingDelay_Decrement();	
}
剩餘的就是調用函數轉換得到溫度值。