单片机八人抢答器程序设计

单片机八人抢答器程序设计,第1张

------------------------------------------

KAI BIT P3.7 开始

------------------------------------------

ORG 0000H

JMP START

START:

----------------------下面是清零(复位)

MOV P0, #0C0H显示0

MOV P2, #255 熄灯

MOV R4, #0

----------------------下面等待按下"开始"键

KAISHI:

JBKAI, KAISHI 没有按"开始",就循环

CALL DELAY延时

JBKAI, KAISHI 消抖

JNB KAI, $ 等待释放

----------------------

MOV P0, #0CH 显示P

WAIT: 等待抢答

MOV A, P1

CPL A

JZWAIT 继续等待

----------------------

XS:查找选手按键的位置

CPL A

MOV P2, A

JNB ACC.0, J0

JNB ACC.1, J1

JNB ACC.2, J2

JNB ACC.3, J3

JNB ACC.4, J4

JNB ACC.5, J5

JNB ACC.6, J6

JMP J7

J7: INC R4

J6: INC R4

J5: INC R4

J4: INC R4

J3: INC R4

J2: INC R4

J1: INC R4

J0: INC R4

MOV A, R4

MOV DPTR, #D_TAB

MOVC A, @A + DPTR

MOV P0, A

----------------------下面等待按下复位键

W_FW:

JBKAI, W_FW没有按,则转

CALL DELAY延时

JBKAI, W_FW消抖

JNB KAI, $ 等待释放

JMP START

------------------------

D_TAB:

DB 0C0H,0F9H,0A4H,0B0H, 99H 共阳极0-9

DB92H, 82H,0F8H, 80H, 90H,0BFH -

------------------------------------------

DELAY: 延时约10ms

MOV R6, #20

DJNZ R7, $

DJNZ R6, $ - 2

RET

==========================================

END

以上程序已经调好。

先来个汇编的程序,P1接一个共阳极数码管,P0低4位接4个抢答按键,主持人复位采用单片机复位按钮实现。

ORG 0000H

START: MOV A,P0

ORL A,#0F0H

CJNE A,#0FFH,PL0

SJMP START

PL0: LCALL DELAY

MOV A,P0

ORL A,#0F0H

CJNE A,#0FFH,PL1

SJMP START

PL1:JNB ACC.0,K1

JNB ACC.1,K2

JNB ACC.2,K3

JNB ACC.3,K4

LJMP START

K1:MOV P1,#0F9H

SJMP $

K2:MOV P1,#0A4H

SJMP $

K3:MOV P1,#0B0H

SJMP $

K4:MOV P1,#99H

SJMP $

DELAY:MOV R6,#15

DEL2: MOV R7,#200

DJNZ R7,$

DJNZ R6,DEL2

RET

END

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/5CountDown秒所经过的时钟数

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12100855.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存