用单片机制作的智能八路抢答器.docx
《用单片机制作的智能八路抢答器.docx》由会员分享,可在线阅读,更多相关《用单片机制作的智能八路抢答器.docx(25页珍藏版)》请在冰豆网上搜索。
用单片机制作的智能八路抢答器
基于单片机的智能抢答器系统
摘要:
电子智能抢答计分器在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。
如果在抢答中,靠视觉是很难判断出哪组先答题。
利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
本设计使用STC89C51单片机来设计智能抢答器,组数可以在六组以内任意使用。
并且具有倒计时和时间设置及报警功能。
利用STC89C51单片机对信号进行锁存、显示等功能。
分别从硬件和软件两方面阐述了该控制系统的设计方法,并经过调试和运行使该系统达到预期目标,具有反应快、功能齐全、实用性强的特点。
引言
随着微电子技术、电力电子技术、传感器技术、永磁材料技术、自动控制技术、微机应用技术的发展,使单片微型计算机也得到迅速的发展,单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。
单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
单片机(单片微型计算机)的应用已经渗透到国民经济的各个部门和领域,它起到了越来越重要的作用。
单片微型计算机就是将中央处理单元、存储器、定时/计数器和多种接口都集成到一块集成电路芯片上的微型计算机。
因此一块芯片就构成了一台计算机。
它已成为工业控制领域、智能仪器仪表、尖端武器、日常生活中最广泛使用的计算机。
它作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。
同时楼宇智能化的发展与成熟,也为基于单片机的照明控制系统的普及与应用奠定了坚实的基础。
1系统设计要点
系统设计主要包括硬件和软件两大部分,依据控制系统的工作原理和技术性能,将硬件和软件分开设计。
硬件设计部分包括电路原理图、合理选择元器件、绘制线路图,然后对硬件进行调试、测试,以达到设计要求。
软件设计部分,首先在总体设计中完成系统总框图和各模块的功能设计,拟定详细的工作计划;然后进行具体设计,包括各模块的流程图,选择合适的编程语言和工具,进行代码
设计等;最后是对软件进行调试、测试,达到所需功能要求。
在系统设计中设计方法的选用是系统设计能否成功的关键。
硬件电路是采用结构化系统设计方法,该方法保证设计电路的标准化、模块化。
硬件电路的设计最重要的选择用于控制的单片机,并确定与之配套的外围芯片,使所设计的系统既经济又高性能。
硬件电路设计还包括输入输出接口设计,画出详细电路图,标出芯片的型号、器件参数值,根据电路图在仿真机上进行调试,发现设计不当及时修改,最终达到设计目的。
软件设计的方法与开发环境的选取有着直接的关系,本系统由于是采用51系列单片机,采用汇编语言编写程序。
系统软件设计采用模块化系统设计方法,先编写各个功能模块子程序,然后进行组合与调整,经过调试后,达到设计功能要求。
2各模块方案选择和论证
2.1抢答器显示模块
显示模块主要是显示抢答的时间,组别号码等。
我考虑有以下两种显示方案。
方案1:
使用液晶屏显示时间。
液晶显示屏(LCD)具有轻薄短小、低耗电量、无辐射危险,平面直角显示以及影像稳定不闪烁等优势,可视面积大,画面效果好,分辨率高,抗干扰能力强的特点。
但由于只需要显示时间和组别的数字,信息量比较少,且由于液晶是以点阵的模式显示各种符号,需要利用控制芯片创建字符库,编程工作量大,控制器的资源占用较多,其成本也偏高。
在使用时,不能有静电干扰,否则易烧坏液晶显示芯片,不易维护。
方案2:
使用传统的数码管显示。
数码管具有:
低能耗、低损耗、低压、寿命长、耐老化、防晒、防潮、防火、防高(低)温,对外界环境要求低,易于维护,同时其精度高,称量快,精确可靠,操作简单。
数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
根据以上的论述,采用方案二。
2.2控制器模块
控制器主要用于各模块控制显示、抢答、音乐等。
控制器的选择有以下两钟方案。
方案1:
采用FPGA(现场可编程门列阵)作为系统的控制器。
FPGA可以实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,
减小了体积,提高了稳定性,并且可以应用EDA软件仿真、调试,易于进行功能扩展。
FPGA采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模实时系统的控制核心。
但由于本设计对数据处理的速度要求不高,FPGA的高速处理的优势得不到充分体现,并且由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。
方案2:
采用ATMEL公司的STC89C51作为系统控制器的CPU方案。
单片机算术运算功能强,软件编程灵活、自由度大,可以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
基于以上分析拟订方案二。
2.3电源方案的选择
系统需要多个电源,STC89C51使用5V稳压电源,四联数码管供电电压为5V。
给出以下两个方案。
方案1:
采用升压型稳压电路。
用两片MC34063芯片分别将3V的电池电压进行直流崭波调压,得到5V稳压输出。
只需使用两节电池,既节省了电池,又减小系统体积重量但该电路供电电流小,供电时间短,无法使相对庞大的系统稳定运作。
方案2:
由于所做的设计不需要很高的精度要求,结合这个电源分析只要给系统5-9V的电压基本能输出显示和运用抢答,故只需利用一节9V的电池便可使整个电路工作。
该方法方便简单,节省材料。
综上所述,选择方案二。
2.4键盘的选择
键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。
键盘按结构形式可以分为非编码键盘和编码键盘,前者用软件方法产生键码,而后者则用硬件方法来产生键码。
在单片机中使用的都是非编码键盘,因为非编码键盘结构简单,成本低廉,非编码键盘的类型很多,常用的有独立式键盘,行列式键盘等。
方案1:
独立式键盘
键盘接口中使用多少根I/O线,键盘中就有几个按键,键盘接口使用了6根I/O口线,该键盘就有6个按键,这种类型的键盘,其按键比较少,且键盘
中各按键的工作互不干扰。
因此可以根据实际需要对键盘中的按键灵活的编码。
如图2-1。
图2-1独立式键盘
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
方案2:
行列式键盘
行列式键盘是用N条I/O线作为行线,M条I/O线作为列线组成的键盘,在行线和列线的每个交叉点上,设置一个按键中按键的个数是M*N个。
这种形式的键盘结构,能够有效的提高单片机系统中I/O的利用率,列线接P1.0~P1.3行线接P1.4~P1.7,行列适用于按键输入多的情况。
CPU对键盘的扫描可以采用取程序控制的随机方式,即只有在CPU空闲是时才去扫描键盘,响应操作人员的键盘输入,但CPU在执行应用程序的过程中,不能响应键盘输入,对键盘的扫描可以采用定时方式,即利用单片机内部定时器每隔一定时间对键盘扫描一次,这样控制方式,不管键盘上有无键闭合,CPU总是定时的关心键盘状态。
在大多数情况下,CPU对键盘可能进行空扫描。
为了提高CPU的效率而又能及时响应键盘输入,可以采用中断方式,既CPU平时不必扫描键盘,只要当键盘上有键盘闭合时就产生中断请求,向CPU申请中断后,立即对键盘上有键盘进性扫描,识别闭合键,并做相应的处理。
如图2-2所示。
图2-2行列式键盘
根据以上的论述,采用方案一,在本系统中采用了独立式键盘,其按键比较少,且键盘中各个按键的工作互不干扰。
3模块的最终方案
主控制器模块:
采用STC89C51单片机控制。
抢答器显示模块:
数码管显示。
电源方案的选择:
采用9V电池供电。
抢答器键盘模块:
独立式键盘。
4功能介绍
如果想调节抢答时间或答题时间,按"抢答时间调节"键或"答题时间调节"键进入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下"加1s"键,如果想减一秒按一下"-1s"键,时间LED上会显示改变后的时间,调整范围为0s~99s,0s时再减1s会跳到99,99s时再加1s会变到0s。
主持人按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设30s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设60s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。
倒数时间到小于5s会每秒响一下提示音。
如倒计时期间,主持人想停止倒计时可以随时按"停止"按键,系统会自动进入准备状态,等待主持人按"抢答开始"进入下次抢答计时。
如果主持人未按"抢答开始"键,而有人按了抢答按键,犯规抢答,LED上不断闪烁FF和犯规号数并响个不停,直到按下"停止"键为止。
5抢答器的软件设计
通过ST89C51芯片的控制,从而构成了整个电路。
抢答组数可以在六组以内任意使用,其流程如图5-3
图5-3抢答系统流程图
5.1数码显示软件设计
采用动态显示,显示器由4个共阴极数码管组成,数码显示程序流程如图5-4。
图5-4数码显示流程图
5.2音乐音频输出
音乐音频输出由
输出,流程图如图5-5
图5-5音乐音频输出流程图
6调试情况分析
6.1硬件调试
6.1.1电路板的制作与检查
考虑到本系统所用元器件较少,大部分功能都是通过软件编程来实现,同时也出于对毕业设计成本的考虑,因此所用到的板子是自己手工制作的PCB板。
在电路板的制作中,首先要进行线路的排布。
利用PROTEL软件模拟实际电路板的线路走向,尽量避免线路出现交叉短路,电源线路尽量安排在电路板的最外圈。
PCB板刻录完成之后,开始进行焊接工作。
焊接完后进行电路板检查,将原线路图与实际焊接的电路板进行对比,由于线路不多,所以用万用表的欧姆档或是短路声响指示功能来做焊点的检测,如此可以避免焊接时漏焊、虚焊和配线错误的问题,同时保证了所制作出来的线路与原设计线路的一致性。
6.1.2电路模块调试
本设计硬件部分主要为显示模块按键模块。
硬件电路功能检测主要针对这两部分进行测试。
对于显示电路,由于使用的是四联数码管显示屏,首先要确定数码管的共阴还是共阳极。
因此先用万用表检测是什么极性。
然后再先固定下,检查显示电路能否正常显示。
最后再焊接上去。
对于按键部分,首先要确定各个按键是否完好,先自己接到一个简易的电路上测试下,确定完好后再焊接。
6.2软件调试的基本方法
软件的设计与调试实行分模块实现方法。
本设计软件调试中的分模块包括显示功能模块、调正时间功能模块,抢答功能模块以报警功能模块。
各个独立模块功能调试成功后,将这些模块程序通过主程序合并在一起,最后再对合并后的总程序进行调试。
各软件模块首先要通过PC和仿真器进行软件调试,当仿真效果符合要求后,再烧写进单片机看能否在实际电路板上正常工作。
编程语言的软件设计采用MCS-51汇编语言编写,所使用的调试软件包括proteus和MedWin2.39
6.2.1软件调试问题分析
LED显示问题:
本次设计的最终方案是采用LED显示屏实现显示功能,最初数码管显示不正常,出现闪烁现象。
通过调试发现这是由于延时时间选择不当会使人眼产生视觉暂留效果,每一次显示时都必须加入适当的时间延时。
由于一开始所选用的延时时间太短,因此出现闪烁现象,在增加显示延时之后,数码管显示正常。
蜂鸣器异常启动问题:
蜂鸣器的启动/关闭是通过单片机输出的控制信号来实现的,当当前时间与闹钟设置时间比较吻合时,单片机将对闹铃控制口
执行取反命令,从而启动蜂鸣器发声。
一开始编写程序时,没有对
口的最初状态作正确设置,由于系统开机复位后,
口处于高电平状态,因此出现一开机蜂鸣器就处于启动状态的情况。
通过在主程序最开始加入对
口取零命令后,蜂鸣器启动/关闭控制恢复正常。
按键消抖问题:
在最初编写程序时,键盘控制部分按照常例加入了按键消抖程序。
在实际调试中,发现按键出现反应不灵敏现象。
这是因为在键盘控制程序中,除了消抖程序外,还加入了按键提示音程序(每次按压键盘时,蜂鸣器发出“哔”的一声提示音)。
由于在调用提示音子程序时,实际上已实现了一次时间的延时,因此再加入按键消抖程序的延时后,致使延时时间过长而出现按键反应不灵敏问题。
通过调试发现提示音子程序本身所产生的延时已能够满足按键消抖时间延迟的要求,因此在键盘控制程序中无需再加入专门的按键消抖程序。
在去除按键消抖程序后,按键控制灵敏度恢复正常。
附件1:
硬件电路原理图
附件2:
PCB图
附件3:
元器件清单列表
元器件描述
元器件编号
数量
单片机
STC89C51
1
LED显示屏
四联共阴
1
晶体振荡器
12MHZ
1
三极管
9012
1
蜂鸣器
/
1
电容
30PF
3
电阻
20K
1
9脚排阻
/
1
按键
/
13
附件4:
程序清单
OKEQU20H;抢答开始标志位
RINGEQU22H;响铃标志位
ORG0000H
AJMPMAIN
ORG0003H
AJMPINT0SUB
ORG000BH
AJMPT0INT
ORG0013H
AJMPINT1SUB
ORG001BH
AJMPT1INT
ORG0040H
MAIN:
MOVR1,#30;初设抢答时间为30s
MOVR2,#60;初设答题时间为60s
MOVTMOD,#11H;设置未定时器/模式1
MOVTH0,#0F0H
MOVTL0,#0FFH;越高发声频率越高,越尖
MOVTH1,#3CH
MOVTL1,#0B0H;50ms为一次溢出中断
SETBEA
SETBET0
SETBET1
SETBEX0
SETBEX1;允许四个中断,T0/T1/INT0/INT1
CLROK
CLRRING
SETBTR1
SETBTR0;一开始就运行定时器,以开始显示FFF.如果想重新计数,重置TH1/TL1就可以了
;=====查询程序=====
START:
MOVR5,#0BH
MOVR4,#0BH
MOVR3,#0BH
ACALLDISPLAY;未开始抢答时候显示FFF
JBINT0,NEXT;ddddddd
ACALLDELAY
JBINT0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
ACALLBARK;按键发声
MOVA,R1
MOVR6,A;送R1->R6,因为R1中保存了抢答时间
SETBOK;抢答标志位,用于COUNT只程序中判断是否查询抢答
MOVR3,#0AH;抢答只显示计时,灭号数
AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT:
JNBP1.0,FALSE1
JNBP1.1,FALSE2
JNBP1.2,FALSE3
JNBP1.3,FALSE4
JNBP1.4,FALSE5
JNBP1.5,FALSE6
AJMPSTART
TZ1:
JMPFALSE7
TZ2:
JMPFALSE8
;=====非法抢答处理程序=====
FALSE1:
ACALLBARK;按键发声
MOVR3,#01H
AJMPERROR
FALSE2:
ACALLBARK
MOVR3,#02H
AJMPERROR
FALSE3:
ACALLBARK
MOVR3,#03H
AJMPERROR
FALSE4:
ACALLBARK
MOVR3,#04H
AJMPERROR
FALSE5:
ACALLBARK
MOVR3,#05H
AJMPERROR
FALSE6:
ACALLBARK
MOVR3,#06H
AJMPERROR
FALSE7:
ACALLBARK
MOVR3,#07H
AJMPERROR
FALSE8:
ACALLBARK
MOVR3,#08H
AJMPERROR
;=====INT0(抢答时间R1调整程序)=====
INT0SUB:
MOVA,R1
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY;先在两个时间LED上显示R1
JNBT0,INC0;T0为+1s键,如按下跳到INCO
JNBT1,DEC0;T1为-1s键,如按下跳到DECO
JNBINT1,BACK0;INT1为确定键,如按下跳到BACKO
AJMPINT0SUB
INC0:
MOVA,R1
CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
AJMPINT0SUB
ADD0:
INCR1
ACALLDELAY1
AJMPINT0SUB
DEC0:
MOVA,R1
JZSETR1;如果R1为0,R1就置99,
DECR1
ACALLDELAY1
AJMPINT0SUB
SETR1:
MOVR1,#63H
ACALLDELAY1
AJMPINT0SUB
BACK0:
RETI
;=====INT1(回答时间R2调整程序)=====
INT1SUB:
MOVA,R2
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY
JNBT0,INC1
JNBT1,DEC1
JNBINT1,BACK1
AJMPINT1SUB
INC1:
MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
ACALLDELAY1
AJMPINT1SUB
ADD1:
INCR2
ACALLDELAY1
AJMPINT1SUB
DEC1:
MOVA,R2
JZSETR2
DECR2
ACALLDELAY1
AJMPINT1SUB
SETR2:
MOVR2,#63H
ACALLDELAY1
AJMPINT1SUB
BACK1:
RETI
;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
COUNT:
MOVR0,#00H;重置定时器中断次数
MOVTH1,#3CH
MOVTL1,#0B0H;重置定时器
RECOUNT:
MOVA,R6;R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
MOVB,#0AH
DIVAB;除十分出个位/十位
MOV30H,A;十位存于(30H)
MOV31H,B;个位存于(31H)
MOVR5,30H;取十位
MOVR4,31H;取个位
MOVA,R6
SUBBA,#07H
JNCLARGER;大于5s跳到LARGER,小于等于5s会提醒
MOVA,R0
CJNEA,#0AH,FULL;1s中0.5s向下运行
CLRRING
AJMPCHECK
FULL:
CJNEA,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计
SETBRING
MOVA,R6
JZQUIT;计时完毕
MOVR0,#00H
DECR6;一秒标志减1
AJMPCHECK
LARGER:
MOVA,R0
CJNEA,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"
DECR6;计时一秒R6自动减1
MOVR0,#00H
CHECK:
JNBT1,QUIT;如按下停止键退出
ACALLDISPLAY
JBOK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMPRECOUNT
ACCOUT:
JNBP1.0,TRUE1
JNBP1.1,TRUE2
JNBP1.2,TRUE3
JNBP1.3,TRUE4
JNBP1.4,TRUE5
JNBP1.5,TRUE6
JNBP1.6,TZ3
JNBP1.7,TZ4
AJMPRECOUNT
TZ3:
JMPTRUE7
TZ4:
JMPTRUE8
QUIT:
CLROK;如果按下了"停止键"执行的程序
CLRRING
AJMPSTART
;=====正常抢答处理程序=====
TRUE1:
ACALLBARK;按键发声
MOVA,R2
MOVR6,A;抢答时间R2送R6
MOVR3,#01H
CLROK;因为答题的计时不再查询抢答,所以就锁了抢答
AJMPCOUNT
TRUE2:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#02H
CLROK
AJMPCOUNT
TRUE3:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#03H
CLROK
AJMPCOUNT
TRUE4:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#04H
CLROK
AJMPCOUNT
TRUE5:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#05H
CLROK
AJMPCOUNT
TRUE6:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#06H
CLROK
AJMPCOUNT
TRUE7:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#07H
CLROK
AJMPCOUNT
TRUE8:
ACALLBARK;
MOVA,R2
MOVR6,A
MOVR3,#08H
CLROK
AJMPCOUNT
;=====犯规抢答程序=====
ERROR:
MOVR0,#00H
MOVTH1,#3CH
MOVTL1,#0B0H
MOV34H,R3;犯规号数暂存与(34H)
HERE:
MOVA,R0
CJNEA,#0AH,FLASH;0.5s向下运行->灭并停响
CLRRING
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三灯全灭
AJMPCHECK1
FLASH:
CJNEA,#14H,CHECK1;下面是1s的情况,响并显示号数并清R0,重新计
SETBRING
MOVR0,#00H
MOVR3,34H;取回号数
MOVR5,#0BH
MOVR4,#0BH;显示FF和号数
AJMPCHECK1
CHECK1:
JNBT1,QUIT1
A