抢答器 汇编语言程序

1、在屏幕上显示倒计时时间
2、时间为0时进行抢答
3、抢答完成后显示抢答人和抢答时间
4、程序采用汇编语言在PC机上完成
尽量带上程序注释
有追加

data segment
CountDown = 5;倒计时的秒数,也是抢答时间上限,不要超过9秒
msgCD db 'CountDown','$'
msgU db 'User '
Uid db ?
db ': '
Time db ?,'.',?,?,' Seconds.$'
UKey db 'qzpm';按键ASCII码
UCount = ($-UKey);抢答人数
msg db 'Press Any key to Exit!$'
msg1 db 'No one Press!$'
StartTC dw ?,? ;抢答开始时钟计数
EndTC dw ?,? ;抢答结束时钟计数

data ends

PRTSTR MACRO X;输出字符串
LEA DX,X
MOV AH,09H
INT 21H
ENDM

SETXY MACRO X,Y;设置光标位置,X=行,Y=列
XOR BH,BH
MOV AH,02H
MOV DH,X
MOV DL,Y
INT 10H
ENDM

code segment
assume cs:code,ds:data
DELAY PROC far;延时一秒
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,02H
INT 1AH
MOV BL,DH
D_P:MOV AH,02H
INT 1AH
CMP BL,DH
JZ D_P
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP

start:
mov ax,data
mov ds,ax

;设置80×25黑白字符显示模式
MOV AH,00H
MOV AL,02H
INT 10H

SETXY 12,35
PRTSTR msgCD;屏幕中间显示CountDown

;倒计时开始
xor cx,cx
mov cl,CountDown
@@:
SETXY 13,40
mov dl,cl
add dl,30h
mov ah,02h
int 21h;显示倒计时秒数
call DELAY;延时一秒
loop @B

SETXY 13,40
mov dl,cl
add dl,30h
mov ah,02h
int 21h

;抢答计时开始
mov ah,0
int 1ah ;cx:dx=获得自午夜以来的时钟计数,每秒18.2次.
mov StartTC,dx
mov StartTC+2,cx;保存抢答开始时钟计数

mov bx,CountDown*91/5;CountDown秒所经过的时钟数
add dx,bx
adc cx,0
mov EndTC,dx
mov EndTC+2,cx ;计算并保存抢答结束计数

L_again:
mov ah,06h
mov dl,0ffh
int 21h
or al,al
jz L_test;没按键则直接检测是否已到抢答时间上限
xor si,si
@@:
cmp UKey[si],al
je L_Press
inc si
cmp si,UCount
jb @B
L_test:
mov ah,0
int 1ah
mov bx,EndTC
mov ax,EndTC+2
sub bx,dx
sbb ax,cx
jae L_again

SETXY 14,33
PRTSTR msg1
jmp @F

L_Press:
mov ah,0
int 1ah;获得按键时刻的时钟数
inc si
mov ax,si
add al,30h
mov Uid,al;存贮按键用户编号
mov bx,StartTC
mov ax,StartTC+2
sub dx,bx
sbb cx,ax;计算从计时开始到按键经过的时钟数,最后存在dx中
mov ax,1000
mul dx
mov bx,182
div bx;将时钟数换算成百分秒数,存放在ax中
mov bl,100
div bl;计算整秒数,结果在al中
add al,30h
mov Time,al
mov al,ah
xor ah,ah
mov bl,10
div bl;计算十分秒数,结果在al中
add al,30h
mov Time+2,al
add ah,30h
mov Time+3,ah;百分秒
SETXY 14,34
PRTSTR msgU
@@:
SETXY 15,29
PRTSTR msg
@@:
mov ah,06h
mov dl,0ffh
int 21h;等待用户按键退出
cmp al,0
je @B

mov ax,4c00h
int 21h
code ends
end start
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-01-20
data segment
CountDown = 5;倒计时的秒数,也是抢答时间上限,不要超过9秒
msgCD db 'CountDown','$'
msgU db 'User '
Uid db ?
db ': '
Time db ?,'.',?,?,' Seconds.$'
UKey db 'qzpm';按键ASCII码
UCount = ($-UKey);抢答人数
msg db 'Press Any key to Exit!$'
msg1 db 'No one Press!$'
StartTC dw ?,? ;抢答开始时钟计数
EndTC dw ?,? ;抢答结束时钟计数

data ends

PRTSTR MACRO X;输出字符串
LEA DX,X
MOV AH,09H
INT 21H
ENDM

SETXY MACRO X,Y;设置光标位置,X=行,Y=列
XOR BH,BH
MOV AH,02H
MOV DH,X
MOV DL,Y
INT 10H
ENDM

code segment
assume cs:code,ds:data
DELAY PROC far;延时一秒
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,02H
INT 1AH
MOV BL,DH
D_P:MOV AH,02H
INT 1AH
CMP BL,DH
JZ D_P
POP DX
POP CX
POP BX
POP AX
RET
DELAY ENDP

start:
mov ax,data
mov ds,ax

;设置80×25黑白字符显示模式
MOV AH,00H
MOV AL,02H
INT 10H

SETXY 12,35
PRTSTR msgCD;屏幕中间显示CountDown

;倒计时开始
xor cx,cx
mov cl,CountDown
@@:
SETXY 13,40
mov dl,cl
add dl,30h
mov ah,02h
int 21h;显示倒计时秒数
call DELAY;延时一秒
loop @B

SETXY 13,40
mov dl,cl
add dl,30h
mov ah,02h
int 21h

;抢答计时开始
mov ah,0
int 1ah ;cx:dx=获得自午夜以来的时钟计数,每秒18.2次.
mov StartTC,dx
mov StartTC+2,cx;保存抢答开始时钟计数

mov bx,CountDown*91/5;CountDown秒所经过的时钟数
add dx,bx
adc cx,0
mov EndTC,dx
mov EndTC+2,cx ;计算并保存抢答结束计数

L_again:
mov ah,06h
mov dl,0ffh
int 21h
or al,al
jz L_test;没按键则直接检测是否已到抢答时间上限
xor si,si
@@:
cmp UKey[si],al
je L_Press
inc si
cmp si,UCount
jb @B
L_test:
mov ah,0
int 1ah
mov bx,EndTC
mov ax,EndTC+2
sub bx,dx
sbb ax,cx
jae L_again

SETXY 14,33
PRTSTR msg1
jmp @F

L_Press:
mov ah,0
int 1ah;获得按键时刻的时钟数
inc si
mov ax,si
add al,30h
mov Uid,al;存贮按键用户编号
mov bx,StartTC
mov ax,StartTC+2
sub dx,bx
sbb cx,ax;计算从计时开始到按键经过的时钟数,最后存在dx中
mov ax,1000
mul dx
mov bx,182
div bx;将时钟数换算成百分秒数,存放在ax中
mov bl,100
div bl;计算整秒数,结果在al中
add al,30h
mov Time,al
mov al,ah
xor ah,ah
mov bl,10
div bl;计算十分秒数,结果在al中
add al,30h
mov Time+2,al
add ah,30h
mov Time+3,ah;百分秒
SETXY 14,34
PRTSTR msgU
@@:
SETXY 15,29
PRTSTR msg
@@:
mov ah,06h
mov dl,0ffh
int 21h;等待用户按键退出
cmp al,0
je @B

mov ax,4c00h
int 21h
code ends
end start

四路电子抢答器的程序
MOV P0,A JNB P1.1,SE1;判断1号抢答器是否打开 JNB P1.2,SE2;判断2号抢答器是否打开 JNB P1.3,SE3;判断3号抢答器是否打开 JNB P1.4,SE4;判断4号抢答器是否打开 MOV R3,#20 LCALL DELAY1 INC DPTR CJNE A,#0FFH,NEXT MOV P0,#0FFH AJMP START;跳转到START处循环 DELAY:MOV R5,#...

用汇编语言编写keil的四人抢答器程序
MOV P0,A LOOP3: JNB P3.3,BEGIN ;若主持人按下复位信号键,则转向主程序 CPL P3.7 ;若没按复位信号键,给出高低信号驱动蜂鸣器 LCALL DELAY ;调用延时子程序 SJMP LOOP3 ;反复间隔0.4s变化,驱动蜂鸣器 END

设计的抢答器,程序不能达到全部要求,求帮助,汇编语言设计
;以下程序,已经调试成功:ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0040H START:MOV TMOD, #01H MOV TH0, #(65536-50000) \/ 256 MOV TL0, #(65536-50000) MOD 256 MOV IE, #82H MOV P1, #0FFH ;LED MOV P2, #0FFH ;数码管 JB ...

现代数字系统实践教程内容简介
本书分为三篇,第一篇聚焦于微机原理与接口技术。第1章介绍了汇编语言程序的上机及调试方法,第2章通过实验深入理解汇编语言与微机应用,第3章探讨微机应用系统的综合设计方法及要求。第二篇深入探讨PLC原理及应用技术。第4章提供了FXON-60MR实验装置及编程技巧的简介,第5章进行基础实验训练,第6章则通...

09浙江高考理科重点本科考信息技术还是通用技术?
电风扇 学习目标:熟悉基本程序结构,掌握条件选择结构;熟悉单片机程序开发流程;学会编写比较复杂的汇编语言程序; 3 单片机与控制电路分组实验包 报警器 教学目标:知道常见传感器的种类;掌握常见传感器的作用。 试验目的:制作一个噪音报警器,当有不同的声音信号时可实现报警功能。 自动门 教学目标:掌握传感器、2051单片...

相似回答
大家正在搜