??? 摘 要: 介紹一種采用MCS51系列單片機控制驅(qū)動Hewlett Packard DESKJET 600/800 系列噴墨打印機的硬件接口設(shè)計和軟件設(shè)計方法" title="設(shè)計方法">設(shè)計方法,。以控制打印機實現(xiàn)表格打印功能為例,給出了用C51語言編寫的一系列相關(guān)基本控制程序,。
??? 關(guān)鍵詞: 單片機? 噴墨打印機? HP PCL LEVEL 3語言
?
??? 單片機應(yīng)用系統(tǒng)中最常用的輸出打印設(shè)備是微型打印機,例如TP系列、UP系列打印機等,對它們的控制技術(shù)也較為成熟,。但是近年來隨著通用打印機的廣泛使用,微型打印機的缺點也日益明顯:一是通用性及互換性不強;二是打印輸出文檔的幅面過小,不便于裝訂及存檔,。而通用打印機都配有國際標(biāo)準(zhǔn)并行接口" title="并行接口">并行接口(CENTRONICS)和串行接口(RS232/422),紙張大小可任意選擇,。這些特點是微型打印機所無法抗衡的。因此在越來越多的單片機應(yīng)用系統(tǒng)中逐漸趨向于使用通用打印機作為打印輸出設(shè)備,。本文介紹了以MCS-51系列單片機為核心,通過CENTRONICS國際標(biāo)準(zhǔn)8位并行接口控制驅(qū)動HP-DJ 600/800系列噴墨打印機的硬件接口電路設(shè)計方法及控制程序設(shè)計" title="程序設(shè)計">程序設(shè)計方法,。
1 CENTRONICS接口標(biāo)準(zhǔn)
??? HP-DJ 600/800系列噴墨打印機采用與CENTRONICS標(biāo)準(zhǔn)兼容的并行打印機接口,接口各引腳信號的定義如表1所示。
?
2 硬件設(shè)計
??? 本著統(tǒng)一編址控制的原則,硬件原理如圖1所示,。
?
??? 本設(shè)計采用MCS-51系列的89C52型單片機,其內(nèi)部有8K字節(jié)的程序存儲器" title="程序存儲器">程序存儲器,盡可滿足本設(shè)計的程序,、表格的存儲要求。在外部擴展了一片數(shù)據(jù)存儲器62256作為打印數(shù)據(jù)緩沖區(qū),RAM62256的存儲容量為32K字節(jié),可以存放大量的打印數(shù)據(jù),。從原理框圖可看出,RAM62256的片選端由單片機的P2.7口控制,因此RAM的地址范圍為:0000H~7FFFH,。
??? 本設(shè)計采用查詢方式進行打印驅(qū)動控制,單片機與打印機的接口包括如下內(nèi)容:
??? (1)單片機的八位數(shù)據(jù)線通過74LS377鎖存后與打印機的八位數(shù)據(jù)線相連,傳送打印數(shù)據(jù)。單片機的P2.7口通過74LS04反相后與74LS377的端相連,因此單片機向打印機傳送數(shù)據(jù)的口地址為8000H,。
??? (2)單片機的P1.0口提供數(shù)據(jù)選通信號,它與打印機STB端連接,進行將打印數(shù)據(jù)送打印機的選通控制,。
??? (3)單片機的P1.1口接打印機的BUSY端,以BUSY信號作為打印機“忙”或“閑”狀態(tài)查詢信號。
3 單片機驅(qū)動控制打印機的軟件設(shè)計
3.1 打印機的控制方法
??? 系統(tǒng)上電后,當(dāng)需要打印的數(shù)據(jù)出現(xiàn)在數(shù)據(jù)線上時,只要主機向打印機的STB端發(fā)一個負脈沖,就把數(shù)據(jù)送入了打印機,。本設(shè)計對打印機的控制采取查詢等待方式,。首先主機讀打印機BUSY線,如果BUSY為高電平" title="高電平">高電平則表示打印機正“忙”,禁止接收數(shù)據(jù),需等待。當(dāng)打印機取走數(shù)據(jù)并處理完畢后,BUSY線被置為閑(低電平),同時輸出應(yīng)答脈沖ACK通知主機,可以再次輸入數(shù)據(jù),??刂茣r序如圖2所示。
?
??? STB為數(shù)據(jù)選通信號,打印機在其上升沿時讀入數(shù)據(jù),。當(dāng)主機發(fā)送數(shù)據(jù)后,需要有0.5μs以上的延時才能向STB線發(fā)負脈沖,即圖2中的t1值不小于0.5μs;當(dāng)STB信號從高電平變?yōu)榈碗娖胶?要保證負脈沖的寬度,亦即圖2中的t2值不小于0.5μs;當(dāng)STB信號從低電平變?yōu)楦唠娖胶?要保證有0.5μs以上的延時,亦即圖2中的t3值不小于0.5μs,以確保打印機將數(shù)據(jù)可靠讀入,。控制流程見圖3所示,。
?
??? 無論打印機打印輸出的是文字還是圖形,主機向其發(fā)送的皆是一系列以字節(jié)為單位的數(shù)據(jù),因此如何向打印機發(fā)送數(shù)據(jù)是關(guān)鍵所在,。以下為一數(shù)據(jù)發(fā)送程序?qū)嵗?其功能是將一個字節(jié)數(shù)據(jù)發(fā)送給打印機。
??? void print_one(char ch)??//ch為待發(fā)送的數(shù)據(jù)
????{?
?????? ??while(P1_1),; ???//讀打印機狀態(tài),BUSY=1?為1,,等待
?????? ??P1_0=1,;????????????? ?//置STB為1
?????????*(char xdata*)0x8000=ch;??//輸出數(shù)據(jù)到打印機
?????? ??P1_0=0;??????? //置STB為0
???? ?? ?_nop_(),;
????? ? ?_nop_()???????????????????? //延時,等待數(shù)據(jù)發(fā)送完畢
?????????P1_0=1,;??????? //置STB為1
????}
3.2 控制程序設(shè)計
??? HP-DJ 600/800系列噴墨打印機使用HP PCL LEVEL 3語言,而在單片機控制系統(tǒng)中使用十六進制代碼。因此在以下程序設(shè)計中,將PCL命令全部替換為用十六進制代碼表示,。
??? 在單片機實時控制系統(tǒng)中,打印機最常用的功能是將控制系統(tǒng)的測試結(jié)果打印出來,。下面通過如何實現(xiàn)一張表格的打印來具體說明單片機控制驅(qū)動噴墨打印機的軟件設(shè)計方法。
??? 需要打印的表格如表2所示,。首先在Windows界面的“附件”的“畫圖”中制作好如表2的表格,將其保存為文件名:REPORT.BMP,,并且在向單片機的程序存儲器中燒寫程序代碼時將此BMP文檔代碼一并寫入,存放在以BMP_ADDR為起始地址的程序區(qū)內(nèi),。BMP_ADDR的值由所制作的表格大小決定,表格的寬度和長度分別用paper_width和paper_length表示。
?
??? 由流程圖4可看出,首項工作是由主機向打印機發(fā)送命令,利用軟件實現(xiàn)打印機的初始化,。初始化的內(nèi)容包括紙張型號,、文本長度、上下邊距,、左右邊距的設(shè)置等,。在本設(shè)計中初始化程序如下:
??? void init_print( )
??? { uchar i;
??? ? char code command[57]=
?????? ??{ 0x1b,,0x45,,?????????????????? ?//打印機復(fù)位
?????? ?? ?0x1b,0x2a,,0x62,,0x32,0x42,,????
?????? ?? ?0x1b,,0x26,0x6c,,0x30,,0x6f,?? ?//圖形方式
?????? ?? ?0x32,,0x36,,0x61,???????????? ?//圖幅為A4
?????? ?? ?0x30,,0x6d,,?????????????? ??//普通紙
?????? ?? ?0x31,0x6c,,?????????????? ??//允許設(shè)計上下邊距
???????? ??0x38,,0x64,?????? ?//垂直行距:8行/英寸
?????? ?? ?0x39,,0x33,,0x70,?//頁長為11.67inch×8=93cpi
???????????0x36,,0x65,,???????? ?//上邊距為0.75inch×8=6cpi
?????? ?? ?0x37,0x37,,0x46,?? //正文長(11.67-0.75-1.25)×8=77cpi
?????? ?? ?0x1b,,0x28,0x73,,0x30,,0x70,,? ?//字間距固定
??????? ? ?0x31,0x32,,0x48,,???????????? ?//12cpi
?????? ?? ?0x1b,0x26,,0x61,,0x39,0x6c,, ?//左邊距=0.75inch
?????? ?? ?0x39,,0x30,0x4d,,??????????
?????? ?? ?0x1b,,0x2a,0x72,,0x31,,0x75,? ?//單色
?????? ?? ?0x31,,0x41,,??????????????????
?????? ?? ?0x1b,0x2a,,0x62,,0x30,0x4d
??? ?},;
? for(i=0,;i<57;i++) print_one(command[i]),;
}
??? 打印機初始化完成后,,將打印緩沖區(qū)清零。這個打印緩沖區(qū)實際上就是位于外部RAM 62256內(nèi)的一段存儲區(qū)域,,RAM 62256的地址范圍是0000H~7FFFH,,在本設(shè)計中將打印緩沖區(qū)的首地址定義為0000H。為了書寫方便在以下的程序中用PRINT_BUF表示這個地址值,。接著將ROM中以BMP_ADDR為首址的內(nèi)容讀出并寫入首址為PRINT_BUF的打印緩沖區(qū)內(nèi),其代碼長度即所設(shè)定表格的寬度和長度的積,。具體程序如下:
??? void read_bmp( )
??? { uint i,;
????? uchar xdata *p; uchar code *q,;
????? p=PRINT_BUF,;
??? ? q=BMP_ADDR,;
??? ? for(i=0;i
??? 打印數(shù)據(jù)全部存入打印緩沖區(qū)后,,只要主機向打印機發(fā)開始打印命令,將打印緩沖區(qū)內(nèi)的數(shù)據(jù)按字節(jié)依次發(fā)往打印機,,一張符合要求的表格即打印出來了,。具體程序如下:
??? void print_report( )
????{ char i;
????uint j,;
??? uchar xdata *p,;
??? char code command1[]={0x1b,0x2a,,0x62,,0x36,0x34,,0x57},; ?????????//開始打印控制命令
??? char code command2[]={0x1b,0x2a,,0x72,,0x43,0x1b,,0x45},; ?????????//結(jié)束打印控制命令
?? ?init_print( );?????//初始化打印機
?? ?clear_print_buf( ),;? ????//清打印緩沖區(qū)
??? read_bmp( ),; ?????//讀入打印緩沖區(qū)
??? p=PRINT_BUF;
?? ?for(j=0,;j
?? ?for(i=0;i
?? ?for(i=0,;i<6,;i++) print_one(command2[i]),;
????}
??? 所設(shè)計的MCS-51系列單片機與噴墨打印機的硬件接口和程序在衡陽無線電總廠的多種測試儀器中應(yīng)用,效果良好,。該硬件接口和軟件編程方法具有一定的通用性,,適用于采用HP PCL LEVEL 3 打印機命令語言并且配有Centronics并行接口的各種打印機,只需在程序中根據(jù)不同機型修改個別參數(shù)值,,即可實現(xiàn)打印輸出,。
參考文獻
1 馬良渝.打印機應(yīng)用大全[M].福州:福建科學(xué)技術(shù)出版社,1995.9
2 Hewlett-Packard Company. Hewlett Packard DeskJet 600/800 Series Printers Software Developer's Pcl Guide.http://www.hp.com.1997.7.1