今天在网上冲浪,看到了一个有趣的项目:51单片机-激光雕刻机。

项目效果:

STC51激光雕刻机

项目资料内容:

    作者用的51单片机,看起来效果不错。有兴趣的,自己到博主页面下载,链接在文章底部。
    因为原博主开源了,所以我在这里做个分享:

代码

/*********************************************************************************
* 【版    本】: 1.0
* 【实验平台】: QX-MCS51 单片机开发板
* 【外部晶振】: 11.0592mhz        
* 【主控芯片】: STC89C52RC
* 【编译环境】: Keil μVisio4        
* 【程序功能】: 通过串口接收电脑指令并控制相关执行机构完成激光雕刻过程                                                                                   
* 【使用说明】: 比特率9600,校验位:无 停止位:1
**********************************************************************************/
/*【指令说明】/'A'雕刻指令'B'x正转指令'C'x反转指令'D'y正转指令'E'复位指令
**********************************************************************************/
/*预处理命令*/
#include <reg52.h>                   //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint unsigned int
uchar num,a;
int xfwjs,yfwjs;    //复位步数计数
int js2,js3;        //复位计数
sbit xmz1=P2^0;            //X轴脉冲引脚1
sbit xmz2=P2^1;                //X轴脉冲引脚2
sbit ymz1=P2^2;                //Y轴脉冲引脚1
sbit ymz2=P2^3;                //Y轴脉冲引脚2
sbit dykg=P2^7;                //激光开关引脚
 uint xjs=0;                //
                //
 uint yjs=0;                //
                //
void ms(uint ms)//延时函数
{
  uint i,j;
  for(i=ms;i>0;i--)
  for(j=115;j>0;j--);
}
/*
********************************************************************************
** 函数名称 : main(void)
** 函数功能 : 主函数
********************************************************************************
*/
void xf()//X正转函数
{
 
 switch(xjs)
 {
 case 0:xjs=1;xmz1=1;xmz2=1; break;
 case 1:xjs=2;xmz1=1;xmz2=0; break;
 case 2:xjs=3;xmz1=0;xmz2=0; break;
 case 3:xjs=0;xmz1=0;xmz2=1; break;
 default:break;
 }
 ms(2);
}
  void xz()//X反转函数
{
   
 switch(xjs)
 {
 case 2:xjs=1;xmz1=1;xmz2=1; break;
 case 3:xjs=2;xmz1=1;xmz2=0; break;
 case 0:xjs=3;xmz1=0;xmz2=0; break;
 case 1:xjs=0;xmz1=0;xmz2=1; break;
 default:break;
 }
  ms(2);
}
 void yf()//y正转函数
{
  
 switch(yjs)
 {
 case 0:yjs=1;ymz1=1;ymz2=1; break;
 case 1:yjs=2;ymz1=1;ymz2=0; break;
 case 2:yjs=3;ymz1=0;ymz2=0; break;
 case 3:yjs=0;ymz1=0;ymz2=1; break;
 default:break;
 }
  ms(2);
}
  void yz()//y反转函数
{
  switch(yjs)
 {                                                                                        
 case 2:yjs=1;ymz1=1;ymz2=1; break;
 case 3:yjs=2;ymz1=1;ymz2=0; break;
 case 0:yjs=3;ymz1=0;ymz2=0; break;
 case 1:yjs=0;ymz1=0;ymz2=1; break;
 default:break;
 }
  ms(2);
}
 void dk()//雕刻函数
{
 dykg=0;                 //打开打印头
 ms(25);                                    //灼烧时间
 dykg=1;                 //关闭打印头
 
} 
 void fw() //复位函数
{
 for(js2=0;js2<xfwjs;js2++)
  {
  xf();
  }
   for(js3=0;js3<yfwjs;js3++)
  {
  yf();
  }
  xfwjs=0;
  yfwjs=0;
}
void main()
{
        TMOD=0x20;                   //用定时器设置串口波特率           9600 
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;          //串口初始化
        SM0=0;
        SM1=1;
        EA=1;           //开启总中断
        ES=1;
        xfwjs=0;
        yfwjs=0;   
        while(1)
        {
                if(num==1)    //判断是否有串口数据的传送
                {
                        
                        ES=0;
                        num=0;
                        if(a!='E')
                        {
                        SBUF=a;                         //返回单片机收到的指令到计算机
                
                        while(!TI);
                        TI=0;
                                }
                        ES=1;
                }
        }        
}                                                                                                                                                                                                                          
void ser() interrupt 4
{        
        RI=0;
        a=SBUF;                        //接收数据SBUF,即将计算机的数据接收。         
                   switch(a)    //判断串口接收的数据
                        {
                                case 'A':dk();break; //雕刻指令
                                case 'D':yz();yfwjs++;break;  //y正转一步
                                case 'B':xz();xfwjs++;break; //X正转一步
                                case 'C':xf();xfwjs--;break;  //X反转一步
                                case 'E':fw();break;  //激光回到原点
                                case 'F':dk();xz();xfwjs++;break;  //雕刻,X正转一步
                                case 'G':dk();xf();xfwjs--;break;  //雕刻,X反转一步                        
                            default :break; 
                        }                          
        num=1;
}


资料获取

转载自:
http://www.51hei.com/bbs/dpj-194873-1.html