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