}
delay(45); //延时500us
flag = ~DQ;
}
DQ=1;
}
图16 DS18B20初始化时序图
此初始化程序功能为:检测DS18B20是否存在,如存在,将位地址38H置1;如不存在,将位地址38H清零。
3.4.2 DS18B20写时序
单片机写DS18B20的时序如图17所示,当主机总线从高拉至低电平时就产生写时间隙,DS18B20在检测到下降沿后15μS时开始采样总线上的电平,所以15μS之内应将所需写的位送到总线上,DS18B20再15—60μS间对总线采样,每写一位总时间必须在60—120μS之间完成。若低电平写入的位是0,高电平写入的位是1,连续写时位间的间隙应大于1μS。程序如下所示:
void write_byte(uint8 val)
{
uint8 i;
for (i=0; i<8; i++)
{
DQ = 1;
_nop_();
DQ = 0;
nops(); //4us
DQ = val & 0x01; //最低位移出
delay(6); //66us
val >>= 1; //右移一位
}
DQ = 1;
delay(1);
}
图17 单片机写DS18B20时序图
3.4.3 读时序
单片机读DS18B20的时序如图18所示,单片机主动产生一个下降沿的启动信号,并文持低电平大于1μS后释放总线,15μS后DS18B20占主动权,DS18B20会将数据按位放在总线上(低位在先,当读取两个字节的温度值时,低字节在先),这时单片机可读取信号,读取一位的时间应在60μS内完成。当需要读取下一位时再产生下降沿启动信号。
uint8 read_byte(void)
{ uint8 i, value=0;
for (i=0; i<8; i++)
{
DQ=1;
_nop_();
value >>= 1;
DQ = 0;
nops(); //4us
DQ = 1;
nops(); //4us
if (DQ)
value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
图18 单片机读DS18B20时序图
此程序功能为:读取DS18B20 A/D转换后的温度值,转换后的二进制存入36H、35H单元,默认为12位转换,低8位存入36H单元,高8位存入35H单元(35H单元的高5位均为符号位,所以判断符号只需判断低12位数据的最高位即可)。1表示为零度以下,0表示零度以上,实际有效位为11位。 AT89S52单片机最小远程监控系统的设计与开发+程序代码+电路图(10):http://www.751com.cn/zidonghua/lunwen_1669.html