📄 ds18b20.c
字号:
#include "ds18b20.h"
//----------------------------//
/**Reset DS18B20 function*/
unsigned char reset_pulse(void)
{
unsigned char temp,presence;
temp=SREG;
cli();
ow_out; /*Set pin D6 as output pin*/
ow_low; /*pull the bus low*/
_delay_us(480); /*delay 480us*/
ow_in; /*set D6 as Input*/
_delay_us(60); /*delay 60us*/
presence=ow_read;
_delay_us(420); /*delay 420us*/
return presence; /*return=1: no device ; return=0: have device*/
SREG=temp; /*return the value of SREG*/
}
//--------------------------------
/***Read 1 bit from DS18B20*/
unsigned char read_bit(void)
{
unsigned char temp,kq;
temp=SREG;
cli();
ow_out; /*set pin D6 as out put*/
ow_low; /*pull the bus low*/
_delay_us(2); /*delay 2 us*/
ow_in; /*release the master*/
_delay_us(9); /*delay 9us*/
if(!(ow_read)) //Doc du lieu
kq = 0;
else
kq = 1;
_delay_us(60);/*delay 60 us*/
SREG=temp; /*return value of SREG*/
return kq;
}
//---------------------------------
/***Write 1 bit to DS18B20***/
void write_bit(unsigned char dbit)
{
unsigned char temp;
temp=SREG;
cli();
ow_out; /*Set PinD6 as output*/
ow_low; /*Drive the Bus low*/
if (dbit==0)
{ _delay_us(60); /*delay 60us*/
ow_in; /*release the master*/
_delay_us(9); /*delay 9us*/
}
if (dbit==1)
{ _delay_us(6); /*delay 6us*/
ow_in; /*release the master*/
_delay_us(64); /*delay 64us*/
}
SREG=temp;
}
//------------------------------------
//Read 1 byte from Bus
unsigned char read_byte (void) {
unsigned char i,byte = 0;
for (i=0; i<8; i++)
{
if (read_bit())
byte |= (1<<i);
_delay_us(40); //delay
}
return byte;
}
//------------------------------------
/***Write 1 byte to DS18B20***/
void write_byte(unsigned char dout)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp=dout&0x01;
write_bit(temp);
dout=dout>>1;
}
}
//---------------------------------------------
/***Read temperature from DS18B20***/
unsigned int read_temp(void)
{
unsigned char i,tempo;
unsigned int p[9]={0,0,0,0,0,0,0,0,0};
unsigned int kq;
tempo=SREG;
cli();
reset_pulse();
write_byte(0xCC); //Skip ROM command
write_byte(0x44); //Convert T command
_delay_us(750); // wait 750ms for conversion complete
reset_pulse();
write_byte(0xCC); //Skip Rom command
write_byte(0xBE); //Read Scratchpad
for (i=0; i < 9; i++)
{p[i] = read_byte();}
kq = (p[0] | (p[1] << 8)) >> 4;
return kq;
SREG=tempo; /*return Interrupt*/
}
//-----------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -