📄 osc2.lst
字号:
677 2 CTCON=CTCON|0x08;
678 2 IEN1=IEN1|0x02;
679 2 }
680 1 }
681
682 void CT1_int (void) interrupt 7 //整个摆宽
683 {
684 1 CTI1=0;
685 1 gate=0; //out1、out2门控信号
686 1 CTCON=CTCON&0xF3;
687 1 if(sec_center==1)
688 1 {
689 2 COM=0XB6;
690 2 COUNT2=out2%256;
691 2 COUNT2=out2/256;
692 2 sec_center=0;
693 2 if(new_sector==1)
694 2 {
695 3 new_sector=0;
696 3 sec_change=1;
697 3 }
698 2 }
699 1 osc_dir=~osc_dir; //换横摆方向
700 1 t_edge=~t_edge; //换边缘标志
701 1 osc_out=~osc_out; //横摆输出
702 1 if(decreased==1)
703 1 IEN1=IEN1|0X10;
704 1 else
705 1 {
706 2 if(center_excursion==1&&judge_ok==0)
707 2 {
708 3 if(center_excursion==1&&judge_ok==0)
709 3 {
710 4 if(t_edge==0&&excursion_dir==1||t_edge==1&&excursion_dir==0)//左边缘、向右偏或右边缘、向左偏
711 4 {
712 5 out1=out1+pp.dc41*80/3;
713 5 judge_ok=1;
714 5 center_excursion=0;
715 5 }
716 4 }
717 3 else if(judge_ok==1)
718 3 {
719 4 out1=out1-pp.dc41*80/3;
720 4 judge_ok=0;
721 4 }
722 3 out2=2*out1;
723 3 COM=0X76;
724 3 COUNT1=out1%256;
725 3 COUNT1=out1/256;
726 3 COM=0XB6;
727 3 COUNT2=out2%256;
728 3 COUNT2=out2/256;
729 3 osc_enable=0;
730 3
731 3 }
732 2 IEN1=IEN1|0X10; //允许CM0,边缘停留时间
733 2 }
734 1 }
735
736 void CM0_int (void) interrupt 11 //边缘停留时间
C51 COMPILER V7.06 OSC2 09/21/2005 09:00:12 PAGE 13
737 {
738 1 CMI0=0;
739 1 c_t42++;
740 1 if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r) //左边缘
741 1 {
742 2 IEN1=IEN1&0XEF; //禁止CM0
743 2 CTCON=CTCON|0x02; //CT0下降沿
744 2 IEN1=IEN1|0X01; //允许CT0
745 2 gate=1;
746 2 osc_out=~osc_out; //边缘停留时间结束
747 2 c_t42=0;
748 2 }
749 1 CML0=TML2+0X20;
750 1 if(CML0<TML2)
751 1 CMH0=TMH2+1+0X4E;
752 1 else
753 1 CMH0=TMH2+0X4E;
754 1 }
755
756 main()
757 {
758 1 TMOD=0x22; //定时器1,方式2;定时器0,方式3,两个8位定时器;
759 1 TL1=0XFD; //波特率19200
760 1 TH1=0XFD;
761 1 TR1=1; //启动定时器
762 1 TMOD=0x23; //定时器0,方式3,两个8位定时器;
763 1 TR1=0;
764 1 TF1=0;
765 1 S0CON=0XF8; //串口方式3,SM2=1,REN=1,TB8=1,RB8=0,TI=0,RI=0
766 1 // IP1=0X03; //CT0、CT1高优先级
767 1 IP0=0X98; //S0=1,T1=1
768 1 ES0=1; //开串口中断
769 1 ET1=1;
770 1 EA=1; //中断总允许
771 1 start_t2();
772 1 urgent_stop=0;
773 1 osc_err=0;
774 1 err_ok=0;
775 1 err=0;
776 1 BEGIN:
777 1 if(urgent_stop==1)
778 1 {
779 2 urgent_stop=0;
780 2 err_ok=0;
781 2 EX1=1;
782 2 EX0=1;
783 2 }
784 1 CTCON=0x00;
785 1 IEN1=0x00;
786 1 COM=0X36;
787 1 COUNT0=0XA0;
788 1 COUNT0=0X0F; //启动横摆脉冲 1K
789 1 COM=0X76;
790 1 COUNT1=0x00;
791 1 COUNT1=0x00;
792 1 COM=0XB6;
793 1 COUNT2=0x00;
794 1 COUNT2=0x00;
795 1 static_out1=0;
796 1 static_out0=0;
797 1 gate=0; //关门控
798 1 osc_enable=1; //横摆使能
C51 COMPILER V7.06 OSC2 09/21/2005 09:00:12 PAGE 14
799 1 osc_dir=0; //横摆方向,0-左,1-右
800 1 osc_out=1; //横摆输出
801 1 work=0;
802 1 receive_p_out=0;
803 1 receive_p_in=0;
804 1 called=0;
805 1 start=0;
806 1 new_sector=0;
807 1 in_sector=0;
808 1 nonce_sec=0;
809 1 sec_center=0;
810 1 sec_change=0; //区间过渡时调整标志
811 1 c_change=0; //区间过渡时调整次数
812 1 temp_c_change=0;
813 1 K4=0;
814 1 start_osc=0;
815 1 osc_started=0;
816 1 osc_ok=0;
817 1 t_edge=0; //0-左边缘 1-右边缘
818 1 c_t42=0;
819 1 share=0; //启动横摆标志
820 1 stop_osc=0;
821 1 decrease=0;
822 1 decreased=0; //衰减标志
823 1 decrease_ok=0;
824 1 to_begin=0;
825 1
826 1 need_para=0;
827 1 POINTER0=0;
828 1 SSUM=0;
829 1 S_ANSW=0;
830 1 POINTER1=0;
831 1 RSUM=0;
832 1 r_byte_nums=4;
833 1 ans=0;
834 1 send=0;
835 1 resend=0;
836 1
837 1 osc_l=0;
838 1 osc_r=0;
839 1 center_excursion=0; //横摆中心偏移标志(DC41)
840 1 center_change=0; //自动横摆未开时,调整中心
841 1 breadth_add=0;
842 1 breadth_dec=0;
843 1 osc_add=0; //摆宽增加次数
844 1 osc_dec=0;
845 1 osc=0;
846 1 judge_ok=0;
847 1 motor_stop=0;
848 1
849 1 CML0=TML2+0X20;
850 1 if(CML0<TML2)
851 1 CMH0=TMH2+1+0X4E;
852 1 else
853 1 CMH0=TMH2+0X4E; //20ms
854 1 EX1=1;
855 1 EX0=1;
856 1 while(start==0) //等待过程中,接受点名和参数
857 1 {
858 2 if(called==1)
859 2 {
860 3 ini_sbuf(M_main,infor,com_calling,S_ANSW,0,0);
C51 COMPILER V7.06 OSC2 09/21/2005 09:00:12 PAGE 15
861 3 s_byte_nums=get_byte_nums(infor);
862 3 TR_noans();
863 3 called=0;
864 3 }
865 2
866 2 if(receive_p_out==1)
867 2 {
868 3 point=&pp.k4;
869 3 for(p_sec=0;p_sec<14;p_sec++)
870 3 *(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
871 3 ini_sbuf(M_main,answer,S_ANSW,0,0,0);
872 3 s_byte_nums=4;
873 3 TR_noans();
874 3 receive_p_out=0;
875 3 }
876 2
877 2 if(receive_p_in==1)
878 2 {
879 3 point=&pp.x[nonce_sec][0];
880 3 for(p_sec=0;p_sec<6;p_sec++)
881 3 *(point+p_sec)=rbuffer[p_sec*2+3]*256+rbuffer[p_sec*2+4];
882 3
883 3 ini_sbuf(M_main,answer,S_ANSW,0,0,0);
884 3 s_byte_nums=4;
885 3 TR_noans();
886 3 receive_p_in=0;
887 3 }
888 2
889 2 if(osc_l==1)
890 2 {
891 3 gate=1; //给出横摆脉冲
892 3 osc_dir=0; //左
893 3 osc_enable=0; //开使能
894 3 osc_l=0;
895 3 }
896 2
897 2 if(osc_r==1)
898 2 {
899 3 gate=1; //开8254门控信号
900 3 osc_dir=1; //右
901 3 osc_enable=0; //开使能
902 3 osc_r=0;
903 3 }
904 2
905 2 if(motor_stop==1)
906 2 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -