基于单片机八路抢答器的仿真与设计
2019-08-22王法杰
王法杰
(西安航空职业技术学院 电子工程学院, 西安 710089)
0 引言
随着各类比赛和娱乐活动的层出不穷,对抢答器功能和性能要求越来越高,目前市场上的智力竞赛抢答器多数是由数字电路设计组成,虽然功能强大,但是线路复杂,可靠性、稳定性不高,功能相对简单,当抢答器路数多时,成品面积较大、运维较困难[1]。因此设计以单片机为核心的新型智能抢答器,利用STC12C5A60S2单片机及外围接口实现抢答系统,结合单片机的定时器的功能,将软件编程与硬件设计结合起来,使得系统能够准确地进行计时,通过数码管显示选手号和时间,能够准确、公平、公正判断出抢答选手,该系统制作过程简单,易于安装和维护,具有一定的使用和推广价值。
1 硬件系统设计
八路抢答器系统采用STC12C5A60S2单片机为控制芯片,与四位一体共阳数码管SM410561D3B和10只自复位轻触开关按键组成[2]。系统的总框图如图1所示。
图1 八路抢答器系统框图
按键模块包括抢答复位和抢答开始按键,用于电路的复位和主持人提示抢答开始进行倒计时,以及八位选手进行抢答的八个按键,如果选手抢答成功则数码管显示该选手按键号,同时对应选手按键的LED小灯发光,数码管的后两位显示答题时间,倒计时5S时,蜂鸣器报警提示[3]。由于数码管的段选和位选均由单片机P0口控制,所以通过74HC573锁存器来确定位选和段选,锁存器的使能端由单片机P2.6和P2.7控制。
2 软件程序设计
2.1 按键模块设计
八位选手的按键由P3口的八位分别控制,P2.0控制抢答器复位按键,P2.1控制抢答开始按键,P1 口的八位分别控制与八位选手按键相对应的八只LED小灯。程序设计时,将按键模块设计一个“KEY.H”头文件供主函数调用[4]。按键函数对十个按键进行编程控制,根据硬件电路图,先通过程序进行按键消抖,对选手按键操作时,用“if语句”判断按键是否按下,延时一段时间后再确定是否按下,如果按键按下,数码管则显示相应的按键序号,同时与该按键对应小灯发光,按键标示为清零,例如判断按键1是否按下,主要代码“if(flag==1) { if(key1==0) { delay(10); if(key1==0) { num=1; flag=0; P1=0xfe;} }”,其中,“flag==1”表示主持人已按下“开始”按键标志位,当“flag==0”时,表示按下开始按键的前提条件下,进一步判断是哪位选手抢答成功,并执行“ if(flag==0) {show(num,11,temp2/10,temp2%10);}”语句,将选手号“num”显示在第一位数码管上,第二位数码管“g”段发光,第三位数码管显示答题时间的十位,第四位数码管显示答题时间的个位。其他七位选手按键操作类似,只是对应调整判断按键号码,即第一位数码管显示数值和小灯对应点亮即可。
2.2 显示模块设计
由于LED数码管显示的位选与段选都由P0口控制,所以用74HC573进行位选或段选存储。当74HC573锁存器的使能端为有效电平即高电平时,则改变输入端的电平,则相应的输出端与输入端电平一致,若使能端为低电平,则输出端的电平为前一次状态输入电平不变,一直保持到使能端有效[5]。程序设计时,先选择位码,使位码控制的锁存器使能端高电平有效,再进行位扫描刷新,然后位码使能端设置低电平,进行段码显示,给P0口送入要显示的数据,到数码管显示数组里获取相应的数值显示到数码管再对数码管段显示使能清零,数码管显示数组赋初值定义为“uchar code table_seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x7f};”用来显示“0-9”数字,数码管灭,“g”段点亮和小数点点亮[6],主要代码如下:
void display()
{ uchar sx;
for(sx=0;sx<4;sx++)//四位数码管
{ wela=1;//位选使能
P0=0x01< wela=0;//位选关闭 P0=0xff; dula=1;//段选使能 P0=table_seg[seg[sx]];//数码管显示 dula=0; delay(800); }} 主持人按下开始按键后3秒钟开始抢答,数码管前两位不显示后两位显示倒计时时间,到时间没人抢答,则进定时器T0中断进行蜂鸣器报警,同时,四位数码管的中间段,即“g”段发光,说明此次抢答无效。若在规定时间内有选手按下按键进行抢答,答题时间为90秒,5秒倒计时提示,进中断蜂鸣器报警[7]。程序设计主要包含主函数和中断函数,在主函数里配置定时器T0为工作模式1,打开定时器,并且开定时器T0中断,赋定时器T0中断初值为50ms,调用前面的按键与数码管显示头文件函数,“ key( );”和“display( );”,用“if语句”判断“flag”标志位,当“if(flag==1)”时,说明按下“开始”按键P2.1,按键消抖后,执行按键函数里的语句“ if(key10==0) { TR0=1;flag=1;flag1=1; }”,置位按键开始和抢答时间标志,同时,调用数码管显示函数,执行语句“ if(flag==1) {show(10,10,temp1/10,temp1%10); }”显示倒计时时间, 当时间到无人按下按键抢答时,进中断进行蜂鸣器报警“if(temp1==0){ temp1=0;TR0=0;flag=2;beep=0; }”;当“flag==2”时,数码管“g”段点亮,“if(flag==2){ show(11,11,11,11);}”; 当复位标志“flag==3”时,则执行语句“ if(flag==3) {show(12,12,12,12);}”,四位数码管显示小数点[8]。此外,在中断函数里要对答题5s进行报警提示,其流程图如图2所示。 图2 中断流程图 中断函数里的主要代码如下: if(num!=0) //有选手按下按键 {temp2--; //90 s倒计时,初值为90 if(temp2<=5) //倒计时5 s {beep=~beep;//蜂鸣器报警 if(temp2==0)//答题时间到 {temp2=0; TR0=0; beep=1; delay(50000); beep=0; //蜂鸣器报警 } } } 程序编译通过后,先下载到proteus仿真软件电路图里进行调试,仿真无误后焊接硬件电路,这样可以减少由于电路或程序的问题而导致实物调试的故障。仿真电路图如图3所示。 单片机的P0口的8位依次和74HC573的“D0-D7”相连,“P2.7”和“P2.6”进行数码管位码和段码的控制,P3口的八位接抢答选手按键,P1口八位接八个LED小灯[9]。锁存器74HC573芯片的/OE为高电平时,输出为高阻态,芯片处于不可控制状态,在本电路中,如图3所示,/OE接低电平。 LE是输出端状态改变使能端,当LE为低电平,输出端Q始终保持上一次存储的信号,当LE为高电平时,Q紧随D的状态变化,并将D的状态锁存,电路中,U2和U3的LE分别接单片机“P2.7”和“P2.6”进行数码管位码和段码的控制。仿真运行时可以模拟抢答过程,例如“6号选手”按下抢答器按键时,对应“D6”点亮,同时,数码管显示从90 s开始倒计时到了3 s,蜂鸣器报警[10],实物制作如图4所示。 图4 八路抢答器实物制作图 以STC12C5A60S2单片机为核心设计的八路抢答器,采用LED数码管进行显示,自动锁存显示结果,主持人按下“开始”按键后,根据不同选手抢答信号的输入,经过单片机的控制处理并产生与输入信号相对应的输出信号,通过数码管显示相应的选手号和答题时间,在规定时间内无选手抢答或答题时间结束前5S,蜂鸣器报警提示[11]。该系统经过实验验证稳定可靠具有一定的实用价值。2.3 报警模块设计
3 软件仿真与实物制作
4 总结