⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xt00.txt

📁 用8086
💻 TXT
字号:
;第七章习题11:用8086,8255,8259和8254构造系统实现对指示灯控制。
;8255的PA0,PA1,PA2的三位DIP开关,通过DIP开关的闭合状态决定接在
;PB口上的八个指示灯之一闪烁。如PA2,PA1,PA0为000时,PB0上所接的指
;示灯闪烁,其余灯熄灭。要求闪烁频率为每秒10次。设8259地址为20H和
;21H,8255地址为60H~63H,8254地址为40H~43H,时钟频率为50KHz,
;8259中断向量号为70H和71H.试设计硬件连接电路,填写中断向量表,编
;写全部初始化程序,完成控制程序编写。
;解:
;全局定义为了便于在实验机上调试,现将地址改成可以在实验机上调试的地址
;中断矢量号从20H开始,8254工作方式3.
  D8255A   EQU  60H
  D8255B   EQU  61H
  D8255C   EQU  62H
  Z8255    EQU  63H
  D8254_0  EQU  40H
  D8254_1  EQU  41H
  D8254_2  EQU  42H
  Z8254    EQU  43H
  INT0     EQU  70H
  INT1     EQU  71H
  STACK SEGMENT STACK
      STA  DW 50 DUP(?)
      TOP  EQU  LENGTH STA
 STACK ENDS
 CODE SEGMENT
  ASSUME CS:CODE,DS:CODE,SS:STACK
  ORG  1000H
 START:  ;初始化
      ;8255
      ;PA口方式0输入,PB口方式0输出,C口上半口输出,下半口输出
     MOV     AL, 10010000B
     MOV     DX, Z8255
     OUT     DX, AL
     ;MOV    AL,0FFH
     MOV     AL, 00H
     MOV     DX, D8255B
     OUT     DX, AL
     ;8254
     ;用#0计数器计数,工作方式3产生中断,计数初值为2500,16进制计数
      MOV  AL,00111110B
      MOV  DX,Z8254
      OUT  DX,AL
      MOV  AL,0c4H
      MOV  DX,D8254_0
      OUT  DX,AL
      MOV  AL,9H
      OUT  DX,AL
   ;8259
   ; 设置中断的入口地址
        xor bx,bx
        push bx
        pop ds
        CLI           ;关中断
   ;以下3个中断向量分别分配给IRQ0
        LEA  AX,IRQ0_INTERRUPT;中断向量20H
        MOV ds:WORD PTR[80H],AX
        MOV ds:WORD PTR[82H],CS
        NOP
        push cs
        pop  ds

   ;ICW1,采用单片8259,边缘触发,需要ICW4
    MOV  AL,00010011B
    MOV  DX,INT0
    OUT  DX,AL
   ;ICW2,中断起始矢量号为70H号
    MOV  AL,70H
    MOV  DX,INT1
    OUT  DX,AL
   ;ICW4,指定非特殊中断结束
    MOV  AL,01H
    OUT  DX,AL
   ;8259操作命令
  ;OCW1: 特征 A0 = 1 按顺序判断
  ;       初始化结束后,只有OCW1要求A0=1
  ;       其它操作命令OCW2,OCW3 都要求A0=0
   MOV AL,0FEH   ;开放0中断
   OUT DX,AL
;OCW2: 特征 A0 = 0 ,D4=0,D3=0
   MOV AL, 20H    ;非特殊EOI结束中断
   MOV DX,INT0
   OUT DX,AL
   sti
;主程序
           mov PBOFF,0
  MAIN:
         ;不做任何事情
           JMP     MAIN
          ;数据区
           ;   PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7 显示码
  PBFLASH  DB 01H,02H,04H,8H,10H,20H,040H,080H
  PBOFF db 0
  PA8255 db 0

;      外部硬件中断处理程序
;
;************************************************
IRQ0_INTERRUPT PROC NEAR
        PUSH   AX
        PUSH   BX
        PUSH   DX
;               为保证实时钟计数不开中断
         sti    ;开中断
         MOV  AL,PBOFF
         CMP  AL,01H
         JE   outpb0
           MOV     DX,D8255A
           in  al, DX
           and al,07
         LEA  BX,PBFLASH
         XLAT
         MOV  DX,D8255B
         OUT  DX,AL
         MOV  PBOFF,1
        JMP EXIT0
       outpb0:
              MOV DX,D8255B
              MOV AL,0H
              OUT DX,AL
         MOV  PBOFF,0
   EXIT0:     cli     ;关中断
;EOI方式
        MOV  AL,  20H   ;不指定EOI结束中断
        MOV  DX,INT0
        OUT  DX,AL
             POP DX
             POP BX
             POP AX
             IRET
IRQ0_INTERRUPT ENDP
   CODE ENDS
END START
//////////////////////////////////////////////////////////////////////
;第七章练习题七:一8255芯片的A口和B口分别与8个LED灯和8个开关连接好,
;通过开关控制LED灯的开和闭。8255的端口地址为40,41,44和46H。画出译
;码电路图,编写初始化程序和控制程序。
;解:
;全局定义
D8255A  EQU   40H
D8255B  EQU   42H
D8255C  EQU   44H
Z8255   EQU   46H
 STACK SEGMENT STACK
    STA DW 50 DUP(?)
    TOP EQU LENGTH STA
 STACK ENDS
 CODE  SEGMENT
    ASSUME CS:CODE,DS:CODE,SS:STACK
 ORG 1000H  
 START:
;8255   初始化
;8255 A口方式0输出,B口方式0输入,C口上半口输出,下半口输出
    MOV    AL,    10000010B  
    OUT    Z8255, AL
L1: MOV    AL,    D8255B
    OUT    D8255A,AL
    MOV    CX,    0FFH
    JMP    L1
     CODE  ENDS
 END START

/////////////////////////////////////////////////////////////////////
;习题6第7题:某系统中8254芯片的通道0~通道2和控制字端口分别为
;FFF0H~FFF2H,定义通道0工作方式2,CLK0=5MHz,要求输出OUT0=1kHz
;方波;定义通道1工作在方式4,用OUT0作为计数脉冲,计数值为1000,
;计数器计到0向CPU发中断请求,CPU响应这一中断后继续写入计数值
;1000,重新开始计数,保持1秒钟向CPU发出一次中断请求。请画出硬件
;链接图,并编写初始化程序。
;解:
INT0    EQU   20H
INT1    EQU   21H
C8254   EQU   0FFF3H
D8254   EQU   0FFF0H 
STACK   SEGMENT STACK 
   STA  DW 50 DUP(?)
   TOP  EQU  LENGTH STA
STACK ENDS
 CODE SEGMENT
       ORG 1000H
       ASSUME CS:CODE,DS:CODE,SS:STACK
START:         ;初始化
        ;设置中断的入口地址
        XOR   BX,BX
        PUSH  BX
        POP   DS                  ;将DS清零
        CLI                       ;关中断
      ;如果设置8259的起始中断向量号为8
      ;以下6个中断向量分别分配给IRQ0.
        LEA  AX,IRQ0_INTERRUPT    ;中断向量8H
        MOV  DS:WORD PTR[32],AX
        MOV  DS:WORD PTR[34],CS
        NOP
        PUSH CS                   ;将CS中的内容传到DS
        POP  DS

       ;初始化8259

        CLI                       ;关中断
       ;ICW1: 特征 A0 = 0 , D4 = 1
       ;边沿触发要求上升沿后保持高电平,
       MOV    AL,     00010011B ;边沿触发,单片使用,需要ICW4
       OUT    INT0,   AL
       JMP    $+2               ;延时
       ;ICW2: 特征 A0 = 1 按顺序判断
       MOV    AL,     00001000B ;中断矢量从08H号开始
       OUT    INT1,   AL
       JMP    $+2
       ;ICW4: 特征 A0 = 1 按顺序判断,ICW1设置要ICW4
       ;EOI,全嵌套方式,非缓冲,86/88系统
       MOV    AL,     00000001 ;采用全嵌套,非缓冲,非自动结束,16位微机处理
       OUT    INT1,   AL
       JMP    $+2
       ;8259操作命令
;************************************************
;OCW1: 特征 A0 = 1 按顺序判断
;       初始化结束后,只有OCW1要求A0=1
;       其它操作命令OCW2,OCW3 都要求A0=0
;************************************************
        MOV   DX,INT1
        MOV   AL,0FEH  ;假设只用1个可屏蔽中断,开放1个可屏蔽中断
        OUT   DX,AL
        MOV   CX,0FFFH
        LOOP  $
;************************************************
;OCW2: 特征 A0 = 0 ,D4=0,D3=0
;************************************************
        MOV   DX,INT0
        MOV   AL,20H    ;00100000B,非特殊EOI结束中断
        OUT   DX,AL
        MOV   CX,0FFFH
        LOOP  $
;************************************************
;OCW3: 特征 A0 = 0 ,D4=0,D3=1
;************************************************

;初始化8254
          MOV     AL,    00110101B  ;写8254控制字,定义计数器0#工作方式2,使用16
                                    ;位BCD计数方式
          MOV     DX,    C8254      ;地址数据太大,采用寄存器间接寻址  
          OUT     DX,    AL
          MOV     AX,    5000       ;为计数器0送计数初值,先送低8位,5000000HZ/1000Hz=5000
          MOV     DX,    D8254
          OUT     DX,    AL
          MOV     AL,    AH             
          OUT     DX,    AL
          MOV     AL,    01111001B  ;写8254控制字,定义计数器1#工作方式4,使用16
          MOV     DX,    C8254      ;位BCD计数方式
          OUT     DX,    AL 
RECOUNT:  MOV     AX,    1000       ;为计数器1送计数初值,先送低8位,1000Hz/1Hz=1000
          MOV     DX,    D8254
          INC     DX
          OUT     DX,    AL
          MOV     AL,    AH             
          OUT     DX,    AL
IRQ0_INTERRUPT   PROC    NEAR
          PUSH    AX
          PUSH    DX
          STI     ;开中断
          MOV     DX,   INT0
          MOV     AL,   20H      ;结束中断
          OUT     DX,   AL
          MOV     AX,   1000       ;为计数器1送计数初值,先送低8位,1000Hz/1Hz=1000
          MOV     DX,   D8254
          INC     DX
          OUT     DX,   AL
          MOV     AL,   AH             
          OUT     DX,   AL
          CLI     ;关中断
          POP     DX
          POP     AX
          IRET
IRQ0_INTERRUPT ENDP
         CODE  ENDS
END      START    

//////////////////////////////////////////////////////////////////////////////////////
;第6章第4题:用8254作为某数据采集系统的定时器,每隔10ms用中断方式采集一次
;数据,已知输入时钟频率为10kHz,8259端口地址为20~21H,中断类型号为13H,
;8254端口地址为40~43H,请为8259和8254编制初始化程序。
;解:
INT0    EQU   20H
INT1    EQU   21H
D8254   EQU   43H
D8254A  EQU   40H 
STACK SEGMENT STACK 
   STA  DW 50 DUP(?)
   TOP  EQU  LENGTH STA
STACK ENDS
 CODE SEGMENT
       ORG 1000H
       ASSUME CS:CODE,DS:CODE,SS:STACK
START:         ;初始化
      ;设置中断的入口地址
        XOR   BX,BX
        PUSH  BX
        POP   DS                  ;将DS清零
        CLI                       ;关中断
     ;如果设置8259的起始中断向量号为10
     ;以下6个中断向量分别分配给IRQ0、IRQ1、IRQ2、IRQ3.
        LEA  AX,IRQ0_INTERRUPT    ;中断向量10H
        MOV  DS:WORD PTR[64],AX
        MOV  DS:WORD PTR[66],CS
        NOP
        LEA  AX,IRQ1_INTERRUPT    ;中断向量11H
        MOV  DS:WORD PTR[68],AX
        MOV  DS:WORD PTR[70],CS
        NOP
        LEA  AX,IRQ2_INTERRUPT    ;中断向量12H
        MOV  DS:WORD PTR[72],AX
        MOV  DS:WORD PTR[74],CS
        NOP
        LEA  AX,IRQ3_INTERRUPT    ;中断向量13H
        MOV  DS:WORD PTR[76],AX
        MOV  DS:WORD PTR[78],CS
        NOP
        PUSH CS                   ;将CS中的内容传到DS
        POP  DS
       ;初始化8259
        CLI                       ;关中断
       ;ICW1: 特征 A0 = 0 , D4 = 1
       ;边沿触发要求上升沿后保持高电平,
       MOV    AL,     00010011B ;边沿触发,单片使用,需要ICW4
       OUT    INT0,   AL
       JMP    $+2               ;延时
       ;ICW2: 特征 A0 = 1 按顺序判断
       MOV    AL,     00010000B ;中断矢量从10H号开始
       OUT    INT1,   AL
       JMP    $+2
       ;ICW4: 特征 A0 = 1 按顺序判断,ICW1设置要ICW4
       ;EOI,全嵌套方式,非缓冲,86/88系统
       MOV    AL,     00000001 ;采用全嵌套,非缓冲,非自动结束,16位微机处理
       OUT    INT1,   AL
       JMP    $+2
       ;8259操作命令
;************************************************
;OCW1: 特征 A0 = 1 按顺序判断
;       初始化结束后,只有OCW1要求A0=1
;       其它操作命令OCW2,OCW3 都要求A0=0
;************************************************
        MOV   DX,INT1
        MOV   AL,0F0H  ;假设只用4个可屏蔽中断,四个中断全部开放
        OUT   DX,AL
        MOV   CX,0FFFH
        LOOP  $
;************************************************
;OCW2: 特征 A0 = 0 ,D4=0,D3=0
;************************************************
        MOV   DX,INT0
        MOV   AL,20H    ;00100000B,非特殊EOI结束中断
        OUT   DX,AL
        MOV   CX,0FFFH
        LOOP  $
;************************************************
;OCW3: 特征 A0 = 0 ,D4=0,D3=1
;************************************************
       ;初始化8254
       MOV    AL,     00110001B;82540号计数器,工作方式0,16位数,二进制
       OUT    D8254,  AL
       MOV    AX,     100      ;为计数器0送计数初值,先送低8位
       OUT    D8254A, AL
       MOV    AL,     AH
       OUT    D8254A, AL       ;为计数器0送计数初值高8位
;中断服务程序
IRQ0_INTERRUPT PROC NEAR
         PUSH   AX
         PUSH   DX
         STI    ;开中断
;........不处理返回
;........
         CLI     ;关中断
         POP   DX
         POP   AX
         IRET
IRQ0_INTERRUPT ENDP
IRQ1_INTERRUPT PROC NEAR
         PUSH   AX
         PUSH   DX
         STI    ;开中断
;........不处理返回
;........
         CLI     ;关中断
         POP    DX
         POP    AX
         IRET
IRQ1_INTERRUPT  ENDP
IRQ2_INTERRUPT  PROC NEAR
         PUSH   AX
         PUSH   DX
         STI    ;开中断
;........不处理返回
;........
         CLI     ;关中断
         POP   DX
         POP   AX
         IRET
IRQ2_INTERRUPT ENDP
IRQ3_INTERRUPT PROC NEAR
         PUSH   AX
         PUSH   DX
         STI    ;开中断
         MOV    DX,INT0
         MOV    AL,20H      ;结束中断
         OUT    DX,AL
         CLI    ;关中断
         POP   DX
         POP   AX
         IRET
IRQ3_INTERRUPT ENDP
CODE  ENDS
END   START    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -