📄 main_1027.c
字号:
{
EA=1;
ini_sbuf(M_current,command,com_calling,0,0,0,0);
s_byte_nums=4;
TR_ans(); // 对方给正常时应答类型,出错时错误信息类型
if(rbuffer[1]==answer)
{
ini_sbuf(M_RW,command,com_calling,0,0,0,0);
s_byte_nums=4;
TR_ans();
if(rbuffer[1]==answer)
{
ini_sbuf(M_OSC,command,com_calling,0,0,0,0);
s_byte_nums=4;
TR_ans();
if(rbuffer[1]==answer)
{
ini_sbuf(M_AVC,command,com_calling,0,0,0,0);
s_byte_nums=4;
TR_ans();
if(rbuffer[1]==err_infor)
{
if(work!=0)
{
ini_sbuf(M_P_RC,err_infor,M_AVC,err,0,0,0);
s_byte_nums=5;
TR_noans();
}
else
{
if(err==18)
{
ini_sbuf(M_AVC,command,com_lift,0,0,0,0);
s_byte_nums=4;
TR_noans();
}
}
}
}
else
{
ini_sbuf(M_P_RC,err_infor,M_OSC,err,0,0,0);
s_byte_nums=5;
TR_noans();
}
}
else
{
ini_sbuf(M_P_RC,err_infor,M_RW,err,0,0,0);
s_byte_nums=5;
TR_noans();
}
}
else
{
ini_sbuf(M_P_RC,err_infor,M_current,err,0,0,0);
s_byte_nums=5;
TR_noans();
}
urgent_stop=1;
}
delay(5);
ini_sbuf(M_ALL,command,com_err_ok,0,0,0,0);
s_byte_nums=4;
TR_noans();
POINTER1=64;
wait_ans=0;
if(pc_stop==1)
pc_stop=0;
err_ok=1;
}
void EX1_INT(void) interrupt 2 //响应线控器申请
{
EX1=0;
c_ex1++;
if(c_ex1==3)
{
EX1=0;
c_ex1=0;
rc_demand=1;
}
else
EX1=1;
}
void T1_INT (void) interrupt 3
{
c_t1++;
if(send==1)
{
if(c_t1==7)
{
if(s_p==0)
S0BUF=sbuffer[POINTER0];
else
S0BUF=sbuffer1[POINTER0];
c_t1=0;
}
}
else
{
if(p_send==1)
{
if(c_t1==4000)
{
TR1=0;
c_t1=0;
overtime=1;
}
}
else
{
if(c_t1==100)
{
TR1=0;
c_t1=0;
overtime=1;
}
}
}
}
void TR_INT (void) interrupt 4 //串行口中断
{ //关中断
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]=S0BUF; //从接收缓冲读出数据
if(rbuffer[0]==M_main)
{
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;
}
}
}
else
POINTER1=0;
}
}
void S1_INT (void) interrupt 5 //I2C
{
ES1=0;
if(S1STA==0x00)
{
FF=1;
S1CON=0xD5;//STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0X08)
{
S1DAT=SLA;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
if(S1STA==0X10)
{
S1DAT=SLA;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
if(S1STA==0X18)
{
S1DAT=COMM;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
if(S1STA==0X20)
{
FF=1;
S1CON=0xD5;//STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0X28)
{
if(readEEPbyte==1||readEEPpage==1||writeEEPpage==1||writeEEPword==1||writeEEPbyte==1)
{
nums++;
if(readEEPbyte==1)
{
if(nums==1)
{
if(getPRG==1)
S1DAT=0X00;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
if(nums==2)
{
if(getPRG==1)
SLA=0XA1;
S1CON=0XE5;
}
}
else
{
if(readEEPpage==1)
{
if(times<6&&nums<130)
{
if(nums==1)
{
COMM=(mainDDR+times*128)%256;
S1DAT=COMM;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
if(nums==2)
{
SLA=SLA+1;
S1CON=0XE5;
}
}
}
else
{
if(writeEEPpage==1)
{
if(times<6&&nums<130)
{
if(nums==1)
COMM=(mainDDR+times*128)%256;
else
{
if(times==5&&nums>=114)
COMM=0xFF;
else
{
if(nums%2==0)
{
COMM=*(point+(times*64+nums-delt))/256;
delt++;
}
else
COMM=*(point+(times*64+nums-delt))%256;
}
}
S1DAT=COMM;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
else
{
S1CON=0xD5;
writeEEPpage=0;
}
}
else
{
if(writeEEPword==1)
{
if(nums<4)
{
if(param==1)
{
if(nums==1)
COMM=(mainDDR+secondDDR)%256;
if(nums==2)
COMM=general_param/256;
if(nums==3)
COMM=general_param%256;
}
if(in_sector==1)
{
if(nums==1)
COMM=(mainDDR+152+nonce_sec*60+p_sec*2)%256;
if(nums==2)
COMM=rbuffer[p_sec*2+3];
if(nums==3)
COMM=rbuffer[p_sec*2+4];
}
S1DAT=COMM;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
else
{
S1CON=0xD5;
writeEEPword=0;
}
}
else
{
if(writeEEPbyte==1)
{
if(nums<3)
{
if(savePRG==1)
{
if(nums==1)
COMM=0X00;
else
COMM=PRG;
}
S1DAT=COMM;
S1CON=0xC5;//STA=0 STO=0 SI=0 AA=1
}
else
{
S1CON=0xD5;
writeEEPbyte=0;
}
}
}
}
}
}
}
else
S1CON=0XD5;
}
if(S1STA==0x30)
{
FF=1;
S1CON=0xD5;//STA=0 STO=1 SI=0 AA=1
}
if(S1STA==0x38)
S1CON=0xE5;//STA=1 STO=0 SI=0 AA=1
if(S1STA==0X40)
{
if(readEEPbyte==1)
S1CON=0XC1;
// if(readEEPpage==1)
else
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;
if(readEEPpage==1)
{
nums1++;
if(times<5&&nums1<130||times==5&&nums1<114)
{
if(nums1%2==1)
temp_GET=GET;
else
{
temp_GET=temp_GET*256+GET;
*(point+(times*64+nums1-delt))=temp_GET;
delt++;
}
S1CON=0XC5;
}
else
S1CON=0XC1;
}
else
S1CON=0xC1;
}
if(S1STA==0x58)
{
if(readEEPbyte==1||readEEPpage==1)
{
GET=S1DAT;
if(readEEPbyte==1)
{
S1CON=0xD5;//STA=0 STO=1 SI=0 AA=1
readEEPbyte=0;
}
else
{
if(readEEPpage==1)
{
S1CON=0XD5;
temp_GET=temp_GET*256+GET;
*(point+(times*64+nums1-delt))=temp_GET;
readEEPpage=0;
}
}
}
else
S1CON=0xD5;
}
ES1=1;
}
void CT0_int (void) interrupt 6
{
CTI0=0;
IEN1=IEN1&0XFE;
CTCON=CTCON&0XFC;
if(enter==0)
{
SLA=0X40;
COMM=0X02;
start_i2a();
delay(5);
SLA=0X43;
start_i2a();
delay(5);
switch(GET)
{
case 0xFB: {
start=1;
enter=1;
}break;
case 0xF7: {
decrease=1;
enter=1;
}break;
case 0xEF: {
current_add=1;
enter=1;
}break;
case 0xDF: {
current_dec=1;
enter=1;
}break;
default: break;
}
if(enter==0)
{
SLA=0X40;
COMM=0X01;
start_i2a();
delay(5);
SLA=0X43;
start_i2a();
delay(5);
switch(GET)
{
case 0xFE: {
rot_front=1;
enter=1;
}break;
case 0xFD: {
rot_reverse=1;
enter=1;
}break;
case 0xFB: {
wire_add=1;
enter=1;
}break;
case 0xF7: {
wire_dec=1;
enter=1;
}break;
case 0xEF: {
tight=1;
enter=1;
}break;
case 0xDF: {
lose=1;
enter=1;
}break;
default: break;
}
}
SLA=0X40;
COMM=0X03;
start_i2a();
delay(5);
}
else
{
if(tight==0&&lose==0)
motor_stop=1;
enter=0;
}
if(enter==1)
CTCON=CTCON|0X01;
else
CTCON=CTCON|0X02;
IEN1=IEN1|0X01;
}
void CM0_int (void) interrupt 11 //流程时钟,100ms中断一次
{
CMI0=0;
// if(auto_return==0)
c_flow++;
/*
else
{
if(c_end>0)
c_end--;
else
IEN1=IEN1&0XEF; //禁止CM0
}
*/
CML0=TML2+0XD4;
if(CML0>TML2)
CMH0=TMH2+1+0X30;
else
CMH0=TMH2+0X30; //100ms
}
void CM1_int (void) interrupt 12
{
CMI1=0;
IEN1=IEN1&0XDF; //CM1
c_cm1++;
if(c_cm1==8)
{
scan=1;
c_cm1=0;
}
else
{
CML1=TML2+0XD4;
if(CML1>TML2)
CMH1=TMH2+1+0X30;
else
CMH1=TMH2+0X30;
IEN1=IEN1|0X20; //CM1
}
}
main()
{
unsigned char k;
TMOD=0x22; //定时器1,方式2;
TL1=0XFD; //波特率9600
TH1=0XFD;
TR1=1; //启动定时器
TMOD=0x23; //定时器0,方式3,两个8位定时器;
TR1=0;
TF1=0;
S0CON=0XC0; //串口方式3,SM2=0,REN=0,TB8=1,RB8=0,TI=0,RI=0
IP0=0X9C; //S0=1,T1=1,EX1=1
ES0=1; //开串口中断
ET1=1;
ES1=1; //I2C
EA=1; //中断总允许
start_t2();
stop=1;
err=0;
urgent_stop=0;
main_err=0;
calling=0;
getPRG=0;
readEEPbyte=0;
readEEPpage=0;
rc_err=1;
EX0=1;
stop=0;
while(rc_err==1);
urgent_stop=0;
EX0=1;
S_ANSW=0;
ans=0;
R_ANSW=0;
r_byte_nums=4;
noans_ok=1;
overtime=0;
wait_ans=0;
s_p=0; //1,发送参数
resend=0;
// last_FINISH=0;
FINISH=0;
readPRG(); //从EEPROM中读取上次使用的程序号
delay(5);
ini_ram(); //从EEPROM中读取当前程序号下的参数存入RAM
call_slave(); //点名
temp_t=pp.d*3.14;
temp_t=temp_t/60;
temp_t=temp_t/pp.v21_p;
if(pp.t13_sd==1)
{
n_t13=pp.t13*temp_t;
if(n_t13==0)
n_t13=1;
}
else
n_t13=pp.t13;
if(pp.t21_sd==1)
{
n_t21=pp.t21*temp_t;
if(n_t21==0)
n_t21=1;
}
if(pp.t32_sd==1)
{
n_t32=pp.t32*temp_t;
if(n_t32==0)
n_t32=1;
}
AA: ini_sbuf(M_ALL,command,com_send_p,0,0,0,0);
s_byte_nums=4;
TR_noans();
send_param(); //更新RAM,及向从板发送参数
if(urgent_stop==1)
{
urgent_stop=0;
goto AA;
}
if(existent[4]==1)
{
delay(2);
send_param1();
if(urgent_stop==1)
{
urgent_stop=0;
goto AA;
}
}
ini_sbuf(M_ALL,command,com_send_p_ok,0,0,0,0);
s_byte_nums=4;
TR_noans();
switch_state();
BEGIN: if(urgent_stop==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -