(分享設計)雕刻機主程序分享!!!- #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
- {
- ;
- }
- }
- }
復制代碼
|