单片机路智力竞赛抢答器设计.docx
《单片机路智力竞赛抢答器设计.docx》由会员分享,可在线阅读,更多相关《单片机路智力竞赛抢答器设计.docx(29页珍藏版)》请在冰点文库上搜索。
单片机路智力竞赛抢答器设计
1.设计内容及要求
1.1设计任务
8路智力竞赛抢答器
1.2设计要求
(1)利用单片机设计并制作智力竞赛抢答器。
(2)设计一个6路或以上的抢答器;
(3)有主持人按键,只有主持人按键按下之后,才允许选手抢答,否则视为犯规,犯规时有对应指示灯亮;
(4)设定抢答时间限制,超过时间若无人抢答则该题作废,并用发光二极管闪烁报警;
(5)抢答限制时间用数码管倒计时显示;
(6)有复位按钮,出现犯规或超时后可复位。
1.3设计方案
1、当主持人按下开始键,开始抢答,初始倒计时30秒开始倒计时,选手抢答成功,进入60秒答题倒计时;
2、如果在主持人按下开始键前按下抢答按钮,抢答犯规,显示器显示犯规选手号码,倒计时和选手号码显示闪烁;
3、主持人可以通过,按"抢答时间调节"键或"答题时间调节"键进入调节状态,此时会显示初始的抢答时间或回答时间,如想加一秒按一下"时间+"键,如果想减一秒按一下"时间-"键,时间LED上会显示改变后的时间,调整范围为0s~99s,0s时再减1s会跳到99,99s时再加1s会变到0s。
4、P3.0为开始抢答,P3.1为复位,p1.0-p1.7为八路抢答输入数码管段选P0口,位选P2口低3位。
P3.2抢答时间调整整,P3.3回答时间调整,P3.4为时间加1调整,P3.5为时间减1调整。
2.抢答器硬件设计
本设计基于AT89S52单片机
AT89S52的引脚图
AT89C52芯片引脚图
2.1时钟频率电路的设计
单片机必须在时钟的驱动下才能工作.在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
1)图2-2外部振荡源电路
一般选用石英晶体振荡器。
此电路在加电大约延迟10ms后振荡器起振,在XTAL2引脚产生幅度为3V左右的正弦波时钟信号,其振荡频率主要由石英晶振的频率确定。
电路中两个电容C1,C2的作用有两个:
一是帮助振荡器起振;二是对振荡器的频率进行微调。
C1,C2的典型值为30PF。
2)单片机在工作时,由内部振荡器产生或由外直接输入的送至内部控制逻辑单元的时钟信号的周期称为时钟周期。
其大小是时钟信号频率的倒数,常用fosc表示。
如时钟频率为12MHz,即fosc=12MHz,则时钟周期为1/12µs。
2.2复位电路
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,其电路图如图4所示:
值得注意的是,在设计当中使用到了硬件复位和软件复位两种功能,由上面的硬件复位后的各状态可知寄存器及存储器的值都恢复到了初始值,而前面的功能介绍中提到了倒计时时间的记忆功能,该功能的实现的前提条件就是不能对单片机进行硬件复位,所以设定了软复位功能。
软复位实际上就是当程序执行完毕之后,将程序指针通过一条跳转指令让它跳转到程序执行的起始地址。
2.3显示电路的设计
电路采用的是CAJ5461BH4位数码管显示,4数码管实物及接线如图所示:
2.4选手抢答按键电路的设计
选手抢答按键选用的是以P1口为输入,电路图如图所示:
2.5主持人按键电路设计
支持人按键电路选用P3口为输入,支持人按键“开始”键接P3.0,“复位”键接P3.1,“修改抢答时间”接P3.2,“修改答题时间”接P3.3,“时间+”接P3.4,“时间-”接P3.5,电路图如图所示:
3.抢答器的程序流程
本设计采用P3.2、P3.3分别接抢答时间调节和答题时间调节按钮,即通过外部中断0、外部中断1分别控制抢答、答题时间的调整。
因此,设计的软件部分可分为工作模块、外部中断0模块、外部中断1模块。
对流程图的分析,也分三部分来介绍。
3.1正常抢答流程
初始化部分:
包括对定时计数器的工作方式、初始化数值的设置,还包括对抢答时间与答题时间的预设,另外,还应对外部中断0、外部中断1进行开放。
3.2抢答时间调整
抢答时间调整的流程图见下图
P3.2对应键的按下,便进入INT0中断过程。
通过不断对P3.4(加1s)和P3.5(减1s)进行不断的查询,来对抢答时间进行调整:
发现P3.4按下,就对原抢答时间加1s,发现P3.5下,就对原抢答时间减1s并调用显示程序。
根据设计要求,当加至99s时,若再加1s,则时间变为0;当减至0s后,若再减一秒,时间变为99s。
因此,流程中应该对当前时间于99s或0s比较,再作出相应处理。
另外,在中断过程中还需要不时对停止按钮进行查询,一旦发现其按下,立即中断返回。
由于本中断过程在返回前一直是循环执行的,因此,只需要在每次循环末查询一次即可,如流程图所示
3.3答题时间调整流程
与抢答时间调整类似,一旦因P3.3对应的按钮按下,便进入INT1中断过程。
通过不断对P3.4(加1s)和P3.5(减1s)进行不断的查询,来对抢答时间进行调整:
发现P3.4按下,就对原抢答时间加1s,发现P3.5下,就对原抢答时间减1s并调用显示程序。
当加至99s时,若再加1s,则时间变为0;当减至0s后,若再减一秒,时间变为99s。
因此,流程中应该对当前时间于99s或0s比较,再作出相应处理。
4.抢答器制作调试问题
4.1在仿真中出现的问题
(1)电路接好后将16进制文件写入单片机内,在数码管显示中,显示的是乱码。
解决方法:
1、检查程序中的字型码是否是共阳极显示的字型码,将共阴极字型码改为共阳极字型码;
2、检查电路图,查看4位数码管显示是不是共阳极显示,将共阴极更改为共阳极显示
(2)数码管显示的数字出现抖动
解决方法:
在显示程序中更改显示延时时间,加长显示的延时时间
(3)在调节抢答时间或调节答题时间是按一次按键显示器上的数字会跳动多次
解决方法:
在按键去抖动程序中加长去抖动的延时时间
4.2在实际电路制作中出现的问题
(1)电路焊接完成将16进制程序烧写进单片机后,电路板不能正常工作,数码管没显示。
解决方法:
检查电路,确认单片机最小系统是否正确及4位数码管与单片机接线是否正确,用万用表检查各管脚间是否短路,排除短路的现象。
(2)最小系统正确及各线路中没有短路接线,数码管全亮,但正确的显示没用显示。
解决方法:
在显示程序中加入将个显示器清零的程序
5.仿真测试效果
5.1初始及复位显示
单片机初始显示及复位显示
5.2正常抢答显示
(1)主持人按下开始键,数码管显示倒计时
抢答倒计时
(2)选手抢答成功,数码管显示选手号码及答题倒计时
4号选手抢答
选手号码及答题倒计时显示
5.3犯规显示
支持人没按下开始键,选手抢答犯规。
数码管显示选手号码并闪烁
4号选手抢答犯规显示
犯规显示
5.4抢答时间调节
支持人按下“复位键”P3.1,按下“修改抢答时间”P3.2,选择调节抢答时间,按“时间+”P3.4和“时间-”P3.5,进行抢答时间的调节;主持人要修改答题时间,按下“复位键”P3.1,按下“修改答题时间”P3.3,选择调节抢答时间,按“时间+”P3.4和“时间-”P3.5,进行答题时间时间的调节,显示如图所示:
抢答时间加7秒显示
答题时间修改显示
6.硬件电路功能显示
6.1电路初始化显示
电路初始时数码管显示PPP
6.2正常抢答显示
1、当主持人按下开始按键后,数码管显示30秒倒计时
2、选手抢答成功,数码管显示选手号码,并显示答题时间倒计时
6.3抢答犯规显示
主持人开始按键没按下,选手按下抢答键后犯规,数码管显示犯规选手号码,倒计时显示处显示PP
6.4复位键显示
当支持人按下复位键,数码管显示初始值,显示PPP
7.实训总结
在为期两个周的单片机实训中,通过完成所选的实训题目,我们将课本中的所学到知识应用到制作中,加深了我们对课本知识的理解,在实训中遇到的许多问题,通过查阅资料和老师的讲解我们对单片机的应用又更进一层,在制作实际电路的过程中,不仅锻炼了我们的的动手能力,通过对AT89S52单片机的应用使我们加深了对单片机的认识,将课本上的知识以实际生活中的应用相结合,在制作抢答器的过程中我们遇到了许多的问题,在试过许多解决方案后,没有解决问题,也想过放弃,但还是坚持了下来。
在你解决一个问题,结果出来后,就会非常的兴奋。
在实训中学到的东西对我们以后的生活学习也有很大的帮助在我们的生活中无乱多大的困难挡住我们前进的路,我们都不能放弃,世上没有解决不了的困难,之遥我们坚持下来,成功就在手中。
8.参考文献
[1]胡建主编.《单片机原理及接口技术实践教程》.北京:
机械工业出版社.2004
[2]何立民.《MCS-51系列单片机应用系统设计》.北京:
北京航空航天大学出版社.1990
[3]潘永雄.《新编单片机原理与应用》.西安:
西安电子科技大学出版社.2003
[4]张迎新.《单片微型计算机原理、应用及接口技术》(第2版).国防工业出版社.2004
[5]苏平.《单片机原理与接口技术》.电子工业出版社.2003
附录:
8路抢答器源程序
OKEQU20H;抢答开始标志位?
ORG0000H
AJMPMAIN
ORG0003H
AJMPINT_0
ORG000BH
AJMPT0INT
ORG0013H
AJMPINT_1
ORG001BH
AJMPT1INT
ORG0040H
MAIN:
MOVR1,#30;初设抢答时间为30s
MOVR2,#50
MOVTMOD,#11H;设置未定时器/模式1
MOVTH1,#3CH
MOVTL1,#0B0H
SETBEA
SETBET0
SETBET1
SETBEX0
SETBEX1;允许四个中断,T0/T1/INT0/INT1
CLROK
SETBTR1
SETBTR0;
START:
MOVR5,#0BH
MOVR4,#0BH
MOVR3,#0BH
ACALLDISPLAY;未开始抢答时候显示000
JBP3.0,NEXT;
ACALLDELAY
JBP3.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
MOVA,R1
MOVR6,A;送R1->R6,因为R1中保存了抢答时间
SETBOK;抢答标志位,用于COUNT只程序中判断是否查询抢答
MOVR7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号
MOVR3,#0AH;抢答只显示计时,灭号数
AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT:
JNBP1.0,K1
JNBP1.1,K2
JNBP1.2,K3
JNBP1.3,K4
JNBP1.4,K5
JNBP1.5,K6
JNBP1.6,K7
JNBP1.7,K8
AJMPSTART;=====非法抢答处理程序=====
K1:
MOVR3,#01H
AJMPFANGUI
K2:
MOVR3,#02H
AJMPFANGUI
K3:
MOVR3,#03H
AJMPFANGUI
K4:
MOVR3,#04H
AJMPFANGUI
K5:
MOVR3,#05H
AJMPFANGUI
K6:
MOVR3,#06H
AJMPFANGUI
K7:
MOVR3,#07H
AJMPFANGUI
K8:
MOVR3,#08H
AJMPFANGUI
/*=====INT0(抢答时间R1调整程序)=====*/
INT_0:
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
JNBP3.1,BACK0;P3.1为确定键,如按下跳到BACKO
AJMPINT_0
INC0:
MOVA,R1
CJNEA,#63H,ADD0;如果不是99,R2加1,如果加到99,R1就置0,重新加起。
MOVR1,#00H
ACALLDELAY1
AJMPINT_0
ADD0:
INCR1
ACALLDELAY1
AJMPINT_0
DEC0:
MOVA,R1
JZSETR1;如果R1为0,R1就置99,
DECR1
ACALLDELAY1
AJMPINT_0
SETR1:
MOVR1,#63H
ACALLDELAY1
AJMPINT_0
BACK0:
RETI
/*=====INT1(回答时间R2调整程序)=====*/
INT_1:
MOVA,R2
MOVB,#0AH
DIVAB
MOVR5,A
MOVR4,B
MOVR3,#0AH
ACALLDISPLAY
JNBP3.4,INC1
JNBP3.5,DEC1
JNBP3.1,BACK1
AJMPINT_1
INC1:
MOVA,R2
CJNEA,#63H,ADD1
MOVR2,#00H
ACALLDELAY1
AJMPINT_1
ADD1:
INCR2
ACALLDELAY1
AJMPINT_1
DEC1:
MOVA,R2
JZSETR2
DECR2
ACALLDELAY1
AJMPINT_1
SETR2:
MOVR2,#63H
ACALLDELAY1
AJMPINT_1
BACK1:
RETI
/*=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====*/
REPEAT:
MOVA,R2;使用设定始浔重新计时
MOVR6,A
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向下运行
AJMPCHECK
FULL:
CJNEA,#14H,CHECK;下面是1s的情况,响并显示号数并清R0,重新计
MOVA,R6
JZQUIT;计时完毕
MOVR0,#00H
DECR6;一秒标志减1
AJMPCHECK
LARGER:
MOVA,R0
CJNEA,#14H,CHECK;如果1s向下运行,否者跳到查"停/显示"
DECR6;计时一秒R6自动减1
MOVR0,#00H
CHECK:
JNBP3.1,QUIT;如按下停止键退出
JNBOK,CHECKK;只在回答倒计时才有效
AJMPNEXTT
CHECKK:
JNBP3.0,REPEAT;判断是否使用锦囊
NEXTT:
ACALLDISPLAY
JBOK,ACCOUT;如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数(这里起到锁抢答作用)
AJMPRECOUNT
ACCOUT:
MOVA,36H
JNBACC.0,TRUE1
JNBACC.1,TRUE2
JNBACC.2,TRUE3
JNBACC.3,TRUE4
JNBACC.4,TRUE5
JNBACC.5,TRUE6
JNBACC.6,TZ1
JNBACC.7,TZ2
AJMPRECOUNT
TZ1:
JMPTRUE7
TZ2:
JMPTRUE8
QUIT:
CLROK;如果按下了"停止键"执行的程序
AJMPSTART
/*=====正常抢答处理程序=====*/
TRUE1:
MOVA,R2
MOVR6,A;抢答时间R2送R6
MOVR3,#01H
CLROK;因为答题的计时不再查询抢答,所以就锁了抢答
AJMPCOUNT
TRUE2:
MOVA,R2
MOVR6,A
MOVR3,#02H
CLROK
AJMPCOUNT
TRUE3:
MOVA,R2
MOVR6,A
MOVR3,#03H
CLROK
AJMPCOUNT
TRUE4:
MOVA,R2
MOVR6,A
MOVR3,#04H
CLROK
AJMPCOUNT
TRUE5:
MOVA,R2
MOVR6,A
MOVR3,#05H
CLROK
AJMPCOUNT
TRUE6:
MOVA,R2
MOVR6,A
MOVR3,#06H
CLROK
AJMPCOUNT
TRUE7:
MOVA,R2
MOVR6,A
MOVR3,#07H
CLROK
AJMPCOUNT
TRUE8:
MOVA,R2
MOVR6,A
MOVR3,#08H
CLROK
AJMPCOUNT
/*=====犯规抢答程序=====*/
FANGUI:
MOVR0,#00H
MOVTH1,#3CH
MOVTL1,#0B0H
MOV34H,R3;犯规号数暂存与(34H)
HERE:
MOVA,R0
CJNEA,#06H,FLASH;0.3s向下运行->灭并停响
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三灯全灭
AJMPCHECK1
FLASH:
CJNEA,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
MOVR0,#00H
MOVR3,34H;取回号数
MOVR5,#0BH
MOVR4,#0BH;显示FF和号数
AJMPCHECK1
CHECK1:
JNBP3.1,QUIT1
ACALLDISPLAY
AJMPHERE
QUIT1:
CLROK
AJMPSTART;
/*=====显示程序=====*/
DISPLAY:
MOVDPTR,#DAT1
MOVA,R3
MOVCA,@A+DPTR
MOVP2,#0feH
MOVP0,A
MOVP2,#0FFH
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVCA,@A+DPTR
MOVP2,#0fdH
MOVP0,A
MOVP2,#0FFH
ACALLDELAY2
MOVA,R4
MOVCA,@A+DPTR
MOVP2,#0fbH
MOVP0,A
MOVP2,#0FFH
ACALLDELAY2
RET
DAT1:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;"灭","1","2","3","4","5","6","7","8","9","灭","F"
DAT2:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C0H,0FFH
/*====加减时间延时(起到不会按下就加N个数)======*/
DELAY1:
MOV35H,#08H
LOOP0:
ACALLDISPLAY
DJNZ35H,LOOP0
RET
/*=====延时去抖动用到)====*/
DELAY:
MOV32H,#12H
LOOP:
MOV33H,#0AFH
LOOP1:
DJNZ33H,LOOP1
DJNZ32H,LOOP
RET;
/*=====延时显示用到)=====*/
DELAY2:
MOV32H,#43H
LOOP3:
MOV33H,#1EH
MOVA,R7;
JNZKEY;没读到有效数据时继续转到KEY
LOOP2:
DJNZ33H,LOOP2
DJNZ32H,LOOP3
RET
/*=====读抢答按键数据口程序=====*/
KEY:
MOVA,P1
CJNEA,#0FFH,KEY2;当不全为1时的数据为有效数据
KEY1:
MOV36H,A;将有效数据送到36H暂存
AJMPLOOP2
KEY2:
DECR7
AJMPKEY1
RET;
T0INT:
MOVTH0,#0ECH
MOVTL0,#0FFH
OUT:
RETI
/*=====T1溢出中断(计时程序)=====*/
T1INT:
MOVTH1,#3CH
MOVTL1,#0B0H
INCR0
RETI
END