📄 osc3.c.bak
字号:
temp_c_change++;
if(temp_c_change%2==0)
share++;
if(share<=c_change)
{
if(share==c_change||c_change==1)
{
out0=temp_out0;
out1=temp_out1;
c_change=0;
share=0;
temp_c_change=0;
sec_change=0;
IEN1=IEN1&0XFE; //CT0
}
else
{
if(temp_out0>static_out0)
out0=static_out0+share*delt_out0/c_change;
else if(temp_out0<static_out0)
out0=static_out0-share*delt_out0/c_change;
if(temp_out1>static_out1)
out1=static_out1+share*delt_out1/c_change;
else if(temp_out1<static_out1)
out1=static_out1-share*delt_out1/c_change;
}
out2=2*out1;
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256; //半个摆宽
COM=0XB6;
COUNT2=out1%256;
COUNT2=out1/256;
sec_center=1;
}
}
if(new_sector==1)
{
c_t42_l=pp.x[nonce_sec][1]*5; //pp.t42_l/10*1000/50
c_t42_r=pp.x[nonce_sec][2]*5;
c_change=pp.x[nonce_sec][5]%256;
temp_out0=900000/pp.x[nonce_sec][3];
temp_out1=pp.x[nonce_sec][4]*80/3;
const1=pp.x[nonce_sec][4];
if(temp_out0!=out0)
{
static_out0=out0;
if(temp_out0>static_out0)
{
delt_out0=temp_out0-static_out0;
out0=(static_out0*c_change+delt_out0)/c_change;
}
else
{
delt_out0=static_out0-temp_out0;
out0=(static_out0*c_change-delt_out0)/c_change;
}
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
}
if(temp_out1!=out1)
{
static_out1=out1;
if(temp_out1>out1)
{
delt_out1=temp_out1-out1;
out1=static_out1*c_change+delt_out1;
out1=out1/c_change;
}
else
{
delt_out1=out1-temp_out1;
out1=static_out1*c_change-delt_out1;
out1=out1/c_change;
}
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256; //半个摆宽
COM=0XB6;
COUNT2=out1%256;
COUNT2=out1/256;
}
osc_add=0;
osc_dec=0;
sec_center=1;
share=1;
temp_c_change=0;
}
c_t2=0;
}
else
{
gate=0;
CTCON=CTCON&0xF3;
static_out0=0;
static_out1=0;
osc_ok=0;
}
if(osc==1)
{
gate=0; //关8254门控信号
delay(15);
if(osc_change==1)
{
out1=out1+pp.da41*80/3;
osc_add++;
}
else
{
out1=out1-pp.da41*80/3;
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门控信号
IEN1=IEN1&0XFD; //CT1
CTCON=CTCON&0xF3;
if(sec_center==1)
{
// COM=0XB6;
// COUNT2=out2%256;
// COUNT2=out2/256;
sec_center=0;
if(new_sector==1)
{
new_sector=0;
sec_change=1;
}
}
osc_dir=~osc_dir; //换横摆方向
t_edge=~t_edge; //换边缘标志
osc_out=~osc_out; //横摆输出
if(decreased==0)
{
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*80/3;
judge_ok=1;
center_excursion=0;
}
}
else if(judge_ok==1)
{
out1=out1-pp.dc41*80/3;
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;
}
CML0=TML2+0X20;
if(CML0<TML2)
CMH0=TMH2+1+0X4E;
else
CMH0=TMH2+0X4E; //20ms
}
IEN1=IEN1|0X10; //允许CM0,边缘停留时间
}
void CT2_int (void) interrupt 8
{
CTI2=0;
c_t2++;
if(c_t2==temp_c_t2)
{
IEN1=IEN1&0XFB; //禁止CT2
// CTCON=CTCON|0x02; //CT0下降沿
// IEN1=IEN1|0X01; //允许CT0
out0=temp_out0;
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
c_t2=0;
// gate=1;
}
// if(c_t2==100)
// over_i_enable=1;
}
void CM0_int (void) interrupt 11 //边缘停留时间
{
CMI0=0;
c_t42++;
if(t_edge==0&&c_t42==c_t42_l||t_edge==1&&c_t42==c_t42_r) //左边缘
{
IEN1=IEN1&0XEF; //禁止CM0
CTCON=CTCON|0x0A; //CT0,CT1下降沿
IEN1=IEN1|0X03; //允许CT,CT1
if(sec_change==0) //2005-09-22
{
out0=900000/start_v;
c_t2=0;
temp_c_t2=out1/12;
// over_i_enable=0;
CTCON=CTCON|0X20; //CT2下降沿
IEN1=IEN1|0X04;
}
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
// COM=0X76;
// COUNT1=out1%256;
// COUNT1=out1/256;
// COM=0XB6;
// COUNT2=out2%256;
// COUNT2=out2/256;
osc_out=~osc_out; //边缘停留时间结束
c_t42=0;
gate=1;
}
else
{
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;
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;
static_out1=0;
static_out0=0;
gate=0; //关门控
osc_enable=1; //横摆使能
osc_dir=0; //横摆方向,0-左,1-右
osc_out=1; //横摆输出
over_i_enable=0;
work=0;
receive_p_out=0;
receive_p_in=0;
called=0;
start=0;
new_sector=0;
in_sector=0;
nonce_sec=0;
sec_center=0;
sec_change=0; //区间过渡时调整标志
c_change=0; //区间过渡时调整次数
temp_c_change=0;
K4=0;
start_osc=0;
osc_started=0;
osc_ok=0;
t_edge=0; //0-左边缘 1-右边缘
c_t42=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;
osc_l=0;
osc_r=0;
center_excursion=0; //横摆中心偏移标志(DC41)
center_change=0; //自动横摆未开时,调整中心
breadth_add=0;
breadth_dec=0;
osc_add=0; //摆宽增加次数
osc_dec=0;
osc=0;
judge_ok=0;
motor_stop=0;
EX1=1;
EX0=1;
while(start==0) //等待过程中,接受点名和参数
{
if(called==1)
{
ini_sbuf(M_main,infor,com_calling,S_ANSW,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<14;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();
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();
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;
}
if(pp.k4==ON)
{
const1=pp.a41;
c_t42_l=pp.t42_l*5; //pp.t42_l/10*1000/50
c_t42_r=pp.t42_r*5;
c_change=pp.t43%256;
temp_out0=900000/pp.v41; //横摆脉冲, 时钟4M,4*60*0.01*1000000
static_out0=900000/start_v;
if(temp_out0>=static_out0)
delt_out0=temp_out0-static_out0;
else
delt_out0=static_out0-temp_out0;
temp_out1=pp.a41*80/3; //横摆半宽脉冲
delt_out1=temp_out1;
out0=static_out0;
out1=delt_out1/c_change;
out2=2*out1; //横摆整宽脉冲
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门控信号
nonce_sec=0;
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
sec_center=1;
sec_change=1;
temp_c_change=0;
share=1;
osc_ok=1;
osc_started=1;
start_osc=0;
gate=1;
osc_out=1;
}
if(in_sector==1&&new_sector==1&&osc_ok==0)
{
c_t42_l=pp.x[nonce_sec][1]*5; //pp.t42_l/10*1000/50
c_t42_r=pp.x[nonce_sec][2]*5;
c_change=pp.x[nonce_sec][5]%256;
const1=pp.x[nonce_sec][4];
temp_out0=900000/pp.x[nonce_sec][3]; //横摆脉冲, 时钟4M,4*60*0.01*1000000
static_out0=900000/start_v;
if(temp_out0>=static_out0)
delt_out0=temp_out0-static_out0;
else
delt_out0=static_out0-temp_out0;
temp_out1=pp.x[nonce_sec][4]*80/3;
delt_out1=temp_out1;
out0=static_out0;
out1=delt_out1/c_change;
out2=2*out1; //横摆整宽脉冲
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256; //半个摆宽
COM=0XB6;
COUNT2=out1%256;
COUNT2=out1/256; //整个摆宽
if(K4==ON&&osc_started==1)
{
osc_dir=0; //方向——左
osc_enable=0; //开横摆使能
CTCON=CTCON|0x08; //CT1下降沿
IEN1=IEN1|0X02; //允许CT1
osc_ok=1;
sec_center=1;
sec_change=1;
temp_c_change=0;
share=1;
osc_add=0;
osc_dec=0;
gate=1;
osc_out=1;
}
}
if(urgent_stop==1)
goto BEGIN;
if(osc_ok==0&¢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;
center_change=1;
}
if(urgent_stop==1)
goto BEGIN;
}while(decrease==0);
while(to_begin==0)
{
if(urgent_stop==1)
goto BEGIN;
}
goto BEGIN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -