📄 dc.c.bak
字号:
#include <dc.h>
sbit stop=P3^5;
sbit wire_back=P4^4;
sbit wire_front=P4^5;
sbit rot_right=P4^6;
sbit rot_left=P4^7;
sbit send_enable=P3^4;
sbit limit=P4^3;
sbit wire_over_i=P1^2;
xdata unsigned char rbuffer[55],sbuffer[6];
unsigned char COMM,SLA,FF,GET,POINTER0,SSUM,POINTER1,RSUM,c_t1,s_byte_nums,r_byte_nums,pulse_num,
err,WIRE,S_ANSW,nonce_sec,work,p_sec,K21,K3,K31,tooth_num,
temp_pulse_num,delt_state;
unsigned int rot_vp,temp_rot_vp,rot_vb,temp_rot_vb,wire_vp,temp_wire_vp,wire_vb,
temp_wire_vb,n_cm0,c_cm0,n_cm1,c_cm1,FINISH,delt_rot,delt_wire
,*point;
bit send,overtime,start,decrease,urgent_stop,rot_front,rot_reverse,wire_add,
wire_dec,rot_ok,wire_ok,in_sector,receive_p_out,receive_p_in,demand,need_para,
rot_stop,rot_stop_ok,called,p_b,new_sector,start_rot,start_wire,stop_wire,r_slope_ok,
w_slope_ok,retract,return_ok,retract_ok,motor_stop,auto_return,resend,ans,
to_begin,noans_ok,ask_return_ok,k_r_p_add,k_r_b_add,k_r_p_dec,k_r_b_dec,k22,k33,k44;
bit kk,rw_err,err_ok;
void start_t2()
{
TM2CON=0x85; //16位溢出,分频系数2,f/12
EA=1;
TM2IR=0;
}
void ini_sbuf(unsigned char a,b,c,d,e,f)
{
sbuffer[0]=a;
sbuffer[1]=b;
sbuffer[2]=c;
sbuffer[3]=d;
sbuffer[4]=e;
sbuffer[5]=f;
}
unsigned char get_byte_nums(unsigned char type)
{
unsigned char numbers;
switch(type)
{
case infor_sec:
case command:
case program:
case answer: numbers=4;
break;
case err_infor:
case parameter1: numbers=5;
break;
case parameter:
case infor: numbers=6;
break;
case parameter2: numbers=7;
break;
case call_result: numbers=8;
break;
case p_out_sec: numbers=55;
break;
case p_in_sec: numbers=24;
break;
case edit_sec: numbers=64;
break;
default: break;
}
return numbers;
}
void TR_noans()
{
noans_ok=0;
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
send_enable=1; //开发送使能
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
send_enable=0; //关发送使能
noans_ok=1;
}
void delay(unsigned char num)
{
unsigned char i,ii;
for(i=0;i<num;i++)
{
for(ii=0;ii<255;ii++);
}
}
void TR_ans()
{
ans=1;
REN=0;
POINTER1=0;
RSUM=0;
TB8=1;
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
send_enable=1; //开发送使能
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
send_enable=0; //关发送使能
REN=1;
send=0;
c_t1=0;
// TR1=1;
while(POINTER1<r_byte_nums&&overtime==0);
TR1=0;
if(overtime==1)
{
err=2; //通信出错
overtime=0;
}
ans=0;
}
void com_type()
{
switch(rbuffer[2])
{
case com_calling: called=1;break;
case com_demand: {
if(demand==0)
demand=1;
}break;
case com_need_para: need_para=1;break;
case com_start: start=1;break;
case com_rot_front: { //正转
if(rot_front==0)
rot_front=1;
}break;
case com_rot_reverse: { //反转
if(rot_reverse==0)
rot_reverse=1;
}break;
case com_wire_add: { //送丝
if(work==0)
{
if(wire_add==0&&WIRE==ON)
wire_add=1;
}
if(work==3)
{
if(wire_add==0&&WIRE==ON&&pp.k3==ON)
wire_add=1;
}
}break;
case com_wire_dec: { //抽丝
if(work==0)
{
if(wire_dec==0&&WIRE==ON)
wire_dec=1;
}
if(work==3)
{
if(wire_dec==0&&WIRE==ON&&pp.k3==ON)
wire_dec=1;
}
}break;
case com_motor_stop: { //停止点动
if(motor_stop==0)
motor_stop=1;
}break;
case com_pre_melt_ok: start_rot=1;break;
case com_decrease: decrease=1;break;
case com_decrease_ok: rot_stop=1;break;
case com_wire: start_wire=1;break;
case com_stopW: stop_wire=1;break;
case com_return: auto_return=1;break;
case com_return_ok: return_ok=1;break;
case com_goto_begin: to_begin=1;break;
case com_err_ok: err_ok=1;break;
default: break;
}
}
void data_type() //对接收到的数据分辨类型
{
switch(rbuffer[1])
{
case command: com_type();break;
// case answer: R_ANSW=rbuffer[2];break;
case infor: {
switch(rbuffer[2])
{
case com_sector: {
nonce_sec=rbuffer[3];
in_sector=1;
new_sector=1;
}break;
case com_wire_on_off: WIRE=rbuffer[3];break;//送丝开关
case com_delt_switch: delt_state=rbuffer[3];break;
default: break;
}
}break;
case p_out_sec: receive_p_out=1;break;
case p_in_sec: {
nonce_sec=rbuffer[2];
receive_p_in=1;
}break;
case parameter1:FINISH=rbuffer[2]*256+rbuffer[3];break;
default: break;
}
}
void EX0_INT (void) interrupt 0 //急停
{
EX1=0;
send_enable=0; //关发送使能
PWM0=0;
PWM1=0;
wire_back=1;
wire_front=1;
rot_right=1;
rot_left=1;
while(err_ok==0)
{
if(called==1)
{
if(rw_err==0)
{
ini_sbuf(M_main,answer,OK,0,0,0);
s_byte_nums=4;
TR_noans();
}
else
{
ini_sbuf(M_main,err_infor,M_RW,err,0,0);
s_byte_nums=5;
TR_noans();
rw_err=0;
err=0;
stop=1;
}
called=0;
}
}
urgent_stop=1;
}
void EX1_INT (void) interrupt 2
{
unsigned char get_err;
EX1=0;
if(limit==0)
err=11; //旋转限位
else if(wire_over_i==0)
err=10;
else
{
get_err=P5;
get_err=get_err&0x04;
if(get_err==0)
err=9;
}
if(err!=0)
{
rw_err=1;
stop=0;
}
else
EX1=1;
}
void T1_INT (void) interrupt 3
{
// EA=0;
c_t1++;
if(send==1)
{
if(c_t1==7)
{
S0BUF=sbuffer[POINTER0];
c_t1=0;
}
}
else
{
if(c_t1==100)
{
TR1=0;
overtime=1;
}
}
// EA=1;
}
void TR_INT (void) interrupt 4 //串行口中断
{
EA=0; //关中断
if(TI==1) //发送完成
{
TI=0;
POINTER0++; //发送缓冲指针加1
if(POINTER0<s_byte_nums-1)
SSUM=SSUM+sbuffer[POINTER0]; //6个数据字节求和
else
sbuffer[s_byte_nums-1]=SSUM+sbuffer[0]; //数据和加地址生成校验码
if(POINTER0==s_byte_nums)
REN=1;
}
if(RI==1) //接收完成
{
RI=0;
POINTER1++; //接收缓冲指针加1
rbuffer[POINTER1-1]=S0BUF; //从接收缓冲读出数据
if(rbuffer[0]==M_RW||rbuffer[0]==M_ALL||rbuffer[0]==M_current_RW)
{
SM2=0;
if(POINTER1==2) //获取字节个数
r_byte_nums=get_byte_nums(rbuffer[1]);
if(POINTER1<r_byte_nums)
RSUM=RSUM+rbuffer[POINTER1-1]; //生成校验码
else
{
SM2=1;
if(RSUM==rbuffer[r_byte_nums-1])
{
if(ans==0)
{
POINTER1=0;
RSUM=0;
}
S_ANSW=OK;
data_type();
}
else
{
S_ANSW=FAIL;
if(resend==0)
resend=1;
}
}
}
else
POINTER1=0;
}
EA=1; //开中断
}
void CT0_int (void) interrupt 6 //焊接角度
{
CTI0=0;
if(auto_return==0)
{
if(FINISH<=50000)
{
temp_pulse_num++;
if(temp_pulse_num==pulse_num)
{
FINISH++;
temp_pulse_num=0;
}
}
else
{
IEN1=IEN1&0XFE; //CT0
temp_pulse_num=0;
}
}
else
{
if(FINISH>0)
{
temp_pulse_num++;
if(temp_pulse_num==pulse_num)
{
FINISH--;
temp_pulse_num=0;
}
}
else
{
PWM0=0;
rot_right=1;
rot_left=1;
IEN1=IEN1&0XFE; //CT0
}
}
}
void CT3_int (void) interrupt 9 //电流脉冲
{
CTI3=0;
CTCON=CTCON&0X3F;
IEN1=IEN1&0XF7; //CT3
p_b=~p_b;
if(p_b==1) //峰值
{
if(rot_ok==1&&K21==ON)
PWM0=temp_rot_vp;
if(wire_ok==1&&WIRE==ON&&K31==ON)
PWM1=temp_wire_vp;
CTCON=CTCON|0X80; //CT3捕捉上升沿
}
else
{
if(rot_ok==1&&K21==ON)//&&r_slope_ok==1)
PWM0=temp_rot_vb;
if(wire_ok==1&&WIRE==ON&&K31==ON)//&&w_slope_ok==1)
PWM1=temp_wire_vb;
CTCON=CTCON|0X40; //CT3捕捉下降沿
}
IEN1=IEN1|0X08; //CT3
}
void CM0_INT (void) interrupt 11 //送丝速度变化时间/抽丝时间
{
c_cm0++;
if(retract==0)
{
if(c_cm0==n_cm0)
{
IEN1=IEN1&0xEF; //CM0
if(temp_wire_vp<wire_vp)
{
if(temp_wire_vp+1==wire_vp)
temp_wire_vp=wire_vp;
else
temp_wire_vp=temp_wire_vp+1;
}
if(temp_wire_vp>wire_vp)
{
if(temp_wire_vp-1==wire_vp)
temp_wire_vp=wire_vp;
else
temp_wire_vp=temp_wire_vp-1;
}
if(K31==ON)
{
if(temp_wire_vb<wire_vb)
{
if(temp_wire_vb+1==wire_vb)
temp_wire_vb=wire_vb;
else
temp_wire_vb=temp_wire_vb+1;
}
if(temp_wire_vb>wire_vb)
{
if(temp_wire_vb-1==wire_vb)
temp_wire_vb=wire_vb;
else
temp_wire_vb=temp_wire_vb-1;
}
}
c_cm0=0;
CML0=TML2+0xC8;
if(CML0<TML2)
CMH0=TMH2+1+0X00;
else
CMH0=TMH2+0X00;
if(K31==OFF)
{
PWM1=temp_wire_vp;
if(temp_wire_vp==wire_vp)
{
if(wire_ok==0)
wire_ok=1;
else
w_slope_ok=1;
}
else
IEN1=IEN1|0x10; //CM0
}
else
{
if(temp_wire_vp==wire_vp&&temp_wire_vb==wire_vb)
{
PWM1=temp_wire_vb;
if(wire_ok==0)
wire_ok=1;
else
w_slope_ok=1;
}
else
IEN1=IEN1|0x10; //CM0
}
}
}
else
{
if(c_cm0<n_cm0)
{
CML0=TML2+0X50; //100ms
if(CML0<TML2)
CMH0=TMH2+1+0XC3;
else
CMH0=TMH2+0XC3;
}
else
{
IEN1=IEN1&0XEF; //CM0
PWM1=0;
wire_back=1;
wire_front=1;
retract_ok=1;
}
}
}
void CM1_INT (void) interrupt 12 //旋转速度变化
{
c_cm1++;
if(c_cm1==n_cm1)
{
IEN1=IEN1&0xDF; //CM1
if(temp_rot_vp<rot_vp)
{
if(temp_rot_vp+1==rot_vp)
temp_rot_vp=rot_vp;
else
temp_rot_vp=temp_rot_vp+1;
}
if(temp_rot_vp>rot_vp)
{
if(temp_rot_vp-1==rot_vp)
temp_rot_vp=rot_vp;
else
temp_rot_vp=temp_rot_vp-1;
}
if(K21==ON)
{
if(temp_rot_vb<rot_vb)
{
if(temp_rot_vb+1==rot_vb)
temp_rot_vb=rot_vb;
else
temp_rot_vb=temp_rot_vb+1;
}
if(temp_rot_vb>rot_vb)
{
if(temp_rot_vb-1==rot_vb)
temp_rot_vb=rot_vb;
else
temp_rot_vb=temp_rot_vb-1;
}
}
c_cm1=0;
CML1=TML2+0XC8;
if(CML1<TML2) //CM1,400us,旋转速度变化时间
CMH1=TMH2+1+0X00;
else
CMH1=TMH2+0X00;
if(K21==OFF)
{
PWM0=temp_rot_vp;
if(temp_rot_vp==rot_vp)
{
if(rot_ok==0)
rot_ok=1;
else
r_slope_ok=1;
}
else
IEN1=IEN1|0x20; //CM1
}
else
{
if(temp_rot_vp==rot_vp&&temp_rot_vb==rot_vb)
{
PWM0=temp_rot_vb;
if(rot_ok==0)
rot_ok=1;
else
r_slope_ok=1;
}
else
IEN1=IEN1|0x20; //CM1
}
}
}
main()
{
TMOD=0x22; //定时器1,方式2;
TL1=0XFD; //波特率9600
TH1=0XFD;
TR1=1; //启动定时器
PCON=0X00; //SMOD=0
TMOD=0x23; //定时器0,方式3,两个8位定时器;
TR1=0;
TF1=0;
S0CON=0XF8; //串口方式3,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
IP0=0X98; //S0=1,T1=1
ES0=1; //开串口中断
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -