📄 p87lpc764+万能遥控调光调速器.lst
字号:
516 2 ON=0; /*禁止可控硅*/
517 2 IsStudy=1; /*设置红外学习标志*/
518 2 StudyOK=0;
519 2 i=20; /*设置10s 学习时间*/
520 2 while(!StudyOK){/*等待学习完成,Led 闪烁*/
521 3 Led=~Led;
522 3 Delay(500);
523 3
524 3
525 3 if(i--==0) goto NoSt;
526 3 }
527 2 /*学习成功*/
528 2 Led=1;
529 2 Delay(100);
530 2 Led=0;
531 2 Delay(100);
532 2 Led=1;
533 2 Delay(100);
534 2 NoSt:
535 2 Led=0;
536 2 IsStudy=0;/*进入接收状态*/
537 2 StudyOK=0;
538 2 break; /*红外学习*/
539 2 default:
540 2 break;
541 2 }
542 1 FuncCode=0;
543 1 FuncSet=0; /*清除功能设置标志*/
544 1 }
545 void Write_FireAngle()
546 {
547 1 Buf1[0]=Fire_Angle%256;
548 1 Buf1[1]=Fire_Angle/256;
549 1 WriteEE(128,2,Buf1);
550 1 }
551 void Read_Last_FireAngle(void)
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 10
552 {
553 1 ReadEE(128,2,Buf1);
554 1 Last_FireAngle=Buf1[0]+Buf1[1]*256;
555 1 }
556 void Write_MaxFireAngle()
557 {
558 1 Buf1[0]=MaxFireAngle%256;
559 1 Buf1[1]=MaxFireAngle/256;
560 1 WriteEE(136,2,Buf1);
561 1 }
562 void Read_MaxFireAngle(void)
563 {
564 1 ReadEE(136,2,Buf1);
565 1
566 1 MaxFireAngle=Buf1[0]+Buf1[1]*256;
567 1 }
568 void WDFeed() /*清看门狗*/
569 {
570 1 WDRST=0X1E;
571 1 WDRST=0XE1;
572 1 }
573 /*三次过零的时间间隔除于2 即为半周期时间值*/
574 void Calc_MaxFireAngle()
575 {
576 1 while((CMP1 & 1)==0); /*等待过零*/
577 1 CMP1 &= 0xFE; /*清比较器中断标志*/
578 1 TR0=1; /*启动定时器*/
579 1 while((CMP1 & 1)==0); /*等待过零*/
580 1 CMP1 &= 0xFE; /*清比较器中断标志*/
581 1 while((CMP1 & 1)==0); /*等待过零*/
582 1 CMP1 &= 0xFE; /*清比较器中断标志*/
583 1 TR0=0; /*关闭定时器*/
584 1 MaxFireAngle=(TH0*256+TL0)/2;
585 1 }
586 /*测量低电平宽度*/
587 unsigned char Get_L_Width()
588 {
589 1 TH1=TL1=0;
590 1 TR1=1; /*启动定时器*/
591 1 while(INT1!=1);
592 1 TR1=0;
593 1 TL1=(TH1*256+TL1 )/250;
594 1 return(TL1/2);
595 1 }
596 /*测量高电平宽度*/
597 unsigned char Get_H_Width()
598 {
599 1 TF1=0;
600 1 TH1=TL1=0;
601 1 TR1=1; /*启动定时器*/
602 1 while(INT1!=0){
603 2 if(TH1>0X20) return(255);/*脉宽约为16ms*/
604 2 /*if(TF1==1) return(255);*/
605 2 }
606 1
607 1
608 1 TR1=0;
609 1 TL1=(TH1*256+TL1 )/250;
610 1 return(TL1/2);
611 1 }
612 /*页写存储器,Num<=8*/
613 int WriteEE(unsigned char SubAdr,unsigned char Num,unsigned char *Wbuf)
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 11
614 {
615 1 unsigned char data i;
616 1 Start(); /*发送I2C 总线起始条件*/
617 1 if(SendByte(0xa0)!=0) return -1; /* 发送被控器总线地址*/
618 1 if(SendByte(SubAdr)!=0) return -1; /*发送写的地址*/
619 1 for(i=0;i<Num;i++) /*重复操作直到发送完最后一个数据*/
620 1 if(SendByte(*(Wbuf+i))!=0) return -1;
621 1 Stop(); /*发送I2C 总线停止条件*/
622 1 Delay(10); /*延时10ms,等待数据写完*/
623 1 return 0;
624 1 }
625 /*读多个字节数据 */
626 int ReadEE(unsigned char SubAdr,unsigned char Num,unsigned char *Rbuf)
627 {
628 1 unsigned char data i;
629 1 Start(); /* 发送I2C 总线起始条件*/
630 1 if(SendByte(0xa0)!=0) return -1;/*发送被控器总线写地址*/
631 1 if(SendByte(SubAdr)!=0) return -1; /*发送读首地址*/
632 1 Start(); /*发送I2C 总线重复起始条件*/
633 1 if(SendByte(0xa1)!=0) return(-1); /*发送被控器总线读地址*/
634 1 if(Num!=1)
635 1 {for(i=0;i<Num-1;i++) *(Rbuf+i)=ReadByte();
636 2 SendACK(); /*发送应答信号*/
637 2
638 2 *(Rbuf+Num-1)=ReadByte();
639 2 }
640 1 else
641 1 *Rbuf=ReadByte();
642 1 SendNoACK(); /*最后一个字节,发送非应答信号*/
643 1 Stop(); /*发送I2C 总线停止条件*/
644 1 return(0);
645 1 }
646 /*字节数据传送子程序发送一个字节数据或地址给被控器*/
647 int SendByte(unsigned char a)
648 {
649 1 unsigned char data i,j;
650 1 unsigned char bdata Sin;
651 1 Sin=a;
652 1 for(i=0;i<8;i++)
653 1 {
654 2 if((Sin & 0x80)==0)
655 2 SDA=0;
656 2 else
657 2 SDA=1;
658 2 for(j=0;j<2;j++);
659 2 SCL=1; /*置时钟线为高通知被控器开始*/
660 2 for(j=0;j<4;j++);/*保证时钟高周期大于4 s*/
661 2 SCL=0;
662 2 Sin=Sin<<1;
663 2 }
664 1 for(j=0;j<2;j++);
665 1 SDA=1;
666 1 for(j=0;j<2;j++);
667 1 SCL=1;
668 1 for(j=0;j<2;j++);
669 1 if (SDA==0) {SCL=0;return 0;} /*成功,返回0*/
670 1 for(j=0;j<1;j++);
671 1 SCL=0;
672 1 return -1; /*未收到应答,返回-1*/
673 1 }
674 /*数据接收子程序从被控器接收一个字节数据*/
675 unsigned char ReadByte()
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 12
676 {
677 1 unsigned char data i,j;
678 1 unsigned char bdata Sin;
679 1 SDA=1;
680 1 for (i=0;i<7;i++)
681 1 {
682 2 SCL=0;
683 2 for(j=0;j<2;j++);
684 2 SCL=1;
685 2 if(SDA==1)
686 2 Sin|=0x01;
687 2 else
688 2 Sin&=0xfe;
689 2 for(j=0;j<2;j++);
690 2 Sin<<=1;
691 2 }
692 1 SCL=0;
693 1 for(j=0;j<2;j++);
694 1 SCL=1;
695 1 if(SDA==1)
696 1 Sin|=0x01;
697 1 else
698 1 Sin&=0xfe;
699 1 for(j=0;j<2;j++);
700 1 return(Sin);
701 1 }
702 /*发送应答位*/
703 void SendACK()
704 {
705 1 unsigned char data j;
706 1 SCL=0;
707 1 for(j=0;j<2;j++);
708 1 SDA=0;
709 1 for(j=0;j<2;j++);
710 1 SCL=1;
711 1 for(j=0;j<4;j++);
712 1 SCL=0;
713 1 }
714 /*发送非应答位*/
715 void SendNoACK()
716 {
717 1 unsigned char data j;
718 1 SCL=0;
719 1 for(j=0;j<2;j++);
720 1 SDA=1;
721 1 for(j=0;j<2;j++);
722 1 SCL=1;
723 1 for(j=0;j<4;j++);
724 1 SCL=0;
725 1 }
726 /*START 启动I2C 总线子程序发送I2C 起始条件*/
727 void Start(void)
728 {
729 1 unsigned char data i;
730 1 SDA=1; /* 发送起始条件的数据信号*/
731 1 for (i=0;i<2;i++);
732 1 SCL=1; /*发送起始条件的时钟信号*/
733 1 for(i=0;i<4;i++) ; /*起始条件建立时间大于4.7 s*/
734 1 SDA=0; /*发送起始信号*/
735 1 for(i=0;i<4;i++); /*起始条件锁定时间大于4 s*/
736 1 SCL=0; /*钳住I2C 总线准备发送或接收数据*/
737 1 }
C51 COMPILER V7.09 P87LPC764_万能襙控礯筥礯_倨_ 11/13/2006 13:51:42 PAGE 13
738 /*STOP 停止I2C 总线子程序发送I2C 总线停止条件*/
739 void Stop(void)
740 {
741 1 unsigned char data i;
742 1 SDA=0;
743 1 for(i=0;i<2;i++) ;
744 1 SCL=1;
745 1 for(i=0;i<4;i++)
746 1 SDA=1;
747 1 for(i=0;i<4;i++);
748 1 }
749 /*一次延时1ms*/
750 void Delay(unsigned int x)
751 {
752 1 unsigned char j;
753 1 while(x--){
754 2 WDRST=0X1E; /*清看门狗*/
755 2 WDRST=0XE1;
756 2 for(j=0;j<120;j++);
757 2 }
758 1 }
759
760
761
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2326 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 76 15
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -