📄 main1_1013.c.bak
字号:
//#pragma la
#include <main1.h>
#define uchar unsigned char
#define uint unsigned int
sbit stop=P3^5;
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,temp_motor_stop,
new_switch1,new_switch2,new_switch3,need_para,
urgent_stop,p_active,rc_active,pc_operate;
xdata uchar start _at_ 0x0800;
xdata uchar start_again _at_ 0x0801;
xdata uchar decrease _at_ 0x0802;
xdata uchar err_ok _at_ 0x0803;
xdata uchar YOUHU _at_ 0x0804;
xdata uchar WIRE _at_ 0x0805;
xdata uchar decrease_ok _at_ 0x0806;
//xdata uchar weld_switch _at_ 0x0807;
//xdata uchar wire_switch _at_ 0x0808;
xdata uchar current_add _at_ 0x0809;
xdata uchar current_dec _at_ 0x080A;
xdata uchar rot_front _at_ 0x080B;
xdata uchar rot_reverse _at_ 0x080C;
xdata uchar wire_add _at_ 0x080D;
xdata uchar wire_dec _at_ 0x080E;
xdata uchar osc_l _at_ 0x080F;
xdata uchar osc_r _at_ 0x0810;
xdata uchar breadth_add _at_ 0x0811;
xdata uchar breadth_dec _at_ 0x0812;
xdata uchar avc_up _at_ 0x0813;
xdata uchar avc_down _at_ 0x0814;
xdata uchar motor_stop _at_ 0x0815;
xdata uchar delt_switch _at_ 0x0816;
//xdata uchar return_ok _at_ 0x0817;
xdata uchar nonce_sec _at_ 0X0818;
xdata uint FINISH _at_ 0X0819;
//xdata uint CURRENT _at_ 0X081B;
//xdata uint VOLTAGE _at_ 0X081D;
//xdata uint AVC _at_ 0X081F;
xdata uchar new_switch11 _at_ 0x0821;
xdata uchar new_switch22 _at_ 0x0822;
xdata uchar pc_edit _at_ 0x0823;
//xdata uint last_FINISH _at_ 0x0824;
xdata uchar pc_stop _at_ 0x0826;
xdata uchar edited _at_ 0x0827;
xdata uchar p_changed _at_ 0x0828;
xdata uchar scan _at_ 0x0829;
xdata uchar err _at_ 0x082A;
xdata uchar rbuffer[64] _at_ 0x0C00;
xdata uchar sbuffer[5] _at_ 0x0C40;
xdata uchar sbuffer1[64] _at_ 0x0C45;
xdata uchar S_ANSW _at_ 0x0C8C;
xdata uchar R_ANSW _at_ 0x0C8D;
xdata uchar POINTER0 _at_ 0x0C8E;
xdata uchar POINTER1 _at_ 0x0C8F;
xdata uchar RSUM _at_ 0x0C90;
xdata uchar SSUM _at_ 0x0C91;
xdata uchar c_t1 _at_ 0x0C92;
xdata uchar s_byte_nums _at_ 0x0C93;
xdata uchar r_byte_nums _at_ 0x0C94;
xdata uchar work _at_ 0x0C95;
xdata uchar pn1 _at_ 0x0C96;
xdata uchar PRG _at_ 0x0C97;
xdata uchar toPRG _at_ 0x0C98;
xdata uchar temp_c _at_ 0x0C99;
xdata uchar need_finish _at_ 0x0C9A;
xdata uint *point _at_ 0x0D00;
void delay(unsigned int num)
{
data unsigned int i,ii;
for(i=0;i<num;i++)
{
for(ii=0;ii<255;ii++);
}
}
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=2;
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: editing=1;break;
case com_efinish: {
editing=0;
edit_finish=1;
}break;
case com_start: if(start==0)
{
start=1;
pc_operate=1;
}break;
case com_start_again: if(start==0)
{
start=1;
start_again=1;
pc_operate=1;
}break;
case com_decrease: decrease=1;break; //手动衰减
case com_current_add: {
scan=1;
current_add=1;
}break; //电流加
case com_current_dec: {
scan=1;
current_dec=1;
}break; //电流减
case com_rot_front: {
scan=1;
rot_front=1;
}break;
case com_rot_reverse: {
scan=1;
rot_reverse=1;
}break;
case com_wire_add: {
scan=1;
wire_add=1;
}break;
case com_wire_dec: {
scan=1;
wire_dec=1;
}break;
case com_osc_l: {
scan=1;
osc_l=1;
}break;
case com_osc_r: {
scan=1;
osc_r=1;
}break;
case com_breadth_add: {
scan=1;
breadth_add=1;
}break;
case com_breadth_dec: {
scan=1;
breadth_dec=1;
}break;
case com_avc_up: {
scan=1;
avc_up=1;
}break;
case com_avc_down: {
scan=1;
avc_down=1;
}break;
case com_motor_stop: temp_motor_stop=1;break;
case com_urgent_stop: {
pc_stop=1;
urgent_stop=1;
err=1;
err_ok=0;
EX0=0;
start=0;
stop=0;
}break;
case com_connect: connect=1;break;
case com_connect_fail: break_connect=1;break;
// case com_forbid_p: p_forbid=1;break;
// case com_forbid_rc: 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;
case com_need_finish: if(need_finish==0)
need_finish=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: {
YOUHU=rbuffer[3];
new_switch1=1;
}break;
case com_wire_on_off: {
WIRE=rbuffer[3];
new_switch2=1;
}break;
case com_delt_switch: new_switch3=1;;break;
default:break;
}
}break;
case p_out_sec: p_received=1;break;
// case p_in_sec: p_received=1;break;
default: break;
}
}
void send_param()
{
unsigned char temp_pc,temp_delt,anum,snum,axis[]={M_current,M_RW,M_OSC,M_AVC};
s_p=1;
point=&pp.pn;
temp_delt=2;
sbuffer1[0]=M_current; //电流和面板接收
sbuffer1[1]=p_out_sec; //电流区间外参数
// sbuffer1[54]=0;
for(temp_pc=2;temp_pc<54;temp_pc++)
{
if(temp_pc%2==0)
{
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
temp_delt++;
}
else
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
}
for(temp_pc=54;temp_pc<64;temp_pc++)
sbuffer1[temp_pc]=0;
s_byte_nums=55;
TR_ans();
// delay(100);
s_p=1;
point=&pp.k2;
temp_delt=2;
sbuffer1[0]=M_RW; //旋转/送丝和面板接收
sbuffer1[1]=p_out_sec; //旋转/送丝区间外参数
for(temp_pc=2;temp_pc<50;temp_pc++)
{
if(temp_pc%2==0)
{
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
temp_delt++;
}
else
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
}
for(temp_pc=50;temp_pc<64;temp_pc++)
sbuffer1[temp_pc]=0;
s_byte_nums=55;
TR_ans();
// delay(100);
s_p=1;
point=&pp.k4;
temp_delt=2;
sbuffer1[0]=M_OSC; //横摆和面板接收
sbuffer1[1]=p_out_sec; //横摆区间外参数
for(temp_pc=2;temp_pc<54;temp_pc++)
{
if(temp_pc%2==0)
{
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
temp_delt++;
}
else
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
}
for(temp_pc=54;temp_pc<64;temp_pc++)
sbuffer1[temp_pc]=0;
s_byte_nums=55;
TR_ans();
// delay(100);
/*
s_p=1;
point=&pp.k5;
temp_delt=0;
// sbuffer1[0]=M_AVC; //横摆和面板接收
// sbuffer1[1]=p_out_sec; //横摆区间外参数
for(temp_pc=2;temp_pc<28;temp_pc++)
{
if(temp_pc%2==0)
{
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
temp_delt++;
}
else
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
}
for(temp_pc=28;temp_pc<64;temp_pc++)
sbuffer1[temp_pc]=0;
s_byte_nums=55;
TR_ans();
*/
for(snum=0;snum<10;snum++)
{
s_p=1;
temp_delt=2;
point=&pp.x[snum][0];
for(temp_pc=2;temp_pc<62;temp_pc++)
{
if(temp_pc%2==0)
{
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)/256;
temp_delt++;
}
else
sbuffer1[temp_pc]=*(point+temp_pc-temp_delt)%256;
}
sbuffer1[0]=0;
sbuffer1[1]=0;
for(temp_pc=62;temp_pc<64;temp_pc++)
sbuffer1[temp_pc]=0;
s_byte_nums=64;
TR_ans();
}
s_p=0;
}
void EX0_INT (void) interrupt 0
{
EX0=0;
urgent_stop=1;
err_ok=0;
}
void EX1_INT (void) interrupt 2
{
EX1=0;
urgent_stop=1;
err_ok=0;
}
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;
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;
EX0=1;
EX1=1;
EA=1; //中断总允许
temp_c=0;
pc_ok=0;
urgent_stop=0;
main1_err=0;
BEGIN: if(urgent_stop==1)
{
urgent_stop=0;
EX0=1;
EX1=1;
}
pc_stop=0;
urgent_stop=0;
err_ok=1;
work=0;
start=0;
// err=0; //错误编号
editing=0; //正在编程
edit_finish=0; //编程结束
p_received=0;
change_prg=0;
connect=0;
break_connect=0;
in_sector=0;
// nonce_sec=0; //当前区间号
// FINISH=0;
// CURRENT=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -