|
(分享設(shè)計(jì))雕刻機(jī)主程序分享。。- #include "IAP15W4K61S4.h"
- #include "Delay_m.h"
- #include "serial_xj.h"
- #include "TIMER.h"
- #include "m_XoY.h"
- #define m_Speed 15 //設(shè)置電機(jī)速度
- #define pulse_Number 40 //單位為1時(shí)電機(jī)所需要的脈沖數(shù)
- #define uint unsigned int
- #define uchar unsigned char
- /*引腳定義區(qū)*/
- /**Step: 脈沖
- ***Dir : 方向
- ***Sleep: 驅(qū)動(dòng)芯片睡眠使能
- ***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;
- /*標(biāo)志位定義區(qū)*/
- /**
- ***Flag0: 完成一次單位運(yùn)行標(biāo)志位
- ***m_Flag: X/Y軸運(yùn)行標(biāo)志位
- ***Serval_Flag 串行接收完成標(biāo)志位
- **/
- bit Flag0=0, m_Flag=0, Serval_Flag=0;
- bit G_mode=0; //G代碼模式G0或G1
- bit Laser_En=1; //激光使能標(biāo)志
- /*變量定義區(qū)*/
- /**
- **X_start: X軸開(kāi)始坐標(biāo)-整形變量
- **Y_start: Y軸開(kāi)始坐標(biāo)-整形變量
- **X_end: X軸終點(diǎn)坐標(biāo)-整形變量
- **Y_end: Y軸終點(diǎn)坐標(biāo)-整形變量
- **/
- int X_start=0, Y_start=0, X_end=0, Y_end=0;
- uchar Rotation_dir; //轉(zhuǎn)動(dòng)方向
- uint Circle_Step; //總的步數(shù)-整形變量
- uchar q=0; //象限值
- uchar Re_value[40]; //接收字節(jié)數(shù)組
- /*子函數(shù)定義區(qū)*/
- void Pin_Init(void); //引腳初使化
- void Timer_Creat(void); //創(chuàng)建Timer0
- //void motor_Stop(void);
- void motor_Zx(void); //X軸正轉(zhuǎn)運(yùn)行一個(gè)單位
- void motor_Fx(void); //X軸反轉(zhuǎn)運(yùn)行一個(gè)單位
- void motor_Zy(void); //Y軸正轉(zhuǎn)運(yùn)行一個(gè)單位
- void motor_Fy(void); //Y軸反轉(zhuǎn)運(yùn)行一個(gè)單位
- void motor_Run(uint circle_step, uchar Q); //電機(jī)運(yùn)行
- void G_code(void);
- /********主函數(shù)********/
- void main()
- {
- //uchar i;
- Serial1_Init(); //串行通信初使化
- Pin_Init(); //引腳初使化
- Timer_Creat(); //定時(shí)器0初使化
- mDelay(100); //待系統(tǒng)穩(wěn)定
- Send_data(0x55);
- ES=1; //開(kāi)啟串行中斷使能
- EA=1; //開(kāi)啟總中斷
- while(1)
- {
- if(Serval_Flag) //如果串行信號(hào)接收正確
- {
- Serval_Flag=0; //清除串行接收正確標(biāo)志位
- G_code(); //分析G代碼,計(jì)算X_end,Y_end及激光是否加載
- //X_end=0; //接收到給定的X坐標(biāo)值
- //Y_end=0; //接收到給定的Y坐標(biāo)值
- // 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)); //總步數(shù)
- q=Pd_XoY(X_start, Y_start, X_end, Y_end); //所在象限
- // Send_data(q);
- // Send_ata(0xAA);
- motor_Run(Circle_Step, q); //電機(jī)運(yùn)行
- Y_start=Y_end; //運(yùn)行完畢后將最終值賦與初使值
- X_start=X_end;
- // for(i=0;i<(Re_value[1]-47);i++)
- // {
- // Send_data(Re_value[i]);
- // }
- Send_data(0x55);
- ES=1; //打開(kāi)串行中斷
- }
- }
- }
- void Pin_Init(void)
- {
- X_En=1;
- X_Sleep=1;
- Y_En=1;
- Y_Sleep=1;
- }
- /******************************
- **函數(shù)功能:定時(shí)器創(chuàng)建并初使化
- **函數(shù)名: Timer_Creat(void)
- */
- void Timer_Creat(void)
- {
- TIM_InitTypeDef myTim_inittypedef;
- myTim_inittypedef.TIM_Mode=TIM_16BitAutoReload; //模式為8位重裝
- myTim_inittypedef.TIM_Polity=0; //不設(shè)工作優(yōu)先級(jí)
- myTim_inittypedef.TIM_Interrupt=ENABLE; //允許中斷
- myTim_inittypedef.TIM_ClkSource=TIM_CLOCK_12T; //時(shí)鐘為傳統(tǒng)12分頻
- myTim_inittypedef.TIM_ClkOut=DISABLE; //不允許外輸出時(shí)鐘
- myTim_inittypedef.TIM_Value=65500; //設(shè)置時(shí)間初值
- myTim_inittypedef.TIM_Run=DISABLE; //TR0=1
- Timer_Inilize(Timer0,&myTim_inittypedef);
- }
- /******************************
- **函數(shù)功能:Timer0定時(shí)器中斷
- **函數(shù)名: timer0_int(void)
- **運(yùn)行變量:static uchar Count0運(yùn)行頻率控制變量
- ** static uint Count1 運(yùn)行步數(shù)控制變量
- ** m_Flag X/Y電機(jī)運(yùn)行標(biāo)志位
- ** Flag0 運(yùn)行完畢標(biāo)志位
- **運(yùn)行常量:m_Speed 5
- ** pulse_Number 2
- */
- void timer0_int (void) interrupt TIMER0_VECTOR
- {
- static uchar Count0=0; //運(yùn)行頻率控制變量控制運(yùn)行速度
- static uint Count1=0; //運(yùn)行步數(shù)控制變量控制運(yùn)行長(zhǎng)度
- if(Count0 == m_Speed) //頻率控制計(jì)數(shù)器等于m_Speed
- {
- Count0=0; //頻率控制變量=0
- if(m_Flag) //當(dāng)X/Y運(yùn)行控制位=1
- {
- X_Step=!X_Step; //X軸動(dòng)作
- }
- else
- {
- Y_Step=!Y_Step; //Y軸動(dòng)作
- }
- Count1++;
- }
- else
- {
- Count0++;
- }
- if(Count1==pulse_Number)
- {
- Count0=0;
- Count1=0;
- TR0=0;
- Flag0=1; //完成一次運(yùn)轉(zhuǎn)
- }
- }
- /*
- void motor_Stop(void)
- {
- X_En=1;
- X_Sleep=0;
- Y_En=1;
- Y_Sleep=0;
- }*/
- /*
- **X軸電機(jī)正向運(yùn)行
- */
- /******************************
- **函數(shù)功能:Y軸電機(jī)正向運(yùn)行
- **函數(shù)名: motor_Fx(void)
- **運(yùn)行變量:bit Flag0 每一步運(yùn)行完畢標(biāo)志位
- ** bit m_Flag Y電機(jī)工作
- */
- void motor_Zx(void)
- {
- X_En=0;
- X_Dir=0;
- m_Flag=1;
- TR0=1;
- while(!Flag0);
- Flag0=0;
- X_En=1;
- }
- /******************************
- **函數(shù)功能:X軸電機(jī)反向運(yùn)行
- **函數(shù)名: motor_Fx(void)
- **運(yùn)行變量:bit Flag0 每一步運(yùn)行完畢標(biāo)志位
- ** bit m_Flag Y電機(jī)工作
- */
- void motor_Fx(void)
- {
- X_En=0;
- X_Dir=1;
- m_Flag=1;
- TR0=1;
- while(!Flag0);
- Flag0=0;
- X_En=1;
- }
- /******************************
- **函數(shù)功能:Y軸電機(jī)正向運(yùn)行
- **函數(shù)名: motor_Zy(void)
- **運(yùn)行變量:bit Flag0 每一步運(yùn)行完畢標(biāo)志位
- ** bit m_Flag X/Y電機(jī)工作標(biāo)志
- */
- void motor_Zy(void)
- {
- Y_En=0; //Y軸電機(jī)使能
- Y_Dir=1; //Y軸電機(jī)正轉(zhuǎn)
- m_Flag=0; //Y電機(jī)工作
- TR0=1; //開(kāi)啟定時(shí)器1中斷
- while(!Flag0); //等待完成步進(jìn)
- Flag0=0; //清除步進(jìn)完成標(biāo)志位
- Y_En=1;
- }
- /******************************
- **函數(shù)功能:Y軸電機(jī)反向運(yùn)行
- **函數(shù)名: motor_Fy(void)
- **運(yùn)行變量:bit Flag0 每一步運(yùn)行完畢標(biāo)志位
- ** bit m_Flag X/Y電機(jī)工作標(biāo)志
- */
- void motor_Fy(void)
- {
- Y_En=0; //Y軸電機(jī)使能
- Y_Dir=0; //Y軸電機(jī)反轉(zhuǎn)
- m_Flag=0; //Y電機(jī)工作
- TR0=1; //開(kāi)啟定時(shí)器1中斷
- while(!Flag0); //等待完成步進(jìn)
- Flag0=0; //清除步進(jìn)完成標(biāo)志位
- Y_En=1;
- }
- /******************************
- **函數(shù)功能:電機(jī)運(yùn)行直線插補(bǔ)
- **函數(shù)名: motor_Run(uint circle_step, uchar Q)
- **形參說(shuō)明:uint circle_step運(yùn)行步數(shù)
- Q直線所在象限
- */
- void motor_Run(uint circle_step, uchar Q)
- {
- int Fm=0;
- while(circle_step)
- {
- if(Q==0) //延Y軸運(yùn)行
- {
- if(Y_end > Y_start)
- {
- Rotation_dir=1; //Y++
- }
- else
- {
- Rotation_dir=2; //Y--
- }
- }
- else if(Q==5) //沿X軸運(yùn)行
- {
- 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); //任意兩點(diǎn)
- }
- else
- {
- Rotation_dir=1; //Y++
- Fm=Fm+(X_end-X_start); //任意兩點(diǎn)
- }
- }
- 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--;
- }
- }
- /******************************
- **函數(shù)功能:串行中斷子函數(shù)
- **函數(shù)名: Serial_inter()
- **運(yùn)行變量:static uchar Count2 接收計(jì)數(shù)器
- ** uchar Re_value[40] 串行數(shù)據(jù)寄存數(shù)組
- ** bit Serval_Flag 接收完畢標(biāo)志位
- */
- void Serial_inter() interrupt 4
- {
- static uchar Count2=0; //設(shè)立串行接收計(jì)數(shù)器
- if(TI)
- {
- TI=0;
- }
- if(RI)
- {
- RI=0;
- Re_value[Count2]=SBUF; //接收數(shù)組進(jìn)行數(shù)據(jù)接收
- if(Re_value[0]==0x47) //如果接收數(shù)組[0]="G"
- {
- if(Re_value[Count2]==0x0d) //如果接收數(shù)組有一位為結(jié)束符
- {
- Count2=0; //清除串行接收計(jì)數(shù)器
- ES=0;
- Serval_Flag=1; //接收正確標(biāo)志位置位
- }
- else //否則
- {
- Count2++; //串行接收計(jì)數(shù)器加1
- }
- }
- }
- }
- /******************************
- **函數(shù)功能:G代碼解釋程序
- **函數(shù)名: G_code(void)
- **運(yùn)行變量:uchar Re_value[40] 串行數(shù)據(jù)寄存數(shù)組
- ** bit Serval_Flag 接收完畢標(biāo)志位
- */
- 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) //當(dāng)字符等于X
- {
- GXoYoZ=0x01;
- X_posi=i;
- }
- else if(Re_value[i]==0x59) //當(dāng)字符等于Y
- {
- GXoYoZ=0x02;
- Y_posi=i;
- }
- else if(Re_value[i]==0x5a) //當(dāng)字符等于Z
- {
- GXoYoZ=0x03;
- Z_posi=i;
- }
- else if(Re_value[i]==0x2e) //當(dāng)字符等于.
- {
- 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
- {
- ;
- }
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|