以下为ATmega16控制DS18B20原代码,感兴趣的朋友可以参考下:
#define DS18B20 (1<<0)
#define DS18B20_0() (DDRB |= DS18B20) // PB1='0'
#define DS18B20_1() (DDRB &= ~DS18B20) // PB1='float'
#define DS18B20_read() (PINB & DS18B20) // read PB1 pin
unsigned char rest_18b20(void)
{
char buff;
DS18B20_0();
delay_us(490);
Clr_Bit(SREG, 7);
DS18B20_1();
delay_us(68);
if(DS18B20_read())
{
buff = 0;
}
else
{
buff = 1;
}
Set_Bit(SREG, 7);
delay_us(432);
return buff;
}
void write_18b20(unsigned char data)
{
unsigned char i;
for(i = 0 ; i < 8 ; i ++)
{
Clr_Bit(SREG, 7);
DS18B20_0();
delay_us(2);
if(data & 0x01)
{
DS18B20_1();
}
else
{
DS18B20_0();
}
delay_us(62);
data = data >>1;
DS18B20_1();
Set_Bit(SREG, 7);
delay_us(2);
}
}
unsigned char read_18b20(void)
{
unsigned char i , buff , data = 0;
buff= 0x01;
for(i = 0 ; i < 8 ; i ++)
{
Clr_Bit(SREG, 7);
DS18B20_0();
delay_us(2);
DS18B20_1();
delay_us(4);
if(DS18B20_read())
{
data = data | buff;
}
else
{
data = data & (~buff);
}
buff = buff << 1;
Set_Bit(SREG, 7);
delay_us(62);
}
return data;
}
//**************读18B20检测到的温度
if(rest_18b20())
{
write_18b20(0xCC);
write_18b20(0x44);
}
delay_ms(1000);
if(rest_18b20())
{
write_18b20(0xCC);
write_18b20(0xBE);
p = &ds18b20_scratch_pad.temp_lsb;
for(i = 0 ; i < 2 ; i ++)
{
*p = read_18b20();
p++;
}
data = ( ds18b20_scratch_pad.temp_lsb >> 4 ) | (ds18b20_scratch_pad.temp_msb << 4);
}
PS:要想读取转换温度,就必须先进行一次温度转换,在转换与读取之间应有一段转换时间(我采用延时函数延长1秒)。
PS:为了方便交流,我建了个AVR技术交流群,感兴趣的朋友可以加下。
群号:6022960
文章评论(0条评论)
登录后参与讨论