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

📄 main1.c

📁 数控系统的模拟系统,用SSTC51仿真单片机,仿真数控机床切割,能执行数控机床代码.
💻 C
字号:
//#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 int  Timer2_Server_Count;              /* 定义静态变量,用来计数T2定时器的溢出次数(进入本函数的次数)*/
           if(Pref_x>0X5AC1||Pref_x<=0||Pref_y>0X5BEC||Pref_y<=0)
		 	                 	 interrupt_flag=1;
		
	  }
#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;				  
		
        }
		
		
		  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=1;                                                /*  开始计时*/
`#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;	   
					 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"); 								   
for(i=0x35;i>=0x30;i--)
           {
           DisplayOneChar(5,1,i);
           DelayXS(1);
             }	   
}
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=80-F*20;
	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 main(void)
{

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

//Pref_y=23500;
//SaveXYToNVRAM();
//Delay5Ms();

#if 0
Pref_x=0x30;
  Pref_y=0x31;
while(1)
 { DisplayOneChar(5,0,Pref_x);
  DisplayOneChar(7,0,Pref_y);

SaveXYToNVRAM();
//if (Pref_x<0x40)
   Pref_x=0;
  Pref_y=0;
   Delay5Ms();
   
ReadXYFromNVRAM();
  
DisplayOneChar(3,1,Pref_x);
DisplayOneChar(5,1,Pref_y);
if (Pref_x>0x40)
  { Pref_x=0x30;
  Pref_y=0x30;}
  else { Pref_x++;
  Pref_y++;}
Delay400Ms();
   Delay400Ms();
  	SBUF=Pref_x;
   while(!TI){;}
	   TI=0;   

    EA=1;
        TR0=1;}

#endif
#if 0
Lcd_print1(0,0,buf);


SaveGcodeToI2C();
Delay5Ms();
buf[2]=0x45;
buf[12]=0x45;

ReadGcodeToI2C();


Lcd_print1(1,0,buf);
//Lcd_print(buf);
#endif
     #if 0
SaveXYToNVRAM
(void)();
Pref_x=123;
Pref_y=123;

Delay5Ms();
  ReadXYFromNVRAM();
  //Pref_x=650;
                                         
								SBUF=LOWBYTE(Pref_x) ; 
                                                   while(!TI){;}
                                                	   TI=0;   
								SBUF=HIGHBYTE(Pref_x);
                                                   while(!TI){;}
                                                	   TI=0;
						   SBUF=LOWBYTE(Pref_y) ; 
                                                   while(!TI){;}
                                                	   TI=0;   
								SBUF=HIGHBYTE(Pref_y);
                                                   while(!TI){;}
                                                	   TI=0; 
				               #endif
#if 0								   
TAI_BI=1;
z_chabu(0,0,50,20);
	while(1);							  
#endif								   
#if 0
NR=1;
circle_interpolation(30,0,0,30);
while(1);
#endif	
//ir_data[2]=ENTER;
//G_translation();
//
//circle_interpolation(-Ii,-Kk,x-Ii,y-Kk);

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

}

⌨️ 快捷键说明

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