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

📄 mainloop.c

📁 这是一个89c52的USB固件系统的源码 使用keilc 生成hex文件 可直接烧录
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <stdio.h>
#include <string.h>
#include <reg51.h>                /* special function register decounterarations   */
#include "mainloop.h"
#include "isr.h"
#include "protozlg.h"
#include "math.h"

#define GAOPIN_KAI  1
#define GAOPIN_GUAN 0
#define MOT_RUN  1
#define MOT_CLOSE 0

#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit WR8253=P1^0;
sbit A8253=P1^1;
sbit RAMCS=P1^4;
sbit CS8253=P1^5;
sbit A15=P2^7;
sbit A0=P3^0;
sbit A1=P3^1;
sbit GATE=P1^2;
sbit PCS=P3^4;
sbit JCS=P3^5;
sbit WRITE=P3^6;
sbit READ=P3^7;

#define MAX_ORDER 5

void outportb(unsigned int Addr,unsigned char Data);

/*
//*************************************************************************
//  Public static data
//*************************************************************************
*/
extern EPPFLAGS bEPPflags;
extern unsigned char idata GenEpBuf[];
extern unsigned char idata EpBuf[];
extern unsigned int data d12_addr;

extern unsigned int data D12_DATA;
extern unsigned int data D12_COMMAND;

sfr CKCON = 0x8F;//87C52x2用
sbit clksel = P2^0;

char idata gaopzt,dianjzt,old_p_status;
unsigned char idata cc;
unsigned char idata c,c1,c2,c3;
unsigned long idata counter;
unsigned char idata read_jing_flag,read_prog_flag,send_req_flag,read_max_loop_flag,read_nc_num_flag,io_wrong_flag;
unsigned char idata diand_flag,diand_axis,diandbz;
long diandjl;
unsigned char idata ch;
char idata mask_cc;
int i,j;
long idata l,ll;
double idata r,f1;
unsigned char idata lbuf[4];
unsigned char idata w_p,zf;
char idata xyt,uvt,work_status;
unsigned int cur_jing;
unsigned int old_cur_jing;
unsigned int loop_counter;
char loop_flag;
char anti_work_flag,timer_ok;
long loop_off;
unsigned char cur_order;

#define xytype(order) (2630+order)       //xy类型 
#define uvtype(order) (2640+order)       //uv类型    
#define xy(order) (2650+order)           //XY记数  
#define counterlen(order) (2660+order*4)   //记数长度  
#define ncorder(order) (2700+order*4)      //程序序号
#define lpdata(order,off) (2780+(order*6+off)*4)  //中心点坐标    起点坐标   末点坐标    
#define lpdata1(order,off) (3020+(order*6+off)*4)  //中心点坐标    起点坐标   末点坐标

#define cur_x (long)(*((long *)(&(XBYTE[2400]))))     //当前xyuv坐标
#define cur_y (long)(*((long *)(&(XBYTE[2405]))))
#define cur_u (long)(*((long *)(&(XBYTE[2410]))))
#define cur_v (long)(*((long *)(&(XBYTE[2415]))))
#define cur_work_seg (long)(*((long *)(&(XBYTE[2420]))))
#define cur_seg (long)(*((long *)(&(XBYTE[2520]))))  //当前段
#define cur_off (long)(*((long *)(&(XBYTE[2525]))))  //当前段内记数
#define e_order XBYTE[3531]  //末点指针
#define xy_uv   XBYTE[3532]  //xy记数或uv记数

//回零标志
#define home_flag XBYTE[2533]
//当前电机相序号
#define cur_x_step_order XBYTE[2534]
#define cur_y_step_order XBYTE[2535]
#define cur_u_step_order XBYTE[2536]
#define cur_v_step_order XBYTE[2537]
//异型参数工件高 上导轮到工件上表面高度
#define height           (long)(*((long *)(&(XBYTE[2538]))))
#define up_height        (long)(*((long *)(&(XBYTE[2542]))))
#define up_down_height   (long)(*((long *)(&(XBYTE[2546]))))
#define cur_order1 XBYTE[2550]
#define max_loop_counter (unsigned int)(*((unsigned int*)(&(XBYTE[2425]))))

//进给速率
#define jinggsl          XBYTE[2300]
//相序类型(5 3 2)
#define xiangxlx         XBYTE[1200]
//正方向电平
#define zhengfxdp        XBYTE[2553]
//脉冲宽度
#define maickd           XBYTE[2554]
//高频状态
//电机状态
#define stop_flag        XBYTE[2450]
#define stop_byte        XBYTE[2452]
//点动轴号
#define diandzh          XBYTE[2557]
//点动方向
#define diandfx          XBYTE[2558]
//短路标志
#define duanlbz          XBYTE[2563]
//短路回退步数
#define duanlhtbs        (long)(*((long *)(&(XBYTE[2568]))))
//同一位置短路回退最大次数
#define tongywzdlhtzdcs  (long)(*((long *)(&(XBYTE[2572]))))
//单段加工标志
#define dandjgbz         XBYTE[2576]

#define x                (long)(*((long *)(&(XBYTE[2580]))))
#define y                (long)(*((long *)(&(XBYTE[2584]))))
#define bx               (long)(*((long *)(&(XBYTE[2588]))))
#define by               (long)(*((long *)(&(XBYTE[2592]))))
#define ex               (long)(*((long *)(&(XBYTE[2596]))))
#define ey               (long)(*((long *)(&(XBYTE[2600]))))
#define cx               (long)(*((long *)(&(XBYTE[2604]))))
#define l1               (long)(*((long *)(&(XBYTE[2608]))))
#define l2               (long)(*((long *)(&(XBYTE[2612]))))
#define l3               (long)(*((long *)(&(XBYTE[2616]))))

void cmd_proc(void);
void send_req_order(char order);
void send_a_step(void);
void send_cur_pos(char axis,char order);
init_j8255();
init_p8255();
write_p8255_a();
write_p8255_b();
write_p8255_c();
write_j8255_a();
write_j8255_b();
write_j8255_c();
out_8255_1_a();
out_8255_1_c(char cc);
unsigned char get_x_y_port_byte(char cc);
unsigned char get_u_v_port_byte(char cc);
open_gao_pin();
close_gao_pin();
open_mot();
close_mot();
open_mac();
close_mac();
x_z();
x_f();
y_z();
y_f();
u_z();
u_f();
v_z();
v_f();
rem_cs();
rev_cs();
send_loop_msg();
void timer_isr();

//D12中断服务
usb_isr() interrupt 0
{ 
  unsigned char c0,c1;

  if (RAMCS == 0)
    c0 = 0;
  else
    c0 = 1;
  if (MCU_D12CS == 0)
    c1 = 0;
  else
    c1 = 1;
  RAMCS = 1;
  MCU_D12CS = 0;
  DISABLE;
  fn_usb_isr();//调用D12中断服务子程序
  ENABLE;
  if (c0 == 1)
    RAMCS = 1;
  if (c1 == 1)
    MCU_D12CS = 1;
  if (c0 == 0)
    RAMCS = 0;
  if (c1 == 0)
    MCU_D12CS = 0;
}

void timer_isr(void) interrupt 2
{ 
  timer_ok = 1;
}

void main(void)
{
  char bz;

  while (1){
    MCU_LED0 = 1;
    for (i=0;i<100;i++);
    MCU_LED0 = 0;
    for (i=0;i<100;i++);
  }
    CKCON = 1;
    MCU_LED0 = 1;
	GATE = 0;
      
	MCU_D12CS = 0x1;
	RAMCS = 1;

	cur_jing = 200;
	anti_work_flag = 0;
	loop_flag = 0;
	loop_counter = 0;
	timer_ok = 0;

//init 8253
    init_j8255();
    init_p8255();
    P2 = 0x3e;
	PCS = 1;
	JCS = 1;
	CS8253 = 0;
	A8253 = 1;
	WR8253 = 1;
    delay1();
	WR8253 = 0;
    delay1();
	WR8253 = 1;
    delay1();

    P2 = 2;
	A8253 = 0;
	WR8253 = 1;
    delay1();
	WR8253 = 0;
    delay1();
	WR8253 = 1;
    delay1();

    P2 = 0;
	A8253 = 0;
	WR8253 = 1;
    delay1();
	WR8253 = 0;
    delay1();
	WR8253 = 1;
    delay1();

	GATE = 1;

   	CS8253 = 1;

//	P0 = 0xFF;//初始化I/O口
//	P1 = 0xFF;
//	P2 = 0xFF;
//	P3 = 0xFF;

	CKCON = 0x00;

	D12_DATA = 0xff02;			//定义数据地址
	D12_COMMAND = 0xff03;		//定义命令地址

	MCU_D12CS = 0x0;
//	D12SUSPD = 0x0;

	IT0 = 0;//初始化中断
	EX0 = 1;
	PX0 = 0;
	IT1 = 1;//初始化中断
	EX1 = 1;
	PX1 = 1;
	EA = 1;


	MCU_D12CS = 0x1;
	MCU_D12CS = 0x0;
	bEPPflags.value = 0;

	MCU_D12CS = 1;
	RAMCS = 0;

	counter = 0;
    read_jing_flag = 0;
	diand_flag = 0;
	diand_axis = 0;
	diandbz = 0;
	diandjl = 0;
	read_prog_flag = 0;
	send_req_flag = 0;
	read_max_loop_flag = 0;
	read_nc_num_flag = 0;
	io_wrong_flag = 0;
	gaopzt = GAOPIN_GUAN;
	dianjzt = MOT_CLOSE;
    stop_flag = stop_byte = 0;
	max_loop_counter = 700;
	read_max_loop_flag = 0;
	old_p_status = 0;
	send_req_flag = 0;
	work_status = 0;
    open_mac();
    close_gao_pin();
    close_mot();

	RAMCS = 1;
	MCU_D12CS = 0;

	MCU_D12CS = 1;
	MCU_D12CS = 0;

	reconnect_USB();//联接USB总线

	while( TRUE ){
	  if(bEPPflags.bits.configuration){
        cmd_proc();//连接正常,调用命令处理
        ENABLE;
	    MCU_D12CS = 1;
	    RAMCS = 0;
        cur_order = cur_order1;
        if (work_status == 1){
          if (XBYTE[xytype(cur_order)] != 0){
            DISABLE;
            WRITE = 1;
            P2 = 2;
		    RAMCS = 1;
            PCS = 0;
            A0 = 1;
            A1 = 0;
            READ = 1;
            READ = 0;
            READ = 1;
			cc = P2;
            PCS = 1;            
            A0 = 0;
            A1 = 0;
		    RAMCS = 0;
            ENABLE;

			bz = 0;
            if (gaopzt == GAOPIN_KAI){
			  if (anti_work_flag == 0){
			    if (((cc&2) == 2)&&(timer_ok == 1)){
                  MCU_LED0 = 0;
                  MCU_LED0 = 0;
                  MCU_LED0 = 0;
                  MCU_LED0 = 1;
                  bz = 1;
				}
		      }
			  else{
			    if (timer_ok == 1)
                  bz = 1;
			  }
			}
			else{
			  if (timer_ok == 1)
			    bz = 1;
			}


            if (loop_counter == max_loop_counter){
			  loop_off = cur_off;
			  loop_flag = 1;
			  anti_work_flag = 1;
			  send_loop_msg();
			  old_cur_jing = cur_jing;
			  cur_jing = 200;
			}

			if (bz == 1){
		      old_p_status = cc&2;
			  timer_ok = 0;
			  loop_counter = 0;
              send_a_step();
			}
			else{
			  if (gaopzt == GAOPIN_KAI)
			    loop_counter ++;
		      for (i=0;i<300;i++);
			}
		  }
		  else{
		    for (i=0;i<300;i++);
		  }
	    }
		else if (work_status == 2){
		  if (counter == 9+30*5){
		    if ((XBYTE[xytype(cur_order)] == 0)&&(cur_order == 0)){
	          send_req_order(0);
 		    }
	      }
		}
		else{
		  for (i=0;i<400;i++);
        }
	    RAMCS = 1;
  	    MCU_D12CS = 0;
		counter ++;
		for (i=0;i<5*6;i++){
		  if (counter == 5+(i+1)*5){
		    send_cur_pos(i/6,i%6);
		  }
		}
		if (counter == 10+30*5){
		  counter = 0;
		}
      }
	  usbserve();//USB服务数据处理
	} // Main Loop
}

void cmd_proc(void)
{
	if(bEPPflags.bits.ep1_rxdone) {
		DISABLE;//接收到主机发来的指令信息
		bEPPflags.bits.ep1_rxdone = 0;
		ENABLE;        
		MCU_D12CS = 1;
        RAMCS = 0;

        if (diand_flag == 2){
          if (diandbz == 0){
		    diandjl += GenEpBuf[3];
		    XBYTE[xytype(1)] = 0;
		    XBYTE[xytype(2)] = 0;
		    XBYTE[xytype(3)] = 0;
		    XBYTE[xytype(4)] = 0;
		    XBYTE[xytype(0)] = 1;
		    XBYTE[uvtype(0)] = 0;
	        cur_order1 = 0;
		    cur_order = e_order = 0;
            (long)(*((long *)(&(XBYTE[ncorder(0)])))) = 0;
            (long)(*((long *)(&(XBYTE[lpdata(0,2)])))) = cur_x;
            (long)(*((long *)(&(XBYTE[lpdata(0,3)])))) = cur_y;
            (long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x;
            (long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y;
		    if (diand_axis == 1){
              (long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x+diandjl;
              XBYTE[xy(0)] = 0;
		    }
            else if (diand_axis == -1){
              (long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x-diandjl;
              XBYTE[xy(0)] = 0;
		    }
            else if (diand_axis == 2){
              (long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y+diandjl;
              XBYTE[xy(0)] = 1;
		    }
            else if (diand_axis == -2){
              (long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y-diandjl;
              XBYTE[xy(0)] = 1;
		    }
            else if (diand_axis == 3){
              (long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x+diandjl;
              XBYTE[xy(0)] = 0;
		    }
            else if (diand_axis == -3){
              (long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x-diandjl;
              XBYTE[xy(0)] = 0;
		    }
            else if (diand_axis == 4){
              (long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y+diandjl;
              XBYTE[xy(0)] = 1;
		    }
            else if (diand_axis == -4){
              (long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y-diandjl;
              XBYTE[xy(0)] = 1;
		    }
		    work_status = 1;
		    cur_off = 0;
		    diandbz = 1;
          }
          diand_flag = 0;
		}
		else if (diand_flag == 1){
		  if (diandbz == 0){
		    if ((GenEpBuf[3] & 0x80) == 0x80){
		      diandjl = (GenEpBuf[3]-0x80)*256;
			  diand_axis = -diand_axis;
		    }
		    else
		      diandjl = GenEpBuf[3]*256;
		  }
		  diand_flag = 2;
		}
		else if (read_nc_num_flag == 1){
		  read_nc_num_flag = 0;
		  if (GenEpBuf[3] != e_order){
            cc = 0x8d;
            RAMCS = 1;
            MCU_D12CS = 0;
            D12_WriteEndpoint(3, 1, &cc);
			io_wrong_flag = 1;
		  }  
		  else{
		    if (anti_work_flag == 1){
	          cur_order1 = e_order;
			  cur_order = e_order;
			  cur_off = (long)(*((long *)(&(XBYTE[counterlen(cur_order)]))));
		      work_status = 1;
			}
			else{
	          cur_order1 = 0;
			  cur_order = 0;
			  cur_off = 0;
			}
		  }
		}
		else if (read_max_loop_flag == 2){
		  max_loop_counter += GenEpBuf[3];
		  read_max_loop_flag = 0;
		}
		else if (read_max_loop_flag == 1){		  
		  max_loop_counter = GenEpBuf[3]*256;
          read_max_loop_flag = 2;
		}
		else if (read_jing_flag == 2){
		  cur_jing += GenEpBuf[3];
		  read_jing_flag = 0;
		  
          DISABLE;
		  RAMCS = 1;
	      GATE = 0;
          delay1();
	      CS8253 = 0;
          P2 = 0x3e;
	      A8253 = 1;
	      WR8253 = 1;
          delay1();
	      WR8253 = 0;
          delay1();
	      WR8253 = 1;
          delay1();

          P2 = cur_jing%256;
          A8253 = 0;
	      WR8253 = 1;
          delay1();
	      WR8253 = 0;
          delay1();
	      WR8253 = 1;
          delay1();

          P2 = cur_jing/256;
          A8253 = 0;
          WR8253 = 1;
          delay1();
	      WR8253 = 0;
          delay1();
	      WR8253 = 1;
          delay1();

	      GATE = 1;
          delay1();
          CS8253 = 1;
	      RAMCS = 0;
          ENABLE;
		}
		else if (read_jing_flag == 1){		  
		  cur_jing = GenEpBuf[3]*256;
		  read_jing_flag ++;
		}
		else if (read_prog_flag > 0){
		  if (read_prog_flag != 12+2*4*6)
		    mask_cc ^= GenEpBuf[3];
		  if (read_prog_flag == 1){
		    if (XBYTE[xytype(e_order)] == 0)
		      w_p = e_order;
            else
		      w_p = (e_order+1)%MAX_ORDER;
			if (XBYTE[xytype(w_p)] != 0){
			  w_p = -1;
			}
			if (w_p != -1)
		    XBYTE[xytype(w_p)] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if (read_prog_flag == 2){
			if (w_p != -1)
		    XBYTE[uvtype(w_p)] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if (read_prog_flag == 3){
			if (w_p != -1)
		    XBYTE[xy(w_p)] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if ((read_prog_flag > 3)&&(read_prog_flag <=7)){
			if (w_p != -1)
		    XBYTE[counterlen(w_p)+read_prog_flag-4] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if ((read_prog_flag > 7)&&(read_prog_flag <=11)){
			if (w_p != -1)
		    XBYTE[ncorder(w_p)+read_prog_flag-8] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if ((read_prog_flag > 11)&&(read_prog_flag <=11+4*6)){
		    cc = (read_prog_flag-12)/4;
			if (w_p != -1)
		    XBYTE[lpdata(w_p,cc)+read_prog_flag-12-cc*4] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if ((read_prog_flag > 11+4*6)&&(read_prog_flag <=11+2*4*6)){
		    cc = (read_prog_flag-12-4*6)/4;
			if (w_p != -1)
		    XBYTE[lpdata1(w_p,cc)+read_prog_flag-12-4*6-cc*4] = GenEpBuf[3];
		    read_prog_flag ++;
		  }
		  else if (read_prog_flag == 12+2*4*6){
		    if (mask_cc == GenEpBuf[3]){
			  if (w_p != -1)
                e_order = w_p;
			}
            read_prog_flag = 0;
		  }
          else
            read_prog_flag = 0;
		}
		else if (GenEpBuf[3] == 1){//自动开高频继续加工但判断是否是启动态
		  if (io_wrong_flag == 0){

⌨️ 快捷键说明

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