📄 driver0425.c.bak
字号:
//#pragma la
#include <driver.h>
xdata unsigned char rbuffer[55],sbuffer[6],p_sec;
unsigned char S_ANSW,POINTER0,POINTER1,work,RSUM,SSUM,c_t1,
nonce_sector,cross_machine,c_decrease,osc_add,osc_dec,SENS,temp_c,
share,byte_nums,nonce_sec,c_t0,v51,c_t42,c_t42_l,c_t42_r,c_sample,
err,osc_start_vh,osc_start_vl,osc_adjudge;
unsigned int *point;
unsigned int adl,adh,ad,vc1,vc2,vc3,vc4,vc5,vc6,const0,c_lift,delt_a41,U51;
xdata unsigned long AD1,AD2,AD3,AD4,AD5,da,c_avc,out0,out1,out2,const1,last_out1;
unsigned char COMM,SLA,FF,GET;
bit t_edge,osc_ok,decrease,decreased,stop_osc,osc_change,osc,sector,excursion_dir,
center_excursion,ad_finish,first_center,pulse_base,sample_avc,new_circle,
called,avc,lift,avc_ok,judge_ok,avc_dir,ergent_stop,pgj,in_sector,start,
lift_complete,K4,over_i1,over_i2,resend,send,overtime,osc_l,osc_r,avc_up,
avc_down,motor_stop,receive_p_out,receive_p_in,demand,start_osc,start_avc,
stop_avc,ans,to_begin,decrease_ok,need_para,ask_lift_ok,lift_ok,edge_start;
#define start_v41 200
#define start_v51 46
void start_i2()
{
data unsigned int time;
P1_6=1; //SCL
P1_7=1; //SDA
S1CON=0x47; //ENS1=1 STA=0 STO=0 SI=0 AA=1
PS1=1;FF=0;
EA=1;
ES1=1;
STA=1;
time=0;
do
{
time++;
if(time>10000)
{
FF=1;
}
}while(FF==0);
FF=0;
ES1=0;
}
void start_t2()
{
TM2CON=0x81; //16位溢出,分频系数1,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()
{
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
P1_5=1; //开发送使能
TR1=1;
while(POINTER0<byte_nums);
TR1=0;
P1_5=0; //关发送使能
}
void err_operate()
{
ini_sbuf(M_ALL,err_infor,0,0,0,0);
switch(err)
{
case 1: //发送超时
case 2: //接收超时
case 3: sbuffer[1]=commuFail;break; //三次校验和错误 //通讯出错
case 4: sbuffer[1]=IgnitFail;break; //引弧失败
case 5: sbuffer[1]=systemErr;break; //电源出错
case 6: sbuffer[1]=overTemp;break; //过温
case 7: sbuffer[1]=lackWater;break; //缺水
case 8: sbuffer[1]=lackGas1;break; //缺气1
case 9: sbuffer[1]=lackGas2;break; //缺气2
}
byte_nums=get_byte_nums(err_infor);
TR_noans();
ergent_stop=1;
}
void TR_ans()
{
ans=1;
REN=0;
POINTER1=0;
RSUM=0;
TB8=1;
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
P1_5=1; //开发送使能
TR1=1;
while(POINTER0<byte_nums);
TR1=0;
P1_5=0; //关发送使能
REN=1;
send=0;
c_t1=0;
TR1=1;
while(POINTER1<byte_nums);
TR1=0;
if(overtime==1)
{
err=3;
err_operate();
overtime=0;
}
ans=0;
}
void delay(int num)
{
data unsigned int i,j;
for(i=0;i<num;i++)
{
for(j=0;j<255;j++);
}
}
void read_8574 () //过流1或过流2
{
unsigned char temp_GET;
SLA=0x43;
start_i2();
temp_GET=GET;
temp_GET=temp_GET&0X01;
if(temp_GET==0)
over_i1=1;
temp_GET=GET;
temp_GET=temp_GET&0X02;
if(temp_GET==0)
over_i2=1;
}
void write_8574(unsigned char col) //出错显示
{
SLA=0x42;
COMM=col;
start_i2();
}
void cross_type() //十字划架型号
{
SLA=0x41;
start_i2();
delay(3);
cross_machine=GET&0X0F;
}
void get_vc()
{
if(pp.k1==PDC)
{
switch(pp.avc_type)
{
case SP: {
vc5=(pp.u51_p-2);
vc6=(pp.u51_p+2);
}break;
case SB: {
vc5=(pp.u51_b-2);
vc6=(pp.u51_b+2);
}break;
case SPB: {
vc1=(pp.u51_p-2);
vc2=(pp.u51_p+2);
vc3=(pp.u51_b-2);
vc4=(pp.u51_b+2);
}break;
default:break;
}
}
else
{
vc5=(pp.u51_p-2);
vc6=(pp.u51_p+2);
}
}
void get_SENS()
{
switch(pp.sens)
{
case 1: {
v51=start_v51; //500
SENS=2; //0.0075mm
}break;
case 2: {
v51=start_v51; //500
SENS=5; //0.01875mm 0.1v
}break;
case 3: {
v51=start_v51; //500
SENS=10; //0.0375mm 0.2v
}break;
case 4: {
v51=39; //592
SENS=16; //0.06mm 0.3v
}break;
case 5: {
v51=30; //778
SENS=21; //0.08mm 0.4v
}break;
case 6: {
v51=23; //1000
SENS=27; //0.1mm 0.5v
}break;
case 7: {
v51=19; //1185
SENS=32; //0.12mm 0.6v
}break;
case 8: {
v51=16; //1407
SENS=38; //0.14mm 0.7v
}break;
case 9: {
v51=13; //1740
SENS=47; //0.16mm 0.8v
}break;
case 10:{
v51=11; //2000
SENS=54; //0.2mm 1v
}break;
default:{
v51=127;
SENS=5;
}break;
}
}
void com_type()
{
switch(rbuffer[2])
{
case com_calling: called=1;break;
case com_motor_stop: { //停止点动
if(motor_stop==0)
motor_stop=1;
}break;
case com_start: start=1;break; //启动
case com_decrease: {
if(avc_ok==1)
{
PWM0=0;
IEN1=IEN1&0XFB; //禁止CT2
IEN1=IEN1&0XF7; //禁止CT3
avc=0;
avc_ok=0;
c_avc=0;
}
if(osc_ok==1)
{
if(osc_add>osc_dec||osc_add==osc_dec)
{
delt_a41=pp.da41*(osc_add-osc_dec);
const0=const0+delt_a41*60+pp.v41*(pp.t42_l+pp.t42_r)/2;
}
else
{
delt_a41=pp.da41*(osc_dec-osc_add);
const0=const0-delt_a41*60+pp.v41*(pp.t42_l+pp.t42_r)/2;
}
last_out1=out1;
c_decrease=(unsigned char)(const1/const0)+1;
if(c_decrease>=8&&c_decrease<=12)
osc_adjudge=1;
else if(c_decrease<=13)
osc_adjudge=2;
else if(c_decrease<=25)
osc_adjudge=3;
else
osc_adjudge=4;
c_decrease=c_decrease+osc_adjudge;
}
decrease=1;
}break;
// case com_decrease_ok: decrease_ok=1;break;
case com_osc: start_osc=1;break; //启动CT0
case com_osc_l: {
if(work==0) //点动
{
if(osc_l==0)
osc_l=1;
}
else
{
if(center_excursion==0&&judge_ok==0)
{
excursion_dir=0;
center_excursion=1;
}
}
}break;
case com_osc_r: {
if(work==0) //点动
{
if(osc_r==0)
osc_r=1;
}
else
{
if(center_excursion==0&&judge_ok==0)
{
excursion_dir=1;
center_excursion=1;
}
}
}break;
case com_breadth_add: {
if(osc_ok==1&&osc==0)
{
osc=1; //启动横摆
osc_change=1;
}
}break;
case com_breadth_dec: {
if(osc_ok==1&&osc==0)
{
osc=1; //启动横摆
osc_change=0;
}
}break;
case com_avc: start_avc=1;break;
case com_avc_up: if(avc_up==0)
avc_up=1;break;
case com_avc_down: if(avc_down==0)
avc_down=1;break;
case com_stop_avc: stop_avc=1;break;
case com_pgj: pgj=1;break;
case com_lift: lift=1;break;
case com_goto_begin: to_begin=1;break;
case com_need_para: if(need_para==0)
need_para=1;break;
case com_ask_lift_ok: ask_lift_ok=1;break;
case com_lift_ok: lift_ok=1;break;
case com_demand: demand=1;break;
default: break;
}
}
void data_type() //对接收到的数据分辨类型
{
switch(rbuffer[1])
{
case command: com_type();break;
// case answer: R_ANSW=rbuffer[1];break;
case infor: {
if(rbuffer[1]==com_sector)
{
sector=1;
if(in_sector==0)
in_sector=1;
nonce_sec=rbuffer[3];
}
}break;
case parameter: {
if(rbuffer[2]==7)
pp.k1=rbuffer[4];
}break;
case p_out_sec: receive_p_out=1;break;
case p_in_sec: {
nonce_sec=rbuffer[2];
receive_p_in=1;
}break;
default: break;
}
}
void T0_INT (void) interrupt 1 //横摆起始时间(低速时间)
{
TF0=0;
c_t0++;
if(c_t0==10) //1536us
{
TR0=0;
COM=0X36;
COUNT0=out0%256;
COUNT0=out0/256;
c_t0=0;
}
}
void T1_INT (void) interrupt 3
{
c_t1++;
if(send==1)
{
if(c_t1==7)
{
S0BUF=sbuffer[POINTER0];
c_t1=0;
}
}
else
{
if(c_t1==100)
{
TR1=0;
overtime=1;
}
}
}
void TR_INT (void) interrupt 4 //串行口中断
{ //关中断
if(TI==1) //发送完成
{
TI=0;
POINTER0++;
if(POINTER0<byte_nums-1)
SSUM=SSUM+sbuffer[POINTER0]; //6个数据字节求和
else
sbuffer[byte_nums-1]=SSUM+sbuffer[0]; //数据和加地址生成校验码
if(POINTER0==byte_nums)
REN=1;
}
if(RI==1) //接收完成
{
RI=0;
POINTER1++; //接收缓冲指针加1
rbuffer[POINTER1-1]=S0BUF; //从接收缓冲读出数据
if(rbuffer[0]==M_OA||rbuffer[0]==M_ALL)
{
SM2=0;
if(POINTER1==2)
byte_nums=get_byte_nums(rbuffer[1]);
if(POINTER1<byte_nums)
RSUM=RSUM+rbuffer[POINTER1-1]; //生成校验码
else
{
SM2=1;
if(RSUM==rbuffer[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;
} //开中断
}
void S1_int (void) interrupt 5 //I2C
{
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) // /////////////////////////////////8
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if (S1STA==0x28)
{
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
FF=1;
}
if (S1STA==0x30) // /////////////////////////////////8
{
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)
{
S1CON=0xC5; //STA=0 STO=0 SI=0 AA=1
}
if (S1STA==0x48) // /////////////////////////////////8
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
if (S1STA==0x50)
{
GET=S1DAT;
S1CON=0xC1; //STA=0 STO=0 SI=0 AA=0
}
if (S1STA==0x58)
{
FF=1;
S1CON=0xD5; //STA=0 STO=1 SI=0 AA=1
}
}
void CT0_int (void) interrupt 6 //横摆中心
{
CTI0=0;
CTCON=CTCON&0xFC;
if(pp.k4==OFF)
{
IEN1=IEN1&0XFE;
P4_1=0; //关8254门控信号
P4_2=1;
center_excursion=0;
}
else
{
if(decrease==1)
{
P4_1=0;
if(pp.v41<=200)
delay(2);
else if(pp.v41<=400)
delay(4);
else if(pp.v41<=600)
delay(8);
else if(pp.v41<=800)
delay(22);
else if(pp.v41<=1000)
delay(25);
else
delay(60);
temp_c++;
if(share+1+osc_adjudge<c_decrease)
{
CTCON=CTCON|0x08; //CT1下降沿
if(temp_c%2==0||first_center==1)
{
share++;
c_t42_l=pp.t42_l*5*(c_decrease-share)/c_decrease;
c_t42_r=pp.t42_r*5*(c_decrease-share)/c_decrease;
out1=last_out1*(c_decrease-share)/c_decrease;
out2=out1;
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256;
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
IEN1=IEN1|0X02;
P4_1=1;
temp_c=0;
if(first_center==1)
first_center=0;
}
else
{
IEN1=IEN1|0X02;
P4_1=1;
}
}
else
{
if(temp_c!=2)
{
CTCON=CTCON|0x08; //CT1下降沿
COM=0X76;
COUNT1=out1%256;
COUNT1=out1/256;
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
IEN1=IEN1|0X02;
P4_1=1;
}
else
{
P4_1=0; //关8254门控信号
CTCON=CTCON&0XF0;
IEN1=IEN1&0XFC; //禁止CT0,CT1
decrease_ok=1;
}
}
if(decreased==0)
decreased=1;
}
else
{
if(osc==1)
{
P4_1=0;
delay(15);
if(osc_change==1)
{
out1=out1+pp.da41*10;
osc_add++;
}
else
{
out1=out1-pp.da41*10;
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;
P4_1=1;
osc=0;
}
CTCON=CTCON|0x08; //CT1上升沿
IEN1=IEN1|0X02; //允许CT1
}
}
}
void CT1_int (void) interrupt 7 //整个摆宽
{
CTI1=0;
P4_1=0; //out1、out2门控信号
CTCON=CTCON&0xF3;
if(osc_ok==0)
{
COM=0XB6;
COUNT2=out2%256;
COUNT2=out2/256;
osc_ok=1;
}
P4_3=~P4_3; //换横摆方向
t_edge=~t_edge; //换边缘标志
P4_6=~P4_6; //横摆输出
if(decreased==1)
{
if(c_t42_l<1)
c_t42_l=1;
if(c_t42_r<1)
c_t42_r=1;
IEN1=IEN1|0X10;
}
else
{
if(center_excursion==1&&judge_ok==0)
{
if(t_edge==0&&excursion_dir==1||t_edge==1&&excursion_dir==0)//左边缘、向右偏或右边缘、向左偏
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -