BASIC单片机在抢答系统中的应用

🏠 首页 《无线电》杂志 1996年 🔗 第5期 🔗 第6页 分类:胆机设计与交流大赛 🔗 曾明 🔗

(曾明)抢答仲裁系统在许多公开竞争场合如智力竞赛、知识竞赛、证券、股票交易中得到广泛应用。以往的抢答器一般由门电路、触发器组成,线路复杂、可靠性不高、功能简单。而利用常用的单片机如8031组成的抢答系统,功能虽然很强。但成本高、设计复杂、灵活性较差。BASIC单片机构成的抢答系统则可克服上述缺点。它具有对抢答响应快、仲裁公正、功能强、设计简单、成本低等优点,非常适合于电子爱好者制作。

本文还介绍了一种BASIC单片机与16键键盘廉价的接口方法。

一、硬件组成

该系统硬件组成如图1所示。其控制核心是BASIC单片机;多路模拟开关CD4067用于选择抢答按键,移位寄存器74CH164控制LED七段数码显示器用来显示倒计时间、优胜者登记号、违例者登记号。系统还设有喇叭,由时基芯片555驱动。主持人控制由抢答开始和结束按键组成。

图1
图1 🔍原图 (1213×828)

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为程序框图。

图2
图2 🔍原图 (462×1011)

程序清单如下:
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