📄 gsd.lst
字号:
C51 COMPILER V7.07 GSD 02/12/2009 20:21:02 PAGE 6
303 1 DQ=1;
304 1 delay15us();delay15us();delay15us();delay15us();//delay15us(); Delay_uS(5);
305 1 //DQ=1;
306 1 return b;
307 1 }
308 uchar readBTS(void) //读1字节
309 {char i,j;
310 1 bit b;
311 1 uchar a;
312 1 j=0;
313 1 for(i=0;i<8;i++)
314 1 {
315 2 b=readTS();
316 2 if(b)j+=1;
317 2 j=_cror_(j,1);
318 2 }
319 1 a=(uchar)j;
320 1 return a;
321 1 }
322
323 void write0TS(void) //写DS18B20数据位0
324 {
325 1 DQ=1;
326 1 DQ=0;
327 1 delay15us();delay15us();delay15us();delay15us();// delay15us();delay15us();Delay_uS(5);delay15us();
328 1 _nop_();_nop_();_nop_();
329 1 DQ=1;
330 1 _nop_();
331 1 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
332 1 }
333 //********************************************************
334 void write1TS(void) //写DS18B20数据位1
335 {
336 1 DQ=1;
337 1 DQ=0;
338 1 _nop_();
339 1 _nop_();_nop_();_nop_();_nop_();_nop_();
340 1
341 1 DQ=1;
342 1 //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
343 1 delay15us();delay15us();delay15us();delay15us();_nop_();_nop_();_nop_();_nop_();_nop_(); //delay15us();del
-ay15us();delay15us();delay15us();delay15us();delay15us();delay15us();Delay_uS(5);
344 1 }
345
346 void writeBTS(uchar byte) //写1字节
347 {uchar i;
348 1 for(i=0;i<8;i++)
349 1 {
350 2 if(byte&0x01)
351 2 write1TS();
352 2 else
353 2 write0TS();
354 2 byte=byte>>1;
355 2 }
356 1 }
357 void gettempTS(void) //读取测得的环境温度
358 {uchar a,b;
359 1 EA=0;
360 1 DS18B20_init();
361 1 writeBTS(0xcc);
362 1 writeBTS(0x44);EA=1;
363 1 Delay1mS(100);EA=0;
C51 COMPILER V7.07 GSD 02/12/2009 20:21:02 PAGE 7
364 1 DS18B20_init();
365 1 writeBTS(0xcc);
366 1 writeBTS(0xbe);
367 1 temp2=readBTS();
368 1 temp1=readBTS();
369 1 readBTS();readBTS();readBTS();readBTS();
370 1 readBTS();readBTS();readBTS();EA=1;
371 1 a=(temp2&0xf0)>>4;
372 1 b=(temp1&0x07)<<4;
373 1 temp=a|b;
374 1 /*temp1=temp1<<4;
375 1 temp1+=(temp2&0xf0)>>4;
376 1 temp2=(temp2&0x0f)?5:0;*/
377 1 }
378
379 /*******************************************************************
380 起动总线函数
381 函数原型: void Start_I2c();
382 功能: 启动I2C总线,即发送I2C起始条件.
383
384 ********************************************************************/
385 void Start_I2c(void)
386 {
387 1 SDA=1; /*发送起始条件的数据信号*/
388 1 _Nop();
389 1 _Nop();
390 1 SCL=1;
391 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
392 1 _Nop();
393 1 _Nop();
394 1 _Nop();
395 1 _Nop();
396 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
397 1 SDA=0; /*发送起始信号*/
398 1 _Nop(); /* 起始条件锁定时间大于4μs*/
399 1 _Nop();
400 1 _Nop();
401 1 _Nop();
402 1 _Nop();
403 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
404 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
405 1 _Nop();
406 1 _Nop();
407 1 _Nop();
408 1 _Nop();
409 1 }
410
411
412
413
414 /*******************************************************************
415 结束总线函数
416 函数原型: void Stop_I2c();
417 功能: 结束I2C总线,即发送I2C结束条件.
418
419 ********************************************************************/
420 void Stop_I2c(void)
421 {
422 1 SDA=0; /*发送结束条件的数据信号*/
423 1 _Nop(); /*发送结束条件的时钟信号*/
424 1 _Nop(); /*发送结束条件的时钟信号*/
425 1 SCL=1; /*结束条件建立时间大于4μs*/
C51 COMPILER V7.07 GSD 02/12/2009 20:21:02 PAGE 8
426 1 _Nop();
427 1 _Nop();
428 1 _Nop();
429 1 _Nop();
430 1 _Nop();
431 1 SDA=1; /*发送I2C总线结束信号*/
432 1 _Nop();
433 1 _Nop();
434 1 _Nop();
435 1 _Nop();
436 1 _Nop();
437 1 }
438
439
440
441
442 /*******************************************************************
443 字节数据传送函数
444 函数原型: void SendByte(uchar c);
445 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
446 此状态位进行操作.(不应答或非应答都使ack=0 假)
447 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
448 ********************************************************************/
449 void SendByte(uchar c)
450 {
451 1 uchar BitCnt;
452 1
453 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
454 1 {
455 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
456 2 else SDA=0;
457 2 _Nop();
458 2 _Nop();
459 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
460 2 _Nop();
461 2 _Nop(); /*保证时钟高电平周期大于4μs*/
462 2 _Nop();
463 2 _Nop();
464 2 _Nop();
465 2 _Nop();
466 2 _Nop(); /*保证时钟高电平周期大于4μs*/
467 2 _Nop();
468 2 _Nop();
469 2 _Nop();
470 2 SCL=0;
471 2 }
472 1
473 1 _Nop();
474 1 _Nop();
475 1 _Nop();
476 1 _Nop();
477 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
478 1
479 1 _Nop();
480 1 _Nop();
481 1 _Nop();
482 1 _Nop();
483 1 SCL=1;
484 1 _Nop();
485 1 _Nop();
486 1 _Nop();
487 1 _Nop();
C51 COMPILER V7.07 GSD 02/12/2009 20:21:02 PAGE 9
488 1 _Nop();
489 1 _Nop();
490 1 if(SDA==1)ack=0;
491 1 else ack=1; /*判断是否接收到应答信号*/
492 1 SCL=0;
493 1 _Nop();
494 1 _Nop();
495 1 _Nop();
496 1 _Nop();
497 1 }
498
499
500
501
502
503
504 /*******************************************************************
505 字节数据传送函数
506 函数原型: uchar RcvByte();
507 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
508 发完后请用应答函数。
509 ********************************************************************/
510 uchar RcvByte(void)
511 {
512 1 uchar retc;
513 1 uchar BitCnt;
514 1
515 1 retc=0;
516 1 SDA=1; /*置数据线为输入方式*/
517 1 for(BitCnt=0;BitCnt<8;BitCnt++)
518 1 {
519 2 _Nop();
520 2 _Nop();
521 2 SCL=0; /*置时钟线为低,准备接收数据位*/
522 2 _Nop();
523 2 _Nop(); /*时钟低电平周期大于4.7μs*/
524 2 _Nop();
525 2 _Nop();
526 2 _Nop();
527 2 _Nop();
528 2 _Nop(); /*时钟低电平周期大于4.7μs*/
529 2 _Nop();
530 2 _Nop();
531 2 _Nop();
532 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
533 2 _Nop();
534 2 _Nop();
535 2 _Nop();
536 2 _Nop();
537 2 retc=retc<<1;
538 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
539 2 _Nop();
540 2 _Nop();
541 2 _Nop();
542 2 _Nop();
543 2 }
544 1 SCL=0;
545 1 _Nop();
546 1 _Nop();
547 1 _Nop();
548 1 _Nop();
549 1 return(retc);
C51 COMPILER V7.07 GSD 02/12/2009 20:21:02 PAGE 10
550 1 }
551
552
553
554
555 /********************************************************************
556 应答子函数
557 原型: void Ack_I2c(bit a);
558
559 功能:主控器进行应答信号,(可以是应答或非应答信号)
560 ********************************************************************/
561 void Ack_I2c(bit a)
562 {
563 1
564 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
565 1 else SDA=1;
566 1 _Nop();
567 1 _Nop();
568 1 _Nop();
569 1 _Nop();
570 1 _Nop();
571 1 _Nop();
572 1 SCL=1;
573 1 _Nop();
574 1 _Nop(); /*时钟低电平周期大于4μs*/
575 1 _Nop();
576 1 _Nop();
577 1 _Nop();
578 1 _Nop();
579 1 _Nop(); /*时钟低电平周期大于4μs*/
580 1 _Nop();
581 1 _Nop();
582 1 _Nop();
583 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
584 1 _Nop();
585 1 _Nop();
586 1 _Nop();
587 1 _Nop();
588 1 }
589
590 /*******************************************************************
591 向有子地址器件发送字节数据函数
592 函数原型: bit ISendByte(uchar sla,ucahr c);
593 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
594 如果返回1表示操作成功,否则操作有误。
595 注意: 使用前必须已结束总线。
596 ********************************************************************/
597 bit ISendByte(uchar sla,uchar suba,uchar c)
598 {
599 1 Start_I2c(); /*启动总线*/
600 1 SendByte(sla); /*发送器件地址*/
601 1 if(ack==0)return(0);
602 1 SendByte(suba); /*发送器件地址*/
603 1 if(ack==0)return(0);
604 1 SendByte(c); /*发送数据*/
605 1 if(ack==0)return(0);
606 1 Stop_I2c(); /*结束总线*/
607 1 return(1);
608 1 }
609
610 /*******************************************************************
611 向有子地址器件读字节数据函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -