void ow reset( 至少480μs char presence=1; 电阻 上拉 while(presence) 15-60μs 单片机发送复位脉冲 18B20应答脉冲 至少480μ5 while(presence) 60-240us GND 图例: 主机拉低 DS18B20拉低 上拉电阻拉高 DQ=1; _nop_();nop ( DQ=0; delay(50); ∥延时550毫秒,读时序 初始化时序 DQ=1; delay(6); ∥延时66毫秒 presence DQ; ∥presence=0,继续下一步 delay(45); /延时495us presence=~DQ; DQ=1; 内蒙古农业大学机电工程学院 12
12 初始化时序 void ow_reset() { char presence = 1; while(presence) { while(presence) { DQ = 1; _nop_(); _nop_(); DQ = 0; delay(50); // 延时550毫秒,读时序 DQ = 1; delay(6); // 延时66毫秒 presence = DQ; // presence =0,继续下一步 } delay(45); // 延时495us presence = ~DQ; } DQ = 1; }
■读时序 单片机读"0”时隙 单片机读“1”时隙 >1us GND >1us >1μs 单片机来样 单片机采样 15μs 45μs 15μs→ 内蒙古农业大学机电工程学院 13
13 读时序
∥DS18B20读1字节函数,从总线上读取1字节 uchar read byte(void) uchar i; 单片机读“0”时隙 TREC 单片机读“1”时隙 >1μs uchar value=0; for(i=8;i>0;i-) GND >1μs+ DQ=1; >1μ5+ 单片机采样 弹片机采样 _nop_();_nop_(); +15us 45μs 15μs value>>=1; DQ=0; _nop_(;_nop_0;_nop_(;_nop_0;//4us 读时序 DQ=1; _nop_O);_nop_();_nop_();_nop_(;//4us if (DQ) value |=0x80; delay(6); ∥66us DQ=1; return(value); 内蒙古农业大学机电工程学院 14
14 读时序 // DS18B20读1字节函数,从总线上读取1字节 uchar read_byte(void) { uchar i; uchar value=0; for(i = 8; i > 0; i-) { DQ = 1; _nop_(); _nop_(); value >>= 1; DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); // 4us DQ = 1; _nop_(); _nop_(); _nop_(); _nop_(); // 4us if (DQ) value |= 0x80; delay(6); // 66us } DQ=1; return(value); }
写时序 单片机写“0”时限 REC >1s 单片机写“1”时隙 60μs<Tx“0”<120 ->1μs Vpu GND DS18B20采样 DS18B20采样 MIN TYP MAX MIN TYP MAX 15us→+15us+←—30s→ ←15μ5→+15u5→←—30s→ 内蒙古农业大学机电工程学院 15
15 写时序
∥DS18B20写命令函数,向1-WRE总线上写一字节 void write_byte(uchar val) 单片机写“0”时隔 单片机写“1”时隔 uchar i; 60μ5<Tx“0"<120 4->1μs for(i=8;i>0;i-) DQ=1; GND DS18B20来样 DS18B20采样 _nop_O;_nop_(); MIN TYP MAX MIN TYP MAX 54s+15s→←一30→ ←155→←15us30s→ DQ=0; _nop_0;_nop_(;_nop_();nop_();nop(;/ 写时序 5us DO=val&0x01; ∥最低位移出 delay(6); /∥66us val>>=1; ∥右移1位 DQ=1; delay(1); 内蒙古农业大学机电工程学院 16
16 写时序 // DS18B20写命令函数,向1-WIRE总线上写一字节 void write_byte(uchar val) { uchar i; for(i=8;i>0;i-) { DQ = 1; _nop_(); _nop_(); DQ = 0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 5us DQ = va l& 0x01; // 最低位移出 delay(6); // 66us val >>=1; // 右移1位 } DQ = 1; delay(1); }