劉 芙,陳宏明
(1.江蘇省淮陰商業(yè)學(xué)校 計(jì)算機(jī)學(xué)院,江蘇 淮陰 223003;2.淮陰工學(xué)院,江蘇 淮陰 223003)
微型打印機(jī)并不是局限于某個時(shí)代的產(chǎn)物,自從1946年日本的愛普生公司研發(fā)了第一個微型打印機(jī)開始,到現(xiàn)在已有65個年頭之多,對其適用性和可優(yōu)化性的研究并沒停息過。當(dāng)下,業(yè)界對體積小、重量輕、噪音低、高速度、高清晰、連接方便、功能完備的微型熱敏打印機(jī)研究步伐依然如故。如何建立一個由計(jì)算機(jī)C語言編程的基于AVR單片機(jī)控制的微型熱敏打印的獨(dú)立系統(tǒng)。系統(tǒng)采用LTP1245熱敏打印機(jī)芯為對象,由AVR單片機(jī)ATMEGA16作為主控制芯片,F(xiàn)AN8200作為熱敏打印機(jī)走紙系統(tǒng)步進(jìn)電機(jī)驅(qū)動芯片,通過串口與上位機(jī)進(jìn)行通訊。并制定給出了計(jì)算機(jī)控制程序系統(tǒng)的控制流程及相應(yīng)的字庫,致使該微型打印機(jī)實(shí)現(xiàn)了系統(tǒng)優(yōu)、硬件簡、成本低、應(yīng)用廣闊的前景[1-3]。
基于采用日本精工LTP1245高速熱敏打印機(jī)。LTP1245由走紙單元、加熱單元及控制單元構(gòu)成。[4]系統(tǒng)硬件結(jié)構(gòu)是AVR單片機(jī)主控電路、驅(qū)動走紙、熱敏頭、檢保電路等組成,如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)框圖
表1為LTP1245打印機(jī)芯規(guī)格參數(shù)。
表1 LTP1245打印頭規(guī)格參數(shù)
LTP1245熱敏打印機(jī)芯走紙電機(jī)采用2相4拍步進(jìn)電機(jī),其規(guī)格參數(shù)如表2所示,激勵時(shí)序如表3所示,驅(qū)動脈沖波形如圖2所示。電機(jī)以順時(shí)針的方向旋轉(zhuǎn)時(shí),是正向進(jìn)紙[4]。
表2 LTP1245走紙電機(jī)規(guī)格參數(shù)
表3 LTP1245走紙電機(jī)激勵時(shí)序
圖2 LTP1245走紙電機(jī)驅(qū)動脈沖波形
激勵順序:表3中是LPT1245進(jìn)紙按正常的方向,當(dāng)馬達(dá)按相位的順序激勵時(shí),第1步,第2步,第3步,第4步,第1步,第2步……,相反,要使馬達(dá)按相反的方面旋轉(zhuǎn),則激勵馬達(dá)的順序?yàn)椋旱?步,第3步,第2步,第1步,第4步,第3步……
步進(jìn)電機(jī)時(shí)序:
1) 停止步驟:為了停止馬達(dá),給一個相位的單個激勵周期,也就是最后的一個打印步驟。
2) 暫停狀態(tài):在暫停狀態(tài),為了防止步進(jìn)電機(jī)過熱,不要激勵步進(jìn)電機(jī),即便在步進(jìn)電機(jī)沒有被激勵的情況下,仍然會有一個壓力保持紙張不會滑動。
3) 起始步驟:重新從步進(jìn)電機(jī)的步進(jìn)電機(jī)立即切換到打印狀態(tài)。當(dāng)重新啟動電機(jī)的懸浮狀態(tài),在單一步驟的輸出和步驟相同的相位信號停止然后開始正常的打印順序。
LTP1245熱敏頭如圖3所示:由384個加熱單元及加熱驅(qū)動構(gòu)成。每一點(diǎn)線的打印數(shù)據(jù)按位由低到高在同步脈沖時(shí)鐘以串行方式傳輸?shù)臄?shù)據(jù),然后將閂鎖止,通過以下方式注冊的閂鎖信號(見圖 4 )[5]。輸入熱敏頭加熱到寫激勵信號的DST反過來根據(jù) printdata 存儲在鎖存寄存器,刺激加熱裝置,在熱敏打印紙上產(chǎn)生點(diǎn)行[6]。LTP1245支持6個分區(qū)的打印。表4顯示了DST信號與加熱單元的關(guān)系。
圖3 熱敏頭框圖
圖4 LTP1245數(shù)據(jù)打印方式
表4 分區(qū)和加熱單元
LTP1245熱敏頭工作時(shí)序如圖5所示,各脈沖信號的典型時(shí)間如表5所示。
圖5 LTP1245熱敏頭工作時(shí)序圖
表5 LTP1245時(shí)序典型時(shí)間
LTP1245為384點(diǎn)打印寬度,即48個字節(jié),由于目前使用的都是雙層熱敏紙,所以打印脈沖為2個脈沖/點(diǎn),即每點(diǎn)行24個字節(jié)。數(shù)據(jù)傳輸時(shí)24個字節(jié)數(shù)據(jù)按位由低到高依次傳送。
根據(jù)LTP1245熱敏頭工作時(shí)序,熱敏打印頭初始化時(shí)同步脈沖CLK為低電平,鎖存脈沖LATCH為高電平,加熱激勵脈沖DST為低電平[7]。打印時(shí)首先需要將打印數(shù)據(jù)傳送到熱敏打印頭,同步脈沖CLK輸出1個脈沖信號作為傳輸開始,在CLK為低電平時(shí)數(shù)據(jù)的第一個位放到信號線DAT上,經(jīng)過延時(shí)T2后同步脈沖CLK變?yōu)楦唠娖?,保持T3時(shí)間后當(dāng)前位數(shù)據(jù)傳送完畢,CLK變?yōu)榈碗娖?,循環(huán)反復(fù)將所有24字節(jié)數(shù)據(jù)傳送完畢,在傳送最后一位時(shí)在CLK為高電平時(shí)鎖存脈沖LATCH變?yōu)榈碗娖讲⒈3諸5時(shí)間,將數(shù)據(jù)鎖存到熱敏打印頭,然后加熱激勵脈沖DST變?yōu)楦唠娖綄?shù)據(jù)加熱打印到熱敏打印紙上[8]。
LTP1245光電檢測電路如圖6所示,當(dāng)熱敏頭壓紙桿打開時(shí)HS的信號為高電平,當(dāng)缺紙時(shí)PS 的信號為高電平,正常工作時(shí)均為低電平。
圖6 LTP1245光電檢測
為了實(shí)現(xiàn)快速打印,要求處理器給打印頭傳送數(shù)據(jù)的速度要快。這就要求選用高性能、高速度的單片機(jī)做主控制器——AVR單片機(jī),該芯片是高性能,低功率8位AVR微處理器與先進(jìn)的RISC結(jié)構(gòu),131指示,多數(shù)指令執(zhí)行時(shí)間為一個唯一時(shí)鐘周期,32目8位普遍運(yùn)行的記數(shù)器,充分的靜態(tài)操作,16 MIPS運(yùn)行在16兆赫下,硬件乘算器以僅二時(shí)鐘周期發(fā)揮程序迭行和數(shù)據(jù)記憶;16k字節(jié)在系統(tǒng)可編程序的閃光;刪掉生活:10 000次;任意起動編碼區(qū)與鎖位的獨(dú)立;編程通過在芯片Boot程序起動編碼系統(tǒng),真實(shí)地進(jìn)行同時(shí)讀和寫操作;512字節(jié)EEPROM,eraselife:100 000 次,片內(nèi)模擬比較碼器等特殊的處理器特點(diǎn);上電復(fù)位和可編程電源故障檢測,在芯片標(biāo)定 RC 振蕩器、芯片/芯片外的中斷源,6 睡眠模式:空閑模式、ADC 的噪聲抑制模式,節(jié)能模式,斷電模式下,待機(jī)模式;32 個可編程的I/O口[9]。
主控制電路如圖7所示。各控制引腳功能如下:
圖7 主控制電路圖
1)RST:復(fù)位
2)TXD,RXD:串口USART。
3)DST1~DST6:熱敏頭打印6個控制區(qū)的加熱接口。
4)ENA:走紙電機(jī)使能,當(dāng)打印時(shí)ENA為高電平,使步進(jìn)電機(jī)驅(qū)動器FAN8200輸出驅(qū)動脈沖。
5)IN1,IN2:步進(jìn)電機(jī)驅(qū)動脈沖輸入,工作時(shí)序如圖5所示。
6)LATCH:熱敏打印頭數(shù)據(jù)鎖存脈沖,當(dāng)一點(diǎn)行數(shù)據(jù)由DAT傳送到熱敏打印頭后,該引腳由高電平變?yōu)榈碗娖?,將?shù)據(jù)存入熱敏打印頭。
7)DAT:熱敏打印頭數(shù)據(jù)輸入線。
8)PS1:缺紙信號,當(dāng)熱敏打印頭缺紙時(shí)該信號為低電平。
9)HS1:打印頭壓板杠桿解除信號,當(dāng)熱打印頭壓板杠桿解除信號為低電壓。
10)CLK:同步信號脈沖的熱打印頭,打印數(shù)據(jù)傳輸信號中的脈沖通過DAT熱打印頭的配合。
本熱敏打印機(jī)的計(jì)算機(jī)控制程序設(shè)計(jì)主要是通過串口接收上位機(jī)數(shù)據(jù),并判斷數(shù)據(jù)類型,如果是命令字,則轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序。如果是打印字符,則轉(zhuǎn)換成相應(yīng)的點(diǎn)行數(shù)據(jù)輸送到熱敏打印機(jī)的移位寄存器,然后加熱打印并走紙一定步數(shù)。打印的字符可以是16*16點(diǎn)陣的漢子字符,也可以是8*8點(diǎn)陣的ASCII碼[10]。整體工作流程如圖8所示。
圖8 系統(tǒng)整體工作流程
根據(jù)圖5中工作時(shí)序的要求,數(shù)據(jù)加載的工作流程如圖9所示。在單片機(jī)模擬時(shí)鐘CLK的配合下將點(diǎn)陣寄存器中的數(shù)據(jù)由低位到高位依次通過數(shù)據(jù)線DAT輸出數(shù)據(jù)到熱敏打印頭內(nèi)部的移位寄存器中。LTP1245一點(diǎn)行需要24個字節(jié)數(shù)據(jù),故需要移位24個字節(jié)。工作流程如圖9所示。
圖9 數(shù)據(jù)加載工作流程
計(jì)算機(jī)C語言程序如下:
/*數(shù)據(jù)加載函數(shù)*/
void Loaddata()
{
uchar i,j,data;//i:左移位的次數(shù);j:傳送字節(jié)數(shù);data:要傳送的字節(jié)
CLK=0;//時(shí)鐘為低電平
for (j=0;j<24;j++) //一點(diǎn)行總共需要傳送24個字節(jié)
{
data=Pointbuf[j];//從點(diǎn)陣寄存器中取出要傳送的字節(jié)數(shù)據(jù)
for (i=0;i<8;i++) //循環(huán)左移8次,
{
if (data &0x80)
DAT=1;//若此位為1,數(shù)據(jù)線為高電平
else
DAT=0;//若此位為0,數(shù)據(jù)線為低電平
CLK=1;
delay_us(1);
CLK=0;
delay_us(1);
data = data<<1;//左移1位
}
}
}
圖10為數(shù)據(jù)打印的工作流程:首先將從串口接收的打印字符存入字符緩存區(qū),判斷字符的類型。由于ASC碼是8*8點(diǎn)陣,所以每個字符有8個字節(jié)數(shù)據(jù);中文字符為16*16點(diǎn)陣,共有32個字節(jié),漢字點(diǎn)陣的排列順序采用“田字格”方法,將一個漢字分成左上、左下、右上、右下4個部分,每個部分就是一個8*8點(diǎn)陣數(shù)據(jù)。確定字庫后如果是ASC碼字符,則將一行打印字符數(shù)據(jù)依次取第一行點(diǎn)陣,重新編成一行點(diǎn)陣數(shù)據(jù)。將這一行點(diǎn)陣數(shù)據(jù)傳送到熱敏打印頭并鎖存。由于采用雙層熱敏打印紙,每一打印行最多24個字節(jié)字符數(shù)據(jù),打印時(shí)先給DST1、3、5區(qū)加熱然后走紙1點(diǎn)行,再次加熱DST2、4、6區(qū),走紙1點(diǎn)行,完成一點(diǎn)行打印。取第二行點(diǎn)陣數(shù)據(jù)松熱敏打印頭打印,循環(huán)直到一行字符打印完畢。如果是漢字字符,則將一行打印字符數(shù)據(jù)依次取第一行點(diǎn)陣,重新編成一行點(diǎn)陣數(shù)據(jù)。將這一行點(diǎn)陣數(shù)據(jù)傳送到熱敏打印頭并鎖存。[11]由于采用雙層熱敏打印紙,每一打印行最多24個字節(jié)字符數(shù)據(jù),打印時(shí)先給DST1、3、5區(qū)加熱然后走紙1點(diǎn)行,再次加熱DST2、4、6區(qū),走紙1點(diǎn)行,完成一點(diǎn)行打印。取第二行點(diǎn)陣數(shù)據(jù)松熱敏打印頭打印,循環(huán)直到一行字符打印完畢[11-12]。
圖10 數(shù)據(jù)打印工作流程
打印8*8點(diǎn)陣ASC碼的計(jì)算機(jī)C語言程序:
/*打印8*8點(diǎn)陣字符*/
void PrintASC()
{
uchar i,j;//i;打印點(diǎn)行數(shù);j:每點(diǎn)行打印字符字節(jié)數(shù)
uint data;//加載的數(shù)據(jù)
Pointbuf_clear();//清打印點(diǎn)陣存儲區(qū)
for (i=0;i<8;i++) //打印8點(diǎn)行
{
for (j=0;j<24;j++) //每點(diǎn)行24個字節(jié)
{
data=Codebuf[j]-0x20;//轉(zhuǎn)換字符,由ASC碼//0X20開始
data=data*8+i;//每個ASC碼為8*8點(diǎn)陣
Pointbuf[j]=ASCCODE[data];//存入點(diǎn)陣存儲器
}
Loaddata(); //數(shù)據(jù)加載
latch_set(); //鎖存
dst135();//135區(qū)加熱打印
Motor_run();//走紙1點(diǎn)行
Dst246();//246區(qū)加熱打印
Motor_run();//走紙1點(diǎn)行
}
}
根據(jù)LTP1245走紙電機(jī)激勵時(shí)序及驅(qū)動芯片F(xiàn)AN8200的工作時(shí)序,走紙電機(jī)工作流程如圖11所示。開始打印時(shí)FAN8200的使能端ENA(ENA=ENA1=ENA2)變?yōu)楦唠娖?,輸入端IN1=1,IN2=1走第一步,接下來IN1=0,IN2=1走第二步,IN1=0,IN2=0時(shí)走第三步,第四步IN1=1,IN2=0。由于LTP1245的走紙電機(jī)是2相4拍步進(jìn)電機(jī),所以走四步后重新循環(huán),由第一步開始。當(dāng)一點(diǎn)行打印結(jié)束后使能端ENA變?yōu)榈碗娖?,停止步進(jìn)電機(jī)的驅(qū)動輸出。下面是計(jì)算機(jī)C語言的打印機(jī)走紙電機(jī)驅(qū)動程序[13]。
圖11 走紙電機(jī)工作流程
/*打印機(jī)走紙電機(jī)驅(qū)動程序*/
void Motor_run()
{
ENA=1;
switch(Step)
{
case 0:
IN1=1;
IN2=1;
Step=1;
break;
case 1:
IN1=0;
IN2=1;
Step=2;
break;
case 2:
IN1=0;
IN2=0;
Step=3;
break;
case 3:
IN1=1;
IN2=0;
Step=0;
break;
}
}
為了減少硬件的存儲空間,字庫采用了自定義特征庫。這樣有利于建立一個強(qiáng)大、靈活的自定字體庫,所以以柔性的打印寬度,打印出美觀的字符效果。首先確定字符型,再尋要打印的第一地址字符,根據(jù)規(guī)范的漢字點(diǎn)陣,點(diǎn)陣選出來的字體到緩沖區(qū),然后加載和打印[14]。
本設(shè)計(jì)打印字符用到了8*8點(diǎn)陣的ASC碼字符和16*16點(diǎn)陣的漢字字符,所以需要建立ASC碼字庫和漢字庫,還能擴(kuò)展條形碼(CODE128)、二維碼(QR)等。點(diǎn)陣字符的提取可以使用專用計(jì)算機(jī)控制程序自動生成,也可以通過自行描點(diǎn)方式提取。ASC碼字庫的建立要與ASC碼字符表一一對應(yīng),為減小字庫大小,ASC碼字符表前32個可以省略不要,從第33個字符“!”開始,第0個為空格,第一個為“!”…需注意提取點(diǎn)陣時(shí)的提取順序要與數(shù)據(jù)加載時(shí)的順序一致。下面是8*8點(diǎn)陣ASC碼和16*16點(diǎn)陣漢字的計(jì)算機(jī)C語言字庫[15]。
flash uchar ASCCODE[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"空格"/
0x08,0x08,0x08,0x08,0x00,0x00,0x08,0x00,//"!"/
0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,//”‘
…
}
flash uchar kai[]=
{0x00,0x7F,0x11,0x11,0x11,0xFF,0x11,0x11,0x11,0x21,0xC1,0x00,
0x40,0xE0,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00};/*"開"*/
flash uchar shi[]=
{0x21,0x21,0xFA,0x54,0x57,0x50,0x53,0xD2,0x32,0x4B,0x82,0x00,
0x00,0x00,0x40,0x20,0xE0,0x00,0xE0,0x20,0x20,0xE0,0x20,0x00};/*"始"*/
該系統(tǒng)采用了12V/3A電源適配器,并將打印機(jī)連接到電腦的USB到串行端口進(jìn)行測試。在開機(jī)通電后,上面的機(jī)器的串行調(diào)試軟件發(fā)送命令和字符,端口速率設(shè)置為9 600,便可以打印相應(yīng)的字符在熱敏紙上。測試打印8*8點(diǎn)陣ASC碼和16*16點(diǎn)陣漢字的計(jì)算機(jī)C語言字庫、條形碼 (CODE128)、二維碼等也都可以擴(kuò)展使用。打印出英文、中文字符,條碼顯示清晰,分辨率高、效果好。在上機(jī)串行調(diào)試軟件發(fā)送"江蘇省淮陰商學(xué)院",將它打印成二維碼,然后對其通過手機(jī)二維碼軟件掃描后能被快速識別,顯示完全正確。
基于設(shè)計(jì)的AVR單片機(jī)控制的熱敏打印機(jī)由ATMEGA16及FAN8200構(gòu)成,減少了周圍元器件,具有可靠性高,打印速度快,裝配成本低等優(yōu)點(diǎn)。
加載位移數(shù)據(jù)采用電腦控制程序,生成的 PWM 信號,提供所需的步進(jìn)電機(jī)驅(qū)動器的源代碼;從而有利于對打印機(jī)的測量與有效控制,通過自建的字庫可以打印任意字符和條形碼、二維碼等。缺紙停止打印,放入打印紙后自動牽拉打印紙等功能方便了用戶使用,值得深入研究和推廣應(yīng)用。