⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhkz21_8.c

📁 这是一款用于工业生产焊接的程序
💻 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 + -