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

2008-6-24 09:05 5217 10 10 分类: MCU/ 嵌入式

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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
10
关闭 站长推荐上一条 /3 下一条