钻石会员
主题
帖子
积分11063
阅读权限50
注册时间2009-12-25
最后登录1970-1-1
在线时间 小时
|
//读ds18b20供电情况,
//如果返回1表示ds18b20是由外部电源供电
//返回0表示是利用1-wire总线寄生供电
//返回2表示ds18b20不存在
unsigned char read_power_supply(ds18b20_typedef * _ds18b20_)
{
cli();
if ( RESET_18b20(_ds18b20_) == 1 )
{
write_18b20( 0xcc, _ds18b20_ ); //跳过Rom 没有这个就不起作用了。
write_18b20(0xb4, _ds18b20_); //读电源供电方式(B4H) 了解18B20的供电方式
_ds18b20_->ds18b20_power = read_byte(_ds18b20_) & 1;
//return (read_byte(_ds18b20_)&1);//其实只要取1bit,这只是为了减少代码,但要读8bit
}
else
_ds18b20_->ds18b20_power = 2;
sei();
return (_ds18b20_->ds18b20_power);
}
unsigned char set_ds18b20_Convert_Temperature ( ds18b20_typedef * _ds18b20_ )
{
unsigned char flag_18b20;
cli();
flag_18b20 = 0;
if (read_power_supply(_ds18b20_) != 2)
if (RESET_18b20 (_ds18b20_) == 1)
{
write_18b20 ( 0xcc, _ds18b20_ ); //skip rom
write_18b20 ( 0x44, _ds18b20_ ); //temp convert
if (_ds18b20_->ds18b20_power == 0) //如果不是1-wire总线寄生供电,就不使用,强上拉,减少损坏电路可能
{
SET_18B20_IO_qiang_vcc; //强上拉_高电平_输出状态
}
// delay_ms_18b20(760); //延时等转换完成,12bit需要750ms
//SET_18B20_IO_ruo_vcc; //弱上拉_输入状态
//flag_18b20=Read_18b20_Temperature(_ds18b20_,32);
flag_18b20 = 1;
}
sei();
return flag_18b20;//返回1,发送温度转换命令成功,返回0,ds18b20不存在.
}
我看了一下以前我avr的代码,三线两线驱动,只有是否强上拉一句代码。
c51用个三级管反转强上拉也是可以的。 |
|