?? dhkz21_8.c
字號:
////////////////////////////////////////////////////////////////
//程序名稱:DHKZ21.c //
//程序功能:普通阻焊程序 //
//運行環境:時鐘頻率6MHz,機器周期為2uS。 //
//程序狀態:該程序編譯通過,硬件系統部分測試。 //
//完成日期:2006,09,01 //
////////////////////////////////////////////////////////////////
#include<reg51.h>
#define uchar unsigned char
/************************管腳定義***************************/
sbit KL5=P1^0; //過零檢測
sbit KL2=P1^5; //電磁加壓閥(2)輸出
sbit KL1=P1^6; //電磁預壓閥(1)輸出
sbit SCR=P1^7; //可控硅觸發信號
sbit A_1=P2^0; //焊接指示燈輸出
sbit A_2=P2^1; //單次連續選擇按鈕輸入
sbit HLED=P2^2; //手動調校開關
/**********************全局變量定義*************************/
uchar data S[16]; //定義數組
uchar data T[16]; //定義數組
uchar h,i,j,k; //定義循環用變量
uchar c,d,m,x,z; //c=過零檢測計數
//d=SCR觸發延時計數
//x=電磁加壓閥跨區段計算標志
//z=SCR觸發脈沖寬度
uchar cc,dd,ee,ff,gg; //cc=階段計數時間
//dd=SCR觸發延遲時間
//ee=加壓閥驅動延遲時間
//ff=加壓閥驅動延遲傳遞時間
//gg=單位爬升時間的功率
uchar mode; //工作方式(=0為中斷0,=1為中斷1,=8為其他功能)
/************************中斷聲明***************************/
void interrupt0() interrupt 0 using 0 //定義外部中斷0
{
mode=0;
m=0;
P0=0xFF; //對P0各位置1,準備接收管腳的信息
P2&=0x0F; //對P2高四位清零
/* for(i=0;i<16;i++)
{
for(h=0;h<4;h++) //當h=4時,延時為100uS
{z=1;}
T[i]=~P0; //采集P0內容到T[i]數組中相應位置
P2+=0x10; //對P2高四位計數
}*/
T[0]=0x20;
T[1]=0x30;
T[2]=0x05;
T[3]=0x10;
T[4]=0x00;
T[5]=0x10;
T[6]=0x10;
T[7]=0x00;
T[8]=0x10;
T[9]=0x10;
T[10]=0x90;
T[11]=0x00;
T[12]=0x90;
T[13]=0x00;
T[14]=0x00;
T[15]=0x00;
}
void time0() interrupt 1 using 1 //定義定時器T0,產生0.1mS定時
{
TL0=0xD6;TH0=0xD6; //再裝入定時器T0初值(2uSx50次=0.1mS)
d+=1; //CE(16進制)=206(10進制)補碼,實際為50次
}
void interrupt1() interrupt 2 using 2 //定義外部中斷1
{
// EX0=0;
// EX1=0;
mode=1;
P0=0xFF; //對P0各位置1,準備接收管腳的信息
P2&=0x0F; //對P2高四位清零
/* for(i=0;i<16;i++)
{
for(h=0;h<4;h++) //當h=4時,延時為100uS
{z=1;}
T[i]=~P0; //采集P0內容到T[i]數組中相應位置
P2+=0x10; //對P2高四位計數
}*/
T[0]=0x20;
T[1]=0x30;
T[2]=0x05;
T[3]=0x10;
T[4]=0x10;
T[5]=0x10;
T[6]=0x10;
T[7]=0x10;
T[8]=0x10;
T[9]=0x10;
T[10]=0x90;
T[11]=0x90;
T[12]=0x90;
T[13]=0x90;
T[14]=0x00;
T[15]=0x00;
}
void counter1() interrupt 3 using 3 //定義計數器C1
{
TL0=0xFA; //再裝入計數器C0初值
}
/************************主程序***************************/
void main(void)
{ //程序初始化
TCON=0x10; //設置:定時器T1,計數器C0,工作模式2
TMOD=0x02; //設置:定時器T1,計數器C0,工作模式2
TL0=0xD6;TH0=0xD6; //定時器T1初值
IT0=1;
IT1=1;
P0=0xFF;
P1=0x9F;
P2=0x0F; //對P2高四位清零
P3=0xFF;
KL1=0;
KL2=0;
SCR=1;
k=0;
A_1=1;
EX0=1; //允許外中斷INT0中斷
// EX1=1; //允許外中斷INT1中斷
EA=1;
mode=8;
m=9;
k=0; //非外中斷標識
//開總中斷
while(1) //無限循環掃描狀態
{
if((mode==0)&&(m==0)) //進入中斷0響應
{
mode=8;
if(mode==0)
A_1=0;
m=9;
k+=1;
//if(k==2)
//A_1=0;
KL1=0;
KL2=0;
for(i=0;i<16;i++)
{
S[i]=T[i];
}
cc=(S[0]&0x0F)+(S[0]>>4)*0x0A; //預壓
ee=(S[1]&0x0F)+(S[1]>>4)*0x0A; //加壓延遲時間
c=0;
x=1; //加壓延遲繼續標志
// KL1=1; //電磁閥1輸出
while(c!=cc) //周期為10mS
{
do{}while(KL5);
c+=1;
if((cc>=ee)&&(c==ee))
{KL2=1;x=0;}
do{}while(!KL5);
}
if((cc<ee)&&(x!=0))
ff=ee-cc;
cc=(S[2]&0x0F)+(S[2]>>4)*0x0A; //爬升
gg=((S[10]&0x0F)+(S[10]>>4)*0x0A)/(S[2]&0x0F);
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
dd=0x64-gg;
d=0;
ET0=1;
TR0=1;
while(d!=dd){};
ET0=0;
TR0=0;
SCR=0;
for(j=0;j<10;j++) //當j=2時,SCR觸發脈沖寬度為50uS
z=1;
SCR=1;
gg+=gg;
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[3]&0x0F)+(S[3]>>4)*0x0A; //焊接I時間1
c=0;
KL1=1;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
S[10]=T[10];
dd=0x64-(S[10]&0x0F)-(S[10]>>4)*0x0A;
d=0;
ET0=1;
TR0=1;
while(d!=dd){};
ET0=0;
TR0=0;
SCR=0;
for(j=0;j<10;j++)
z=1;
SCR=1;
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[5]&0x0F)+(S[5]>>4)*0x0A; //冷卻
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[6]&0x0F)+(S[6]>>4)*0x0A; //焊接I時間2
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
dd=0x64-(S[12]&0x0F)-(S[12]>>4)*0x0A;
d=0;
ET0=1;
TR0=1;
while(d!=dd){};
ET0=0;
TR0=0;
SCR=0;
for(j=0;j<10;j++)
z=1;
SCR=1;
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[8]&0x0F)+(S[8]>>4)*0x0A; //保持
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=1;}
do{}while(!KL5);
}
KL1=0;
KL2=0;
cc=(S[9]&0x0F)+(S[9]>>4)*0x0A; //休止
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
do{}while(!KL5);
c+=1;
}
if(A_2==0)
{mode=0;}
else
{mode=8;}
EX0=1;
EA=1;
}
/* if(mode==1) //進入中斷1響應
{
mode=8;
KL1=0;
KL2=0;
for(i=0;i<16;i++)
{
S[i]=T[i];
}
A_1=0;
cc=(S[0]&0x0F)+(S[0]>>4)*0x0A; //預壓
ee=(S[1]&0x0F)+(S[1]>>4)*0x0A; //加壓延時開始
c=0;
x=1;
KL1=1; //電磁閥1輸出
while(c!=cc) //周期為10mS
{
do{}while(KL5);
c+=1;
if((cc>=ee)&&(c==ee))
{KL2=1;x=0;}
do{}while(!KL5);
}
if((cc<ee)&&(x!=0))
ff=ee-cc;
cc=(S[2]&0x0F)+(S[2]>>4)*0x0A; //爬升
gg=((S[11]&0x0F)+(S[11]>>4)*0x0A)/(S[2]&0x0F);
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
dd=0x64-gg;
d=0;
ET0=1;
TR0=1;
while(d!=dd){};
ET0=0;
TR0=0;
SCR=0;
for(j=0;j<6;j++) //當j=2時,SCR觸發脈沖寬度為50uS
z=1;
SCR=1;
gg+=gg;
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[4]&0x0F)+(S[4]>>4)*0x0A; //焊接II時間1
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
S[10]=T[10];
dd=0x64-(S[11]&0x0F)-(S[11]>>4)*0x0A;
d=0;
ET0=1;
TR0=1;
while(d!=dd){};
ET0=0;
TR0=0;
SCR=0;
for(j=0;j<6;j++)
z=1;
SCR=1;
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[5]&0x0F)+(S[5]>>4)*0x0A; //冷卻
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[7]&0x0F)+(S[7]>>4)*0x0A; //焊接II時間2
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=0;}
dd=0x64-(S[13]&0x0F)-(S[13]>>4)*0x0A;
d=0;
ET0=1;
TR0=1;
while(d!=dd){};
ET0=0;
TR0=0;
SCR=0;
for(j=0;j<6;j++)
z=1;
SCR=1;
do{}while(!KL5);
}
if((cc<ff)&&(x!=0))
ff-=cc;
cc=(S[8]&0x0F)+(S[8]>>4)*0x0A; //保持
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
do{}while(!KL5);
c+=1;
if((cc>=ff)&&(c==ff)&&(x!=0))
{KL2=1;x=1;}
}
KL1=0;
KL2=0;
A_1=1;
cc=(S[9]&0x0F)+(S[9]>>4)*0x0A; //休止
c=0;
while((c!=cc)&&(HLED==1))
{
do{}while(KL5);
do{}while(!KL5);
c+=1;
}
if(A_2==0)
{mode=1;}
else
{mode=8;}
EX1=1;
EX0=1;
}*/
/* if((HLED==0)&&(mode=8))
KL1=1;
else
KL1=0;*/
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -