八位智能抢答器单片机.docx
《八位智能抢答器单片机.docx》由会员分享,可在线阅读,更多相关《八位智能抢答器单片机.docx(17页珍藏版)》请在冰点文库上搜索。
八位智能抢答器单片机
单片机技术及应用综合训练(设计报告)
题目:
八位智能抢答器
姓名:
漩涡鸣人
学院:
数理与信息工程学院
专业:
电子科学与技术
班级:
112
学号:
1886110220
指导教师:
自来也
2014年5月
一、选题要求
题目:
八位智能抢答器
设计一个供8位选手参加比赛的智力竞赛抢答器,要求:
(1)每位选手有一个抢答按钮,按钮的编号与选手的编号相对应。
(2)抢答器具有第一个抢答器信号的鉴别和数据所存、显示功能。
抢答开始后,若有选手按抢答按钮,则该选手指示灯亮,并在数码管上显示对应得分编号,扬声器发出音响提示,同时电路具有自锁功能,禁止其他选手抢答,优先强大选手的编号一直保持到主持人将系统清零为止。
(3)抢答器具有定时答题的功能。
一次抢答的时间和答题的时间由主持人决定,在主持人发出抢答指令后,定时器立即进行减计时,并在显示器上显示,同时扬声器发出短暂的声响,声响持续5s钟左右。
(4)设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。
并保持到主持人按复位键。
(5)当设定的时间到,而无人抢答时,本次抢答无效,扬声器报警发出声音,并禁止抢答,定时器上显示FFF。
(6)若有选手如果在主持人按开始键之前违规抢答,系统报警,LED显示违规选手号码和FF,直到主持人按下停止键。
二、硬件电路设计
(一)、整体电路设计
P1.0-P1.7为八路抢答输入,数码管段选P0口,控制位选P2口低3位,P3.0为开始抢答按钮,P3.2为抢答停止按钮,蜂鸣器和警示灯输出为P3.6口。
P3.2抢答时间设置,P3.3为答题时间设置,P3.4为时间加1调整,P3.5为时间减1调整。
其工作原理为:
接通电源后,主持人将开关拨到“清除”状态,抢答器处于禁止状态,编号显示器F,此时,主持人可以通过P3.2设置抢答时间,P3.3设置答题时间,P3.4调整时间加1,P3.5调整时间减1来设定每个环节的时间,默认为15秒抢答,30秒回答;主持人将开关置“抢答开启”状态,宣布“开始”抢答器工作。
定时器倒计时,扬声器给出声响提示。
选手在定时时间内抢答时,抢答器完成:
优先判断、编号锁存、编号显示、扬声器提示。
图1
当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。
如果再次抢答必须由主持人再次操作“开启、结束”状态开关。
若有选手如果在主持人按开始键之前违规抢答,系统报警,LED显示违规选手号码和FF,直到主持人按下停止键。
(2)部分电路设计
1、控制电路设计
电路图如下图,P3.0为开始抢答按钮,P3.2为抢答停止按钮,蜂鸣器和警示灯输出为P3.6口。
P3.2抢答时间设置,P3.3为答题时间设置,P3.4为时间加1调整,P3.5为时间减1调整。
要完成以下功能:
主持人将控制开关拨到"抢答开启"位置时,扬声器发声,抢答电路和定时电路进人正常抢答工作状态;当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停止工作。
图2
2、抢答器按钮电路设计
图三
P1.0-P1.7为八路抢答输入,选手通过按键输入抢答题目。
3、数码管显示模块电路设计
图四
数码管采用的七段共阴极4位数码管,控制位选P2口低3位,数码管阳极分别接在单片机的P0端。
功能是:
当主持人按下“抢答开启”按钮,数码管显示抢答倒计时,如果有选手抢答,则显示抢答的选手号和回答时间的倒计时。
三、软件设计
1、根据抢答器的原理及硬件电路的设计要求,可以先列出程序框图如下:
2、主程序为:
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
JBP3.0,NEXT;ddddddd
ACALLDELAY
JBP3.0,NEXT;去抖动,如果"开始键"按下就向下执行,否者跳到非法抢答查询
ACALLBARK;按键发声
MOVA,R1
MOVR6,A;送R1->R6,因为R1中保存了抢答时间
SETBOK;抢答标志位,用于COUNT只程序中判断是否查询抢答
MOVR7,#01H;读抢答键数据信号标志,这里表示只读一次有用信号
MOVR3,#0AH;抢答只显示计时,灭号数
AJMPCOUNT;进入倒计时程序,"查询有效抢答的程序"在COUNT里面
NEXT:
JNBP1.0,FALSE1
JNBP1.1,FALSE2
JNBP1.2,FALSE3
JNBP1.3,FALSE4
JNBP1.4,FALSE5
JNBP1.5,FALSE6
JNBP1.6,FALSE7
JNBP1.7,FALSE8
AJMPSTART
;=====非法抢答处理程序=====
FALSE1:
MOVR3,#01H
AJMPERROR
FALSE2:
MOVR3,#02H
AJMPERROR
FALSE3:
MOVR3,#03H
AJMPERROR
FALSE4:
MOVR3,#04H
AJMPERROR
FALSE5:
MOVR3,#05H
AJMPERROR
FALSE6:
MOVR3,#06H
AJMPERROR
FALSE7:
MOVR3,#07H
AJMPERROR
FALSE8:
MOVR3,#08H
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
JNBP3.1,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
JNBP3.1,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
;=====倒计时程序(抢答倒计时和回答倒计时都跳到改程序)=====
REPEAT:
MOVA,R2;使用锦囊时重新计时
MOVR6,A
CLRRING
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:
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;如果按下了"停止键"执行的程序
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,#06H,FLASH;0.3s向下运行->灭并停响
CLRRING
MOVR3,#0AH
MOVR4,#0AH
MOVR5,#0AH;三灯全灭
AJMPCHECK1
FLASH:
CJNEA,#0CH,CHECK1;下面是0.8s的情况,响并显示号数并清R0,重新计
SETBRING
MOVR0,#00H
MOVR3,34H;取回号数
MOVR5,#0BH
MOVR4,#0BH;显示FF和号数
AJMPCHECK1
CHECK1:
JNBP3.1,QUIT1
ACALLDISPLAY
AJMPHERE
QUIT1:
CLRRING
CLROK
AJMPSTART
;=====显示程序=====
DISPLAY:
MOVDPTR,#DAT1;查表显示程序,利用P0口做段选码口输出/P2低三位做位选码输出,
MOVA,R3
MOVCA,@A+DPTR
MOVP2,#0feH
MOVP0,A
ACALLDELAY2
MOVDPTR,#DAT2
MOVA,R5
MOVCA,@A+DPTR
MOVP2,#0fdH
MOVP0,A
ACALLDELAY2
MOVA,R4
MOVCA,@A+DPTR
MOVP2,#0fbH
MOVP0,A
ACALLDELAY2
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
;=====延时4236个机器周期(去抖动用到)=====
DELAY:
MOV32H,#12H
LOOP:
MOV33H,#0AFH
LOOP1:
DJNZ33H,LOOP1
DJNZ32H,LOOP
RET
;=====延时4236个机器周期(显示用到)=====
DELAY2:
MOV32H,#43H
LOOP3:
MOV33H,#1EH
MOVA,R7;每隔60~70个机器周期读一次P1口,全为1时为无效数据,继续读,有一个不为1时,转到正常抢答处理
JNZAAAA1;没读到有效数据时继续转到AAAA1
LOOP2:
DJNZ33H,LOOP2
DJNZ32H,LOOP3
RET
;=====读抢答按键数据口程序=====
;由于在读抢答数据口的时候,单片机首先进入倒计时程序,再调用显示程序,最后才检测按键口
;然而在检测按键口时动态扫描要调用三次(4ms)延时程序.这样就会导致读数据口出现滞后,造成1号优先最高.8号最低.
;故采用在延时子程序中加了读数据口程序.保证了灵敏度和可靠性
AAAA1:
MOVA,P1
CJNEA,#0FFH,AA1;当不全为1时的数据为有效数据
AA0:
MOV36H,A;将有效数据送到36H暂存
AJMPLOOP2
AA1:
DECR7
AJMPAA0
;=====发声程序=====
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
四、软硬件调试结果
1、打开抢答“开启”按钮,没有人抢答时,数码管显示倒计时,由于默认倒计时为15秒抢答,15秒过后,则禁止抢答;抢答时间可以在“抢答开启”按钮按下前,通过“抢答时间设置”来设置,调试结果如下图。
图5
2、打开抢答“开启”按钮,在规定的时间有选手下抢答按钮,则数码管上显示答题的选手编号,蜂鸣器发出声音,并且指示灯闪亮,并且其他选手就不能抢答了,系统自动转入答题环节,开始答题倒计时;调试结果如下图。
图6
3、如果主持人没有按下抢答“开启”按钮,就有选手抢答,则数码管显示违规抢答的选手编号,并且蜂鸣器发出违规声音,指示灯闪亮,直到主持人按下“抢答结束”后,才恢复正常;调试结果如下图。
图7
五、实验总结
此次的课程设计为期将近一周的时间,通过本次课程设计,巩固了单片机的各种知识,开阔了我的视野;特别是在设计的过程中,遇到了很多的问题,程序的编写很困难,只好到图书馆借阅单片机设计相关的书籍查阅一些模块的程序设计,最终,终于编译成功了。
此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。
虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我受益匪浅。