當初看到老外做的解析度極低的印表機我就開始意淫,找了幾個光碟機和一堆破爛就開始造。此教程由百事可樂獨家贊助,我還沒拆封呢
方法/步驟
工作方式:用點陣液晶取模取模,然後串列埠發到微控制器,微控制器控制機械部分按照如下方式:每行有7x8個點(步進電機每走一步一個點,一行60步左右,要取8的倍數。)當走完這7x8個點的時候,歸位,走紙一行,之前的動作最初的設想是敲色帶,後來發現這TM又麻煩又浪費,乾脆直接用筆了
後來買了點熱敏紙……鋸了掉一節,光碟機伺服總算夠用了用一根20r的電阻接上5V發熱,一個12V的繼電器經過改造用來落筆
窮逼一個,沒有多的步進電機了= =無奈用這個有刷電機,走紙精度渣渣渣
歸位用的檢測開關
電路部分。微控制器是AT89S52,用了一堆D882和B772三極體來控制機械部分的電源。列印的效果不要在意我打了什麼內容
#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}}}
注意事項
注意不要被電電到