单片机的多功能抢答器设计 精品Word文档格式.docx
《单片机的多功能抢答器设计 精品Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机的多功能抢答器设计 精品Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![单片机的多功能抢答器设计 精品Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/29/7b98051f-1b87-4d00-bd1f-248eddebd80a/7b98051f-1b87-4d00-bd1f-248eddebd80a1.gif)
P3口除了一般I/O线的功能外,还具有更为重要的第二功能,p3.0~p3.4口接五个按钮,p3.6口(外部数据存储器写选通)接一个报警器。
3.2显示模块设计
显示模块用的是7SEG-MPX4CC,1、3、4口是用来控制数码管显示数的。
本数码管采用的是动态显示。
图3.27SEG-MPX4CC图
4软件流程设计
4.1系统流程图
图4.1系统流程图
4.2倒计时程序流程图
图4.2倒计时流程图
4.3显示程序流程图
图4.3显示程序流程图
4.4四路抢答器程序
org0
okequ20h
requ22h
ljmpstart
org0003h
ljmpinterrupted
org000bh
ljmpt0int
org0013h
ljmpint1sub
org001bh
ljmpt1int
org0040h
start:
movr1,#10
movr2,#30
movtmod,#11h
movth0,#0f0h
movtl0,#0ffh
movth1,#3ch
movtl1,#0b0h
setbea
setbet0
setbet1
setbex0
setbex1
clrok
clrr
setbtr1
setbtr0
inquire:
movr5,#0bh;
查询
movr4,#0bh
movr3,#0bh
acalldisplay;
未开始抢答时候显示FFF
jbp3.0,key
acalldelay
jbp3.0,key;
去抖动,如果"
开始键"
按下就向下执行,否者跳到非法抢答查询
acallbark
mova,r1
movr6,a
setbok
movr7,#01h;
读抢答键数据信号标志,这里表示只读一次有用信号
movr3,#0ah;
抢答只显示计时,灭号数
ljmpcount
key:
jnbp1.0,f1
jnbp1.1,f2
jnbp1.2,f3
jnbp1.3,f4
ljmpinquire
f1:
movr3,#01h;
非法抢答
ljmperror
f2:
movr3,#02h
f3:
movr3,#03h
ljmperror
f4:
movr3,#04h
ljmperror
interrupted:
mova,r1;
抢答时间R1调整
movb,#0ah
diva
movr5,a
movr4,b
movr3,#0ah
acalldisplay
jnbp3.4,inc0
jnbp3.5,dec0
jnbp3.1,back0
ljmpinterrupted
inc0:
mova,r1
cjnea,#63h,add0;
如果不是99,R2加1,如果加到99,R1就置0,重新加起。
movr1,#00h
acalldelay1
add0:
incr1
ljmpinterrupted
dec0:
jzsetr1;
如果R1为r,R1就置99,
decr1
acalldelay1
setr1:
movr1,#63h
back0:
reti
int1sub:
mova,r2;
回答时间R2调整
movb,#0ah
divab
movr5,a
movr4,b
movr3,#0ah
acalldisplay
jnbp3.4,inc1
jnbp3.5,dec1
jnbp3.1,back1
ljmpint1sub
inc1:
mova,r2
cjnea,#63h,add1
movr2,#00h
ljmpint1sub
add1:
incr2
dec1:
jzsetr2
decr2
setr2:
movr2,#63h
back1:
repeat:
mova,r2;
倒计时
movr6,a
clrr
count:
movr0,#00h
movth1,#3ch
movtl1,#0b0h
recount:
mova,r6;
r6保存了倒计时的时间,之前先将抢答时间或回答时间给R6
mov30h,a
mov31h,b
movr5,30h
movr4,31h
mova,r6
subba,#07h
jnclarger;
大于5s跳到larger,小于等于5s会提醒
mova,r0
cjnea,#0ah,full;
1s中0.5s向下运行
clrr
ljmpcheck
full:
cjnea,#14h,check;
下面是1s的情况,响并显示号数并清R0,重新计
setbr
mova,r6
jzquit;
计时完毕
movr0,#00h
decr6;
一秒标志减1
larger:
mova,r0
如果1s向下运行,否者跳到查"
停/显示"
计时一秒R6自动减1
check:
jnbp3.1,quit;
如按下停止键退出
jnbok,checkk;
只在回答倒计时才有效
ljmpkeyt
checkk:
jnbp3.0,repeat;
判断是否使用锦囊
keyt:
jbok,accout;
如果是抢答倒计时,如是则查询抢答,否者跳过查询继续倒数
ljmprecount
accout:
mova,36h
jnbacc.0,true1
jnbacc.1,true2
jnbacc.2,true3
jnbacc.3,true4
tz1:
jmptrue3
tz2:
jmptrue4
quit:
clrok;
如果按下了"
停止键"
执行的程序
clrr
ljmpinquire
true1:
acallbark;
开始抢答
movr6,a
movr3,#01h
因为答题的计时不再查询抢答,所以就锁了抢答
ljmpcount
true2:
acallbark
movr6,a
movr3,#02h
clrok
ljmpcount
true3:
movr3,#03h
true4:
clrok
error:
movr0,#00h;
犯规抢答
mov34h,r3
here:
cjnea,#06h,flash;
0.3s向下运行->
灭并停响
movr4,#0ah
movr5,#0ah;
三灯全灭
ljmpcheck1
flash:
cjnea,#0ch,check1;
下面是0.8s的情况,响并显示号数并清R0,重新计
movr3,34h;
取回号数
movr5,#0bh
movr4,#0bh;
显示FF和号数
check1:
jnbp3.1,quit1
acalldisplay
ljmphere
quit1:
clrok
ljmpstart
display:
movdptr,#dat1;
显示程序
mova,r3
movca,@a+dptr
movp2,#0feh
movp0,a
acalldelay2
movdptr,#dat2
mova,r5
movca,@a+dptr
movp2,#0fdh
movp0,a
acalldelay2
mova,r4
movp2,#0fbh
ret