劉 芙,陳宏明
(1.江蘇省淮陰商業學校 計算機學院,江蘇 淮陰 223003;2.淮陰工學院,江蘇 淮陰 223003)
微型打印機并不是局限于某個時代的產物,自從1946年日本的愛普生公司研發了第一個微型打印機開始,到現在已有65個年頭之多,對其適用性和可優化性的研究并沒停息過。當下,業界對體積小、重量輕、噪音低、高速度、高清晰、連接方便、功能完備的微型熱敏打印機研究步伐依然如故。如何建立一個由計算機C語言編程的基于AVR單片機控制的微型熱敏打印的獨立系統。系統采用LTP1245熱敏打印機芯為對象,由AVR單片機ATMEGA16作為主控制芯片,FAN8200作為熱敏打印機走紙系統步進電機驅動芯片,通過串口與上位機進行通訊。并制定給出了計算機控制程序系統的控制流程及相應的字庫,致使該微型打印機實現了系統優、硬件簡、成本低、應用廣闊的前景[1-3]。
基于采用日本精工LTP1245高速熱敏打印機。LTP1245由走紙單元、加熱單元及控制單元構成。[4]系統硬件結構是AVR單片機主控電路、驅動走紙、熱敏頭、檢保電路等組成,如圖1所示。

圖1 系統硬件結構框圖
表1為LTP1245打印機芯規格參數。

表1 LTP1245打印頭規格參數
LTP1245熱敏打印機芯走紙電機采用2相4拍步進電機,其規格參數如表2所示,激勵時序如表3所示,驅動脈沖波形如圖2所示。電機以順時針的方向旋轉時,是正向進紙[4]。

表2 LTP1245走紙電機規格參數

表3 LTP1245走紙電機激勵時序

圖2 LTP1245走紙電機驅動脈沖波形
激勵順序:表3中是LPT1245進紙按正常的方向,當馬達按相位的順序激勵時,第1步,第2步,第3步,第4步,第1步,第2步……,相反,要使馬達按相反的方面旋轉,則激勵馬達的順序為:第4步,第3步,第2步,第1步,第4步,第3步……
步進電機時序:
1) 停止步驟:為了停止馬達,給一個相位的單個激勵周期,也就是最后的一個打印步驟。
2) 暫停狀態:在暫停狀態,為了防止步進電機過熱,不要激勵步進電機,即便在步進電機沒有被激勵的情況下,仍然會有一個壓力保持紙張不會滑動。
3) 起始步驟:重新從步進電機的步進電機立即切換到打印狀態。當重新啟動電機的懸浮狀態,在單一步驟的輸出和步驟相同的相位信號停止然后開始正常的打印順序。
LTP1245熱敏頭如圖3所示:由384個加熱單元及加熱驅動構成。每一點線的打印數據按位由低到高在同步脈沖時鐘以串行方式傳輸的數據,然后將閂鎖止,通過以下方式注冊的閂鎖信號(見圖 4 )[5]。輸入熱敏頭加熱到寫激勵信號的DST反過來根據 printdata 存儲在鎖存寄存器,刺激加熱裝置,在熱敏打印紙上產生點行[6]。LTP1245支持6個分區的打印。表4顯示了DST信號與加熱單元的關系。

圖3 熱敏頭框圖

圖4 LTP1245數據打印方式

表4 分區和加熱單元
LTP1245熱敏頭工作時序如圖5所示,各脈沖信號的典型時間如表5所示。

圖5 LTP1245熱敏頭工作時序圖

表5 LTP1245時序典型時間
LTP1245為384點打印寬度,即48個字節,由于目前使用的都是雙層熱敏紙,所以打印脈沖為2個脈沖/點,即每點行24個字節。數據傳輸時24個字節數據按位由低到高依次傳送。
根據LTP1245熱敏頭工作時序,熱敏打印頭初始化時同步脈沖CLK為低電平,鎖存脈沖LATCH為高電平,加熱激勵脈沖DST為低電平[7]。打印時首先需要將打印數據傳送到熱敏打印頭,同步脈沖CLK輸出1個脈沖信號作為傳輸開始,在CLK為低電平時數據的第一個位放到信號線DAT上,經過延時T2后同步脈沖CLK變為高電平,保持T3時間后當前位數據傳送完畢,CLK變為低電平,循環反復將所有24字節數據傳送完畢,在傳送最后一位時在CLK為高電平時鎖存脈沖LATCH變為低電平并保持T5時間,將數據鎖存到熱敏打印頭,然后加熱激勵脈沖DST變為高電平將數據加熱打印到熱敏打印紙上[8]。
LTP1245光電檢測電路如圖6所示,當熱敏頭壓紙桿打開時HS的信號為高電平,當缺紙時PS 的信號為高電平,正常工作時均為低電平。

圖6 LTP1245光電檢測
為了實現快速打印,要求處理器給打印頭傳送數據的速度要快。這就要求選用高性能、高速度的單片機做主控制器——AVR單片機,該芯片是高性能,低功率8位AVR微處理器與先進的RISC結構,131指示,多數指令執行時間為一個唯一時鐘周期,32目8位普遍運行的記數器,充分的靜態操作,16 MIPS運行在16兆赫下,硬件乘算器以僅二時鐘周期發揮程序迭行和數據記憶;16k字節在系統可編程序的閃光;刪掉生活:10 000次;任意起動編碼區與鎖位的獨立;編程通過在芯片Boot程序起動編碼系統,真實地進行同時讀和寫操作;512字節EEPROM,eraselife:100 000 次,片內模擬比較碼器等特殊的處理器特點;上電復位和可編程電源故障檢測,在芯片標定 RC 振蕩器、芯片/芯片外的中斷源,6 睡眠模式:空閑模式、ADC 的噪聲抑制模式,節能模式,斷電模式下,待機模式;32 個可編程的I/O口[9]。
主控制電路如圖7所示。各控制引腳功能如下:

圖7 主控制電路圖
1)RST:復位
2)TXD,RXD:串口USART。
3)DST1~DST6:熱敏頭打印6個控制區的加熱接口。
4)ENA:走紙電機使能,當打印時ENA為高電平,使步進電機驅動器FAN8200輸出驅動脈沖。
5)IN1,IN2:步進電機驅動脈沖輸入,工作時序如圖5所示。
6)LATCH:熱敏打印頭數據鎖存脈沖,當一點行數據由DAT傳送到熱敏打印頭后,該引腳由高電平變為低電平,將數據存入熱敏打印頭。
7)DAT:熱敏打印頭數據輸入線。
8)PS1:缺紙信號,當熱敏打印頭缺紙時該信號為低電平。
9)HS1:打印頭壓板杠桿解除信號,當熱打印頭壓板杠桿解除信號為低電壓。
10)CLK:同步信號脈沖的熱打印頭,打印數據傳輸信號中的脈沖通過DAT熱打印頭的配合。
本熱敏打印機的計算機控制程序設計主要是通過串口接收上位機數據,并判斷數據類型,如果是命令字,則轉去執行相應的命令程序。如果是打印字符,則轉換成相應的點行數據輸送到熱敏打印機的移位寄存器,然后加熱打印并走紙一定步數。打印的字符可以是16*16點陣的漢子字符,也可以是8*8點陣的ASCII碼[10]。整體工作流程如圖8所示。

圖8 系統整體工作流程
根據圖5中工作時序的要求,數據加載的工作流程如圖9所示。在單片機模擬時鐘CLK的配合下將點陣寄存器中的數據由低位到高位依次通過數據線DAT輸出數據到熱敏打印頭內部的移位寄存器中。LTP1245一點行需要24個字節數據,故需要移位24個字節。工作流程如圖9所示。

圖9 數據加載工作流程
計算機C語言程序如下:
/*數據加載函數*/
void Loaddata()
{
uchar i,j,data;//i:左移位的次數;j:傳送字節數;data:要傳送的字節
CLK=0;//時鐘為低電平
for (j=0;j<24;j++) //一點行總共需要傳送24個字節
{
data=Pointbuf[j];//從點陣寄存器中取出要傳送的字節數據
for (i=0;i<8;i++) //循環左移8次,
{
if (data &0x80)
DAT=1;//若此位為1,數據線為高電平
else
DAT=0;//若此位為0,數據線為低電平
CLK=1;
delay_us(1);
CLK=0;
delay_us(1);
data = data<<1;//左移1位
}
}
}
圖10為數據打印的工作流程:首先將從串口接收的打印字符存入字符緩存區,判斷字符的類型。由于ASC碼是8*8點陣,所以每個字符有8個字節數據;中文字符為16*16點陣,共有32個字節,漢字點陣的排列順序采用“田字格”方法,將一個漢字分成左上、左下、右上、右下4個部分,每個部分就是一個8*8點陣數據。確定字庫后如果是ASC碼字符,則將一行打印字符數據依次取第一行點陣,重新編成一行點陣數據。將這一行點陣數據傳送到熱敏打印頭并鎖存。由于采用雙層熱敏打印紙,每一打印行最多24個字節字符數據,打印時先給DST1、3、5區加熱然后走紙1點行,再次加熱DST2、4、6區,走紙1點行,完成一點行打印。取第二行點陣數據松熱敏打印頭打印,循環直到一行字符打印完畢。如果是漢字字符,則將一行打印字符數據依次取第一行點陣,重新編成一行點陣數據。將這一行點陣數據傳送到熱敏打印頭并鎖存。[11]由于采用雙層熱敏打印紙,每一打印行最多24個字節字符數據,打印時先給DST1、3、5區加熱然后走紙1點行,再次加熱DST2、4、6區,走紙1點行,完成一點行打印。取第二行點陣數據松熱敏打印頭打印,循環直到一行字符打印完畢[11-12]。

圖10 數據打印工作流程
打印8*8點陣ASC碼的計算機C語言程序:
/*打印8*8點陣字符*/
void PrintASC()
{
uchar i,j;//i;打印點行數;j:每點行打印字符字節數
uint data;//加載的數據
Pointbuf_clear();//清打印點陣存儲區
for (i=0;i<8;i++) //打印8點行
{
for (j=0;j<24;j++) //每點行24個字節
{
data=Codebuf[j]-0x20;//轉換字符,由ASC碼//0X20開始
data=data*8+i;//每個ASC碼為8*8點陣
Pointbuf[j]=ASCCODE[data];//存入點陣存儲器
}
Loaddata(); //數據加載
latch_set(); //鎖存
dst135();//135區加熱打印
Motor_run();//走紙1點行
Dst246();//246區加熱打印
Motor_run();//走紙1點行
}
}
根據LTP1245走紙電機激勵時序及驅動芯片FAN8200的工作時序,走紙電機工作流程如圖11所示。開始打印時FAN8200的使能端ENA(ENA=ENA1=ENA2)變為高電平,輸入端IN1=1,IN2=1走第一步,接下來IN1=0,IN2=1走第二步,IN1=0,IN2=0時走第三步,第四步IN1=1,IN2=0。由于LTP1245的走紙電機是2相4拍步進電機,所以走四步后重新循環,由第一步開始。當一點行打印結束后使能端ENA變為低電平,停止步進電機的驅動輸出。下面是計算機C語言的打印機走紙電機驅動程序[13]。

圖11 走紙電機工作流程
/*打印機走紙電機驅動程序*/
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;
}
}
為了減少硬件的存儲空間,字庫采用了自定義特征庫。這樣有利于建立一個強大、靈活的自定字體庫,所以以柔性的打印寬度,打印出美觀的字符效果。首先確定字符型,再尋要打印的第一地址字符,根據規范的漢字點陣,點陣選出來的字體到緩沖區,然后加載和打印[14]。
本設計打印字符用到了8*8點陣的ASC碼字符和16*16點陣的漢字字符,所以需要建立ASC碼字庫和漢字庫,還能擴展條形碼(CODE128)、二維碼(QR)等。點陣字符的提取可以使用專用計算機控制程序自動生成,也可以通過自行描點方式提取。ASC碼字庫的建立要與ASC碼字符表一一對應,為減小字庫大小,ASC碼字符表前32個可以省略不要,從第33個字符“!”開始,第0個為空格,第一個為“!”…需注意提取點陣時的提取順序要與數據加載時的順序一致。下面是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};/*"始"*/
該系統采用了12V/3A電源適配器,并將打印機連接到電腦的USB到串行端口進行測試。在開機通電后,上面的機器的串行調試軟件發送命令和字符,端口速率設置為9 600,便可以打印相應的字符在熱敏紙上。測試打印8*8點陣ASC碼和16*16點陣漢字的計算機C語言字庫、條形碼 (CODE128)、二維碼等也都可以擴展使用。打印出英文、中文字符,條碼顯示清晰,分辨率高、效果好。在上機串行調試軟件發送"江蘇省淮陰商學院",將它打印成二維碼,然后對其通過手機二維碼軟件掃描后能被快速識別,顯示完全正確。
基于設計的AVR單片機控制的熱敏打印機由ATMEGA16及FAN8200構成,減少了周圍元器件,具有可靠性高,打印速度快,裝配成本低等優點。
加載位移數據采用電腦控制程序,生成的 PWM 信號,提供所需的步進電機驅動器的源代碼;從而有利于對打印機的測量與有效控制,通過自建的字庫可以打印任意字符和條形碼、二維碼等。缺紙停止打印,放入打印紙后自動牽拉打印紙等功能方便了用戶使用,值得深入研究和推廣應用。