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

📄 jihaitang.c

📁 加工中心面板检测程序。用步进电机移动机构按下相应按钮
💻 C
📖 第 1 页 / 共 2 页
字号:
#include<reg51.h>
#include<stdio.h>
#include<absacc.h>
#include<intrins.h>	
#include <string.h>
#define uchar unsigned char 
#define uint unsigned int
#define TRUE 1
#define FALSE 0
#define Pi 3.1415
#define LCD_Data_Port 	P0
sbit Relay=P1^4;		 	  			//电磁继电器
sbit XPulse_Sent=P1^0;		   	   		//X轴步进电动机脉冲
sbit dirx=P1^1;			   				//X轴步进电动机正反转
sbit YPulse_Sent=P1^2;		   	  		//Y轴步进电动机脉冲		
sbit diry=P1^3;		  	  				//Y轴步进电动机正反转
sbit Strat=P1^5;		  	  			//键盘开始
sbit Stop=P1^6;							//复位
sbit Xsensor=P3^4;						//传感器1
sbit Ysensor=P3^5;						//传感器2

sbit RW=P3^6;							//写
sbit RS=P3^7;							//读
sbit ENABLE=P2^6;						//使能
sbit Busy=P0^7;							//忙
uchar countx,county;		 			//对X,Y轴步进电动机发送的脉冲数
uchar ch=0;					 			//定时器计时次数
uchar Fx=0,Fy=0;			 			//X,Y轴步进电动机信号
uchar key_flag;							//键盘信号
uchar key_value;						//键盘值
//uchar ta=0;							//X轴步进电动机传感器信号
//uchar tb=0;							//Y轴步进电动机传感器信号
uchar tg=0;								//定时器廷时中断标志
bit m0=1,m1=1;				 			//脉冲计数标志
uint data3;
uint data1;
uint data2;
uint data4=0;
uint data5=0;
uint MM;
uint MN;
uint code keylist[23]= {0x0701,0x0702,0x0704,0x0708,0x0710,			//按键编码
				//单节执行,机械锁定,MST锁定,单节忽略,Z轴锁定
                    0x0720,0x0740,0x0780,0x0201,0x0204,
				//加工吹气,选择停止,程式空跑,自动断电,中心出水
				    0x0202,0x0301,0x0302,0x0304,
				//底板冲刷,刀库正转,刀库反转,排屑器正转,
				    0x0308,0x0210,0x0220,0x0240,0x0280,
				//排屑器停止,主轴反转,主轴停止,主轴正转,主轴定位,
                    0x0310,0x0320,0x0340,0x3080};
				//排屑器反转,冷却液自动,冷却液手动,工作灯
																		   //按键编码
uint code keylist1[9]={0x0001,0x0002,0x0004,0x0008,
				//+4   , +X ,+Y  ,+Z  ,
                  0x0010,0x0020,0x0040,0x0080,0x0100};
				//-Z  , -Y , -X,-4 ,过行程解除

uchar code aa[32][4]={{30,0,1,1},{30,0,1,1},{30,0,1,1},{45,0,1,1},{30,0,1,1},{30,0,1,1},	   //按键之间距离
					   //+4,+Z,-Y,单节执行,机械锁定,MST锁定,
				{45,10,1,1},{30,0,1,1},{30,53,1,1},{0,23,1,0},{0,30,1,0},{270,10,0,0},
				 //主轴反转,主轴停止,中心出水,底板冲刷,主轴正转,+X
				{30,0,1,1},{30,0,1,1},{45,0,1,1},{30,0,1,1},{30,0,1,1},{45,10,1,1},
				//过行程解除,-X,单节忽略,Z轴锁定,加工吹气,主轴定位,
				{30,0,1,1},{30,0,1,1},{270,10,0,0},{30,0,1,1},{30,0,1,1},{45,0,1,1},
				//刀库正转,刀库反转,+Y,-Z,-4,选择停止,
				{30,0,1,1},{30,0,1,1},{45,10,1,1},{30,0,1,1},{30,0,1,1},{60,10,0,0},
				//程式空跑,自动断电,排屑器正转,排屑器停止,排屑器反转,冷却液自动,
				{30,0,1,1},{30,0,1,1}};
				//冷却液手动,工作灯

uchar code xx[32]={ 0x8001,0x8008,0x8020,0xc010,0xc020,0xc040,				//按键显示灯

				 //+4,+Z,-Y,单节执行,机械锁定,MST锁定,
				   0xa100,0xa200,0xe040,0xe020,0xa400,0x8002,

				//主轴反转,主轴停止,中心出水,底板冲刷,主轴正转,+X
				 0xe080,0x8040,0xc080,0xe001,0xe002,0xa800,
				//过行程解除,-X,单节忽略,Z轴锁定,加工吹气,主轴定位,
				 0xc100,0xc200,0x8004,0x8010,0x8080,0xe004,
				 //刀库正转,刀库反转,+Y,-Z,-4,选择停止,
				 0xe008,0xe010,0xc400,0xc800,0xe100,0xe200,
				 //程式空跑,自动断电,排屑器正转,排屑器停止,排屑器反转,冷却液自动,
					0xe400,0xe800} ;
				 //冷却液手动,工作灯
uchar code ii[32][16]={{'E','r','r','o','r',':','n','u','m','b','e','r','0','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','2',' '},
						{'E','r','r','o','r',':','n','u','m','b','e','r','0','3',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','4',' '},
						{'E','r','r','o','r',':','n','u','m','b','e','r','0','5',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','6',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','0','7',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','8',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','0','9',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','0',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','1','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','2',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','1','3',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','4',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','1','5',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','6',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','1','7',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','8',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','1','9',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','0',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','2','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','2',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','2','3',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','4',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','2','5',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','6',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','2','7',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','8',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','2','9',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','3','0',' '},
					{'E','r','r','o','r',':','n','u','m','b','e','r','3','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','3','2',' '} };
uchar  mydoc[16]="READY 04jd xmut";
uchar  Regard[16]="04jd14&04 200706";
uchar code kdf[16]="200706 04jd";
uchar code kff[16]="NO.2004323004";
uchar code kfe[16]="NO.2004323014";
void _dl5us(void);									   							//廷时
int Checkout(void);									   							//数据校验
void Control_Wave(uchar cx,uchar cy,uchar dirx1,uchar diry1);					//步进电机的控制
void Delay(uint x);																//廷时
void Dic(uchar x);																//电磁继电器控制
void Output0(uchar x);															//LCD输出
void Output1(uchar i);															//键盘灯显示
void Read(void);																//数据读取
void RST(void);																	//复位
void Select(uchar x);															//用于片选
void Culculate(uchar x,uchar y);															//数据处理
void time(uchar x);																//用于廷时
void time2(void);						    									//定时器溢出时产生中断后程序处理
void time3(void);																//用于廷时器time()中断
void Check_Busy(); 																//检测是否忙
void LCD_Initial();																//初始化设置
void Write_Data (uchar Data); 													//写数据
void Write_Command (uchar Command);												//写指令
void Write_String (uchar *String);												//写字符串到LCD


 
/*=====================================================
主函数
====================================================*/

 	void main(void)
	{

		
		uchar i;
		uint cl;
		IE=0Xff;					            								//中断总控制位EA,外部中断0开中断		
		IP=0X01;					            								//外部中断0为高中断优先级
     	time(200);
		Relay=0;			 					    							//上电清零
		P2=0xf9;																 //锁存器不选用
        Write_String(Regard);							    								
	    RST();
	    Write_String(mydoc);
		key_flag=0;					            								//设置中断标志为0
																	//数据处理
		
		     do
		{
			if(key_flag)			            								//判断按键是否有效
			{
			
				
				switch(key_value)               								//根据按键分支
				{
					case 0x40:	                								//处理P1_5口按键

					for(i=0 ;i< 32;i++)	 										//将数组值循环发给函数
						{	  
						  Culculate(aa[i][0],aa[i][1]);
						  Control_Wave(MM,MN,aa[i][2],aa[i][3]);
						  time(1000);		 									//廷时
						  //Relay=0;												//清零
						  Dic(1);												//电磁继电器有效
						  Read();		       									//数据读取
						  cl=Checkout();										//数据校验
					      if(cl==0)
						    {
							Write_String(ii[i]);		   								//无效LCD显示
						    }
						  else													  
						  	Output1(i);		  									//显示灯亮
							Dic(0);			    								//电磁继电器无效
						
						}
						
					RST();
				    Write_String(mydoc);				    									//检测完后自动复位
					break;
					case 0x20:			       									//处理P1_6按键
											   									//停止 
					break;				     
					default:			       									//无效按键,两个键同时按下
					break;
				}
				key_flag=0;			           									//清按键标志
			}
		}while(TRUE);


		
		
		
	}
	/*===================================================
	   外部中断0处理程序
	   功能说明:处理X,Y轴传感器信号引起的中断
				处理键盘信号引起的中断
	   函数返回值:无
	======================================================*/
			
			
			void Int0()interrupt 0
   {
   	  	uchar reread_key;
		IE=0X80;	  														//屏蔽外部中断0
	  if(Xsensor==0)			 											//	X轴传感器信号引起的外部中断0
	  	{
			Fx=0;		 													//X轴步进电机停止
			
		}
	  if(Ysensor==0)														//Y轴传感器信号引起的外部中断0
	  	{
			Fy=0;															//Y轴步进电机停止
			
		}

	
					
	key_flag=0;																//设置中断标志为0
	//P1=0xff;							    								//P1锁存器各口置1
	key_value=P1&0x60;					    								//读取外部中断源输入,并屏蔽除了P1_5 P1_6之外的口
	Delay(10);			 													//廷时
	reread_key=P1&0x60;	 													//再次读取外部中断源输入,并屏蔽除了P1_5 P1_6之外的口
		if(key_value==reread_key)
			{
				key_flag=1;				   									//设置中断标志为1

			}
	while(Strat==0||Stop==0);	 		    								//等待确认按键已松开
	IE=0Xff;					            								//打开外部中断0

		
   }   	



/*========================================================
 函数类型:void
 功能:由主函数传递值,向XY轴步进电机不断发送脉冲使其转动
	  dirx=1电机正转,反之反转
函数参数:cx,cy,dirx1,diry1

==========================================================*/
void Control_Wave(uchar cx,uchar cy,uchar dirx1,uchar diry1)	 
{	
	countx=cx;		
	county=cy;	
	dirx=dirx1;		   													//正转
	diry=diry1;		   													//反转
	TMOD=0x01;
	TH0=0Xf6;
	TL0=0X3c;
	EA=1;			  													//总控制位开启
	ET0=1;
	TR0=1;
	while(countx!=0 || county!=0) 										//判断脉冲是否发送完毕
	{
	}
	TR0=0;							 									//定时器关
}
/*============================================================
  函数类型:void
  功能说明:定时器溢出时产生中断后程序处理

  函数参数:无

==============================================================*/
	void time2()interrupt 1		   
	{
		TH0=0xf6;
		TL0=0x3c;
		if(countx>0)		   											//判断脉冲数是否发送完毕
		{  
			XPulse_Sent=~XPulse_Sent;		  							//取反
			m0=~m0;
	        if(m0)			   											//每发一个脉冲自减
				countx--;

		}
		if(county>0)
		{
			YPulse_Sent=~YPulse_Sent;
			m1=~m1;
			if(m0)
				county--;
		}
		TF0=0;
	}

/*====================================================================
  函数类型:void
  功能说明:其它函数调用传递值,用于廷时
  函数参数:x

========================================================================*/
	void time(uchar x)		
	{
		tg=1;															//区分是由廷时函数引起的中断
		TMOD=0x10;
		TH1=0Xf6;
		TL1=0X3c;
		EA=1;
		ET1=1;
		TR1=1;
		while(ch<x)			 											//判断条件是否满足,等待中断
			{
				
			}

		tg=0;															//清标志位
		TR1=0;
		ch=0;
	}

	/*========================================================
	  函数名称:_dl5us
	  功能说明:廷时5ms
	 函数参数:无

	==========================================================*/


	/* void _dl5us(void)		           									//廷时5个nop
	{

		_nop_();			           									//相当于汇编指令中的空操作指令NOP

	}  */

	/*=======================================================
	  函数名称:Delay
	  函数类型:void
	  功能说明:多次调用_dl5us达到廷时的作用
	  函数参数:无

	==========================================================*/


	void Delay(uint x)		          									//廷时函数
	{
		uint i,j;
		
	for(j=0;j<200;j++)
		for(i=0;i<x;i++)
			{
			_nop_();			           									//相当于汇编指令中的空操作指令NOP

			}
	}
	  

	  

⌨️ 快捷键说明

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