DS18B20溫度傳感器
-
複位
時序圖如下所示:低電平持續時間為480-960us,高電平持續時間為15-60us,然後低電平持續60-240us。
代碼如下:
void ds18b20_rst(void)
{
IO_OUT; //輸出模式
DQ_OUT=0; //拉低DQ引腳
delay_us(600); //延時480-960us
DQ_OUT=1; //拉高DQ引腳
while(DQ_OUT); //等待器件應答(器件拉低),約15-60us後
while(!DQ_OUT); //應答脈沖出現後,等待器件拉高,約60-240us後
}
-
寫0操作
時序圖如下所示:
代碼如下:
void ds18b20_write_zero(void)
{
IO_OUT; //輸出模式
DQ_OUT=0 //拉低引腳
delay_us(80); //延時60-120us
DQ_OUT=1; //拉高引腳
delay_us(2);
}
- 寫1操作
代碼如下:
void ds18b20_write_one(void)
{
IO_OUT; //輸出模式
DQ_OUT=0
delay_us(2);
DQ_OUT=1;
delay_us(80);
}
- 讀0、1操作
代碼如下:
unsigned char ds18b20_read_bit(void)
{
unsigned char data;
IO_OUT;
DQ_OUT=0;
delay_us(2);
DQ_OUT=1;
DQ_IN;
delay_us(2);
if(DQ_IN)
data=1;
else
data=0;
delay_us(500);
return data;
}
- 寫1位元組
代碼如下:
void ds18b20_write_byte(unsigned char data)
{
unsigned char i,testb;
IO_OUT;
for(i=0;i<8;i++)
{
testb=data&0x01; //從低位開始寫
data>>=1;
if(testb)
ds18b20_write_one();
else
ds18b20_write_zero();
}
}
- 讀一位元組
代碼如下:
unsigned char ds18b20_read_byte(void)
{
unsigned char i,j,data=0;
for(i=0;i<8;i++)
{
j=ds18b20_read_bit();
data=(j<<7)|(data>>1); //從低位開始讀
}
return data;
}
- 開始讀取資料
代碼如下:
void ds18b20_start(void)
{
ds18b20_rst();
ds18b20_write_byte(0xcc); // 跳過ROM
ds18b20_write_byte(0x44); //溫度轉換
}
- 初始化
代碼如下:
unsigned char ds18b20_init(void)
{
gpio_init(); //此引腳需根據相應的單片機進行配置
ds18b20_rst();
}
- .讀取溫度
代碼如下:
short get_tempetature(void)
{
unsigned char TL,TH;
short tem;
ds18b20_start(); //開始轉換
delay_ms(700); //等待轉換完成
ds18b20_init();
ds18b20_write_byte(0xcc); //跳過ROM
ds18b20_write_byte(0xbe); //讀取暫存寄存器
TL=ds18b20_read_byte(); //低八位
TH=ds18b20_read_Byte(); //高八位,注意前五位為符号位隻有全為0的時候溫度是正的
tem=TH; //獲得高八位
tem<<=8;
tem+=TL; //獲得底八位
return tem;
}