条码扫描器与单片机的接口设计
基于对PS/2接口协议和条码扫描器输出数据格式的认识,从触发方式和接收方式两个方面详细分析了单片机读取条码数据的原理与实现方法,同时给出了扫描码与ASCII码的转换程序设计。在应用中,给出了条码扫描器与MCU的接口电路及通行方案,并介绍了单片机对条码数据识别系统一种典型应用方法。
条码扫描器是计算机系统的标准输入设备之一,它将扫描到的图像信息转换为数字信号,继而转化为与计算机兼容的数据,而且它与计算机的接口可以直接识别,无需做额外的接口设计。尽管可与PC机简单直接相连,但在一些较小系统中这样设计也是不经济的。举例说明,像自动存包柜系统中设置条码扫描器,如果在每一个存包柜配一台PC机来完成条码数据的读取和柜子的开关的话,那由于PC机价格高、体积大,这样组成的系统一方面成本高,另一方面要设计PC机的安放位置。在这种情况下,选用价格低、可靠性好的单片机来完成这台PC机的功能就具有较大的优越性。但是对于单片机系统而言,由于没有现成的接口处理器,尤其是对PS/2口,8位单片机没有键盘口的IP核,因此就必须自己设计接口,利用单片机现有的资源,模拟接口处理,实现通信。系统的设计包括两个主要部分——硬件连接的设计和软件协议的仿真。其中软件协议的实现是核心,其本质是在硬件接口设计好的情况下,实现单片机系统与条码阅读器的一个广义上的通信。
键盘接口和PS/2协议
连接器的电气特性
条码扫描器的插头为键盘圆形插针,见图2。其中只有四个脚有意义,它们分别是Clock(时钟脚)、Data(数据脚)、+5V(电源脚)和Ground(电源地),见表1。在PS/2键盘与PC机的物理连接上只要保证这四根线一一对应就可以。PS/2设备靠PC的PS/2端口提供+5V电源,另外两个脚Clock(时钟脚)和Data(数据脚)都是集电极开路的,所以必须接大阻值的上拉电阻。它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。
PS/2协议分析
软件设计的关键是模拟PS/2协议,PS/2协议是键盘与PC连接的双向异步串行通信协议,它选用键码扫描集作为按键识别体系。扫描码和ASCII码完全不相同,所以接口设计的一个重要任务是在扫描码和ASCII之间建立一种映射关系,将读取的扫描码转换为ASCII码。对于大多数键码而言,在键盘被打开的情况下,只要一个键被按下,就一定会产生一个通码;只要一个键被释放,就一定会产生一个断码。于是,对于一个键值而言,它的组成就是通码+断码。在第二套通码中,对于绝大多数键而言,通码为单字节,断码为双字节的。其规则为:断码的第一个字节是F0h,第二个字节是这个键的通码。比如:按键“a”的通码为1CH,而其断码则为F0H,1CH,整个代码1CH,F0h,1CH就表示按键小写字母“a”的一个动作。若在PS/2键盘中整个击键的过程,先按下左SHIFT键,再按下a键,释放a键,释放左SHIFT键,这些时间段内分别产生了左SHIFT的通码(12H),A的通码(1CH),A的断码(F0H,1CH),SHIFT断码(F0H,12H),查表后可以得出产生了12H,1CH,F0H,1CH,F0H,12H这一连串表示大写字母“A”的扫描码。
如果将条码扫描器设置为键盘接口,它输出的信号就完全按照PS/2的数据格式编码。在键盘口接口系统中,由Data线和Clock线来控制对扫描码的检索和传递。如果Data线和Clock线都处于高电平状态,则扫描器每次检索到一个扫描码,就会立即将其发送。每位发送的数据在时钟信号的下降沿(当时钟从高变到低的时候)被单片机读取。需要指出的是,条码扫描器在一行条码数据输入完成后,会在结尾自动加上一个“回车”符,这一点在单片机条码数据接口设计中很有必要,利用它可以在软件程序设计中判断一行条码数据的读取结束。
当条码扫描器扫描到有效条码时,会自动产生时钟信号,同时通过数据线按位将扫描码送到单片机。因此,可利用单片机内部串行口来接收扫描码。因为单片机本身集成了串口通信的IP核,串口的控制是相当成熟和简单的,只需做软件上的设计。但当单片机的串行口被用来与其他设备通讯时,就必须从新设计硬件接口来将扫描码信号做必要的转换,然后在软件的配合下完成扫描码的接收。
基于对PS/2协议的分析,整个系统软件设计主要包括两个部分:第一是模拟I/O接口时序,接收原始数据;第二是解读原始数据,识别所收到的条码数据。简单的数据接收方式是直接串行接收,此外还可以将条码输入设备的串行输出扫描码转换成并行数据 ,然后利用单片机的并口读取。
直接读取串行数据
在接口设计中条码扫描器的输出接口选用键盘口搭配PS/2协议,采用串行方式进行数据传输时,连线较为简单,主要将Clock线和Data线与单片机相连,为了读取数据时可以采用中断触发方式,将Clock线接到单片机外部中断0请求入口端P3.2上,见图4。为保证在每一个时钟信号的下降沿单片机能准确读取Data线的状态(一位数据),触发形式有两种方案:中断方式和查询方式。
在中断方式中,在主程序将中断口初始化为下降沿触发方式,并将PS/2接口的Data线和Clock线都初始化为空闲状态,即高电平状态,使程序在每个时钟下降沿时自动进入到中断服务程序读取数据。当中断进行11次后说明一帧数据接收完毕,安排一个标志BF为后续程序表明,然后关闭中断,转向扫描码的判断和ASCII码的转换程序。
如果设计中其他应用程序占用了中断口,就必须采用查询方式来接收条码数据。设计中要保持CPU一直检测Clock线上的电平,一旦出现拉低,开始检测Data线的电平状态,得到一位数据,同时记录Clock线跳变次数,满11次记录一个8位的字符数据。这两种方式各有优缺点:中断触发减轻了CPU负担,处理速度更快,查询方式为系统设计节省中断口,供应用程序使用,在实际应用中,可根据设计需要采用不同的触发方式。
数据的并行传输方式
设计的核心是采用串入并出芯片如74HC164,条码输入设备输出的串行数据脉冲和时钟脉冲分别接到74HC164的数据端A,B端及时钟输入CLK端,由Clock脉冲的下降沿控制74HC164的位移操作,条码输入设备每输出一个字符的扫描码,由CLK控制在74HC164的输出脚Q0-Q7上分别输出扫描码的D7-D0位,这部分转换完成后接口通知MCU将转换完毕的扫描码读入。由于Q0-Q7不能直接和P0口相连,因此,为了保证单片机准确读取74HC1164的Q0-Q7脚上的扫描码,设计一片74HC245将他们隔开,74HC245是八位双向3态缓冲电路,在ENABLE与DIR同时为低电平的时候,74HC245将B1-B8上的数据传送至A1-A8上,为使单片机准确地发出读数命令,接口电路要完成74HC164转换完一个扫描码之后通知单片机接收74HC164的Q0-Q7数据。设计中采用对Clock脉冲的下降沿记数来实现,输入至74HC164的CLK脉冲同时又输入至单片机的T1脚,见图5。利用T1对CLK脉冲记数,因为条码扫描器输出数据中每9个负脉冲对应一帧扫描码,因此T1每记数9次向CPU发出中断请求,从而保证CPU准确地读取数据。
键盘扫描码转换程序设计
由于键盘扫描码无规律可循,因此由键盘扫描码获得相应按键的键值(字符键为其ASCII值)只能通过查表的方式获得。用单片机解码时,在程序中可以根据每个断码前一字节为F0H去判断当前的键是否释放,同样在条码扫描器向单片机发送SHIFT、CTRL等功能键都可以在程序中用标志位去进行处理,转换的方式是先去掉断码,保留通码,用通码去查表,设计中将常用键的通码以及与之相对应的ASCII码定义在scancodes.h文件,从中查表得到相对应的ASCII码值,将之顺序记录到数组中。
基于上面单个字符的接收程序,解读原始数据,识别所收到的条码数据,判断是否为回车符,回车符作为一串条码接收完成标志,如果为回车符,则转入对这一串条码数据的处理程序,调用相应程序,如存储、显示、驱动电磁锁等应用子程序。就构成了一个完整的条码阅读器的应用体系。
整个设计中没有使用单片机的内部串行口,给系统节省了端口,根据不同的需要还可以扩展其他功能模块接口。通过这个研究,单片机本身优越的编程和控制性能,加上简单的接口电路便能实现对条码设备的数据读取,这种方法可以推广至其它兼容PC机键盘接口的数据设备,如磁卡刷卡器。应用于工业自动化领域,用单片机来代替PC机的工作,可以大大减少生产成本,而且可靠性较高。