基于8088的智能抢答器
目录
((
21))课
课程
程设
计
设任
计务
题与
要目求
; ;
(3)设计过程(包括方案论证、设计原理、创新点以及采用的新(
4
)技硬
件
术系
统
等框
图
与
)说
明
; ;
(5)软件主要模块流程图与说明; (6)工作总结(包括自己的收获与体会;遇到的问题和解决的方法;技术实现技巧和创新点;作品存在的问题和改进设想等); (
7
)
附
录
1、源程序及程序注释 2
3、参考文献
、
原
理
图
八路抢答器
一、课程设计任务与要求:
1、利用8255A,8088,8259等的硬件下,利用程序实现一个抢答器的功能; 2、设计具有倒计时功能的计数器;
3、设计具有在外界控制下可加分,并显示的功能; 4、设计具有可以用来抢答的功能;
二、设计过程
1、倒计时子程序:
选手在主持人按了开始键后抢答成功后,系统将调用子程序倒计时。倒计时时先显示20秒,然后利用十位的1~0的循环,和个位的9~0的循环,使之依次显示19,18…01,00秒,便完成了抢答器的倒计时。具体流程图如下:
开始
显示1秒
十位输出到state[2]
将个位输出到state[3],显示个位 和十位1秒 否 个位循环10?
是 否 十位循环2? 结束
2、显示分数子程序:
程序先得到当前选手的编号,根据编号得到该选手的分数。用cx记录该分数100的个数,首先赋值为0,然后将该分数与100比较,如大于100,则将该分数减100,100的个数cx加一,如小于100,则得到该分数100的个数cx,并得到该cx的LED字母,并输出到state[1];然后用cx记录该分数10的个数,先赋值为0,然后将该分数与10比较,如大于10,则将该分数减10,10的个数cx加一,如小于10,则得到该分数10的个数cx,并得到其LED字母,输出到state[2];此时分数已为个位数,根据该个位数得到该分数个位的LED字母,输出到state[3]。
具体流程图:
将十位数的LED字母输出到state[2] 分数减十,ax=ax-10; 10的个数加一,cx=cx+1 ax < 10? 将百位数的LED字母输出到state[1],10的个数cx=0 分数减一百,ax=ax-100; 100个数加一,cx=cx+1 开始 得到该选手分数,存入ax; 100的个数cx=0 ax < 100
结束 ax已为个位数的个数,将个位数的LED字母输出到state[3]
三、硬件系统框图与说明
8088 8259 译码器定时器 时钟电路
将8个抢答按钮信号通过一个8位并行输入口接至微机中。当主持人启动抢答过程后,微机通过该并行输入口循环对8路抢答信号进行采样。当采样到那一组的抢答信号已经发出,则立即停止采样,并记录下该组的组号
当8组均未按下抢答按钮时,送入到并行接口的8位抢答状态都是0,而当微机采样到这8位数据不为0时,则表示有一组获得了抢答机会,然后通过逐位查询个位状态,即可判断出哪一组抢答成功,最后利用并行输出接口将抢答成功的组号现实出来.在实验中,可以仅用一位7段数码管来显示抢答选手的组号.
为了对抢答后的回答时间进行计时控制,可以利用一个可编程定时计时器,先置计数初值,再计时,当计时时间到后,由并行接口输出一个响铃信号提示抢答选手的回答时间已到。
四、软件主要模块流程图与说明
1、倒计时源代码:
COUNTDOWN PROC ;倒计时子程序,倒计时20秒
PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI
MOV AL,5BH ;首先输出20 MOV BX,OFFSET STATE
ADD BX,2
MOV [BX],AL ;将2LED字母输出到state[2] MOV AL,3FH INC BX
MOV [BX],AL MOV CX,0E0H
B1: CALL DISPLAY1 LOOP B1
MOV BX,OFFSET TABLE2
MOV SI,OFFSET TABLE1
MOV CX,2 SHIWEI: PUSH CX
MOV SI,OFFSET STATE ADD SI,2
MOV AL,[BX] MOV [SI],AL MOV CX,10 MOV SI,OFFSET TABLE1 PUSH BX
MOV BX,OFFSET STATE
ADD BX,3
GEWEI: MOV AL,[SI] MOV [BX],AL PUSH CX
MOV CX,0E0H
B2: CALL DISPLAY1 LOOP B2 INC SI POP CX LOOP GEWEI POP CX
LOOPSHIWEI POP SI POP DX POP CX POP BX POP AX
;将0的LED字母输出到state[3] ;显示20秒 ;十位的循环显示(1,0) ;得到十位的LED代码 ;将其输出到state[2]
;个位的循环显示(9,8,…1,0) ;得到个位的LED字母 ;将其输出到state[3] ;显示该数字一秒钟
RET
COUNTDOWN ENDP
2、显示分数源代码:
SCORE PROC ;显示当前选手分数子程序 PUSH AX PUSH BX PUSH CX PUSH DX
MOV AL,CURRNUM ADD AL,AL AND AX,00FFH MOV BX,OFFSET SCORE ADD BX,AX
MOV AX,[BX] MOV CL,0 NUM1: CMP AX,100 JL OUT1
SUB AX,100 INC CL JMP NUM1
OUT1: PUSH AX MOV BX,OFFSET TAB AND CX,00FFH ADD BX,CX
MOV AL,[BX] MOV BX,OFFSET STATE
ADD BX,1
MOV [BX],AL MOV CL,0 POP AX
NUM2: CMP AX,10 JL OUT2 SUB AX,10 INC CL JMP NUM2
OUT2: PUSH AX AND CX,00FFH
MOV BX,OFFSET TAB
ADD BX,CX
MOV AL,[BX] MOV BX,OFFSET STATE ADD BX,2
MOV [BX],AL ;得到该选手编号 ;得到该选手分数
;用于记录100的个数 ;判断该分数是否小于100 ;该分数大于100,则减100 ;将100的个数加1 ;将100个数输出 ;得到其LED字母 ;将之输出到state[1] ;记录10的个数 ;判断是否小于10
;大于10,则将之减10 10的个数加1 ;输出10的个数 ;得到其LED字母 ;将其输出到state[2]
; POP AX
OUT3: MOV BX,OFFSET TAB ;输出个位 ADD BX,AX
MOV AL,[BX] ;得到其LED字母 MOV BX,OFFSET STATE
ADD BX,3
MOV [BX],AL ;将其输出到state[3] POP SI POP DX POP CX POP BX POP AX RET
SCORE ENDP
五、总结
1、了解自己的模块功能后,首先要想出怎样实现它,并写出流程图,这样才会顺利地写出子程序代码,才不会进入进退两难的境地。编写程序时,还要和别的成员多多交流,这样才能使程序合并起来后能顺利地运行。编写自己的程序时,能比较容易地实现出来,但合并起来后,出现的问题很多。但经过慢慢地调试、修改,终于使我们的程序运行了出来。
2、我加深了对课本知识的理解,同时熟练掌握了汇编语言的编辑、调试工具。在以后的学习生活中还要继续保持严谨认真的科学态度,保持不断尝试和探索的耐心,保持勇于解决问题的决心。
3、在设计中,把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
六、附录
1、源程序及程序注释
DATA SEGMENT
TAB DB 3FH,06H,5BH,66H,6DH,7DH,07H,7FH,6FH TABLE1 DB 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH TABLE2 DB 06H,3FH BZ DB 00H CURRNUM DB 0
SCORE DW 0,100,100,100,100
STATE DB 0,0,0,0 DATA ENDS
CODE SEGMENT
AUUSME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,10010000B ;初始化8255 OUT 63H,AL
BEGIN: CALL DISPLAY ;调用显示程序,让其显示state中内容 IN AL,60H ;扫描端口A的开关键内容 TEST AL,0FFH ;检测是否有键按下
JZ BEGIN ;如无键按下,则循环扫描
CALL ONESECOND2 ;有键按下时,调用延时程序段消抖动 KAISHIT: TEST AL,00001000B JNZ KAISHIKEY JMP FUWEIT
KAISHIKEY: CALL KAISH JMP BEGIN
FUWEIT: TEST AL,00000100B JNZ FUWEIKEY JMP UP FUWEIKEY: CALL FUWEI JMP BEGIN
UP: TEST AL,00000010B JNZ UPKEY
JMP DOWN UPKEY: CALL UPSCORE JMP BEGIN
DOWN: TEST AL,00000001B JNZ DOWNKEY JMP GETNUM
DOWNKEY: CALL DOWNSCORE JMP BEGIN
GETNUM: MOV BL,CURRNUM CMP BL,0 JNZ BEGIN
MOV CX,4 MOV BL,00010000B TEST1: TEST AL,BL JNZ GETCKEY
ROL BL,1 LOOP BEGIN
GETCKEY: CALL GETKNUM JMP BEGIN
KAISHI PROC MOV BZ,0FFH RET KAISHI ENDP
;有键按下时,测试是否是开始键 ;测试是否是复位键 ;测试是否是加分键 ;测试是否是减分键 ;测试是否是抢答键 ;用于循环及测试抢答键编号
;开始键子程序
;将bz置0ffh,测试开始键是否按下 ;调用开始键程序 FUWEI PROC ;复位键子程序 ,用于将清空除score之外所有内容 MOV AX,0
MOV CURRNUM,AL ;将当前选手编号内容清为零 MOV BZ,AL ;将开始键状态设为未按下 MOV AL,3FH
MOV BIAOZHI,AL ;将扬声器不叫,红绿灯状态为不亮 MOV CX,4
MOV AL,0
MOV BX,OFFSET STATE
LOP1: MOV [BX],AL INC BX LOOP LOP1 RET FUWEI ENDP
DISPLAY PROC PUSH AX PUSH BX PUSH CX PUSH DX
MOV AL,BIAOZHI OUT 62H,AL
MOV BX,OFFSET STATE MOV AL,00111110B OUT 62H,AL MOV AL,[BX]
OUT 61H,AL CALL DELAY INC BX
MOV AL,00111101B OUT 62H,AL
MOV AL,[BX]
OUT 61H,AL CALL DELAY INC BX
MOV AL,00111011B OUT 62H,AL MOV AL,[BX]
OUT 61H,AL CALL DELAY INC BX
MOV AL,00110111B
OUT 62H,AL MOV AL,[BX]
OUT 61H,AL 4个LED无显示内容 ;在4个LED中显示state中的内容 ;显示扬声器,红绿灯状态 ;显示state[0]中内容 ;延时 ;显示state[1]中内容 ;显示state[2]中内容 ;显示state[3]中内容
;使 CALL DELAY POP DX POP CX POP BX POP AX RET DISPLAY ENDP
DISPLAY1 PROC ;显示state内容,检测开关、复位、加分、减分键是否按下,倒计时用 PUSH AX PUSH BX PUSH CX PUSH DX
MOV AL,BIAOZHI OUT 62H,AL
MOV BX,OFFSET STATE MOV AL,00101110B
OUT 62H,AL MOV AL,[BX]
OUT 61H,AL CALL DELAY INC BX
MOV AL,00101101B OUT 62H,AL MOV AL,[BX]
OUT 61H,AL CALL DELAY INC BX
MOV AL,00101011B OUT 62H,AL MOV AL,[BX]
OUT 61H,AL CALL DELAY INC BX
MOV AL,00100111B OUT 62H,AL MOV AL,[BX]
OUT 61H,AL CALL DELAY
IN AL,60H TEST AL,00001111B JNZ B7
JMP B8
B7: JMP BEGIN B8: POP DS
;显示扬声器,红绿灯状态 ;显示state[0]中内容 ;显示state[1]中内容 ;显示state[2]中内容 ;显示state[3]中内容 ;得到端口A内容
;检测是否有开关、复位、加分、减分键按下 begin检测该键 ;跳回
POP CX POP BX POP AX RET DISPLAY1 ENDP
DELAY PROC ;延时,用于LED显示延时用 PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,OFFH IOP2: LOOP LOP2 POP DX POP CX POP BX POP AX
RET DELAY ENDP
GETKNUM PROC ;检测到抢答键后,得到该键编号,并存入currnum中 PUSH AX PUSH BX
PUSH DX
MOV AX,CX ;由cx得到抢答者编号
MOV CURRNUM,AL ;将该抢答者编号存入currnum MOV BX,OFFSET TAB
ADD BX,AX
MOV AL,[BX] ;得到该编号的LED代码 MOV BX,OFFSET STATE ;将该LED代码存入state[0] MOV [BX],AL
TESTBZ: MOV AL,BZ ;得到该选手编号后,测试开始键是否按下 CMP AL,0FFH JNZ A
CALL GETPASS ;开始键已按下时,绿灯通 A: CALL WARN ;开始键未按下,警告 POP DX POP BX POP AX
GETKNUM END
WARN PROC ;警告子程序,使扬声器响,红灯亮 PUSH AX PUSH BX
PUSH CX PUSH DX
MOV AL,11011111B
MOV BIAOZHI,AL POP DX POP CX POP BX POP AX RET WARN ENDP
UPSCORE PROC ;当前选手加分 PUSH AX PUSH BX PUSH CX PUSH DX
MOV AL,CURRNUM ADD AL,AL MOV BX,OFFSET SCORE AND AX,00FFH
ADD BX,AX PUSH AX MOV AX,10
ADD [BX],AX CALL SHOWSCORE POP DX POP CX POP BX POP AX RET UPSCORE ENDP
DOWNSCORE PROC PUSH AX PUSH BX PUSH CX PUSH DX
MOV AL,CURRNUM ADD AL,AL MOV BX,OFFSET SCORE AND AX,OOFFH ADD BX,AX
MOV AX,10
SUB [BX],AX CALL SHOWSCORE POP DX POP CX POP BX POP AX
;得到当前选手编号 ;将当前选手编号乘二 ;使bx指向当前选手分数地址 ;将该分数加10 ;显示该选手分数 ;当前选手减分 ;得到当前选手编号 将该分数减10 ; RET DOWNSCORE ENDP
显示分数源代码 时间倒数源代码
CODE ENDS END START
2、原理图
8259 8086
注:原理图中还没有画出译码器那一个模块
3、器件
8086、8255、8258、74LS04(驱动)、排阻、发光二极管、数码管、译码器、74LS138
4、参考文献
1、阎石?《数字电子技术基础》[M]?北京:清华大学出版社
2、谢维成,牛勇《微机原理与接口技术》[M] :华中科技大学出版社