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.硬件电路图