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

📄 spotwelder.c

📁 点焊机控制器C51源码+SCH & DDB
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 
李先的红姆点焊机  

ailing于温州华侨机械--2005.10
*/

#include<intrins.h>
#include"keyscan.h"
#include"at24cxx.h"
#ifdef __C51__
  #include<regx51.h>
#endif
#ifdef __C52__
  #include<regs52.h>
#endif

#define nop() _nop_()
#define uchar unsigned char
#define uint  unsigned int

#define Prrz  11
#define Weld  22
#define PrrzL 33
#define Space 44
#define check 55
#define Emergency 66

#define AUTO  1
#define MAN   0


//led driver bit
sbit bPrrz_led   = P3^5;
sbit bWeld_led   = P3^6;
sbit bFshCnt_led  = P3^7;
sbit bPrrzL_led  = P3^0;
sbit bSpace_led  = P1^7;
sbit bSet_led    = P3^1;
sbit bMode_led   = P3^4;
//relay drive bit
sbit bPrrz_RlyDr = P2^6;
sbit bWeld_RlyDr = P2^5;
sbit bPrrzL_RlyDr= P2^4;
sbit bFshCnt_RlyDr= P2^2;
sbit bSpace_RlyDr= P2^3;

sbit bStartup =P3^2;

/*按键设置是为:百位+=100,十位+=10,个位+=1 */
unsigned int PrrzTime;
unsigned int WeldTime;
unsigned int WorkCount;
unsigned int PrrzLTime;
unsigned int SpaceTime;

unsigned char Work;
unsigned char Tent;
unsigned char data trnscv[11]={0,0,0,0,0,0,0,0,0,0};
unsigned char DisData[15];
unsigned char WorkMode;
 
bit bcheck;


void SendByte(unsigned char Data);
unsigned char RcvByte();
bit ISendByte(uchar SLA,uchar Data);
bit ISendStr(uchar sla,uchar Suba,uchar *s,uchar Num);
bit IRcvByte(uchar sla,uchar *rcv);
bit IRcvStr(uchar SLA,uchar Suba,uchar *rcv,uchar Num);

/******************************  keyscan() **********************************
 
 放在 5ms 中断里运行
 RUN=p3.2; shift=p3.4; FUNCtion=p3.5; add=p3.7 共 4 个独立式按键;
 p3.3 为合盖的行程开关不能作为一个独立按键,否则合盖后p3.3==0将屏蔽掉所有的按键。
*****************************************************************************/

void keyscan(void)
{
  uchar KCodeCrrt;
  static uchar DBCount;
  static uchar DownCT;

  KCodeCrrt=0x7c&P1;  // &01111100b
  if(KCodeCrrt==0x7c)
   {
	  if(DBCount==0)
	   {
		if(KeyState==DOWN)
		 {
	        KeyState=BeFree;
			bExecute=DONT;
			DownCT=0;		  //按键持续按下的计时清零
		 }	
	   }
	  else 
	    DBCount--;
   }
  else
   {
    if(DBCount==1) 
	 {
	   if(bExecute==DONT)
	    {
		  bExecute=DONE;
		  KeyCode=~(KCodeCrrt|0x83);
		}
	   else if(DownCT>SetupOverCode)
	    {
		  DownCT=SetupOverCode;
		  if(KeyKind==Continued)
		    KeyCode=KCodeCrrt;
		}
	   KeyState=DOWN;
	   DownCT++;
	 }
    else if(DBCount<1)	   //消抖
	  DBCount++;    
   }
}
/******************************************************************************
				            键盘处理程序
******************************************************************************/
#define RUN    11
#define FUNC   22
#define runing 1
#define stop   0
unsigned int prrz_buf;
unsigned char Program;
unsigned char position;

bit flag_func; //作为进入功能设置的标志
bit flag_run;  //作为向24C01 发送数据的标志
bit current_state;

void DispData_Dispose(void);
void Write_24Cxx(void);
/******************************/
uint DEC_DSP(uchar digital, uint minuend)
{
  if(digital==100)
   {
     if(minuend<100)
	   minuend+=900;
	 else
	   minuend-=100;
   }
  else if(digital==10)
   {
     if((minuend%100)<10)
	   minuend+=90;
	 else
	   minuend-=10;
   } 
  else if(digital==1)
   {
     if((minuend%10)<1)
	   minuend+=9;
	 else
	   minuend-=1;
   }
 return(minuend);
}


/******************************/
void Key_Server(void)
{
  uchar i;
 
  switch(KeyCode)
  {
    case 0x04:             //work mode
		   DeleteKeyCode();
		   if(bcheck){bcheck=0;break;}
		   if(Program==FUNC)
		    {
		      if(WorkMode==MAN)
		       { 
			     bMode_led=0;
			     WorkMode=AUTO;
			   }
		      else 
		       {
			     bMode_led=1;
		         WorkMode=MAN;
			   }
		      do{i=ISendStr(AT24WC01,10,&WorkMode,1);
		   	    }while(!i);
			}
	       break;
    case 0x08:             //dec
	       DeleteKeyCode();
		   if(bcheck){bcheck=0;break;}
		   if(Program==FUNC)
		   {
		     if(position==0)
			   PrrzTime=DEC_DSP(100,PrrzTime);
			 else if(position==1)
               PrrzTime=DEC_DSP(10,PrrzTime);
			 else if(position==2)
               PrrzTime=DEC_DSP(1,PrrzTime);
			 else if(position==3)
 			   WeldTime=DEC_DSP(100,WeldTime);
			 else if(position==4)
               WeldTime=DEC_DSP(10,WeldTime);
			 else if(position==5)
			   WeldTime=DEC_DSP(1,WeldTime);
			 else if(position==6)
			   WorkCount=DEC_DSP(100,WorkCount);
			 else if(position==7)
			   WorkCount=DEC_DSP(10,WorkCount);
			 else if(position==8)
			   WorkCount=DEC_DSP(1,WorkCount);
			 else if(position==9)
			   PrrzLTime=DEC_DSP(100,PrrzLTime);
			 else if(position==10)
			   PrrzLTime=DEC_DSP(10,PrrzLTime);
			 else if(position==11)
			   PrrzLTime=DEC_DSP(1,PrrzLTime);
			 else if(position==12)
			   SpaceTime=DEC_DSP(100,SpaceTime);
			 else if(position==13)
			   SpaceTime=DEC_DSP(10,SpaceTime);
			 else if(position==14)
			   SpaceTime=DEC_DSP(1,SpaceTime);
			 
		   }
          break;
    case 0x10:             //shift
           DeleteKeyCode();
		   if(bcheck){bcheck=0;break;}
           if(Program==FUNC)
		    {
			  position++;
			  if(position==15)
				position=0;
            }
		   break;
	
    case 0x20:		        //Function
	       DeleteKeyCode();
		   bcheck=0;
           if(Program==RUN)
		    {
			   Program=FUNC;
			   bSet_led=0;
			   flag_func=1;
			   flag_run=0;
			   position=0;
			   Work=Emergency;
			}
		   else
		    {
			   Program=RUN;
			   flag_func=0;
			   flag_run=1;
			   bSet_led=1;
			}
           break;	
    case 0x40:			  //check
	       DeleteKeyCode();
		   if((current_state==stop)&&(flag_func==0))
		    {  if(!bcheck)
			    {
		          bPrrz_led=0;
		          bPrrz_RlyDr=0;
                  prrz_buf=PrrzTime;
		          PrrzTime=0;
				  bcheck=1;
	              Work=check;
				}
			   else bcheck=0;
			}
	       break;
    default:
           break;
  }
}
/*********************************************************************************
  这里的数据填充顺序是为和 74154 的输出顺序相配合,因布线不合理所致	。
**********************************************************************************/
void DisData_DSP()
{
    DisData[0]=(char)((SpaceTime/100)%10);
    DisData[1]=(char)((SpaceTime/10)%10);
    DisData[2]=(char)(SpaceTime%10);
    DisData[3]=(char)((PrrzLTime/100)%10);
    DisData[4]=(char)((PrrzLTime/10)%10);
    DisData[5]=(char)(PrrzLTime%10);
    DisData[6]=(char)((PrrzTime/100)%10);
    DisData[7]=(char)((PrrzTime/10)%10);
    DisData[8]=(char)(PrrzTime%10);
    DisData[9]=(char)((WeldTime/100)%10);
    DisData[10]=(char)((WeldTime/10)%10);
    DisData[11]=(char)(WeldTime%10);
	DisData[12]=(char)((WorkCount/100)%10);
	DisData[13]=(char)((WorkCount/10)%10);
	DisData[14]=(char)(WorkCount%10);

}
/***************************   LED_Display()   ************************************

 i 左移 4 位做为 74154 的输入,74154的 输出 Q0-Q14 为SpaceTimed \PrrzLTime\PrrzTime\
 WeldTime\WorkCount 的 百位 ,十 位,个位。而面板上的次序为 PrrzTime \WeldTime \WorkCount\
 PrrzLTime\SpaceTime,这样以来按键移位的顺序和显示位驱动的顺序无法统一,需要分别处理
***********************************************************************************/
 
void LED_Display()
{ 
   static unsigned int j;
   static unsigned char i;
   P2_7=1;
   DisData[i] &=0x0f;
   DisData[i] |=(i<<4);
   if(flag_func)
    { 
	  if(j++>999)j=0;
	  if(j>499)P0=DisData[i];
	  else
	   {  
	      if((position==0)&&(i==6))P0=0xff;
		  else if((position==1)&&(i==7))P0=0xff;
		  else if((position==2)&&(i==8))P0=0xff;
		  else if((position==3)&&(i==9))P0=0xff;
		  else if((position==4)&&(i==10))P0=0xff;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -