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

 

Python 6人抢答器 抢答器程序编写_状态字