使用者函數主要是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();
}
剩餘的就是調用函數轉換得到溫度值。