📄 main1-1.c.bak
字号:
//#pragma la
#include <main1.h>
#define uchar unsigned char
#define uint unsigned int
sbit stop=P3^5;
xdata uchar sbuffer[5],rbuffer[64],sbuffer1[55];
uchar S_ANSW,R_ANSW,POINTER0,POINTER1,RSUM,SSUM,c_t1,s_byte_nums,r_byte_nums,
work,pn1,PRG,err,toPRG,temp_c;
bit edit_finish,copy,change_prg,overtime,getPRG,received,send,t31OK,t41OK,
t51OK,resend,ans,s_p,noans_ok,connect,break_connect,main1_err,in_sector,
editing,p_received,lift_ok,pc_ok,need_para,temp_motor_stop,p_forbid,rc_forbid,new_switch1,new_switch2,
pc_stop,urgent_stop,p_active,rc_active;
uint *point;
xdata uchar start _at_ 0x0800;
xdata uchar decrease _at_ 0x0802;
//xdata uchar urgent_stop _at_ 0x0804;
xdata uchar YOUHU _at_ 0x0806;
xdata uchar WIRE _at_ 0x0808;
xdata uchar decrease_ok _at_ 0x080A;
xdata uchar weld_switch _at_ 0x080C;
xdata uchar wire_switch _at_ 0x080E;
xdata uchar current_add _at_ 0x0810;
xdata uchar current_dec _at_ 0x0812;
xdata uchar rot_front _at_ 0x0814;
xdata uchar rot_reverse _at_ 0x0816;
xdata uchar wire_add _at_ 0x0818;
xdata uchar wire_dec _at_ 0x081A;
xdata uchar osc_l _at_ 0x081C;
xdata uchar osc_r _at_ 0x081E;
xdata uchar breadth_add _at_ 0x0820;
xdata uchar breadth_dec _at_ 0x0822;
xdata uchar avc_up _at_ 0x0824;
xdata uchar avc_down _at_ 0x0826;
xdata uchar motor_stop _at_ 0x0828;
//xdata uchar lift_ok _at_ 0x082A;
xdata uchar return_ok _at_ 0x082C;
xdata uchar nonce_sec _at_ 0X082E;
xdata uint FINISH _at_ 0X0830;
xdata uint CURRENT _at_ 0X0832;
xdata uint VOLTAGE _at_ 0X0834;
xdata uint AVC _at_ 0X0836;
//xdata uchar pc_ok _at_ 0x0838;
xdata uchar new_switch11 _at_ 0x0839;
xdata uchar new_switch22 _at_ 0x083A;
xdata uchar p_forbided _at_ 0x083B;
xdata uchar rc_forbided _at_ 0x083C;
xdata uchar p_actived _at_ 0x083D;
xdata uchar rc_actived _at_ 0x083E;
xdata uint last_FINISH _at_ 0x0840;
void TR_noans()
{
REN=0;
noans_ok=0;
// TB8=1;
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
noans_ok=1;
REN=1;
}
void TR_ans()
{
REN=0;
ans=1;
POINTER1=0;
RSUM=0;
TB8=1;
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
REN=1;
send=0;
c_t1=0;
// TR1=1;
while(POINTER1<r_byte_nums&&overtime==0);
TR1=0;
POINTER1=0;
RSUM=0;
if(overtime==1)
{
err=3;
main1_err=1;
overtime=0;
stop=0;
}
ans=0;
REN=0;
}
void ini_sbuf(unsigned char a,b,c,d,e)
{
sbuffer[0]=a;
sbuffer[1]=b;
sbuffer[2]=c;
sbuffer[3]=d;
sbuffer[4]=e;
}
unsigned char get_byte_nums(unsigned char type)
{
unsigned char numbers;
switch(type)
{
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=9;
break;
case para_pc: numbers=10;
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 com_type()
{
switch(rbuffer[2])
{
case com_edit: if(p_forbided==1)
{
editing=1; //编程
}break;
case com_efinish: if(p_forbided==1)
{
editing=0;
edit_finish=1;
}break;
case com_start: if(rc_forbided==1)
{
// if((edited==1&&edit_finish==1)||(edited==0))//编程未结束,禁止启动焊接
start=1;
}break;
case com_decrease: if(rc_forbided==1)
decrease=1;break; //手动衰减
case com_current_add: if(rc_forbided==1)
current_add=1;break; //电流加
case com_current_dec: if(rc_forbided==1)
current_dec=1;break; //电流减
case com_rot_front: if(rc_forbided==1)
rot_front=1;break;
case com_rot_reverse: if(rc_forbided==1)
rot_reverse=1;break;
case com_wire_add: if(rc_forbided==1)
wire_add=1;break;
case com_wire_dec: if(rc_forbided==1)
wire_dec=1;break;
case com_osc_l: if(rc_forbided==1&&osc_l==0)
osc_l=1;break;
case com_osc_r: if(rc_forbided==1&&osc_r==0)
osc_r=1;break;
case com_breadth_add: if(rc_forbided==1&&breadth_add==0)
breadth_add=1;break;
case com_breadth_dec: if(rc_forbided==1&&breadth_dec==0)
breadth_dec=1;break;
case com_avc_up: if(rc_forbided==1)
avc_up=1;break;
case com_avc_down: if(rc_forbided==1)
avc_down=1;break;
case com_motor_stop: if(rc_forbided==1&&temp_motor_stop==0)
temp_motor_stop=1;break;
case com_urgent_stop: if(rc_forbided==1)
{
pc_stop=1;
urgent_stop=1;
err=1;
}break;
case com_connect: connect=1;break;
case com_connect_fail: break_connect=1;break;
case com_forbid_p: if(p_forbided==0)
p_forbid=1;break;
case com_forbid_rc: if(rc_forbided==0)
rc_forbid=1;break;
case com_p_active: p_active=1;break;
case com_rc_active: rc_active=1;break;
case com_need_para: need_para=1;break;
default: break;
}
if(ans==0)
{
POINTER1=0;
RSUM=0;
r_byte_nums=4;
}
}
void data_type() //对接收到的数据分辨类型
{
switch(rbuffer[1])
{
case command: com_type();break;
case answer: R_ANSW=rbuffer[2];break;
case err_infor: err=rbuffer[3];break;
/*
case infor_sec: {
nonce_sec=rbuffer[2];
}break;
*/
case edit_sec: {
// if(in_sector==0)
// {
// nonce_sec=rbuffer[2];
// in_sector=1;
// }
p_received=1;
}break;
/*
case parameter: {
param=1;
}break;
*/
/*
case program:
if(work==0||work==1)
{
PRG=rbuffer[3];
change_prg=1;
save_prg(); //将程序号存入EEPROM
}break;
*/
case infor: {
switch(rbuffer[2])
{
/* case com_sector: nonce_sec=rbuffer[3];break;
case com_copyEXP: {
PRG=rbuffer[2]; //假设为当前程序号
toPRG=rbuffer[3]; //目的程序号
copy=1;
}break;
*/
case com_calling: R_ANSW=rbuffer[3];break;
case com_switch: {
YOUHU=rbuffer[3];
WIRE=rbuffer[4];
}break;
case com_weld_simu: if(rc_forbided==1)
{
YOUHU=rbuffer[3];
new_switch1=1;
}break;
case com_wire_on_off: if(rc_forbided==1)
{
WIRE=rbuffer[3];
new_switch2=1;
}break;
default:break;
}
}break;
case p_out_sec: p_received=1;break;
// case p_in_sec: p_received=1;break;
default: break;
}
}
void EX0_INT (void) interrupt 0
{
EX0=0;
urgent_stop=1;
err=1;
}
void T1_INT (void) interrupt 3
{
// EA=0;
c_t1++;
if(send==1)
{
if(c_t1==7)
{
if(s_p==0)
SBUF=sbuffer[POINTER0];
else
SBUF=sbuffer1[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==1)
// TB8=0;
if(POINTER0<s_byte_nums)
{
if(POINTER0<s_byte_nums-1)
{
if(s_p==1)
SSUM=SSUM+sbuffer1[POINTER0];
else
SSUM=SSUM+sbuffer[POINTER0]; //6个数据字节求和
}
else
{
if(s_p==1)
sbuffer1[s_byte_nums-1]=SSUM+sbuffer1[0];
else
sbuffer[s_byte_nums-1]=SSUM+sbuffer[0]; //数据和加地址生成校验码
}
}
}
if(RI==1) //接收完成
{
RI=0;
POINTER1++; //接收缓冲指针加1
rbuffer[POINTER1-1]=SBUF; //从接收缓冲读出数据
if(POINTER1==2)
r_byte_nums=get_byte_nums(rbuffer[1]);
if(POINTER1<r_byte_nums)
RSUM=RSUM+rbuffer[POINTER1-1]; //生成校验码
else
{
if(rbuffer[r_byte_nums-1]==RSUM)
{
if(ans==0)
{
POINTER1=0;
RSUM=0;
}
S_ANSW=OK;
data_type();
}
else
{
S_ANSW=FAIL;
if(resend==0)
resend=1;
}
}
}
EA=1; //开中断
}
main()
{
uchar i,j,delt,temp_pc,temp_delt,c_err;
TMOD=0x22; //定时器1,方式2;
TL1=0XFD; //波特率9600
TH1=0XFD;
TR1=1; //启动定时器
// PCON=0X80; //SMOD=1;
TMOD=0x23; //定时器0,方式3,两个8位定时器;
TR1=0;
TF1=0;
SCON=0X50; //串口方式1,SM2=0,REN=1,TB8=1,RB8=0,TI=0,RI=0
IP=0X98; //S0=1,T1=1
// EX0=1; //急停
ES=1; //开串口中断
ET1=1;
EA=1; //中断总允许
temp_c=0;
pc_ok=0;
urgent_stop=0;
main1_err=0;
p_forbid=0;
rc_forbid=0;
p_active=0;
rc_active=0;
p_forbided=0;
rc_forbided=0;
p_actived=0;
rc_actived=0;
BEGIN:
/* if(urgent_stop==1)
{
EX0=1;
stop=1;
urgent_stop=0;
}
*/
pc_stop=0;
urgent_stop=0;
work=0;
start=0;
err=0; //错误编号
editing=0; //正在编程
edit_finish=0; //编程结束
p_received=0;
// edited=0; //进行过编程操作
change_prg=0;
connect=0;
break_connect=0;
in_sector=0;
nonce_sec=0; //当前区间号
FINISH=0;
CURRENT=0;
VOLTAGE=0;
AVC=0;
decrease=0;
rot_front=0;
rot_reverse=0;
wire_add=0;
wire_dec=0;
osc_l=0;
osc_r=0;
avc_up=0;
avc_down=0;
temp_motor_stop=0;
motor_stop=0;
new_switch1=0;
new_switch2=0;
POINTER0=0;
SSUM=0;
S_ANSW=0;
POINTER1=0;
RSUM=0;
ans=0;
R_ANSW=0;
r_byte_nums=4;
noans_ok=1;
overtime=0;
s_p=0; //1,发送参数
// rc_forbided=1;
while(start==0)
{
if(connect==1)
{
ini_sbuf(M_PC,answer,OK,0,0);
s_byte_nums=4;
TR_noans();
pc_ok=1;
connect=0;
}
if(break_connect==1)
{
pc_ok=0;
break_connect=0;
}
/*
if(p_forbid==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
p_forbided=1;
p_actived=0;
p_forbid=0;
}
if(rc_forbid==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
rc_forbided=1;
rc_actived=0;
rc_forbid=0;
}
*/
if(temp_motor_stop==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
motor_stop=1;
temp_motor_stop=0;
}
if(editing==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
while(p_received==0)
{
if(urgent_stop==1)
{
if(pc_stop==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
pc_stop=0;
stop=0;
}
goto BEGIN;
}
if(resend==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
p_received=0;
resend=0;
}
}
point=&pp.pn;
delt=0;
for(i=2;i<55;i++)
{
*(point+i-2)=rbuffer[i+delt]*256+rbuffer[i+delt+1];
delt++;
}
p_received=0;
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
while(p_received==0)
{
if(urgent_stop==1)
{
if(pc_stop==1)
{
ini_sbuf(M_PC,answer,S_ANSW,0,0);
s_byte_nums=4;
TR_noans();
pc_stop=0;
stop=0;
}
goto BEGIN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -