• 微处理器原理与接口课程设计-八路抢答器


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

     

                            

  • 相关阅读:
    C#数据库数据导出Excel通用方法
    统计数据库大小的方法
    ashx中使用HttpContext.Current.Session ,出现未将对象引用设置到实例上[转]
    ASP.NET数据库备份[转]
    XDocument读取xml的所有元素以及XPath语法[转]
    Datastage客户端安装 记录
    依赖注入控制反转 (摘抄记录)
    管道处理模型四——MVC原理(摘抄cainong2005博客)
    管道处理模型三(摘抄cainong2005博客)
    管道处理模型二(摘抄cainong2005博客)
  • 原文地址:https://www.cnblogs.com/wlei5206/p/11992018.html
Copyright © 2020-2023  润新知