有一个《单片机八人抢答器程序设计》的题目。
题目链接:http://zhidao.baidu.com/question/504744812.html
设计要求:
利用 KEIL 软件编制控制程序。
利用 PROTEUS 仿真软件,绘制单片机控制系统:
P1 口接 8 个按钮,编号为1、2、3、...7、8;
P3.7 接主持人“开始/复位”按钮;
P0 口接一个数码管(共阳极);
P2 口接 8 个LED灯,用于对应8个小组抢答指示。
(1)当主持人没有按下“开始”按钮时,数码管显示0;
(2)当主持人按下“开始”按钮并松开后,数码管显示P,允许各小组抢答;
(3)若有某一个小组按钮按下,点亮抢答小组的指示灯,并将抢答小组号显示在数码管上。
(4)当主持人按下“复位”按钮并松开后,重新进入(1)。
源程序 汇编 和 C51 都可以!
做而论道的设计程序如下:
;简易抢答器
;------------------------------------------
KAI BIT P3.7 ;开始键
;------------------------------------------
ORG 0000H
JMP START
START:
;----------------------;下面是清零(复位)
MOV P0, #0C0H ;显示0
MOV P2, #255 ;熄灯
MOV R4, #0
;----------------------;下面等待按下"开始"键
KAISHI:
JB KAI, KAISHI ;没有按"开始",就循环
CALL DELAY ;延时
JB KAI, KAISHI ;消抖
JNB KAI, $ ;等待释放
;----------------------
MOV P0, #0CH ;显示P
WAIT: ;等待抢答
MOV A, P1
CPL A
JZ WAIT ;继续等待
;----------------------
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:
JB KAI, W_FW ;没有按,则转
CALL DELAY ;延时
JB KAI, W_FW ;消抖
JNB KAI, $ ;等待释放
JMP START
;------------------------
D_TAB:
DB 0C0H,0F9H,0A4H,0B0H, 99H ;共阳极0-9
DB 92H, 82H,0F8H, 80H, 90H,0BFH ;-
;------------------------------------------
DELAY: ;延时约10ms
MOV R6, #20
DJNZ R7, $
DJNZ R6, $ - 2
RET
;==========================================
END
程序运行后,主持人按下开始按键时显示的画面如下:
图片链接:http://xiangce.baidu.com/picture/detail/9850fd005f13e02d4ea049b643cc3134eef256e1
有人抢答后,显示的画面如下:
图片链接:http://xiangce.baidu.com/picture/detail/077253d8ef5443cce34b4910471a899e203449e1
单片机的控制,有时序先后的区别。
程序中,每次都是先检查 P1.0 处的按键,最后检查 P1.7 的按键。
如果, P1.7 按键先按下,P1.3 后按下,但是,开始查询的时候,还查不到 P1.7,而是先查到了 P1.3,那么,单片机将把后按下的,认定为成功抢答。
甚至, P1.7 比 P1.3 先按下 10 微秒,单片机都会错误的认定 P1.3 是先按下的。
为了避免出现这种不公平现象,应该在《抢答控制》部分,使用纯电子器件的电路,以取得高速处理的效果。而单片机仅仅适用于数码显示等的低速处理。