根据他人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) //y轴前进函数 { while(1) { switch(yfb) { case 4:{a=b=1; b_=a_=0; yfb=1; i--; delayms(M); if(i==0){a=b=0;break;}} case 1:{b=a_=1; a=b_=0; yfb=2; i--; delayms(M); if(i==0){a_=b=0;break;}} case 2:{a_=b_=1; b=a=0; yfb=3; i--; delayms(M); if(i==0){a_=b_=0;break;}}
上一篇:基于单片机+ADC0809的数字电流表仿真+源程序+设计报告
下一篇:单片机+PT100+SHT11的温湿度检测系统仿真与程序源码
推荐阅读最新更新时间:2024-11-09 19:38
设计资源 培训 开发板 精华推荐
- LTC3642IDD 高效 5V 降压型稳压器的典型应用电路
- MIC4826 EL 驱动器,用于使用 1 节锂离子电池或 5V 固定输入电压的 2 英寸/2 灯
- OZWI插座8266模块刷入点灯科技,接入天猫、小爱、小度。
- 基于L6364Q的适用于STM32 Nucleo的双通道IO-Link设备扩展板
- MAXREFDES1226:借助MAX17690和MAX17606,效率低至87%的小尺寸,薄型,5V / 1.5A,同步,无光耦反激式DC-DC转换器
- AD9763-EBZ,AD9763 DAC 评估板
- 使用 MD1213 和 TC6320 100V 超声波脉冲器的高压脉冲器电路
- IS31FL3216-QFLS2-EB,基于 IS31FL3216 16 通道 LED 驱动器的评估板
- 使用SPI的USB闪存驱动器控制器应用电路
- ADA4627-1ACPZ-R7带保护反相放大器的典型应用电路