×
单片机 > 单片机程序设计 > 详情

基于51单片机的光驱激光雕刻机源程序电路图+上位机

发布时间:2020-06-18 发布时间:
|

根据他人DIY 激光雕刻机  手绘原理图 画得不好勿怪,实验操中
电路原理图如下:

单片机源程序如下:

/*z地址定义

50 1=x+,2=x-,3=y+,4=y-

51 前进后退步数高

52 前进后退步数低

53 

54/55 字宽 

56 

57 弱光开关

58/59 激光强度

60 x轴速度

61 y轴速度

62 开始打印0,57

63 暂停

64 停止标志

65

66  左右标记 

100开始时灰度图数据

*/


#include

#define uint unsigned int 

#define uchar unsigned char 

#define N z[60]           //X速度

#define M z[61]           //Y速度

sbit a=P1^3;//步进电机接线定义  移动激光头

sbit a_=P1^2;

sbit b=P1^1;

sbit b_=P1^0;

sbit xa=P1^4;

sbit xa_=P1^5;

sbit xb=P1^6;

sbit xb_=P1^7;

/*sbit a=P1^4;//步进电机接线定义 移动底板

sbit a_=P1^5;

sbit b=P1^6;

sbit b_=P1^7;

sbit xa=P1^3;

sbit xa_=P1^2;

sbit xb=P1^1;

sbit xb_=P1^0;  */

sbit jg=P2^0;

sbit led=P2^1;//指示灯

uchar xdata z[500]={0};//缓存

uchar buff[3];//串口缓存

uchar x1,x0,y1,y0,cont2=0;

uchar xfb=4,yfb=4;//走步标志位



unsigned char HighRH = 0;  //高电平重载值的高字节

unsigned char HighRL = 0;  //高电平重载值的低字节

unsigned char LowRH  = 0;  //低电平重载值的高字节

unsigned char LowRL  = 0;  //低电平重载值的低字节




void delayms(uint xms)                                

{   

        uint i,j;

        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒

                for(j=110;j>0;j--);

}


/* 配置并启动PWM,fr-频率,dc-占空比 */

void ConfigPWM(unsigned int fr, unsigned char dc)

{

    unsigned int  high, low;

    unsigned long tmp;

    

    tmp  = (11059200/12) / fr;  //计算一个周期所需的计数值

    high = (tmp*dc) / 100;      //计算高电平所需的计数值

    low  = tmp - high;          //计算低电平所需的计数值

    high = 65536 - high + 12;   //计算高电平的重载值并补偿中断延时

    low  = 65536 - low  + 12;   //计算低电平的重载值并补偿中断延时

    HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节

    HighRL = (unsigned char)high;

    LowRH  = (unsigned char)(low>>8);  //低电平重载值拆分为高低字节

    LowRL  = (unsigned char)low;

    TMOD &= 0xF0;   //清零T0的控制位

    TMOD |= 0x01;   //配置T0为模式1

    TH0 = HighRH;   //加载T0重载值

    TL0 = HighRL;

    ET0 = 1;        //使能T0中断

    TR0 = 1;        //启动T0

    jg = 1;     //输出低电平,关闭激光

}

/* 关闭PWM */

void ClosePWM()

{

    TR0 = 0;     //停止定时器0

    ET0 = 0;     //禁止定时器0中断

    jg = 1;  //输出低电平,关闭激光

}

/* T0中断服务函数,产生PWM输出 */

void InterruptTimer0() interrupt 1

{

    if (jg == 1)  //当前输出为低电平时,装载高电平值并输出高电平

    {

        TH0 = LowRH;

        TL0 = LowRL;

        jg = 0;

    }

    else              //当前输出为高电平时,装载低电平值并输出低电平

    {

        TH0 = HighRH;

        TL0 = HighRL;

        jg = 1;

    }

}




void xfor(uint i)                //x轴前进函数,前进多少步

{   

  while(1) 

  {

                if(xfb==4)

                  {

         xa=xb=1;

               xb_=xa_=0;

                     xfb=1;

                     i--;                        

               delayms(N);

                     if(i==0){xa=xb=0; break;}

                  }

                   if(xfb==1)

                  {

         xb=xa_=1;

               xa=xb_=0;

                     xfb=2;

                     i--;        

               delayms(N);

                     if(i==0){xa_=xb=0; break;}

                  }

                   if(xfb==2)

                  {

         xa_=xb_=1;

         xb=xa=0;

                     xfb=3;        //走步标志位

                     i--;

               delayms(N);

                     if(i==0){xa_=xb_=0; break;}

                   }

                   if(xfb==3)

                  {

         xa_=xb=0;

               xb_=xa=1;

                     xfb=4;

                     i--;        

               delayms(N);

                     if(i==0){xa=xb_=0; break;}

                  }



                }


}



void xbac(uint i)                //xxx后退函数

{   

     while(1) 

         {

                if(xfb==1)

                  {

         xa_=xb=0;

               xb_=xa=1;

                     xfb=4;

                     i--;                                //走步标志位

               delayms(N);

                     if(i==0){xa=xb_=0; break;}

                   }

                   if(xfb==4)

                  {

         xa_=xb_=1;

         xb=xa=0;

                     xfb=3;

                     i--;        

               delayms(N);

                     if(i==0){xa_=xb_=0; break;}

                   }

                   if(xfb==3)

                  {

         xb=xa_=1;

               xa=xb_=0;

                     xfb=2;        //走步标志位

                     i--;        

               delayms(N);

                     if(i==0){xa_=xb=0; break;}

                   }

                   if(xfb==2)

                  {

         xa=xb=1;

               xb_=xa_=0;

                     xfb=1;

                     i--;        

               delayms(N);

                     if(i==0){xa=xb=0; break;}

                  }

                }

}




void yfor(uint i)



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会