基于单片机的智能抢答器系统八路Word文档格式.docx
《基于单片机的智能抢答器系统八路Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能抢答器系统八路Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
数码显示是采用BCD编码显示数字,程序编译容易,资源占用较少。
根据以上的论述,采用方案二。
2.2控制器模块
控制器主要用于各模块控制显示、抢答、音乐等。
控制器的选择有以下两钟方案。
采用FPGA(现场可编程门列阵)作为系统的控制器。
FPGA可以实现各种复杂的逻辑功能,规模大,密度高,它将所有器件集成在一块芯片上,
减小了体积,提高了稳定性,并且可以应用EDA软件仿真、调试,易于进行功能扩展。
FPGA采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模实时系统的控制核心。
但由于本设计对数据处理的速度要求不高,FPGA的高速处理的优势得不到充分体现,并且由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。
采用ATMEL公司的STC89C51作为系统控制器的CPU方案。
单片机算术运算功能强,软件编程灵活、自由度大,可以用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
基于以上分析拟订方案二。
2.3电源方案的选择
系统需要多个电源,STC89C51使用5V稳压电源,四联数码管供电电压为5V。
给出以下两个方案。
采用升压型稳压电路。
用两片MC34063芯片分别将3V的电池电压进行直流崭波调压,得到5V稳压输出。
只需使用两节电池,既节省了电池,又减小系统体积重量但该电路供电电流小,供电时间短,无法使相对庞大的系统稳定运作。
由于所做的设计不需要很高的精度要求,结合这个电源分析只要给系统5-9V的电压基本能输出显示和运用抢答,故只需利用一节9V的电池便可使整个电路工作。
该方法方便简单,节省材料。
综上所述,选择方案二。
2.4键盘的选择
键盘是单片机不可缺少的输入设备,是实现人机对话的纽带。
键盘按结构形式可以分为非编码键盘和编码键盘,前者用软件方法产生键码,而后者则用硬件方法来产生键码。
在单片机中使用的都是非编码键盘,因为非编码键盘结构简单,成本低廉,非编码键盘的类型很多,常用的有独立式键盘,行列式键盘等。
独立式键盘
键盘接口中使用多少根I/O线,键盘中就有几个按键,键盘接口使用了6根I/O口线,该键盘就有6个按键,这种类型的键盘,其按键比较少,且键盘
中各按键的工作互不干扰。
因此可以根据实际需要对键盘中的按键灵活的编码。
如图2-1。
图2-1独立式键盘
最简单的编码方式就是根据I/O输入口所直接反映的相应按键,按下的状态进行编码,称按键直接状态码,对于这样编码的独立式键盘,CPU可以通过直接读取I/O口的状态来获取按键的直接状态编码值,根据这个值直接进行按键识别,这样形式的键盘结构简单,按键识别容易。
独立式键盘的缺点是需要占用比较多的I/O口线,当单片机应用系统键盘中需要的按键比较少或I/O口线比较富余时,可以采用这样类型的键盘。
行列式键盘
行列式键盘是用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显示屏
四联共阴
晶体振荡器
12MHZ
三极管
9012
蜂鸣器
/
电容
30PF
3
电阻
20K
9脚排阻
按键
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
去抖动,如果"
开始键"
按下就向下执行,否者跳到非法抢答查询
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:
MOVR3,#01H
AJMPERROR
FALSE2:
ACALLBARK
MOVR3,#02H
FALSE3:
MOVR3,#03H
FALSE4:
MOVR3,#04H
FALSE5:
MOVR3,#05H
FALSE6:
MOVR3,#06H
FALSE7:
MOVR3,#07H
FALSE8:
MOVR3,#08H
=====INT0(抢答时间R1调整程序)=====
INT0SUB:
MOVA,R1
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
先在两个时间LED上显示R1
JNBT0,INC0;
T0为+1s键,如按下跳到INCO
JNBT1,DEC0;
T1为-1s键,如按下跳到DECO
JNBINT1,BACK0;
INT1为确定键,如按下跳到BACKO
AJMPINT0SUB
INC0:
CJNEA,#63H,ADD0;
如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
ADD0:
INCR1
DEC0:
JZSETR1;
如果R1为0,R1就置99,
DECR1
SETR1:
MOVR1,#63H
BACK0:
RETI
=====INT1(回答时间R2调整程序)=====
INT1SUB:
MOVA,R2
MOVR5,A
ACALLDISPLAY
JNBT0,INC1
JNBT1,DEC1
JNBINT1,BACK1
INC1:
MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
AJMPINT1SUB
ADD1:
INCR2
DEC1:
JZSETR2
DECR2
SETR2:
MOVR2,#63H
BACK1:
=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
COUNT:
MOVR0,#00H;
重置定时器中断次数
重置定时器
RECOUNT:
MOVA,R6;
R6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
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
JZQUIT;
计时完毕
MOVR0,#00H
DECR6;
一秒标志减1
LARGER:
如果1s向下运行,否者跳到查"
停/显示"
计时一秒R6自动减1
CHECK:
JNBT1,QUIT;
如按下停止键退出
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
TZ3:
JMPTRUE7
TZ4:
JMPTRUE8
QUIT:
CLROK;
如果按下了"
停止键"
执行的程序
=====正常抢答处理程序=====
TRUE1:
抢答时间R2送R6
MOVR3,#01H
因为答题的计时不再查询抢答,所以就锁了抢答
AJMPCOUNT
TRUE2:
ACALLBARK;
MOVR6,A
MOVR3,#02H
TRUE3:
MOVR3,#03H
TRUE4:
MOVR3,#04H
TRUE5:
MOVR3,#05H
TRUE6:
MOVR3,#06H
TRUE7:
MOVR3,#07H
TRUE8:
MOVR3,#08H
=====犯规抢答程序=====
ERROR:
MOVTL1,#0B0H
MOV34H,R3;
犯规号数暂存与(34H)
HERE:
CJNEA,#0AH,FLASH;
0.5s向下运行->
灭并停响
MOVR4,#0AH
MOVR5,#0AH;
三灯全灭
AJMPCHECK1
FLASH:
CJNEA,#14H,CHECK1;
MOVR3,34H;
取回号数
MOVR4,#0BH;
显示FF和号数
CHECK1:
JNBT1,QUIT1