RW1820
参数名: | 具体参数 |
---|---|
工作电压: | +2.8V~+5.5V |
测量范围: | -55摄氏度~125摄氏度 |
测量精度: | (-10摄氏度~85摄氏度):±0.5摄氏度 |
(+35摄氏度~+45摄氏度)±0.1摄氏度 | |
温度转换时间 | (12位分辨率)80MS |
可选分辨率 | 7~12位 |
接口方式: | 单线串行Single-Linevitable兼容1-wire |
通信速率: | 16Kbps标准速率或可变速率 |
多节点通信地址: | 64bit Rom或者用户自定24-bit Extension RomID |
RW1820内部结构
9字节暂存器 | |
---|---|
byte 0 | (温度)LSB 50H |
byte 1 | (温度)MSB 05H |
byte 2 | TH用户定义字节 |
byte 3 | TL用户定义字节 |
byte 4 | 配置寄存器 |
byte 5 | 保留位(FFH) |
byte 6 | 保留位(0CH) |
byte 7 | 保留位(10H) |
byte 8 | CRC校验位 |
1-wire 单总线协议
1-wire 单总线协议 | |
---|---|
定义: | 主机和从机通过一根线进行通信,在一条总线上可挂接的从器件数量几乎不受限制 |
特点: | 它采用单根信号线,即可传输时钟,又能传输数据,而且数据传输是双向的。 |
优点: | 单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护。 |
通信过程
初始化:复位脉冲+从机应答脉冲
主机通过拉低单总线480-960us产生复位脉冲,然后释放总线,进入接收模式主机释放总线时,会产生低电平跳变为高电平的上升沿,单总线器件检测到上升沿后,延时15-60us,单总线器件拉低总线60-240us来产生应答脉冲。主机接收到从机的应答脉冲说明单总线器件就绪,初始化过程完成。
void Reset(void)
{
unsigned int i;
DOUT=0; //DOUT为信号线,主机拉低总线
i=103; //延时
while(i>0)i--;
DOUT=1; //释放总线低电平跳变为高电平的上升沿
i=4;
while(i>0)i--; //延时,此处后继可检测应答脉冲
}
标志0与标志1
当数据线被拉低15us后,在15-60us的时间窗口内对数据线进行采样。如果数据线为低电平就是
标志0,如果数据线为高电平,就是标志1。
写标志0与标志1
主机要产生一个写1标志,就必须把数据线拉高,在写标志开始的15us内允许数据线拉高。
主机要产生一个写0标志,就必须把数据线拉低并保持60us
void Writebyte(unsigned char dat)
{
unsigned int i;
unsigned char j;
bit PrepareSendbit; //暂存发送位
for(j=1;j<=8;j++)
{
PrepareSendbit=dat&0x01; //取待发送字节的最低位
dat=dat>>1;
if(testbPrepareSendbit) //如果是1
{
DOUT=0; //释放信号线
i++;i++;
DOUT=1; //将信号线拉高,从机采样为高
i=8;while(i>0)i--;
}
else
{
DOUT=0; //将信号线拉低,从机采样为低
i=8;while(i>0)i--;
DOUT=1;
i++;i++;
}
}
}
读标志0与标志1
bit Readbit(void)
{
unsigned int i;
bit dat;
DOUT=0;i++; //将总线拉低后1us
DOUT=1;i++;i++; //释放总线后延时一部分,避免脉冲信号
dat=DOUT; //取信号
i=8;while(i>0)i--; //延时
return (dat);
}
读一字节
unsigned char ReadByte(void)
{
unsigned char i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=Readbit(); dat=(j<<7)|(dat>>1);
}
return(dat);
}
通过1-wire协议获取RW1820温度
unsigned int Get()
{
float tt;
unsigned char a,b;
Reset();
delay(1);
Writebyte(0xcc);
Writebyte(0xbe);
a=ReadByte();
b=ReadByte();
temperature=b;
temperature<<=8;
temperature=temperature|a;
tt=temperature*0.0625;
temperature=tt*10+0.5;
return temperature;
}