📄 8583 b20.lst
字号:
467 2 _Nop();
468 2 _Nop(); /*保证时钟高电平周期大于4μs*/
469 2 _Nop();
470 2 _Nop();
471 2 _Nop();
472 2 _Nop();
473 2 _Nop(); /*保证时钟高电平周期大于4μs*/
474 2 _Nop();
475 2 _Nop();
476 2 _Nop();
477 2 SCL=0;
478 2 }
479 1
480 1 _Nop();
481 1 _Nop();
482 1 _Nop();
483 1 _Nop();
484 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
485 1
486 1 _Nop();
487 1 _Nop();
488 1 _Nop();
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 9
489 1 _Nop();
490 1 SCL=1;
491 1 _Nop();
492 1 _Nop();
493 1 _Nop();
494 1 _Nop();
495 1 _Nop();
496 1 _Nop();
497 1 if(SDA==1)ack=0;
498 1 else ack=1; /*判断是否接收到应答信号*/
499 1 SCL=0;
500 1 _Nop();
501 1 _Nop();
502 1 _Nop();
503 1 _Nop();
504 1 }
505
506
507
508
509
510
511 /*******************************************************************
512 字节数据传送函数
513 函数原型: uchar RcvByte();
514 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
515 发完后请用应答函数。
516 ********************************************************************/
517 uchar RcvByte(void)
518 {
519 1 uchar retc;
520 1 uchar BitCnt;
521 1
522 1 retc=0;
523 1 SDA=1; /*置数据线为输入方式*/
524 1 for(BitCnt=0;BitCnt<8;BitCnt++)
525 1 {
526 2 _Nop();
527 2 _Nop();
528 2 SCL=0; /*置时钟线为低,准备接收数据位*/
529 2 _Nop();
530 2 _Nop(); /*时钟低电平周期大于4.7μs*/
531 2 _Nop();
532 2 _Nop();
533 2 _Nop();
534 2 _Nop();
535 2 _Nop(); /*时钟低电平周期大于4.7μs*/
536 2 _Nop();
537 2 _Nop();
538 2 _Nop();
539 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
540 2 _Nop();
541 2 _Nop();
542 2 _Nop();
543 2 _Nop();
544 2 retc=retc<<1;
545 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
546 2 _Nop();
547 2 _Nop();
548 2 _Nop();
549 2 _Nop();
550 2 }
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 10
551 1 SCL=0;
552 1 _Nop();
553 1 _Nop();
554 1 _Nop();
555 1 _Nop();
556 1 return(retc);
557 1 }
558
559
560
561
562 /********************************************************************
563 应答子函数
564 原型: void Ack_I2c(bit a);
565
566 功能:主控器进行应答信号,(可以是应答或非应答信号)
567 ********************************************************************/
568 void Ack_I2c(bit a)
569 {
570 1
571 1 if(a==0)SDA=0; /*在此发出应答或非应答信号 */
572 1 else SDA=1;
573 1 _Nop();
574 1 _Nop();
575 1 _Nop();
576 1 _Nop();
577 1 _Nop();
578 1 _Nop();
579 1 SCL=1;
580 1 _Nop();
581 1 _Nop(); /*时钟低电平周期大于4μs*/
582 1 _Nop();
583 1 _Nop();
584 1 _Nop();
585 1 _Nop();
586 1 _Nop(); /*时钟低电平周期大于4μs*/
587 1 _Nop();
588 1 _Nop();
589 1 _Nop();
590 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
591 1 _Nop();
592 1 _Nop();
593 1 _Nop();
594 1 _Nop();
595 1 }
596
597 /*******************************************************************
598 向有子地址器件发送字节数据函数
599 函数原型: bit ISendByte(uchar sla,ucahr c);
600 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
601 如果返回1表示操作成功,否则操作有误。
602 注意: 使用前必须已结束总线。
603 ********************************************************************/
604 bit ISendByte(uchar sla,uchar suba,uchar c)
605 {
606 1 Start_I2c(); /*启动总线*/
607 1 SendByte(sla); /*发送器件地址*/
608 1 if(ack==0)return(0);
609 1 SendByte(suba); /*发送器件地址*/
610 1 if(ack==0)return(0);
611 1 SendByte(c); /*发送数据*/
612 1 if(ack==0)return(0);
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 11
613 1 Stop_I2c(); /*结束总线*/
614 1 return(1);
615 1 }
616
617 /*******************************************************************
618 向有子地址器件读字节数据函数
619 函数原型: bit IRcvByte(uchar sla,ucahr *c);
620 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
621 址sla,返回值在c.
622 如果返回1表示操作成功,否则操作有误。
623 注意: 使用前必须已结束总线。
624 ********************************************************************/
625 uchar IRcvByte(uchar sla,uchar suba)
626 {
627 1 uchar c;
628 1 Start_I2c(); /*启动总线*/
629 1 SendByte(sla); /*发送器件地址*/
630 1 if(ack==0)return(0);
631 1 SendByte(suba); /*发送子器件地址*/
632 1 if(ack==0)return(0);
633 1
634 1 Start_I2c();
635 1
636 1 SendByte(sla+1); /*发读器件地址*/
637 1 if(ack==0)return(0);
638 1 c=RcvByte(); /*读取数据*/
639 1 Ack_I2c(1); /*发送非就答位*/
640 1 Stop_I2c(); /*结束总线*/
641 1 return c;
642 1 }
643
644
645
646
647
648 void main(void)
649 {
650 1 TIMERIni();
651 1 ISendByte( PCF8583, 0x00, 0x00);Delay1mS(200);//时钟芯片pcf8563初始化
652 1 //ISendByte(PCF8583, 0X00,0x80);
653 1 DS18B20_init(); //温度传感器DS18B20初始化
654 1 Delay1mS(200);
655 1 while(1)
656 1 {
657 2 if( read_temp==1)
658 2 {TEST=~TEST;
659 3 Readtemperature();
660 3 /*temp=IRcvByte(PCF8583, 0X02);
661 3 temp1=(temp/16)&0x0f;temp2=temp&0x0f;
662 3 sec=temp1*10+temp2;
663 3 temp=IRcvByte(PCF8583, 0X03);
664 3 temp1=temp>>4;temp2=temp&0x0f;
665 3 min=temp1*10+temp2;
666 3 temp=IRcvByte(PCF8583, 0X04);
667 3 temp1=(temp>>4)&0x03;temp2=temp&0x0f;
668 3 hou=temp1*10+temp2;
669 3 temp=IRcvByte(PCF8583, 0X05);
670 3 temp1=(temp>>4)&0x03;;temp2=temp&0x0f;
671 3 day=temp1*10+temp2;
672 3 temp=IRcvByte(PCF8583, 0X06);
673 3 temp1=(temp>>4)&0x01;temp2=temp&0x0f;
674 3 mon=temp1*10+temp2;*/
C51 COMPILER V7.07 8583_B20 02/05/2009 23:03:45 PAGE 12
675 3
676 3 read_temp=0; //读DS18B20检测到的温度
677 3 }
678 2
679 2 keyboard();
680 2 if(key>0)
681 2 {
682 3 menu();
683 3 }
684 2 }
685 1 }
686
687
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1490 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 47 2
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -