日志档案

发表于 2008-6-24 9:05:04

1

标签: AVR  ATmega16  DS18B20  18B20  

初学AVR_日记(三)_ATmega16控制DS18B20原代码

以下为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

系统分类: 单片机   |   用户分类: AVR   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(421)    回复(0)  

投一票您将和博主都有获奖机会!