六路抢答器设计.docx
《六路抢答器设计.docx》由会员分享,可在线阅读,更多相关《六路抢答器设计.docx(17页珍藏版)》请在冰豆网上搜索。
六路抢答器设计
1问题描述
1.1设计任务
设计制作一个可容纳六组参赛队的智力竞赛抢答器,每组设置一个抢答按钮供抢答者使用。
电路具有第一抢答信号的鉴别和锁存功能。
1.2设计要求
要求确定第一个输入的抢答信号,并保持该信号不变,同时使后输入的信号无效。
在发出“抢答开始命令”后开始计时,经过规定的抢答时间后若没有人抢答,就发出“抢答时间到”信号,并锁定输入电路,使各路抢答信号无法再输入。
设置计分电路,开始时每组预置为100分或其他,答对一次加10分,答错减10分(可选)。
2设计思想
课程设计此次课程设计有点难度,刚开始是一直都没有设计思路,后来通过在网上收集资料,参考一些比较成功的设计思路。
慢慢就有了一些自己的想法以及思路的形成。
我设计的智力竞赛抢答器可同时供6名选手或6个代表队参加比赛,他们的编号分别是1、2、3、4、5、6、,各用一个抢答按钮,按钮的编号与选手的编号是相对应的,分别是S1、S2、S3、S4、S5、S6;给节目主持人设置二个控制按钮开关,用来控制系统的清零和抢答的开始抢答器具有程序存储、数据锁存和显示功能,抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在数码管上显示出选手的编号,同时蜂鸣器给出音响提示,此外,要封锁输入电路,禁止其他选手抢答,优先抢答选手的编号一直保持到主持人将系统清零为止如果想调节抢答时间或答题时间,按"抢答时间调节"键或"答题时间调节"键进入调节状态,此时会显示现在设定的抢答时间或回答时间值,如想加一秒按一下"加1s"键,如果想减一秒按一下"-1s"键,时间就会显示改变后的时间,调整范围为0s~99s,0s时再减1s会跳到99,99s时再加1s会变到0s,主持人按"抢答开始"键,会有提示音,并立刻进入抢答倒计时(预设15s抢答时间),如有选手抢答,会有提示音,并会显示其号数并立刻进入回答倒计时(预设10s抢答时间),不进行抢答查询,所以只有第一个按抢答的选手有效。
倒数时间到小于5s会每秒响一下提示音。
如倒计时期间,主持人想停止倒计时可以随时按"停止"按键,系统会自动进入准备状态,等待主持人按下“抢答开始开关”进入下次抢答计时。
如果主持人未按"抢答开始"键,而有人按了抢答按键,犯规抢答,显示器上不断闪烁FF和犯规号数并响个不停,直到按下"停止"键为止。
有想过设计记分系统但程序太过于复杂,在我的能力之外,因此只能有以上粗陋的设计思路。
我相信还有很大的发展的空间需要我们去完善,去扩展。
3电路原理与电路图
3.1电路原理图:
图3.1硬件电路图
3.2电路原理和过程说明
电路工作原理和过程说明:
上图是硬件电路图应用单片机实现了六路抢答的功能,89c51是性能很好的单片机运用了单片机的各个接口的原理。
其中p1.1到p1.6是抢答开关的接口,p1.0是开始按键的接口,p1.7是停止按键的接口。
只要一按下开始键电路就会开始倒计时,然后选手就开始抢答,在LED显示器上显示选手的编号以及时间的倒计时,但在规定时间的后5s还没回答出就会发出警告的声音。
当有选手犯规时则显示选手的编号同时发出报警的声音。
4流程图与仿真结果
4.1系统原理
如图2.2所示:
图2.2系统原理图
说明:
系统原理图是根据单片机的功能和不同的程序而设计的一个模块,能够反应系统的工作原理。
让你在没看到元件之前就先知道运用的范围,给人初步的认知。
此系统原理图简单明了,分为三大部分有系统初始化模块、按键模块(非法抢答模块、正确抢答模块、调整抢答时间、调整回答时间)、数码显示模块。
4.2程序流程图
否
是
否
否否
是是是
否
是
图2.1流程图
说明:
开始键按下,进入抢答倒计时,要是有人抢答则开始回答问题。
如果没人抢答则且倒计时间到则按超时处理。
要是在没有开始就有人抢答则按犯规处理,并结束此次抢答进入下一次抢答。
4.3仿真结果及说明
说明:
当按下PIAY键时出现如下图所示的起始现象。
这段由主持人控制,其可以进行清零和抢答开始的控制。
图4.1
说明:
按下开始开关即为抢答时间倒计时15S,此时间可以随意设置。
如图4.2所示但在截图之前已经过去了2s
图4.2
说明:
当按下开始键后选手就可以抢答,下图4.3显示的是一号选手正确抢答,回答时间为10s开始倒计时。
对选手的序号进行锁存显示器显示其序号。
证明其数据锁存、显示功能正常。
图4.3
说明:
当按下开始键后选手就可以抢答,下图4.4显示的是五号选手正确抢答,回答时间为10s开始倒计时。
图4.4
说明:
回答时间可以调整下图4.5为按下回答时间调整开关时间从15加到60S
图4.5
说明:
当有选手犯规会出现如图4.6所示情况,显示犯规选手的编号并且不停的跳动发出报警的声音
图4.6
5设计总结
课程设计很有挑战性也很有难度,我在这次课程设计中花费了很多的时间和精力。
从开始选择课题到最后的成型阶段遇到了很多的困难。
但在其中收获的遇到的困难要多的多,因此还是非常乐意去将课程搞好。
在这次课程设计中申老师给了我很多的建议和帮助,在开始根本没有思路的时候我第一反应就是问老师,老师在第一时间给了我答复。
模型的建立需要一段时间的研究,这就是体现我们组员的合作精神的时候了,每个人都把自己的想法说出来然后进行讨论。
在老师的要求下我们达成了一致,就是在共同设计的基础上要有所不同。
在遇到问题时我们就会在网上或通过电话联系争取在老师规定的时间内做好。
对有些我们不知道的东西我们很主动的联系老师,比喻我在选择仿真器件的时候不知道哪些功能要全面一些。
在选择单片机的类型方面遇到了一些难题,因为不同的单片机的功能不完全相同。
比喻89c51就要比80c51要强很多,所以必须得考虑好该使用那些器件。
我觉得什么事情都的自己去花心思才能得到自己想要的结果,你只有自己全心的去做了是不会让老师失望的。
总的来说这次课程设计我收获了很多东西,使我的动手能力有了极大的提高,也让我在考虑问题的多样性方面更加全面。
我个人认为这次课程设计是成功的,让我明白了只要自己能够坚持去做一件事,并且有多学多问的习惯没有什么事是做不到的。
加之老师的帮助以及同学之间的合作,我觉得只要自己想去做就一定会完成的。
我觉得人生在世是需要很多帮助的,单凭自己一个人是不会过的很好的。
当我们帮助别人或被帮助时我们都的怀着一颗感谢的心。
在这次课程设计中我要感谢我的指导老师申寿云老师,申老师是一个非常负责的老师,值得信任。
同时也很感谢给过我帮助的同学,要不是你们的帮助我是很难完成这次课程设计的,谢谢你们的帮助和支持。
参考文献
[1]李建忠.单片机原理及应用.西安电子科技大学出版社,2008
[2]张迎新.单片机初级教程——单片机基础.北京航空航天大学出版社,2006[3]张俊谟.单片机中级教程-----原理与应用.北京航空航天大学出版社,2006
附录
程序设计源代码:
OKEQU20H ;抢答开始标志位;将P1口与P2口互换,P3.0-P1.0,P3.1-P1.7
RINGEQU22H ;响铃标志位
ORG0000H
AJMPMAIN
ORG0003H
AJMPINT0SUB
ORG000BH
AJMPT0INT
ORG0013H
AJMPINT1SUB
ORG001BH
AJMPT1INT
ORG0040H
;主程序
MAIN:
MOVR1,#0FH ;初设抢答时间为15s
MOVR2,#0AH ;初设答题时间为10s
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
JBP1.0,NEXT ;ddddddd
ACALLDELAY
JBP1.0,NEXT ;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
ACALLBARK ;按键发声
MOVA,R1
MOVR6,A ;送R1->R6,因为R1中保存了抢答时间
SETBOK ;抢答标志位,用于COUNT只程序中判断是否查询抢答
MOVR3,0AH ;抢答只显示计时,灭号数
AJMPCOUNT ;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT:
JNBP1.1,FALSE1
JNBP1.2,FALSE2
JNBP1.3,FALSE3
JNBP1.4,FALSE4
JNBP1.5,FALSE5
JNBP1.6,FALSE6
AJMPSTART
;=====非法抢答处理程序=====
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
;=====INT0(抢答时间R1调整程序)=====
INT0SUB:
MOVA,R1
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY ;先在两个时间LED上显示R1
JNBP3.4,INC0 ;P3.4为+1s键,如按下跳到INCO
JNBP3.5,DEC0 ;P3.5为-1s键,如按下跳到DECO
JNBP1.7,BACK0 ;P3.1为确定键,如按下跳到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
JNBP3.4,INC1
JNBP3.5,DEC1
JNBP1.7,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:
JNBP1.7,QUIT ;如按下停止键退出
ACALLDISPLAY
JBOK,ACCOUT ;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMPRECOUNT
ACCOUT:
JNBP1.1,TRUE1
JNBP1.2,TRUE2
JNBP1.3,TRUE3
JNBP1.4,TRUE4
JNBP1.5,TRUE5
JNBP1.6,TRUE5
AJMPRECOUNT
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
;=====犯规抢答程序=====
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:
JNBP1.7,QUIT1
ACALLDISPLAY
AJMPHERE
QUIT1:
CLRRING
CLROK
AJMPSTART
;=====显示程序=====
DISPLAY:
MOVDPTR,#DAT1 ;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
MOVA,R5
MOVCA,@A+DPTR
MOVP2,#01H
MOVP0,A
ACALLDELAY
MOVDPTR,#DAT2
MOVA,R4
MOVCA,@A+DPTR
MOVP2,#02H
MOVP0,A
ACALLDELAY
MOVA,R3
MOVCA,@A+DPTR
MOVP2,#04H
MOVP0,A
ACALLDELAY
RET
DAT1:
DB00H,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;"灭","1","2","3","4","5","6","7","8","9","灭","F"
DAT2:
DB3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,00H,71H
;第一个为零,其他与上相同,因为十位如果为零显示熄灭
;====加减时间延时(起到不会按下就加N个数)======
DELAY1:
MOV35H,#08H
LOOP0:
ACALLDISPLAY
DJNZ35H,LOOP0
RET
;=====延时(显示和去抖动用到)=====
DELAY:
MOV32H,#12H
LOOP:
MOV33H,#0AFH
LOOP1:
DJNZ33H,LOOP1
DJNZ32H,LOOP
RET
;=====发声程序=====
BARK:
SETBRING
ACALLDELAY1
ACALLDELAY1
CLRRING ;按键发声
RET
;=====TO溢出中断(响铃程序)=====
T0INT:
MOVTH0,#0ECH
MOVTL0,#0FFH
JNBRING,OUT;
CPLP3.6 ;RING标志位为1时候P3.6口不短取反使喇叭发出一定频率的声音
OUT:
RETI
;=====T1溢出中断(计时程序)=====
T1INT:
MOVTH1,#3CH
MOVTL1,#0B0H
INCR0
RETI
END