(分享设计)雕刻机主程序分享!!!- #include "IAP15W4K61S4.h"
- #include "Delay_m.h"
- #include "serial_xj.h"
- #include "TIMER.h"
- #include "m_XoY.h"
- #define m_Speed 15 //设置电机速度
- #define pulse_Number 40 //单位为1时电机所需要的脉冲数
- #define uint unsigned int
- #define uchar unsigned char
- /*引脚定义区*/
- /**Step: 脉冲
- ***Dir : 方向
- ***Sleep: 驱动芯片睡眠使能
- ***En: 使能
- **/
- sbit X_Step=P1^2;
- sbit X_Dir=P1^1;
- sbit X_Sleep=P1^2;
- sbit X_En=P1^4;
- sbit Y_Step=P5^5;
- sbit Y_Dir=P5^4;
- sbit Y_Sleep=P3^3;
- sbit Y_En=P3^5;
- /*标志位定义区*/
- /**
- ***Flag0: 完成一次单位运行标志位
- ***m_Flag: X/Y轴运行标志位
- ***Serval_Flag 串行接收完成标志位
- **/
- bit Flag0=0, m_Flag=0, Serval_Flag=0;
- bit G_mode=0; //G代码模式G0或G1
- bit Laser_En=1; //激光使能标志
- /*变量定义区*/
- /**
- **X_start: X轴开始坐标-整形变量
- **Y_start: Y轴开始坐标-整形变量
- **X_end: X轴终点坐标-整形变量
- **Y_end: Y轴终点坐标-整形变量
- **/
- int X_start=0, Y_start=0, X_end=0, Y_end=0;
- uchar Rotation_dir; //转动方向
- uint Circle_Step; //总的步数-整形变量
- uchar q=0; //象限值
- uchar Re_value[40]; //接收字节数组
- /*子函数定义区*/
- void Pin_Init(void); //引脚初使化
- void Timer_Creat(void); //创建Timer0
- //void motor_Stop(void);
- void motor_Zx(void); //X轴正转运行一个单位
- void motor_Fx(void); //X轴反转运行一个单位
- void motor_Zy(void); //Y轴正转运行一个单位
- void motor_Fy(void); //Y轴反转运行一个单位
- void motor_Run(uint circle_step, uchar Q); //电机运行
- void G_code(void);
- /********主函数********/
- void main()
- {
- //uchar i;
- Serial1_Init(); //串行通信初使化
- Pin_Init(); //引脚初使化
- Timer_Creat(); //定时器0初使化
- mDelay(100); //待系统稳定
- Send_data(0x55);
- ES=1; //开启串行中断使能
- EA=1; //开启总中断
- while(1)
- {
- if(Serval_Flag) //如果串行信号接收正确
- {
- Serval_Flag=0; //清除串行接收正确标志位
- G_code(); //分析G代码,计算X_end,Y_end及激光是否加载
- //X_end=0; //接收到给定的X坐标值
- //Y_end=0; //接收到给定的Y坐标值
- // Send_data(X_start);
- // Send_data(Y_start);
- // Send_data(X_end);
- // Send_data(X_end);
- //Send_data(0xAA);
- Circle_Step=(Abs(Y_end-Y_start)+Abs(X_end-X_start)); //总步数
- q=Pd_XoY(X_start, Y_start, X_end, Y_end); //所在象限
- // Send_data(q);
- // Send_ata(0xAA);
- motor_Run(Circle_Step, q); //电机运行
- Y_start=Y_end; //运行完毕后将最终值赋与初使值
- X_start=X_end;
- // for(i=0;i<(Re_value[1]-47);i++)
- // {
- // Send_data(Re_value[i]);
- // }
- Send_data(0x55);
- ES=1; //打开串行中断
- }
- }
- }
- void Pin_Init(void)
- {
- X_En=1;
- X_Sleep=1;
- Y_En=1;
- Y_Sleep=1;
- }
- /******************************
- **函数功能:定时器创建并初使化
- **函数名: Timer_Creat(void)
- */
- void Timer_Creat(void)
- {
- TIM_InitTypeDef myTim_inittypedef;
- myTim_inittypedef.TIM_Mode=TIM_16BitAutoReload; //模式为8位重装
- myTim_inittypedef.TIM_Polity=0; //不设工作优先级
- myTim_inittypedef.TIM_Interrupt=ENABLE; //允许中断
- myTim_inittypedef.TIM_ClkSource=TIM_CLOCK_12T; //时钟为传统12分频
- myTim_inittypedef.TIM_ClkOut=DISABLE; //不允许外输出时钟
- myTim_inittypedef.TIM_Value=65500; //设置时间初值
- myTim_inittypedef.TIM_Run=DISABLE; //TR0=1
- Timer_Inilize(Timer0,&myTim_inittypedef);
- }
- /******************************
- **函数功能:Timer0定时器中断
- **函数名: timer0_int(void)
- **运行变量:static uchar Count0运行频率控制变量
- ** static uint Count1 运行步数控制变量
- ** m_Flag X/Y电机运行标志位
- ** Flag0 运行完毕标志位
- **运行常量:m_Speed 5
- ** pulse_Number 2
- */
- void timer0_int (void) interrupt TIMER0_VECTOR
- {
- static uchar Count0=0; //运行频率控制变量控制运行速度
- static uint Count1=0; //运行步数控制变量控制运行长度
- if(Count0 == m_Speed) //频率控制计数器等于m_Speed
- {
- Count0=0; //频率控制变量=0
- if(m_Flag) //当X/Y运行控制位=1
- {
- X_Step=!X_Step; //X轴动作
- }
- else
- {
- Y_Step=!Y_Step; //Y轴动作
- }
- Count1++;
- }
- else
- {
- Count0++;
- }
- if(Count1==pulse_Number)
- {
- Count0=0;
- Count1=0;
- TR0=0;
- Flag0=1; //完成一次运转
- }
- }
- /*
- void motor_Stop(void)
- {
- X_En=1;
- X_Sleep=0;
- Y_En=1;
- Y_Sleep=0;
- }*/
- /*
- **X轴电机正向运行
- */
- /******************************
- **函数功能:Y轴电机正向运行
- **函数名: motor_Fx(void)
- **运行变量:bit Flag0 每一步运行完毕标志位
- ** bit m_Flag Y电机工作
- */
- void motor_Zx(void)
- {
- X_En=0;
- X_Dir=0;
- m_Flag=1;
- TR0=1;
- while(!Flag0);
- Flag0=0;
- X_En=1;
- }
- /******************************
- **函数功能:X轴电机反向运行
- **函数名: motor_Fx(void)
- **运行变量:bit Flag0 每一步运行完毕标志位
- ** bit m_Flag Y电机工作
- */
- void motor_Fx(void)
- {
- X_En=0;
- X_Dir=1;
- m_Flag=1;
- TR0=1;
- while(!Flag0);
- Flag0=0;
- X_En=1;
- }
- /******************************
- **函数功能:Y轴电机正向运行
- **函数名: motor_Zy(void)
- **运行变量:bit Flag0 每一步运行完毕标志位
- ** bit m_Flag X/Y电机工作标志
- */
- void motor_Zy(void)
- {
- Y_En=0; //Y轴电机使能
- Y_Dir=1; //Y轴电机正转
- m_Flag=0; //Y电机工作
- TR0=1; //开启定时器1中断
- while(!Flag0); //等待完成步进
- Flag0=0; //清除步进完成标志位
- Y_En=1;
- }
- /******************************
- **函数功能:Y轴电机反向运行
- **函数名: motor_Fy(void)
- **运行变量:bit Flag0 每一步运行完毕标志位
- ** bit m_Flag X/Y电机工作标志
- */
- void motor_Fy(void)
- {
- Y_En=0; //Y轴电机使能
- Y_Dir=0; //Y轴电机反转
- m_Flag=0; //Y电机工作
- TR0=1; //开启定时器1中断
- while(!Flag0); //等待完成步进
- Flag0=0; //清除步进完成标志位
- Y_En=1;
- }
- /******************************
- **函数功能:电机运行直线插补
- **函数名: motor_Run(uint circle_step, uchar Q)
- **形参说明:uint circle_step运行步数
- Q直线所在象限
- */
- void motor_Run(uint circle_step, uchar Q)
- {
- int Fm=0;
- while(circle_step)
- {
- if(Q==0) //延Y轴运行
- {
- if(Y_end > Y_start)
- {
- Rotation_dir=1; //Y++
- }
- else
- {
- Rotation_dir=2; //Y--
- }
- }
- else if(Q==5) //沿X轴运行
- {
- if(X_end > X_start)
- {
- Rotation_dir=3; //X++
- }
- else
- {
- Rotation_dir=4; //X--
- }
- }
- else if(Q==1) //在第一象限
- {
- if(Fm>=0)
- {
- Rotation_dir=3; //X++
- Fm=Fm-(Y_end-Y_start); //任意两点
- }
- else
- {
- Rotation_dir=1; //Y++
- Fm=Fm+(X_end-X_start); //任意两点
- }
- }
- else if(Q==2) //在第二象限
- {
- if(Fm>=0)
- {
- Rotation_dir=4; //X--
- Fm=Fm-(Y_end-Y_start);
- }
- else
- {
- Rotation_dir=1; //Y++
- Fm=Fm+(X_start-X_end);
- }
- }
- else if(Q==3) //在第三象限
- {
- if(Fm>=0)
- {
- Rotation_dir=4; //X--
- Fm=Fm-(Y_start-Y_end);
- }
- else
- {
- Rotation_dir=2; //Y--
- Fm=Fm+(X_start-X_end);
- }
- }
- else //在第四象限
- {
- if(Fm>=0)
- {
- Rotation_dir=3; //X++
- Fm=Fm-(Y_start-Y_end);
- }
- else
- {
- Rotation_dir=2; //Y--
- Fm=Fm+(X_end-X_start);
- }
- }
- switch(Rotation_dir)
- {
- case 1:
- {
- motor_Zy();
- }
- break;
- case 2:
- {
- motor_Fy();
- }
- break;
- case 3:
- {
- motor_Zx();
- }
- break;
- case 4:
- {
- motor_Fx();
- }
- break;
- }
- circle_step--;
- }
- }
- /******************************
- **函数功能:串行中断子函数
- **函数名: Serial_inter()
- **运行变量:static uchar Count2 接收计数器
- ** uchar Re_value[40] 串行数据寄存数组
- ** bit Serval_Flag 接收完毕标志位
- */
- void Serial_inter() interrupt 4
- {
- static uchar Count2=0; //设立串行接收计数器
- if(TI)
- {
- TI=0;
- }
- if(RI)
- {
- RI=0;
- Re_value[Count2]=SBUF; //接收数组进行数据接收
- if(Re_value[0]==0x47) //如果接收数组[0]="G"
- {
- if(Re_value[Count2]==0x0d) //如果接收数组有一位为结束符
- {
- Count2=0; //清除串行接收计数器
- ES=0;
- Serval_Flag=1; //接收正确标志位置位
- }
- else //否则
- {
- Count2++; //串行接收计数器加1
- }
- }
- }
- }
- /******************************
- **函数功能:G代码解释程序
- **函数名: G_code(void)
- **运行变量:uchar Re_value[40] 串行数据寄存数组
- ** bit Serval_Flag 接收完毕标志位
- */
- void G_code(void)
- {
- uchar i;
- uchar GXoYoZ=0; //读取X或Y或Z字符
- uchar X_posi, Y_posi, Z_posi;
- if(Re_value[2]) //如果第二位等于1
- {
- G_mode=1; //G1模式
- }
- else
- {
- G_mode=0; //G0模式
- }
- for(i=3;i<(Re_value[1]-47);i++)
- {
- if(Re_value[i]==0x58) //当字符等于X
- {
- GXoYoZ=0x01;
- X_posi=i;
- }
- else if(Re_value[i]==0x59) //当字符等于Y
- {
- GXoYoZ=0x02;
- Y_posi=i;
- }
- else if(Re_value[i]==0x5a) //当字符等于Z
- {
- GXoYoZ=0x03;
- Z_posi=i;
- }
- else if(Re_value[i]==0x2e) //当字符等于.
- {
- switch(GXoYoZ)
- {
- case 0x01:
- {
- if((i-X_posi)==3)
- {
- X_end=(Re_value[i-2]-0x30)*100+(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
- }
- else
- {
- X_end=(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
- }
- GXoYoZ=0;
- X_posi=0;
- }
- break;
- case 0x02:
- {
- if((i-Y_posi)==3)
- {
- Y_end=(Re_value[i-2]-0x30)*100+(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
- }
- else
- {
- Y_end=(Re_value[i-1]-0x30)*10+(Re_value[i+1]-0x30);
- }
- GXoYoZ=0;
- Y_posi=0;
- }
- break;
- case 0x03:
- {
- if(Re_value[Z_posi+1]=='-')
- {
- Laser_En=0;
- }
- else
- {
- Laser_En=1;
- }
- GXoYoZ=0;
- Z_posi=0;
- }
- break;
- }
- }
- else
- {
- ;
- }
- }
- }
复制代码
|