📄 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 + -