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

📄 main.c

📁 数控系统的模拟系统,用SSTC51仿真单片机,仿真数控机床切割,能执行数控机床代码.
💻 C
字号:
/*****************************************************************************

** 功能模块描述:主函数

** 建立日期: 2007年5月2日

** 调用模块:LCD 显示、G代码输入、直线插补、圆弧插补、手动、回原点G代码执行。

** 版本号: 030120531

** 设计者 :周德宇

******************************************************************************/

//#include <sst89x5x4.H>
#include <AT89X51.h>                         /*头文件定义*/
#include <stdio.h>
#include <intrins.h>     
#include <math.h>   
#include <ALL.h>
#include <Line_interpolation.c>
#include <manual.c>
#include <lcd.c>
#include <G_translation.c>
#include <G_input.c>
#include <return_origin.c>
#include <Cir_interpolation.c>	 
#include <24c02.c> 
//#include <IAP.c>
//#include <Interrupt service.c>
/////////////////////子函数//////////////////////////

void service_t0(void) interrupt TF0_VECTOR using 2
	{
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
ir_signtime++;
if (ir_signtime>250) {ir_signtime=0; TR0=0;ir_start_flag=0;ir_rpt1=ir_rpt2=0;
ir_data[2]=ir_data[3]=0xff;	 //清除数据.
	} 	 
//如果接收到单次的触发脉冲,如干扰或红外信号的结束,关闭定时器,并把红外引导标记清除,把连发标记也清除
	}
#ifdef  T2
void service_t2(void) interrupt TF2_VECTOR  using 1				 /*每秒中断显示XY值并判断XY值是否溢出,溢出则停止输出*/
	  {     
static unsigned char  Timer2_Server_Count;
 
	TF2=0;                                         // T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的?

 Timer2_Server_Count++;
if(Timer2_Server_Count==4)                    // T2定时器的预装载值为0x0BDC,溢出1次就是35m秒钟。
  {
  Timer2_Server_Count=0;
    

			     SBUF=(unsigned char)(Pref_x/100);
	              while(!TI){;}
	                TI=0;	  
                
			  SBUF=(unsigned char)(Pref_y/100);
	              while(!TI){;}
	                TI=0;	   
          	
    }
}
	
  
#endif
#if 0
void service_ex1(void)  interrupt IE1_VECTOR using 1             /*外部紧急中断*/
              {    
                        interrupt_flag=1;
                      //  Lcd_print("interrupt");
                        while(1)
                        	{
                        	P1_6=0;
                        	DelayXS(1) ;
			        P1_6=1;
                        	}
              }

#endif	
void service_ex0(void)  interrupt IE0_VECTOR using 3
{   
	EA=0 ; //中断关闭
   TH0=(65536-ir_time)/256;
	TL0=(65536-ir_time)%256;

 if(!ir_start_flag&&ir_signtime>20)         //如果没收到引导脉冲,进行引导脉冲CHECK.
     {
	  ir_sign_count=0;         //脉冲记数
	  ir_start_flag=1;         //ir_start_flag 引导信号标记。
     }

  if(ir_start_flag)
    {
        if(ir_signtime>0&&ir_signtime<10) //符合真正数据的脉冲
	     {
		  
		  ir_temp>>=1; 
		  
		  if(ir_signtime>3)	  ir_temp|=0x80; //如果时间>3是1
         
		  ir_sign_count++;        //红外脉冲+1
		  
	     switch (ir_sign_count) 
		  {
        case 8:
		  ir_data[0]=ir_temp;             //设备码
		  break;
		  case 16:
        ir_data[1]=ir_temp;
		  break;
		  case  24:
		  ir_data[2]=ir_temp;             //数据码
		  break;
		  case  32:
 		  ir_data[3]=ir_temp;

		   if (ir_data[0]==~ir_data[1]&&ir_data[2]==~ir_data[3])
		   {
		  ir_flag=1;                       //有键按下.
           /*  SBUF=ir_data[2];
			  
	              while(!TI){;}
	                TI=0;	*/
		 if(ir_data[2]==JINTING)
			 	Jamp_to_user_pragram();
		
        }
		
		
		  break;
		     }  
        
  		  }
  		  
if(ir_signtime>0X40) {     lf_flag=1; 
		                 if (ir_rpt1>10) { ir_rpt2++;if(ir_rpt2==2) {ir_rpt2=0;ir_flag=1;}  }       
							  else ir_rpt1++ ;  
							   }                           //连发码的处理:接收到连发码,淹死20个码,然后每5个码发送一次键按下信号
  else       lf_flag=0;    
  }
          ir_signtime=0;     //计数器归0
              EA=1;
        TR0=1;   //开始计时
   
}

void TandC_Tnit(void)
 {
 EA=1;                           //总控
ES=1;                            //串行中断允许
ET1=0;                          //定时器0
ET0=1;                          //定时器1,波特发生
EX0=1;                          //外部0中断
IT0=1;                           //下降沿触发
 
SCON=0x50;                     //SCON: serail mode 1, 8-bit UART, enable ucvr 
TMOD=0x21;                 //TMOD: timer 1, mode 2, 8-bit reload ,time0 mode1;
PCON=0x80;                 //SMOD=1; 
#ifdef Y12
TH1= 0xFD;                     //Baud:19200  fosc=11.0592MHz 	
#endif
#ifdef Y22
TH1= 0xFa;                     //Baud:19200  fosc=22.1184MHz 	
#endif
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
TR1=1;          // timer 1 run 
#ifdef T2
 T2MOD &= 0xFC;                                /* 定时器2输出不允许 */
 T2MOD |= 0x01;                              /* ;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/
 EXF2=0;                                          /*  定时器2外部标志位清除*/
 TCLK=0;RCLK=0;                           /*  不用于波特率发生器*/
 EXEN2=0;                                    /*  视T2EX(P1.1)端信号无效*/ 
 TH2=MSB_reload_value;                  /*  填入初始化值*/
 TL2=LSB_reload_value;   
RCAP2H=MSB_reload_value;             /* 重载值 */
 RCAP2L=LSB_reload_value; 
 C_T2=0;                                           /*  定时模式*/
 CP_RL2=0;                                      /*  重载模式*/
 EA=1;                                              /* 中断允许*/
 ET2=1;                                            /*  允许T2中断*/
TR2=0;                                             
#endif
 }


void  start_handler(void)
{
 WriteCommandLCM(0x01,1);
  Lcd_print1(0,0,"1.MDI 2.MANUL ");
   Lcd_print1(1,0,"3.RUN 4.ORIRGIN");
   WriteCommandLCM(0x0F,1);	
 WriteCommandLCM(0x06,1);
 LocateXY(0,0);
  ir_data[2]=LEFT;
   while(1) 
             {
         	    	a: 
			           LocateXY(0,0);
                                       while(!(ir_data[2]== ENTER))
                                                 { 
                                                 if(ir_data[2]== RIGHT) goto b;
							if(ir_data[2]== GB_DOWN) goto c;					 
                                                  if(ir_data[2]==EXIT) goto e;
							  }
							ir_data[2]=0;	
							///Jamp_to_user_pragram();
				                     G_input();
							 break;
									  
							
                    b:  
			         LocateXY(6,0);
                                       while(!(ir_data[2]== ENTER))
                                                 { 
                                                  if(ir_data[2]== LEFT) goto a;
							 if(ir_data[2]== GB_DOWN) goto d;
							 if(ir_data[2]==EXIT) goto e;					 
							}
								ir_data[2]=0;		   
					     ManualOperation();			   
						          break;	
			c: 	
				 LocateXY(0,1);
                                       while(!(ir_data[2]== ENTER))
                                                 { 
                                                 if(ir_data[2]==RIGHT)  goto d;
                                                 if(ir_data[2]== GB_UP)  goto a;
							 if(ir_data[2]==EXIT) goto e;					 
							}
							ir_data[2]=0;		   
			                    G_translation();		   
						          break;	
			 d:  	
				 LocateXY(6,1);
                                       while(!(ir_data[2]== ENTER))
                                                 { 
                                                 if(ir_data[2]== LEFT) goto c;
							if(ir_data[2]== GB_UP) goto b;					 
							 if(ir_data[2]==EXIT) goto e;					 
							}
								ir_data[2]=0;
					  Return_origin();		   
						          break;						  
		 }
   	
e:   ir_flag=0;
 	}
#if 1
void DelayXS(unsigned char x)                                           /*延时x秒*/
{
unsigned char TempCycA =(unsigned char)x*DELAY;
unsigned int TempCycB;
while(TempCycA--)
   { 
     TempCycB=7269;
    while(TempCycB--) ;
   }
}
#endif

void buf_0xff(void)                    /*G代码缓冲区付值为0XFF*/
{
unsigned char i;
for(i=0;i<LENTH;i++)  
	buf[i]=0xff;
}
void getin_system(void)          /*进入系统5秒到计时*/
{
unsigned char i=0x30;
Lcd_print("the system of CN");
TR2=1;
for(i=0x35;i>=0x30;i--)
           {
           DisplayOneChar(5,1,i);
           DelayXS(1);
             }	 
TR2=0;
}
void displayX(void)

{
 unsigned char display_Pref_x[3]={0,0,0};
 if(! ((Pref_x%100)==0)) { kc=200-F*50;goto a;}
	    display_Pref_x[0]=(unsigned char)(Pref_x/10000)+0x30;
		  display_Pref_x[1]=(unsigned char)(Pref_x/1000%10)+0x30;
		 display_Pref_x[2]=(unsigned char)(Pref_x/100%100%10)+0x30;
                DisplayOneChar (8,1,display_Pref_x[0]);
		DisplayOneChar (9,1,display_Pref_x[1]);
		 DisplayOneChar (10,1,display_Pref_x[2]);
		 kc=100-F*30;
	a:display_Pref_x[0]=0;
}
void displayY(void)

{
 unsigned char display_Pref_y[3]={0,0,0};
 if(! ((Pref_y%100)==0)) { kc=200-F*50;goto a;}
	    display_Pref_y[0]=(unsigned char)(Pref_y/10000)+0x30;
		  display_Pref_y[1]=(unsigned char)(Pref_y/1000%10)+0x30;
		 display_Pref_y[2]=(unsigned char)(Pref_y/100%100%10)+0x30;
                DisplayOneChar (13,1,display_Pref_y[0]);
		DisplayOneChar (14,1,display_Pref_y[1]);
		 DisplayOneChar (15,1,display_Pref_y[2]);
		  kc=80-F*20;
	a:display_Pref_y[0]=0;
}	

void displayXY(void)
{
          unsigned char display_Pref_xy[3]={0,0,0};
           display_Pref_xy[0]=(unsigned char)(Pref_x/10000)+0x30;
           display_Pref_xy[1]=(unsigned char)(Pref_x/1000%10)+0x30;
          display_Pref_xy[2]=(unsigned char)(Pref_x/100%100%10)+0x30;
          DisplayOneChar (7,1,0x58);
           DisplayOneChar (8,1,display_Pref_xy[0]);
		DisplayOneChar (9,1,display_Pref_xy[1]);
		 DisplayOneChar (10,1,display_Pref_xy[2]);
		 DisplayOneChar (12,1,0x59);
		   display_Pref_xy[0]=(unsigned char)(Pref_y/10000)+0x30;
		  display_Pref_xy[1]=(unsigned char)(Pref_y/1000%10)+0x30;
		 display_Pref_xy[2]=(unsigned char)(Pref_y/100%100%10)+0x30;
                DisplayOneChar (13,1,display_Pref_xy[0]);
		DisplayOneChar (14,1,display_Pref_xy[1]);
		 DisplayOneChar (15,1,display_Pref_xy[2]);

}

void Jamp_to_user_pragram(void)
{
ACC=0X00;
B=0X00;
PSW=0X00;
SP=0X00;
DPH=0X00;
DPL=0X00;
IE=0X00;
IP=0X00;
PCON=0X00;
P0=0X00;
P1=0X00;
P2=0X00;
P3=0X00;
SFST=SFST&0XE0;
SFDT=0X00;
SFCM=0X00;
SFAL=0X00;
RCAP2L=0X00;
RCAP2H=0X00;
TL2=0X00;
TH2=0X00;
T2CON=0X00;
SCON=0X00;
TCON=0X00;
TMOD=0X00;
TL0=0X00;
TH0=0X00;
TL1=0X00;
TH1=0X00;
SFCF=SFCF|0X80;
SFCF=SFCF&0XBC;
((void (code*)(void))0x0000)();

}

void main(void)
{

LCMInit();
TandC_Tnit();
getin_system();   /*进入系统5秒到计时*/
buf_0xff();                             /*G代码缓冲区付值为0XFF*/
s=&buf;
TAI_BI=1;                       /*提笔*/
ReadXYFromNVRAM();


while(1)						/*主循环*/		   
{
start_handler();	
}

}

⌨️ 快捷键说明

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