📄 osc.c.bak
字号:
S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
}
if (S1STA==0x48)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if (S1STA==0x50)
{
GET=S1DAT;
S1CON=0xC1; //STA=0 STO=0 SI=0 AA=0
}
if (S1STA==0x58)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
}
void CT0_int (void) interrupt 6 //横摆中心
{
CTI0=0;
CTCON=CTCON&0xFC;
if(pp.k4==OFF)
{
IEN1=IEN1&0XFE;
gate=0;
osc_enable=1;
center_excursion=0;
}
else
{
if(decrease==1)
{
gate=0;
if(pp.v41>800)
delay(3);
temp_c++;
if(share+1+osc_adjudge<c_decrease)
{
CTCON=CTCON|0x08; //CT1下降沿
if(temp_c%2==0||first_center==1)
{
share++;
c_t42_l=pp.t42_l*5*(c_decrease-share)/c_decrease;
c_t42_r=pp.t42_r*5*(c_decrease-share)/c_decrease;
out1=last_out1*(c_decrease-share)/c_decrease;
out2=out1;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256;
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
IEN1=IEN1|0X02;
gate=1;
temp_c=0;
if(first_center==1)
first_center=0;
}
else
{
IEN1=IEN1|0x02;
gate=1;
}
}
else
{
if(temp_c!=2)
{
CTCON=CTCON|0x08; //CT1下降沿
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256;
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
IEN1=IEN1|0X02;
gate=1;
}
else
{
gate=0; //关8254门控信号
CTCON=CTCON&0XF0;
IEN1=IEN1&0XFC; //禁止CT0,CT1
decrease_ok=1;
}
}
if(decreased==0)
decreased=1;
}
else
{
if(osc==1)
{
gate=0; //关8254门控信号
delay(15);
if(osc_change==1)
{
out1=out1+pp.da41*10;
osc_add++;
}
else
{
out1=out1-pp.da41*10;
osc_dec++;
}
out2=out1;
CTCON=CTCON|0X08;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256;
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
IEN1=IEN1|0X02;
gate=1;
osc=0;
}
CTCON=CTCON|0x08;
IEN1=IEN1|0x02;
}
}
}
void CT1_int (void) interrupt 7 //整个摆宽
{
CTI1=0;
gate=0; //out1、out2门控信号
CTCON=CTCON&0xF3;
if(osc_ok==0)
{
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
osc_ok=1;
}
osc_dir=~osc_dir; //换横摆方向
t_edge=~t_edge; //换边缘标志
osc_out=~osc_out; //横摆输出
if(decreased==1)
{
if(c_t42_l<1)
c_t42_l=1;
if(c_t42_r<1)
c_t42_r=1;
IEN1=IEN1|0X10;
}
else
{
if(center_excursion==1&&judge_ok==0)
{
if(center_excursion==1&&judge_ok==0)
{
if(t_edge==0&&excursion_dir==1||t_edge==1&&excursion_dir==0)//左边缘、向右偏或右边缘、向左偏
{
out1=out1+pp.dc41*10;
judge_ok=1;
center_excursion=0;
}
}
else if(judge_ok==1)
{
out1=out1-pp.dc41*10;
judge_ok=0;
}
out2=2*out1;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256;
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
osc_enable=0;
}
IEN1=IEN1|0X10; //允许CM0,边缘停留时间
}
}
void CM0_int (void) interrupt 11 //边缘停留时间
{
CMI0=0;
c_t42++;
if(decreased==0)
{
if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r) //左边缘
{
IEN1=IEN1&0XEF; //禁止CM0
CTCON=CTCON|0x02; //CT0下降沿
IEN1=IEN1|0X01; //允许CT0
gate=1;
TR0=1;
osc_out=~osc_out; //边缘停留时间结束
c_t42=0;
}
}
else
{
if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r) //左边缘
{
IEN1=IEN1&0XEF; //禁止CM0
CTCON=CTCON|0x02;
IEN1=IEN1|0X01;
gate=1;
osc_out=~osc_out; //边缘停留时间结束
c_t42=0;
}
}
CML0=TML2+0X20;
if(CML0<TML2)
CMH0=TMH2+1+0X4E;
else
CMH0=TMH2+0X4E;
}
main()
{
TMOD=0x22; //定时器1,方式2;定时器0,方式3,两个8位定时器;
TL1=0XFD; //波特率19200
TH1=0XFD;
TR1=1; //启动定时器
TMOD=0x23; //定时器0,方式3,两个8位定时器;
TR1=0;
TF1=0;
S0CON=0XF8; //串口方式3,SM2=1,REN=1,TB8=1,RB8=0,TI=0,RI=0
IP1=0X03; //CT0、CT1高优先级
IP0=0X98; //S0=1,T1=1
ES0=1; //开串口中断
// ET0=1;
ET1=1;
// EAD=1; //AD中断允许
// ES1=1; //I2C
EA=1; //中断总允许
start_t2();
urgent_stop=0;
osc_err=0;
err_ok=0;
err=0;
BEGIN:
if(urgent_stop==1)
{
urgent_stop=0;
err_ok=0;
EX1=1;
EX0=1;
}
CTCON=0x00;
IEN1=0x00;
COM=0X36;
COUNT0=0XA0;
COUNT0=0X0F; //启动横摆脉冲 1K
COM=0X76;
COUNT1=0x00;
COUNT1=0x00;
COM=0XB6;
COUNT2=0x00;
COUNT2=0x00;
gate=0; //关门控
osc_enable=1; //横摆使能
osc_dir=0; //横摆方向,0-左,1-右
osc_out=1; //横摆输出
work=0;
called=0;
start=0;
sector=0;
in_sector=0;
start_osc=0;
osc_ok=0;
first_center=1;
t_edge=0; //0-左边缘 1-右边缘
c_t0=0;
c_t42=0;
temp_c=0;
share=0; //启动横摆标志
stop_osc=0;
decrease=0;
decreased=0; //衰减标志
decrease_ok=0;
to_begin=0;
need_para=0;
POINTER0=0;
SSUM=0;
S_ANSW=0;
POINTER1=0;
RSUM=0;
r_byte_nums=4;
ans=0;
send=0;
resend=0;
demand=0;
osc_l=0;
osc_r=0;
center_excursion=0; //横摆中心偏移标志(DC41)
breadth_add=0;
breadth_dec=0;
osc_add=0; //摆宽增加次数
osc_dec=0;
osc=0;
judge_ok=0;
motor_stop=0;
CML0=TML2+0X20;
if(CML0<TML2)
CMH0=TMH2+1+0X4E;
else
CMH0=TMH2+0X4E; //20ms
EX1=1;
EX0=1;
while(start==0) //等待过程中,接受点名和参数
{
if(called==1)
{
ini_sbuf(M_main,infor,S_ANSW,cross_machine,0,0);
s_byte_nums=get_byte_nums(infor);
TR_noans();
called=0;
}
if(receive_p_out==1)
{
point=&pp.k4;
for(p_sec=0;p_sec<13;p_sec++)
*(point+p_sec)=rbuffer[p_sec*2+2]*256+rbuffer[p_sec*2+3];
ini_sbuf(M_main,answer,S_ANSW,0,0,0);
s_byte_nums=4;
TR_noans();
// demand=0;
receive_p_out=0;
}
if(receive_p_in==1)
{
point=&pp.x[nonce_sec][0];
for(p_sec=0;p_sec<6;p_sec++)
*(point+p_sec)=rbuffer[p_sec*2+3]*256+rbuffer[p_sec*2+4];
ini_sbuf(M_main,answer,S_ANSW,0,0,0);
s_byte_nums=4;
TR_noans();
// demand=0;
receive_p_in=0;
}
if(osc_l==1)
{
gate=1; //给出横摆脉冲
osc_dir=0; //左
osc_enable=0; //开使能
osc_l=0;
}
if(osc_r==1)
{
gate=1; //开8254门控信号
osc_dir=1; //右
osc_enable=0; //开使能
osc_r=0;
}
if(motor_stop==1)
{
gate=0; //关横摆脉冲
osc_enable=1;
motor_stop=0;
}
if(urgent_stop==1)
goto BEGIN;
}
K4=pp.k4&0x01;
const0=pp.v41*(pp.t42_l+pp.t42_r)/2;
const0=const0+pp.a41*60;
// const0=pp.a41*60;
const1=(unsigned long)(pp.v41)*(unsigned long)(pp.t17);
out0=2400000/pp.v41; //横摆脉冲, 时钟4M,4*60*0.01*1000000
out1=10*pp.a41; //横摆半宽脉冲,时钟1K,(A41/10)/(v41/60)*1000
out2=2*out1; //横摆整宽脉冲
c_t42_l=pp.t42_l*5; //pp.t42_l/10*1000/50
c_t42_r=pp.t42_r*5;
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256; //半个摆宽
COM=0XB6;
COUNT2=out1%256;
COUNT2=out1/256; //整个摆宽
work=3; //关8254门控信号
do
{
if(start_osc==1) //开始横摆
{
ini_sbuf(M_main,answer,S_ANSW,0,0,0);
s_byte_nums=4;
TR_noans();
osc_dir=0; //方向——左
osc_enable=0; //开横摆使能
CTCON=CTCON|0x08; //CT1下降沿
IEN1=IEN1|0X02; //允许CT1
gate=1;
osc_out=1;
// TR0=1;
start_osc=0;
}
if(urgent_stop==1)
goto BEGIN;
if(pp.k4==OFF&¢er_excursion==1)
{
if(excursion_dir==0)
osc_dir=0; //左
else
osc_dir=1;
CTCON=CTCON|0X02;
COM=0X76;
COUNT1=10;
COUNT1=0;
IEN1=IEN1|0X01;
gate=1;
osc_enable=0; //开横摆使能
center_excursion=0;
}
if(urgent_stop==1)
goto BEGIN;
if(sector==1) //进入新区间
{
if(osc_ok==1)
{
K4=pp.x[nonce_sector][19];
if(K4==1)
{
}
else
{
stop_osc=1;
}
}
sector=0;
}
/*
if(resend==1)
{
POINTER1=0;
RSUM=0;
ini_sbuf(M_main,answer,S_ANSW,0,0,0);
s_byte_nums=get_byte_nums(answer);
}
*/
if(urgent_stop==1)
goto BEGIN;
}while(decrease==0);
/*
while(decrease_ok==0)
{
if(urgent_stop==1)
goto BEGIN;
}
*/
while(to_begin==0)
{
if(urgent_stop==1)
goto BEGIN;
}
goto BEGIN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -