📄 ds18b20.lst
字号:
244 2 }
245 1 EA = 1;
246 1 }
247
248
249 BYTE owbReadByte(void)
250 {
251 1 BYTE i,byte;
252 1 EA = 0;
253 1 byte = 0;
254 1 for (i=0;i<8;i++)
255 1 {
256 2 byte>>=1;
257 2 if (owbReadBit()) byte|=0x80;
258 2 }
259 1 EA = 1;
260 1 return byte;
261 1 }
262
263
264
265 //////////////////////////////////////////////////////////////////
266 // 搜索操作
267
268
269 #define OWBS_AND_0 0x00
270 #define OWBS_AND_1 0x04
271 #define OWBS_NAN_0 0x00
272 #define OWBS_NAN_1 0x02
273 #define OWBS_SER_0 0x00
274 #define OWBS_SER_1 0x01
275
276
277 BIT owbGetRomBit(OWBROM * pRom, BYTE nBit)
278 {
279 1 // 低位在先!
280 1 nBit %= 64;
281 1 return (((pRom->b[nBit / 8]) >> (nBit % 8)) & 0x01);
282 1 }
283
284 void owbSetRomBit(OWBROM * pRom, BYTE nBit)
285 {
286 1 // 低位在先!
287 1 BYTE mask = 1;
288 1 nBit %= 64;
289 1 mask <<= (nBit % 8);
290 1 (pRom->b[nBit / 8]) |= mask;
291 1 }
292
293 void owbClrRomBit(OWBROM * pRom, BYTE nBit)
294 {
295 1 // 低位在先!
296 1 BYTE mask = 1;
297 1 nBit %= 64;
298 1 mask <<= (nBit % 8);
299 1 (pRom->b[nBit / 8]) &= (~mask);
300 1 }
301
302
303 BIT owbIncRom(OWBROM * pRom, BYTE nBit)
C51 COMPILER V8.02 DS18B20 04/26/2008 21:37:29 PAGE 6
304 // return 1 = 溢出 (将设 pRom = '111...111')
305 // nBit += '1'(并且可向前进位), all after nBit setted '0'
306 {
307 1 char i;
308 1 BIT c;
309 1
310 1 c = 1;
311 1 nBit %= 64;
312 1
313 1 for (i=nBit; i>=0; i--)
314 1 {
315 2 if ( owbGetRomBit(pRom,i) )
316 2 {
317 3 if (c)
318 3 {
319 4 // c = 1;
320 4 owbClrRomBit(pRom,i);
321 4 }
322 3 else
323 3 {
324 4 // c = 0;
325 4 // owbSetRomBit(pRom,i);
326 4 }
327 3 }
328 2 else
329 2 {
330 3 if (c)
331 3 {
332 4 c = 0;
333 4 owbSetRomBit(pRom,i);
334 4 }
335 3 else
336 3 {
337 4 // c = 0;
338 4 // owbClrRomBit(pRom,i);
339 4 }
340 3 }
341 2 }
342 1
343 1 if (c)
344 1 {
345 2 // 溢出
346 2 for (i=0; i<8; i++) pRom->b[i]=0xff;
347 2 return 1;
348 2 }
349 1
350 1 for (i=nBit+1; i<64; i++)
351 1 {
352 2 owbClrRomBit(pRom,i);
353 2 }
354 1
355 1 return 0;
356 1 }
357
358
359 void owbSetSearchEnd(OWBROM * pRomWant)
360 {
361 1 BYTE dp;
362 1 for (dp=0;dp<8;dp++) pRomWant->b[dp] = 0xff;
363 1 }
364
365
C51 COMPILER V8.02 DS18B20 04/26/2008 21:37:29 PAGE 7
366 BOOL owbIsSearchEnd(OWBROM * pRomWant)
367 {
368 1 //检测是否已搜索结束
369 1 BYTE dp,status = 0xff;
370 1 for (dp=0;dp<8;dp++) status &= pRomWant->b[dp];
371 1
372 1 if (status == 0xff) return TRUE;
373 1 return FALSE;
374 1 }
375
376 BOOL owbSearchPath(OWBROM * pRomWant, BYTE cmd)
377 {
378 1 BYTE dp,status;
379 1
380 1 owbInit();
381 1 owbWriteByte( (cmd==0xF0) ? 0xF0 : 0xEC );
382 1
383 1 EA = 0;
384 1 dp=0;
385 1 while (dp < 64)
386 1 {
387 2 status = 0;
388 2 if ( owbReadBit() ) status |= OWBS_AND_1;
389 2 if ( owbReadBit() ) status |= OWBS_NAN_1;
390 2 if ( owbGetRomBit(pRomWant,dp) ) status |= OWBS_SER_1;
391 2
392 2 switch (status)
393 2 {
394 3 case (OWBS_AND_0 | OWBS_NAN_0 | OWBS_SER_0):
395 3 owbWriteBit(0);
396 3 break;
397 3 case (OWBS_AND_0 | OWBS_NAN_0 | OWBS_SER_1):
398 3 owbWriteBit(1);
399 3 break;
400 3 case (OWBS_AND_0 | OWBS_NAN_1 | OWBS_SER_0):
401 3 owbWriteBit(0);
402 3 break;
403 3 case (OWBS_AND_0 | OWBS_NAN_1 | OWBS_SER_1): //进位重搜
404 3 owbIncRom(pRomWant,dp);
405 3 dp = 200;
406 3 break;
407 3 case (OWBS_AND_1 | OWBS_NAN_0 | OWBS_SER_0): //改为搜'1'
408 3 owbIncRom(pRomWant,dp);
409 3 owbWriteBit(1);
410 3 break;
411 3 case (OWBS_AND_1 | OWBS_NAN_0 | OWBS_SER_1):
412 3 owbWriteBit(1);
413 3 break;
414 3 case (OWBS_AND_1 | OWBS_NAN_1 | OWBS_SER_0): //无器件
415 3 case (OWBS_AND_1 | OWBS_NAN_1 | OWBS_SER_1): //无器件
416 3 default:
417 3 dp = 200;
418 3 owbSetSearchEnd(pRomWant);
419 3 }
420 2
421 2 dp++;
422 2 }//while end
423 1 EA = 1;
424 1
425 1 if (dp == 64) // find out a device
426 1 {
427 2 owb_SearchDeviceROM = *pRomWant;
C51 COMPILER V8.02 DS18B20 04/26/2008 21:37:29 PAGE 8
428 2 owb_SearchDeviceIndex++;
429 2 owbDeviceInit(TRUE);
430 2 owbIncRom( pRomWant,63 );
431 2 return TRUE;
432 2 }
433 1
434 1 return FALSE;
435 1 }
436
437 void owbPreSearchDevices(OWBROM * pRomWant)
438 {
439 1 BYTE i;
440 1 for (i=0;i<8;i++) pRomWant->b[i] = 0;
441 1 owb_SearchDeviceIndex = 0xff;
442 1 }
443
444 void owbUnpreSearchDevices(void)
445 {
446 1 owb_nCntDevice = owb_SearchDeviceIndex + 1;
447 1 }
448
449
450 BYTE owbCountDevices(void)
451 {
452 1 return owb_nCntDevice;
453 1 }
454
455 BYTE owbGetCacheIndex(void)
456 {
457 1 return owb_CacheDeviceIndex;
458 1 }
459
460 BYTE owbGetSearchIndex(void)
461 {
462 1 return owb_SearchDeviceIndex;
463 1 }
464
465 void owbCacheSearch(void)
466 {
467 1 owb_CacheDeviceIndex = owb_SearchDeviceIndex;
468 1 owb_CacheDeviceROM = owb_SearchDeviceROM;
469 1 }
470
471 BYTE owbGetCacheROM(BYTE i)
472 {
473 1 return owb_CacheDeviceROM.b[i & 0x07];
474 1 }
475
476 BYTE owbGetSearchROM(BYTE i)
477 {
478 1 return owb_SearchDeviceROM.b[i & 0x07];
479 1 }
480
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1124 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 36
IDATA SIZE = 19 ----
C51 COMPILER V8.02 DS18B20 04/26/2008 21:37:29 PAGE 9
BIT SIZE = ---- 9
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -