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