在工厂自动化系统中,往往需要对产品进行定量包装,或随时统计在流水线上所生产的某种产品的数量。为满足工厂自动化的需求,我们采用微处理器和8253等芯片设计了一种自动计数系统。这种系统电路简单,造价低,适合中小企业使用。8253是可编程的计数器/定时器,其内部有三个独立的16位计数器/定时器通道,每个计数器通道均可按6种不同的方式工作,并且都可以按二进制或十进制计数。其CLK0~CLK2是计数器0~2的时钟脉冲输入端,GATE0~GATE2是门控脉冲输入端,OUT0~OUT2是输出端(见图1)。当用8253做外部事件计数器时,在CLK端所加的计数脉冲由外部事件产生,这些脉冲的间隔可以不相等。如果要用它做定时器,则CLK端应输入精确的时钟脉冲。这时,8253所能实现的定时时间决定于计数脉冲的频率和计数器的初值,定时时间=时钟脉冲周期tc×预置的计数初值n 8253的控制逻辑由5个控制信号和A0组成,对应的操作见表1.
RL1,RL0——读/写操作位。00表示锁存数据,可随时读取计数器中的计数值;01表示只读/写低8位,高8位自动置为0;10表示只读/写高8位,低8位自动置为0;11表示读/写16位数据,先低8位,后高8位。
M2,M1,M0——工作方式选择位。0~5表示方式0~5.方式0,计数完中断;方式1,可程控单触发操作;方式2,分频脉冲发生;方式3,分频方波发生;方式4,软件触发选通;方式5,硬件触发选通。其中方式0的工作过程如下:当程序送一控制字将所选的计数器置于所设定的方式后,该计数器的输出为低;当计数器初值装入被选中的计数器后,在外部输入的门控高电平的控制下,则可通过各自的计数脉冲进行递减计数。此时其输出仍为“低”。当计数器从初始值减到全“0”时,便产生一高电平输出,利用此输出信号向CPU发计数完中断;此中断请求一直保持到程序再次向计数器装入初值为止。
BCD——计数方式选择位。1表示按十进制计数,0表示按二进制计数。使用8253计数功能的电路见图1.
当LED发光管与光电管之间无工件通过时,LED发出的光能够照在光电管上,使光电管导通,集电极变为低电平。此信号经74LS14驱动整形后送到8253的CLK1,使8253的CLK1端也为低电平。当LED发光管与光电管之间有工件通过时,LED发出的光被工件挡住,光电管截止,集电极变为高电平,使8253的CLK1端也为高电平。待工件通过后,CLK1端又回到了低电平。这样,每通过一个工件,就从CLK1端输入一个正脉冲,利用8253对此脉冲计数,就可以统计出工件的个数来。
8253的A1和A0分别与CPU地址总线的A2和A1相连。GATE1接+5V,OUT1作为中断信号INT接到8259A的一个中断请求输入端IR2或者接51单片机的外部中断输入。本系统中设计的8253的端口地址分别为0350H,0352H,0354H,0356H.
编程时,可选择计数器1工作在方式0.在8253的方式0工作方式中,从将计数初值写入计数器到开始减1计数之间,有一个时钟脉冲的延迟。若计数初值为n=999,那么经过n+1个即1000个脉冲时计数值减为0,并在OUT1端输出一正跳变,这可以作为中断请求。在中断服务子程序中CPU可以做其他处理,如送下一个包装箱等。
设计数初值为1999(要求一个包装箱内装工件2000),按十进制计数,先送低8位,再送高8位,控制字为01110001B.初始化程序为:
MOV AL,01110001B
若自动计数系统中,在包装箱未装满之前想了解包装箱中已经装了多少个工件,我们可以利用8253的数据锁存功能;由于8253是减1计数器,可以读取计数器的现行值,再用装满值减去现行值,即得当前包装箱中的工件数。
此时方式控制字为01000000B,实现上述功能的程序为: