汇编语言小设计——抢答器

汇编语言与微机接口小设计——>抢答器(6路)

随着电子技术的发展,计算机在现代科学技术的发展中起着更加重要的作用。各种技术都离不开计算机,计算机已经在人们生活的各个方面普及了。本课程设计是微机原理及接口技术的应用。运用所学的微机原理和接口技术知识完成六路竞赛抢答器。通过硬件与软件的结合,用我们刚刚学过的汇编语言编写程序模拟分析了六路抢答器出现的各种情况。该抢答器以主持人为中心,操作抢答器的开始与复位,选手们可以根据主持人的提示进行抢答,该抢答器基本能满足现在市场所需抢答器的需要,设计简单,成本低,适合小型抢答场合。

功能如下:
硬件测试通过。8259能够实现中断。8254能够实现呼吸灯。8255能够控制L8—L15的亮与灭。
启动与复位。主持人按KK1+键表示表示启动一次抢答,绿色发光二极管亮作允许抢答指示。此时选手侧可以按动各自的抢答按钮。主持人按KK2+表示复位。红绿指示灯全灭,选手灯全灭。主持人可以再次按KK1+键,启动下一次抢答。
抢答。使用实验仪的逻辑电平开关K0-K5来代表6个抢答按钮。当开关向上拨时表示按下按钮。收到第1个抢答信号后,主持人侧红色发光二极管亮(绿色发光二极管仍然亮)作已经有人抢答指示。
显示选手灯。在单个LED灯上显示抢先一组的组别。
在数码管上显示选手编号。
同时考虑抢答允许时间,10秒内有效。10秒之后无人抢答,本次抢答作废。

1、设计思路
首先初始化8255,然后判断是启动还是复位操作,若是复位操作,则控制8255输出的数据使绿色和红色指示灯、LED灯全灭;否则启动下一次抢答,使绿色发光二极管亮;当8255的输入口PB有不为0的数据时,则使绿色发光二极管灭并使红色发光二极管点亮。并判断先拨动开关的组号,在LED灯上显示出其组号。最后使用LED 8段数码管,显示选手编号。
2、使用的I/O设备
输入设备有:8个开关K0~K7。两个按键,KK1+和KK2+。
输出设备有:8个LED灯L0~L7。一位数码管显示器。
3、使用的芯片
8259芯片,8255芯片,8254芯片
4、芯片的作用
(1)8259芯片,实现中断控制。结合8254实现定时中断。启动和停止也由相应的中断服务程序实现。有三个中断源开放,MIR6、MIR7和SIR1。MIR6接OUT0,MIR7接KK1+,SIR1接KK2+。
(2)8255芯片,有PA、PB和PC三个并行口。PA口接8个开关的输入,让PB口去控制选手LED灯L0~L7。PC口自然去接数码管。
(3)8254芯片,实现硬件定时。定时10s。有两个通道CNT0和CNT1可用。选用CNT0和CNT1使用。
四、硬件线路设计
1、硬件接线图
汇编语言小设计——抢答器_第1张图片
汇编语言小设计——抢答器_第2张图片
1、程序流程图
汇编语言小设计——抢答器_第3张图片
汇编语言小设计——抢答器_第4张图片

TIMER0      EQU     0600H       ;IOY0 
TIMER1      EQU     0602H 
TIMER2      EQU     0604H 
TIMERM     EQU     0606H
P8255A      EQU     0640H       ;IOY1
P8255B      EQU     0642H 
P8255C      EQU     0644H 
P8255M      EQU     0646H
;---------------------------------------------------------------
DATA        SEGMENT 
DISCODE     DB      3FH,06H,5BH,4FH,66H,6DH,7DH,07H     ;0--7的显示代码
              DB      7FH,6FH,77H,7CH,39H,5EH,79H,71H     ;8--F的显示代码
STA          DB      00H	
TIME         DW      500		
COUNT       DB      100
DATA         ENDS
SSTACK      SEGMENT PARA    STACK   'STACK'
              DW      32  DUP(?)
SSTACK      ENDS
CODE        SEGMENT 
              ASSUME  CS:CODE, DS:DATA,SS: SSTACK			
START:       MOV     AX,DATA	
             MOV     DS,AX
;--------------------------------------------------------------- 8255初始化
INITA:      MOV     DX, P8255M 
            MOV     AL, 90H 
            OUT     DX, AL 
            MOV     DX, P8255B 
            MOV     AL, 0FFH 
            OUT     DX, AL 
;--------------------------------------------------------------- 中断芯片
INITB:      PUSH     DS
            MOV     AX,0000H	
            MOV     DS,AX		
            MOV     AX,OFFSET	 MIR7
            MOV     SI,003CH
            MOV     [SI],AX
            MOV     AX,CS
            MOV     SI,003EH
            MOV     [SI],AX
            MOV     AX,OFFSET	 MIR6
            MOV     SI,0038H
            MOV     [SI],AX
            MOV     AX,CS
            MOV     SI,003AH
            MOV     [SI],AX
            MOV     AX, OFFSET	 SIR1 
            MOV     SI, 00C4H 
            MOV     [SI], AX 
            MOV     AX, CS 
            MOV     SI, 00C6H 
            MOV     [SI], AX 
            CLI	
            POP     DS		
;---------------------------------------------------------------主片
            MOV     AL,11H
            OUT     20H,AL          ;ICW1
            MOV     AL,08H
            OUT     21H,AL          ;ICW2
            MOV     AL,04H
            OUT     21H,AL          ;ICW3
            MOV     AL,01H
            OUT     21H,AL          ;ICW4
;-------------------------------------------------------------初始化从片8259 
            MOV     AL, 11H 
            OUT     0A0H, AL        ;ICW1 
            MOV     AL, 30H 
            OUT     0A1H, AL        ;ICW2 
            MOV     AL, 02H 
            OUT     0A1H, AL        ;ICW3 
            MOV     AL, 01H 
            OUT     0A1H, AL        ;ICW4
;--------------------------------------------------------------- 
            MOV     AL, 0FDH        ;OCW1 = 1111 1101B
            OUT     0A1H,AL 		
            MOV     AL,2BH          ;OCW1 = 00101011B
            OUT     21H,AL	
            STI	
;--------------------------------------------------------------- 定时器芯片
INITC:      MOV     DX, TIMERM      ;8254控制字 
            MOV     AL, 36H         ;计数器0,方式3 
            OUT     DX, AL 
            MOV     DX, TIMER0
            MOV     AX, 20000 
            OUT     DX, AL 
            MOV     AL, AH
            OUT     DX, AL 
            MOV     DX, TIMERM      ;8254控制字 
            MOV     AL, 76H         ;计数器1,方式3 
            OUT     DX, AL
            MOV     DX, TIMER1
            MOV     AX, 1000 
            OUT     DX, AL 
            MOV     AL, AH 
            OUT     DX, AL 
;--------------------------------------------------------------- 8255初始化
INITD:      NOP
;--------------------------------------------------------------- 
BEGIN:      NOP
AA2:        JMP     AA2
;--------------------------------------------------------------- 
MIR7        PROC    NEAR
            PUSH    AX
            PUSH    DX
            MOV     AX,0137H
            INT     10H             ;显示字符7
            MOV     AX,0120H
            INT     10H
            MOV AL,STA
            CMP AL,01H
            JNZ M7END;状态位不是01的话就结束  可能存在一个刚按下start就来中断的情况  需要在start里面重新初始化8254
            MOV  DX,21H
            IN    AL,DX
            OR   AL,11000000B;关中断
            OUT  DX,AL
            ;----------选手灯全灭
            MOV  DX,  P8255C
            MOV  AL,  10000000B;状态灯pc7 pc6    1  0 代表无人抢答       
            OUT   DX,  AL
            MOV   DX,  P8255B
            MOV   AL,  0;全灭代表8.亮
            OUT   DX,  AL
            MOV  AL,   10H
            MOV  STA,  AL
   M7END:   MOV     AL,20H
            OUT     20H,AL
            POP     DX
            POP     AX			
            RET
MIR7        ENDP
;--------------------------------------------------------------- 
MIR6        PROC    NEAR
            PUSH    AX
            PUSH    DX
            MOV     AX,0136H
            INT     10H             ;显示字符6
            MOV     AX,0120H
            INT     10H
			MOV  BX,  TIME
			DEC  BX
			MOV  TIME,  BX
			JNZ   SWAP
			CALL  MIR7
    SWAP:   MOV  DX,  P8255A
             IN   AL,  DX
    CK_STA: MOV  AH,  STA
            CMP   AH,  01H
            JNZ   M6END;检测状态位是否为01H
    CK_K:   TEST  AL,  0FFH
            JZ  M6END	
            MOV  DX,  21H;想读中断控制字,屏蔽MIR7MIR6和
            IN  AL,  DX
            OR  AL,  11000000B;开中断交给SIR1
            OUT  DX,  AL
            CALL  SWITCH;今晚调通
            MOV  STA,11H;转换状态
            M6END:   MOV     AL,20H
            OUT     20H,AL  
            POP     DX
            POP     AX			
            IRET
MIR6        ENDP	
SIR1        PROC    NEAR
            PUSH    AX
            PUSH    DX
            MOV     AX,0131H
            INT     10H             ;显示字符1
            MOV     AX,0120H
            INT     10H
       MOV  DX, 21H
            IN  AL, DX
           	MOV  TIME,500;这里重新对time进行处理
	        	CALL  ALTER	;调用状态转换函数
            MOV     AL, 20H 
            OUT     0A0H, AL 
            OUT     20H, AL
            POP     DX
            POP     AX			
            IRET
SIR1        ENDP

;---------------------------------------------------以下为子程序
DELAY:      PUSH    SI
            PUSH    CX
            MOV     SI,	00FFH
D11:        MOV     CX,	00FFH
D22:        LOOP    D22
            DEC     SI
            JNZ     D11             ;延时结束
            POP     CX              
            POP     SI
            RET
;---------------------------------------------------------------
ALTER       PROC    NEAR
            PUSH    AX
            MOV     AL,STA
            TEST    AL,01H
            JZ      EVEN1
ODD1:       MOV     STA,0
            CALL    SUBR1
            JMP     DONE2
EVEN1:      MOV     STA,01H
            CALL    SUBR2
DONE2:      POP     AX
            RET
ALTER       ENDP
SUBR1       PROC    NEAR
            PUSH    AX
            PUSH    DX
            ;---------选手灯,数码管全灭,状态转换为00H PC7 PC6灯的问题
            MOV DX,P8255C
            MOV AL,00H
            OUT DX,AL
            MOV DX,P8255B
            MOV AL,0FFH
            OUT DX,AL
            	POP     DX
            POP     AX
            RET
SUBR1       ENDP
SUBR2       PROC    NEAR
            PUSH    AX
            PUSH    DX
              ;-----------------准备干活了  确保10s中断不会被打断
            MOV DX,P8255C
            IN AL,DX
            MOV AL,01000000B;01H红绿灯
            OUT DX,AL
            ;----------------------------------重新初始化8254 防止出现不到十秒就中断的情况
            MOV     DX, TIMER0
            MOV     AX, 20000
            OUT     DX, AL 
            MOV     AL, AH
            OUT     DX, AL
            MOV     DX, TIMER1
            MOV     AX, 1000 
            OUT     DX, AL 
            MOV     AL, AH 
            OUT     DX, AL  
            ;--------------------------------
            IN AL,21H
            AND AL,00111111B;允许中断
            OUT 21H,AL
            ;-------------------------------
            POP     DX
            POP     AX
            RET
SUBR2       ENDP
SWITCH		PROC  		NEAR				; 
			PUSH	AX
			PUSH	DX
	        MOV     DX,P8255A	 ;判断A口开关状态
	  		IN		AL,DX
	  		MOV DX,P8255C
	  		OR AL,0C0H
	  		OUT DX,AL
	  		MOV     DX,P8255A
	  		TEST	AL,01H
			JNZ		K1
			TEST	AL,02H
			JNZ		K2
			TEST	AL,04H
			JNZ		K3
			TEST	AL,08H
			JNZ		K4
			TEST	AL,10H
			JNZ		K5
			TEST	AL,20H
			JNZ		K6
			JMP		DOWN4
	  ;利用分支实现选手灯亮,以及状态从01H-->11H
	 	K1:	
	 			
			MOV		AL,06H
			MOV    STA,11H
			JMP     DONE
	 	K2:
			MOV		AL,5BH
			MOV    STA,11H
			JMP     DONE
	    K3:	
			MOV		AL,4FH
			MOV    STA,11H
			JMP     DONE
		K4:	
			MOV		AL,66H
			MOV    STA,11H
			JMP     DONE
		K5:	
			MOV		AL,6DH
			MOV    STA,11H
			JMP     DONE
		K6:
			MOV		AL,7DH
			MOV    STA,11H
			JMP     DONE
DONE:	   
			MOV		DX,P8255B
			OUT		DX,AL
DOWN4:		
			POP	  	DX
       		POP		AX
       		RET
SWITCH		ENDP   
;---------------------------------------------------------------         	
CODE        ENDS
            END     START
;---------------------------------------------------------------         	
CODE        ENDS
            END     START

下面送上实验结果图何连线图——>

汇编语言小设计——抢答器_第5张图片

你可能感兴趣的:(汇编语言)