1.设计内容
①抢答开关电路分别设定选手抢答键8个、主持人开始抢答键和复位键。
②系统工作后,首先由主持人按下开始键,同时单片机进入10秒倒计时并显示。
③选手们开始抢答,如果在10秒内无人抢答,则红灯全部亮起,等待主持人按复位键,进入下一题。
④若有人抢答,选手对应的抢答指示灯点亮,LED显示器上同步显示抢答选手的编号,表示抢答成功。同时封锁输入电路,禁止其他选手抢答
⑤抢答成功后,单片机自动进入60秒回答问题倒计时
⑥若选手在60秒内回答完问题并回答正确,抢答成功,且显示有效。
⑦主持人按下复位键,系统返回到抢答状态,进行下一轮抢答。
2.实验程序
CON8279 EQU 0CFE9H
DATA8279 EQU 0CFE8H
ORG 0000H
LJMP START
ORG 4100H
START: MOV DPTR,#DATA8279;8279命令口地址
CLR A ;清零
MOV PSW,#00H
MOV SP,#60H
MOVX @DPTR,A
MOV DPTR,#CON8279 ;8279命令字
MOV A,#0D1H ;清显示命令字
MOVX @DPTR,A
LOOP1: ;MOV P1,#0FFH ;清零红绿LED灯
MOVX A,@DPTR ;读状态字
ANL A,#0FH
JZ LOOP1 ;是否有键按下?没有则循环等待,有则继续运行
MOV DPTR,#DATA8279 ;进入数据口
MOVX A,@DPTR ;读键值
MOV R0,A
ANL A,#0FH ;取低四位
JZ DAOSHU10 ;按键为开始键,跳转DAOSHU10,进入10S
JNZ FSQD ;按键为其他键,跳转到非法抢答
FSQD: MOV P1,#0AAH ;亮红灯
MOV DPTR,#CON8279 ;写显示RAM命令,命令口地址
MOV A,#81H ;选中LED2
MOVX @DPTR,A
MOV A,R0 ;显示非法抢答序号
ANL A,#0FH
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口
MOVX @DPTR,A
AJMP NDELAY
DAOSHU10: MOV P1,#0FFH
MOV R2,#10H ;走10S倒数
;LED6
MOV DPTR,#CON8279 ;写显示RAM命令,命令口地址
MOV A,#85H ;选中LED6
MOVX @DPTR,A
MOV A,R2
ANL A,#0FH ;取后半字节
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口
MOVX @DPTR,A
;LED5
MOV DPTR,#CON8279 ;写显示RAM命令
MOV A,#84H ;选中LED5
MOVX @DPTR,A
MOV A,R2
ANL A,#0F0H
SWAP A ;取后半字节,高低字交换
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口将A写入
MOVX @DPTR,A
MOV DPTR,#CON8279 ;回到命令口
MOV R2,#09H
LJMP T10S
T10S: MOV R5,#03 ;1S延迟
LJMP DE1
DE1: MOV R6,#200
DE2: MOV R7,#126
DE3: MOVX A,@DPTR ;读状态字
ANL A,#0FH
JNZ LOOP2I ;有键按下?,有则跳入LOOP2I,判断按键,没有则继续
DJNZ R7,DE3
DJNZ R6,DE2
DJNZ R5,DE1
LJMP DAOSHU9
LOOP2I: MOV DPTR,#DATA8279 ;进入数据口
MOVX A,@DPTR ;读键值
ANL A,#0FH ;取低四位
MOV R1,A ;保存队员序号到R1
JZ DE3 ;按键为开始键,跳转DE3,返回
XRL A,#09H
JZ DE3 ;按键为复位键,跳转DE3,返回
LJMP LOOP2
DAOSHU9: ;走9秒倒数
;LED2
MOV DPTR,#CON8279 ;写显示RAM命令,命令口地址
MOV A,#85H ;选中LED2
MOVX @DPTR,A
MOV A,R2 ;将高键位读出
ANL A,#0FH ;取后半字节
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口
MOVX @DPTR,A
;LED1
MOV DPTR,#CON8279 ;写显示RAM命令
MOV A,#84H ;选中LED1
MOVX @DPTR,A
MOV A,R2
ANL A,#0F0H
SWAP A ;取后半字节,高低字交换
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口将A写入
MOVX @DPTR,A
MOV DPTR,#CON8279 ;回到命令口
DEC R2
CJNE R2,#0FFH,T10S ;R2减1,不为零回到T10S延迟1S确认,然后继续扫描&显示倒数
LJMP DAOSHU60NN ;进入10S超时程序
LOOP2: MOV DPTR,#CON8279 ;8279命令字
MOV A,#0A0H ;显示\消隐命令
MOVX @DPTR,A
MOV A,#40H ;读FIFO命令
MOVX @DPTR,A;显示队号低位
MOV DPTR,#CON8279 ;写显示RAM命令,命令口地址
MOV A,#81H ;选中LED6
MOVX @DPTR,A
MOV A,R1 ;将高键位读出
ANL A,#0FH ;取后半字节
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口
MOVX @DPTR,A;高位
MOV DPTR,#CON8279 ;写显示RAM命令
MOV A,#80H ;选中LED5
MOVX @DPTR,A
MOV A,R1
ANL A,#0F0H
SWAP A ;取后半字节,高低字交换
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口将A写入
MOVX @DPTR,A
MOV DPTR,#CON8279 ;回到命令口
LCALL DE2S ;显示2秒
LJMP DAOSHU60S
DAOSHU60S: ;准备60秒倒数
MOV DPTR,#DATA8279 ;数据口
MOV R2,#06H ;R2存入十位变量
MOV R3,#00H ;R3存入个位变量
MOV A,R2
SWAP A ;A变为60H,十位已经放入A
ADD A,R3 ;个位R3加入
MOV R4,A ;得来的当前秒数放入R4
LJMP DAOSHU60
DAOSHU60: ;60秒倒数
;LED6
MOV DPTR,#CON8279 ;写显示RAM命令,命令口地址
MOV A,#85H ;选中LED6
MOVX @DPTR,A
MOV A,R4 ;将高键位读出
ANL A,#0FH ;取后半字节
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口
MOVX @DPTR,A
;LED5
MOV DPTR,#CON8279 ;写显示RAM命令
MOV A,#84H ;选中LED5
MOVX @DPTR,A
MOV A,R4
ANL A,#0F0H
SWAP A ;取后半字节,高低字交换
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口将A写入
MOVX @DPTR,A
MOV DPTR,#CON8279 ;回到命令口
MOV R3,#09H ;个位变为9
DEC R2 ;十位变为5
LJMP T10SA
T10SA: MOV R5,#03H ;1S延迟
LJMP DE1B
DE1B: MOV R6,#200
DE2B: MOV R7,#126
DE3B: MOV DPTR,#CON8279 ;回到命令口
MOVX A,@DPTR ;读状态字
ANL A,#0FH
JNZ DAOSHU60YN ;有键按下?,有则跳入DAOSHU60YN,判断是否是抢答按键
DJNZ R7,DE3B
DJNZ R6,DE2B
DJNZ R5,DE1B
LJMP DAOSHU601
DAOSHU60YN: MOV DPTR,#DATA8279 ;进入数据口
MOVX A,@DPTR ;读键值
ANL A,#0FH ;取低四位
XRL A,R1 ;判断是否为抢答按键,若是则清零A,不是则A非零
JZ DAOSHU602 ;按键为抢答按键,显示抢答成功,跳转DAOSHU602
JNZ DE3B ;按键为其他键,跳转回DE3B,继续倒计时
DAOSHU601:
MOV A,R2
SWAP A ;A变为十位,十位已经放入A
ADD A,R3 ;个位R3加入
MOV R4,A ;得来的当前秒数放入R4
;LED2
MOV DPTR,#CON8279 ;写显示RAM命令,命令口地址
MOV A,#85H ;选中LED2
MOVX @DPTR,A
MOV A,R4 ;将高键位读出
ANL A,#0FH ;取后半字节
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口
MOVX @DPTR,A
;LED1
MOV DPTR,#CON8279 ;写显示RAM命令
MOV A,#84H ;选中LED1
MOVX @DPTR,A
MOV A,R4
ANL A,#0F0H
SWAP A ;取后半字节,高低字交换
MOV DPTR,#TAB1
MOVC A,@A+DPTR ;取段显码
MOV DPTR,#DATA8279 ;写显示RAM,数据口将A写入
MOVX @DPTR,A
MOV DPTR,#CON8279 ;回到命令口
DEC R3
CJNE R3,#0FFH,T10SA ;个位减1,转移到1S延迟处
MOV R3,#09H ;个位变9,等待十位减少
DEC R2
CJNE R2,#0FFH,T10SA ;个位减为0,且变为9,十位减1,回到1S延迟处
LJMP DAOSHU60NN
DAOSHU60NN: MOV P1,#0AAH ;红灯全部亮起
MOV DPTR,#CON8279 ;命令口
MOVX A,@DPTR ;读状态字
ANL A,#0FH
JZ DAOSHU60NN ;有键按下?没有则循环等待
MOV DPTR,#DATA8279 ;进入数据口
MOVX A,@DPTR ;读键值
ANL A,#0FH ;取低四位
XRL A,#09H ;判断是否为按键9,若是则清零A,不是则A非零
JZ JUMP ;按键为按键9,跳转到中介,从而跳到START,回到初始位置
JNZ DAOSHU60NN ;按键为其他键,跳转DAOASHU60NN,再次等待
DAOSHU602: MOV P1,#55H ;抢答成功,显示有效,所有绿灯亮起
MOV DPTR,#CON8279 ;8279命令字
MOVX A,@DPTR ;读状态字
ANL A,#0FH
JZ DAOSHU602 ;有键按下?没有则循环等待
MOV DPTR,#DATA8279 ;进入数据口
MOVX A,@DPTR ;读键值
ANL A,#0FH ;取低四位
XRL A,#09H ;判断是否为按键9,若是则清零A,不是则A非零
JZ JUMP ;按键为按键9,跳转到中介,从而跳到START,回到初始位置
JNZ DAOSHU602 ;按键为其他键,跳转DAOSHU602,再次等待
DE2S: MOV R5,#06 ;2s Delay
LJMP DE1A
DE1S: MOV R5,#03 ;1s Delay
LJMP DE1A
DE1A: MOV R6,#200
DE2A: MOV R7,#126
DE3A: DJNZ R7,DE3A
DJNZ R6,DE2A
DJNZ R5,DE1A
RET
NDELAY: MOV R2, #36H ;非法抢答延时
DEL: MOV R4, #06FH
DEL1: MOV R6, #06FH
DEL2: DJNZ R6, DEL2
DJNZ R4, DEL1
DJNZ R2, DEL
AJMP START
JUMP: MOV P1,#0FFH ;关所有LED
LJMP START ;跳转到初始状态
TAB1: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;段显码表
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
END
3.硬件电路图