版权声明: https://blog.csdn.net/JRK_CSDN/article/details/86601108
DS18B20
- DALLAS公司成功的One-Wire温度传感器,后在2011年Maxim收购了DALLAS。
精度&&工作方式
数据格式分MSB(8位)、LSB(8位),其中MSB的高5位是不用做数值信息的,仅最高位用于表示符号。
每一个数表示0.0625℃,计数值×0.0625即可换算成摄氏度
常用控制编码
0xCC:跳过ROM读取
0x44:更新Scratchpad (便笺式高速Cache)
0xBE:读取Scratchpad ,先输出LSB,后输出MSB (先低后高)
驱动
- 访问设备 是否 忙
bit Ack_18B20() //获取器件状态
{
bit Ack;
EA=0;
OneWire_18B20 = 0;
delayX0us(50); //延时500us(未定义该函数,自己写)
OneWire_18B20 = 1;
delayX0us(6);
Ack = OneWire_18B20;
while(!OneWire_18B20); //等待信号结束
EA=1;
return Ack; //“1”为 18B20在线
}
- 写字节
void Write_18B20(u8 dat) //器件写字节
{
u8 mark;
EA=0;
for(mark=0x01;mark!=0;mark<<=1)
{
OneWire_18B20 = 0; //拉低
_nop_();
_nop_();
if(dat & mark)
OneWire_18B20 = 1; //写数据
else
OneWire_18B20 = 0;
delayX0us(6);
OneWire_18B20 = 1; //拉高
}
EA = 1;
}
- 读字节
u8 Read_18B20() //器件读字节
{
u8 mark;
u8 dat = 0;
EA=0;
for(mark=0x01;mark!=0;mark<<=1)
{
OneWire_18B20 = 0;
_nop_();
_nop_();
OneWire_18B20 = 1;
_nop_();
_nop_();
if(OneWire_18B20)
dat |= mark;
delayX0us(6);
}
EA = 1;
return dat;
}
- 更新Scratchpad (即 16位温度值寄存器)
bit Init_18B20() //器件温度转换
{
bit Ack;
Ack = Ack_18B20();
if(Ack == 0)
{
Write_18B20(0xCC);
Write_18B20(0x44);
}
return ~Ack;
}
- 读取16位温度值
int GetTemp_18B20() //获取16位温度数据
{
bit Ack;
u8 MSB, LSB;
int temp = 0;
Ack = Ack_18B20();
if(Ack == 0)
{
Write_18B20(0xCC);
Write_18B20(0xBE);
LSB = Read_18B20();
MSB = Read_18B20();
temp = MSB;
temp <<= 8;
temp |= LSB;
}
return temp;
}
注:
①每次写操作必须从ROM开始,一般跳过(使用0xCC)。
②delayX0us(u8 num)延时函数未写,意义为延时num*10 微秒,具体请看DS18B20时序图。