?? avc2.c.bak
字號:
#include <AVC.h>
#define start_v51 46
sbit message_enable=P1^5;
sbit stop=P3^5;
sbit gate=P4^1;
sbit avc_dir=P4^5;
sbit avc_enable=P4^4;
sbit temp_voltage=P4^2;
sbit externel_voltage=P4^3;
xdata unsigned char rbuffer[55],sbuffer[6];
unsigned char S_ANSW,POINTER0,POINTER1,work,RSUM,
SSUM,c_t1,nonce_sector,cross_machine,SENS,s_byte_nums,r_byte_nums,
nonce_sec,v51,c_sample,err,p_sec,out1;
unsigned int adl,adh,ad,delt_a41,U51,out0,*point,temp_avc,temp_u51_p,temp_u51_b,c_lift;
unsigned long AD1,AD2,AD3,AD4,AD5,da;
unsigned char COMM,SLA,FF,GET;
bit decrease,ad_finish,pulse_base,new_circle,called,avc,
lift,avc_ok,urgent_stop,pgj,in_sector,new_sector,start,lift_complete,over_i1,
over_i2,resend,send,overtime,avc_up,avc_down,motor_stop,receive_p_out,
receive_p_in,demand,start_avc,stop_avc,ans,to_begin,need_para,
ask_lift_ok,lift_ok,avc_err,err_ok;
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位溢出,分頻系數(shù)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;
message_enable=0; //開發(fā)送使能
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
message_enable=1; //關(guān)發(fā)送使能
}
void TR_ans()
{
ans=1;
REN=0;
POINTER1=0;
RSUM=0;
TB8=1;
POINTER0=0;
SSUM=0;
send=1;
c_t1=0;
message_enable=0; //開發(fā)送使能
TR1=1;
while(POINTER0<s_byte_nums);
TR1=0;
message_enable=1; //關(guān)發(fā)送使能
REN=1;
send=0;
c_t1=0;
TR1=1;
while(POINTER1<r_byte_nums);
TR1=0;
if(overtime==1)
{
err=3;
avc_err=1;
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 get_SENS()
{
switch(pp.sens)
{
case 1: {
out0=8000; //500HZ
out1=4; //2p,0.0075mm
}break;
case 2: {
out0=8000; //500HZ
out1=10; //5p,0.01875mm 0.1v
}break;
case 3: {
out0=8000; //500HZ
out1=20; //10p,0.0375mm 0.2v
}break;
case 4: {
out0=6757; //592hz
out1=32; //0.06mm 0.3v
}break;
case 5: {
out0=5141; //778hz
out1=42; //0.08mm 0.4v
}break;
case 6: {
out0=4000; //1000hz
out1=54; //0.1mm 0.5v
}break;
case 7: {
out0=3376; //1185hz
out1=64; //0.12mm 0.6v
}break;
case 8: {
out0=2843; //1407hz
out1=76; //0.14mm 0.7v
}break;
case 9: {
out0=2299; //1740hz
out1=94; //0.16mm 0.8v
}break;
case 10:{
out0=2000; //2000hz
out1=104; //0.2mm 1v
}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: decrease=1;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_err_ok: err_ok=1;break;
default: break;
}
}
void data_type() //對接收到的數(shù)據(jù)分辨類型
{
switch(rbuffer[1])
{
case command: com_type();break;
// case answer: R_ANSW=rbuffer[1];break;
case infor: if(rbuffer[2]==com_sector)
{
in_sector=1;
new_sector=1;
nonce_sec=rbuffer[3];
}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 EX0_INT (void) interrupt 0 //急停
{
EX0=0;
message_enable=1; //關(guān)發(fā)送使能
gate=0;
externel_voltage=0;
AD1=0;
AD2=0;
AD3=0;
AD4=0;
AD5=0;
U51=0;
while(err_ok==0)
{
if(called==1)
{
if(avc_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_AVC,err,0,0);
s_byte_nums=5;
TR_noans();
avc_err=0;
err=0;
stop=1;
}
called=0;
}
}
urgent_stop=1;
}
void EX1_INT (void) interrupt 2
{
unsigned char get_err;
EX1=0;
get_err=P5;
get_err=get_err&0x04;
if(get_err==0)
err=15;
else
{
get_err=P5;
get_err=get_err&0x08;
if(get_err==0)
err=16;
else
{
get_err=P5;
get_err=get_err&0x10;
if(get_err==0)
err=17;
else
{
get_err=P5;
get_err=get_err&0x80;
if(get_err==0)
err=18;
}
}
}
if(err!=0)
{
avc_err=1;
stop=0;
}
else
EX1=1;
}
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 //串行口中斷
{ //關(guān)中斷
if(TI==1) //發(fā)送完成
{
TI=0;
POINTER0++;
if(POINTER0<s_byte_nums-1)
SSUM=SSUM+sbuffer[POINTER0]; //6個數(shù)據(jù)字節(jié)求和
else
sbuffer[s_byte_nums-1]=SSUM+sbuffer[0]; //數(shù)據(jù)和加地址生成校驗碼
if(POINTER0==s_byte_nums)
REN=1;
}
if(RI==1) //接收完成
{
RI=0;
POINTER1++; //接收緩沖指針加1
rbuffer[POINTER1-1]=S0BUF; //從接收緩沖讀出數(shù)據(jù)
if(rbuffer[0]==M_AVC||rbuffer[0]==M_ALL||rbuffer[0]==M_AVC_P)
{
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;
} //開中斷
}
void CT0_int (void) interrupt 6
{
CTI0=0;
CTCON=CTCON&0xFC;
gate=0;
if(decrease==0&&pp.k5==ON)
{
if(pp.k1==DC||(pp.k1==PDC&&pp.avc_type==SP&&pulse_base==1))//(pp.avc_type==SP&&pulse_base==1||pp.avc_type==SPB||pp.avc_type==SB&&pulse_base==0)))
CTCON=CTCON|0x20;
}
if(decrease==1&&lift==1) //衰減過程
{
avc_enable=1; //關(guān)弧長使能
IEN1=IEN1&0XFE; //禁止CT0
lift_complete=1;
}
}
void CT2_int (void) interrupt 8 //電壓采樣保持脈沖
{
CTI2=0;
CTCON=CTCON&0xCF;
if(decrease==0)
{
// IEN1=IEN1&0XFB; //禁止CT2
ad_finish=0; //AD轉(zhuǎn)換及處理過程
ADCON=0X08; //啟動AD采樣
}
}
void CT3_int (void) interrupt 9 //電流脈沖
{
CTI3=0;
pulse_base=~pulse_base;
CTCON=CTCON&0X3F;
if(avc_ok==0) //開始弧長
{
if(pp.avc_type==SB)
temp_avc=temp_u51_b;
else
temp_avc=temp_u51_p;
avc_ok=1;
CTCON=CTCON|0x20; //CT2下降沿
IEN1=IEN1|0X04; //允許CT2,采樣保持脈沖
}
else
{
if(pp.avc_type==SP)
{
if(pulse_base==0) //進(jìn)入基值
{
gate=0;
CTCON=CTCON&0xCF;
}
else
{
temp_avc=temp_u51_p;
c_sample=0;
CTCON=CTCON|0x20;
}
}
else if(pp.avc_type==SB)
{
if(pulse_base==1)
{
gate=0;
CTCON=CTCON&0xCF;
}
else
{
temp_avc=temp_u51_b;
c_sample=0;
CTCON=CTCON|0x20;
}
}
else
{
gate=0;
CTCON=CTCON&0xCC;
AD1=0;
AD2=0;
AD3=0;
AD4=0;
AD5=0;
new_circle=1;
if(pulse_base==1)
temp_avc=temp_u51_p;
else
temp_avc=temp_u51_b;
CTCON=CTCON|0x20;
}
}
if(pulse_base==1)
CTCON=CTCON|0X80; //CT3下降沿
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -