C语言在AVR单片机控制的微打印应用
2020-09-02陈宏明
刘 芙,陈宏明
(1.江苏省淮阴商业学校 计算机学院,江苏 淮阴 223003;2.淮阴工学院,江苏 淮阴 223003)
0 引言
微型打印机并不是局限于某个时代的产物,自从1946年日本的爱普生公司研发了第一个微型打印机开始,到现在已有65个年头之多,对其适用性和可优化性的研究并没停息过。当下,业界对体积小、重量轻、噪音低、高速度、高清晰、连接方便、功能完备的微型热敏打印机研究步伐依然如故。如何建立一个由计算机C语言编程的基于AVR单片机控制的微型热敏打印的独立系统。系统采用LTP1245热敏打印机芯为对象,由AVR单片机ATMEGA16作为主控制芯片,FAN8200作为热敏打印机走纸系统步进电机驱动芯片,通过串口与上位机进行通讯。并制定给出了计算机控制程序系统的控制流程及相应的字库,致使该微型打印机实现了系统优、硬件简、成本低、应用广阔的前景[1-3]。
1 系统设计整体结构
基于采用日本精工LTP1245高速热敏打印机。LTP1245由走纸单元、加热单元及控制单元构成。[4]系统硬件结构是AVR单片机主控电路、驱动走纸、热敏头、检保电路等组成,如图1所示。
图1 系统硬件结构框图
表1为LTP1245打印机芯规格参数。
表1 LTP1245打印头规格参数
1.1 走纸单元
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) 起始步骤:重新从步进电机的步进电机立即切换到打印状态。当重新启动电机的悬浮状态,在单一步骤的输出和步骤相同的相位信号停止然后开始正常的打印顺序。
1.2 热敏头单元
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光电检测
1.3 主控制电路单元
为了实现快速打印,要求处理器给打印头传送数据的速度要快。这就要求选用高性能、高速度的单片机做主控制器——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热打印头的配合。
2 系统计算机控制程序设计
2.1 系统整体工作流程
本热敏打印机的计算机控制程序设计主要是通过串口接收上位机数据,并判断数据类型,如果是命令字,则转去执行相应的命令程序。如果是打印字符,则转换成相应的点行数据输送到热敏打印机的移位寄存器,然后加热打印并走纸一定步数。打印的字符可以是16*16点阵的汉子字符,也可以是8*8点阵的ASCII码[10]。整体工作流程如图8所示。
图8 系统整体工作流程
2.2 系统整体工作流程
根据图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点行
}
}
2.3 走纸电机工作流程
根据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;
}
}
3 字库的搭建
为了减少硬件的存储空间,字库采用了自定义特征库。这样有利于建立一个强大、灵活的自定字体库,所以以柔性的打印宽度,打印出美观的字符效果。首先确定字符型,再寻要打印的第一地址字符,根据规范的汉字点阵,点阵选出来的字体到缓冲区,然后加载和打印[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};/*"始"*/
4 应用结果验证
该系统采用了12V/3A电源适配器,并将打印机连接到电脑的USB到串行端口进行测试。在开机通电后,上面的机器的串行调试软件发送命令和字符,端口速率设置为9 600,便可以打印相应的字符在热敏纸上。测试打印8*8点阵ASC码和16*16点阵汉字的计算机C语言字库、条形码 (CODE128)、二维码等也都可以扩展使用。打印出英文、中文字符,条码显示清晰,分辨率高、效果好。在上机串行调试软件发送"江苏省淮阴商学院",将它打印成二维码,然后对其通过手机二维码软件扫描后能被快速识别,显示完全正确。
5 结束语
基于设计的AVR单片机控制的热敏打印机由ATMEGA16及FAN8200构成,减少了周围元器件,具有可靠性高,打印速度快,装配成本低等优点。
加载位移数据采用电脑控制程序,生成的 PWM 信号,提供所需的步进电机驱动器的源代码;从而有利于对打印机的测量与有效控制,通过自建的字库可以打印任意字符和条形码、二维码等。缺纸停止打印,放入打印纸后自动牵拉打印纸等功能方便了用户使用,值得深入研究和推广应用。