目前,我国各医院普遍使用的心电图机绝大多数是机电式的,即通过电极检测心电信号,放大后直接记录,存在着打印效率低、噪声污染严重、心电波形失真等缺点。与之相比,数字式心电图机通过软件实现噪声抑制和心电参数的提取,并采用数字式打印机输出心电图形,可为医护人员提供更完美心电图和更多诊断信息,必将成为市场的发展趋势,有着更广阔的应用前景。由于数字心电图机通过ADC采集的数据是离散的,要将其在图纸上还原为原始的心电图形,除了要将数据与图纸上的离散点对应起来,还要根据信号变化的趋势,在这些点之间连线,使之成为连续的图形。将心电数据尤其是多导联心电数据同步、准确、快速打印出来是整个系统开发的难点和关键,而高效打印算法对数字心电图机的开发无疑是很有意义的。
随着电子技术的发展,打印机已经广泛应用到各个领域,成为各种智能数字化仪器仪表的重要数据输出手段。而其中热敏打印机凭其体积小、重量轻、可靠性高、打印字符清晰、无噪声、走纸均匀等独特能而越来越受到青睐,更是成为小型医疗仪器如心电图机的首先。
下面以笔者课题组开发的12导同步心电图机为例,介绍以普通52单片机为主控芯片应用串行热敏打印机实现多种方式的心电图形打印,并重点描述了12导联同步打印方式的程序实现方案。
1 系统硬件设计
系统配置了一个内置式数字打印机,它主要由热敏打印头(W216-QS)和步进电机组成。W126-QS点阵式热敏打印头打印数据采用串行输入,其内部不仅包含有由C-MOS集成芯片构成的1728位移位寄存器,还包含借助高密度厚膜工艺制成的加热元件。这些加热元件通过锁存和切换晶体管驱动,可在热敏打印纸上产生1728个点,对应的打印宽度为216mm,分辨率为8dot/mm。热敏打印头所需的打印数据为串行数据,数据传输遵循SPI口的通信协议。系统采用了口线模拟SPI的工作方式与打印头通信,电路如图1所示。
考虑到52单片机内部令有256字节的内部RAM,系统还外扩1片HM628128存储12导心电数据和中间转换结果。
2 系统软件编写
数字打印实现的两个关键问题:①如何将心电数据转换成打印数据;②如果将数据输出到数字打印机。通常采用的方法是转换数据同时将其输出到打印机打印。这样节省了存储器空间;缺点是程序实现复杂,通用性差(不同打印方式的数据输出程序不同),系统功能不易扩展,数据转换和输出都要考虑打印点位置,并且每输出一点的数据都要调用一次程序,加大了系统开销。系统软件中没有采有这种方式,而是在内存中开辟216字节打印缓冲区,将热敏打印头1728个点与216×8位数据相对应,每次将要打印的一线数据都转换完再输出。这样只需在数据转换时考虑打印位置和方式,输出程序只需将216字节的数据按位输出即可,并且每打印一线数据只需调用一次输出子程序,字节了系统开销。缺点是占用系统资源,这一点在12导同步打印表现得尤为明显。
系统程序实现三种打印方式:分两次打印12导联数据,每次打印6导、12导同步打印、纵向打印(打印效果如图2)。在每一种打印程序中实现模拟SPI口将打印数据送至数字打印机的子程序共用,不同处在于如何将心电数据转换成打印数据。
2.1 I/O口线模拟SPI口
SPI(Serial Peripheral InteRFace)总线串口是由Motorola公司提出的一种同步串行外设接口,通过四根线进行通信:时钟线(SPKCLK)、数据输出线(SPIMISO)、数据输出线(SPIMOSI)、片选线(CS),内部通过SPIDAT寄存器完成串-并/并-串转换。它主要工作在主从式系统中,一个主器件可以带多个从器件,主器件通过片选线控制总线冲突,使同一时刻只有一个从器件与从器件交换数据。
系统应用的串行热阵式打印机数据传输采用SPI时序,但普通52单片机无SPI口,所以采用I/O口线模拟SPI时序。考虑到系统中MCU作为主器件总是发送数据,而数字打印机作为唯一从器件又总是接收数据,所以只需用口线模拟SPI口的时钟线(SPIKCLK)、数据输出线(SPIMOSI),程序模拟SPIDAT完成并-串转换即可。如前所提到打印头打印的数据点数为1728点,分辨率为8mm/mV,对应216字节的数据,为此从内部RAM中分配出216字节的空间作为打印缓冲区,程序从缓冲区依次读数据,在模拟时钟线的控制下将并行数据转换成的串行数据按位依次送至打印机的移位寄存器中,结束后送LATCH锁存信号和打印头加热脉冲STROBE,从而在热敏打印纸打印出一线心电图形,驱动步进电机向前走纸即可以连续打印。SPI口模拟程序如下:
OUTPUT:
现场保护
LCALL INTRAM ;初始化内部打印缓冲区
MOV R0,#Dat_Buff ;初始化R0为缓冲区末位地址
DAT_OUT:
MOV A,@R0 ;从缓冲区读数据
MOV R7,#08H ;初始化R7控制并/串数据转换
CONT_CHG:
RRC A ;对ACC循环右移实现并-串转换
MOV P1.3,C 将串行数据送至打印机
SETB P1.1 ;模拟SPI时钟
NOP
CLR P1.1
DJNZ R7,CONT_CHG ;判断1字节数据是否转换完
DEC R0 ;寻址下一字节
CJNE R0,#15H,DAT_OUT;判断数据是否全部转换完
CLR P1.2 ;产生数据锁存信号
NOP
SETB P1.2
NOP
CLR P1.0 ;产生加热脉冲
LCALL HEATDLY ;调用加热延时程序
SETB P1.1
LCALL MOTOR_RUN ;步进电机走纸
恢复现场
RET