多语言展示
当前在线:500今日阅读:31今日分享:25

DIY光驱打印机

当初看到老外做的分辨率极低的打印机我就开始意淫,找了几个光驱和一堆破烂就开始造。此教程由百事可乐独家赞助,我还没拆封呢
方法/步骤
1

工作方式:用点阵液晶取模取模,然后串口发到单片机,单片机控制机械部分按照如下方式:每行有7x8个点(步进电机每走一步一个点,一行60步左右,要取8的倍数。)当走完这7x8个点的时候,归位,走纸一行,之前的动作最初的设想是敲色带,后来发现这TM又麻烦又浪费,干脆直接用笔了

2

后来买了点热敏纸……锯了掉一节,光驱伺服总算够用了用一根20r的电阻接上5V发热,一个12V的继电器经过改造用来落笔

3

穷逼一个,没有多的步进电机了= =无奈用这个有刷电机,走纸精度渣渣渣归位用的检测开关

4

电路部分。单片机是AT89S52,用了一堆D882和B772三极管来控制机械部分的电源。打印的效果不要在意我打了什么内容

5

#include 'reg52.h' //51系列单片机定义文件#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数sbit PE = P1^0;//控制笔的继电器sbit Y_M = P1^1;//控制Y轴有刷电机sbit S1 = P1^2;//归位检测的开关unsigned int delaytimeX = 200;//X轴前进延时unsigned int delaytimeX1 = 200;//X轴后退延时unsigned int delaytimeY_M = 1100;//有刷电机换行延时unsigned int delaytimepd = 1500;//落笔延时unsigned int delaytimepd1 = 1000;//抬笔延时unsigned int h = 0;unsigned char code X_Rotation[4]={0x55,0x99,0xAA,0x66};//这几个数据直接输出到P0控制步进电机void delay(uint t) //定义延时函数{while(--t);}void fd()//X轴前进一步{for(h=0;h<4;h++){P0=X_Rotation[3-h];delay(delaytimeX);}P0=0x00;}void bk(){//X轴归位while(S1){for(h=0;h<4;h++){P0=X_Rotation[h];delay(delaytimeX1);}}P0=0x00;}void nl()//换行{Y_M = 0;delay(delaytimeY_M);Y_M = 1;}void pe()//落笔{PE = 0;delay(delaytimepd);PE = 1;delay(delaytimepd1);}void main(){unsigned char dat;unsigned int i=0;unsigned int j=0;unsigned char temp = 0;TMOD=0x20;//定时器工作方式设置,定时器1方式2SCON=0x50;//串口工作方式1,允许串口接收TH1=0x0FD;//定时器初值高8位设置TL1=0x0FD;//定时器初值低8位设置PCON=0x80;//波特率倍频TR1=1;//定时器启动SBUF = 17;//Xon//baud:19200bk();while(1){if (RI == 1){//接收中断标志位为1时dat = SBUF;//接收数据 SBUF 为单片机的接收发送缓冲寄存器RI = 0;//令接收中断标志位为0(软件清零)SBUF = 19;//Xoffwhile(TI == 0);TI = 0;for(i=0; i<8; i++){ dat=dat-0x80;dat=dat<<1;//左移一位temp = CY;//移出的位给temp if(temp==0){pe();//落笔fd();}else//不落笔{fd();}}//delay(500);j++;if(j==7)//X走到最右侧,走完7x8个点{j=0;delay(2000);bk();//X归位delay(2000);nl();//换行}SBUF = 17;//Xon}}}

注意事项

注意不要被电电到

推荐信息