(曾明)抢答仲裁系统在许多公开竞争场合如智力竞赛、知识竞赛、证券、股票交易中得到广泛应用。以往的抢答器一般由门电路、触发器组成,线路复杂、可靠性不高、功能简单。而利用常用的单片机如8031组成的抢答系统,功能虽然很强。但成本高、设计复杂、灵活性较差。BASIC单片机构成的抢答系统则可克服上述缺点。它具有对抢答响应快、仲裁公正、功能强、设计简单、成本低等优点,非常适合于电子爱好者制作。
本文还介绍了一种BASIC单片机与16键键盘廉价的接口方法。
一、硬件组成
该系统硬件组成如图1所示。其控制核心是BASIC单片机;多路模拟开关CD4067用于选择抢答按键,移位寄存器74CH164控制LED七段数码显示器用来显示倒计时间、优胜者登记号、违例者登记号。系统还设有喇叭,由时基芯片555驱动。主持人控制由抢答开始和结束按键组成。

BASIC单片机是力源单片机技术研究所研制的可用BASIC高级语言编程的单片机,它提供8路可独立编程的I/O口。其程序存放在电可擦除存储器串行EEROM(93LC56/66)中,可在线修改/调试程序,存储器还能存放数据(断电可不丢失)。该单片机具有编程简单直观、体积小、功耗低、成本低等优点,广泛应用于智能控制中。
该单片机目前有两种形式可提供给用户,一种是将EEPROM(93LC56/66)放在片外的PIC58BS芯片;另一种是力源最新推出的(PIC58BS+93LC66)=PS1008芯片。
在该系统中,为了减化硬件,省略了+5V的电源电路,且直接使用了BASIC单片机的最小系统PIC58BS——CUM或PS1008——CUM。为了提高运行速度,在实际系统中振荡电路使用10M的晶体(但在调试/写入程序时需用4M的晶体)。
4067是16路模拟开关,它包括一个16选1的译码器和被译码器输出控制的16个双向模拟开关,当引脚15(INN)为低电平时,A、B、C、D选取不同值,就有不同的模拟开关与脚1(I/O)相连通。在与单片机连接中,A、B、C、D对应于P0、P1、P2、P3口。I/O与P4口连接。单片机通过扫描按键、如有键按下,则P4口输出零电平给单片机,单片机再判断键号。
74HC164是8位串行移位寄存器,其时钟(CLK)和数据(D1)端分别与单片机的P5、P6相连。其输出端Q0…Q6控制第一位数码管,Q7输出端与第二个数码管的b、c段相连,这样两数码管依次可显示“0”、“1”、…“9”、“10”、…“16”、消隐。本例PIC58BS的P7触发时基电路555控制喇叭。由于555输出电流大,可以直接驱动喇叭。P7发出高脉冲,向555复位端4脚上的电容充电,555接成振荡器形式。在4脚为高电平期间,振荡起振,驱动8Ω的喇叭,发出开始抢答信号(或违例报警信号)。这样可以确保在喇叭响时,抢答的初值为随机数,保证了仲裁的公正。
二、软件设计
(1)抢答的基本原则是抢答信号开始后,按抢答的时间的先后顺序决定胜负,被首先扫到的键应为优胜者。在该系统中,如使用10M的晶体,扫描每个按键时间约为0.0005秒。单片机可分辨出毫秒级的按键差别。这在一般应用中已经足够。
(2)要能惩罚违例者。在抢答信号发出之前,如有抢先按键,系统能及时发现,并显示违例号码,作出相应的处理后,重新开始抢答。
(3)由于该系统只用一片74HC164驱动两个数码管。段选码需作相应布置。显示的段选码一共有18组,通过查表,以串行输出的方式,分别驱动显示“1”…“16”、“0”、“空”。
(4)主程序
程序开始,显示“0”。并等待主持人的开始命令,主持人宣布开始后(按开始键),系统进入倒计时(倒计时起点可根据需要设置,该系统中以10秒为例计时起点)。其间不断的采样按键,以防止违例者按键。
如查出违例者,则不断闪烁显示违例号码,同时发出报警,等待主持人的结束命令,重新开始抢答。
如无违例者,则倒计时到零,同时响铃、开始抢答。单片机不断查询按键,被首先查询到的按键号被显示(优胜者号码),同时喇叭响。主持人发出结束信号后开始下一轮抢答。
本系统只需在软件上做适当改变就能够满足不同场合的要求。图2为程序框图。

程序清单如下:
5
dirs=%11101100
Stst: b1=0
gosub dis ;显示零
loop:input 0
if pin0=0 then main ;抢答开始
goto loop
main:b1=10
lop:gosub dis
if b1=0 then cc ;倒计时完毕,开始抢答
output 0
output 1
for b7=0 to 25 ;反复查询违例者
for b2=0 to 15 ;查询按键,以防违例者
pins=b2^%00001111
if pin4=0 then bb ;如违例,作出违例处理
next b2
next b7
b1=b1-1 ;倒计时
goto lop
CC:pulsout 7,4 ;发出抢答开始声音
anjn:for b2=0 to 15 ;查询抢答优胜者
pins=b2^%00011111
if pin4=0 then aa ;有按键,处理按键
next
input 1
if pin1=0 then stat ;结束信号到,转下一轮
goto anjn ;无按键,继续查询按键
aa:b11=b2
pulsout 7,15 ;发出抢答声音
b1=b11+1
gosub dis ;显示优胜者号
dd:input 1
if pin1=0 then stat ;等待结束信号
goto dd
bb:pulsout 7,20 ;违例者报警音
b1=b2+1
gosub dis ;显示违例号
pause 700 ;延时
b1=17
gosub dis ;显示消隐
pause 700
input 1
if pin1=0 then stat ;等待结束信号
goto bb
dis:lockup b1,($3f,$06,$5b,$4f,$66,$6d,$7d,
$07,$7f,$6f,$bf,$86,$db,$cf,$e6,$ed,
$fd,$00),b0
for b6=1 to 8
pin5=bit7 ;串行送出段选码
pulsout6,1
b0=b0*2
return