我是靠谱客的博主 难过豆芽,最近开发中收集的这篇文章主要介绍微机原理-8259下降沿中断-计数实验,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.  首先附上原理图,引脚连接的方式是网络标号的形式,分模块进行原理图的绘画,这样使原理图更加清晰。

2.  实验案例运用的主要芯片有8255、8259, 下面分别对这两个芯片进行主要的讲解。

首先对8255进行端口定义,如下图所示,可以看到在8255A的A0和A1引脚连接的是AB1、AB2,CS引脚连接的是138译码器。那么8255控制字,AD15-AD0分别为:0000 0000 1000 0110B,转化为16进制就是 86H。那么控制A端口自然就是,0000 0000 1000 0000B,即80H,在本实验中,只用到了8255的端口A,所以只对A端口进行定义。

                        

对 8255 端口的定义完成后,需要对8255的工作方式进行定义。

三种工作方式可用软件编程对控制口设置来指定。三种基本的工作方式为: 方式0-基本的输入输出,方式1-选通输入输出方式, 方式2-双向传送方式。本实验的功能是,在每次按键按下后,触发 8259 下降沿中断,进入中断后,对八个LED灯实现16进制的累加,进而对LED灯的控制亮灭。因此,命令8255工作在方式0,A端口为输出状态。

故8255控制字(D7-D0)为:1000 0000B,16进制为 80H。

 3.  8259的链接图如下所示。

      首先对 ICW1写控制字,本实验为上升沿触发,一片 8255 使用 , 写IW4,因此 ICW1控制字为(D7-D0):0001 0011B。

      再对 ICW2写控制字 , 中端号为20H。故 ICW2控制字为(D7-D0):0010 0000B。

      最后对 ICW4写控制字,显然 ICW4控制字为(D7-D0):0000 0001B。

 

本图片来源:中断控制器8259——工作方式、命令字_花无凋零之时的博客-CSDN博客_8259

 

  本图片来源:中断控制器8259——工作方式、命令字_花无凋零之时的博客-CSDN博客_8259

4. 从图中可以看出,LED是共阳的。即初始化变量 CNT = 0FFH , 为LED为全灭状态。若按键按下,8259触发下降沿中断,进入中断函数之中。只需在中断函数之中,把变量 CNT 减 1 , 则实现了16进制的自减。

(1)第一次按下按键,8255 的A端口输出为 0FEH, 转化为 2 进制为 1111 1110B,故是PA0为低电平 , PA1-PA7都为高电平。因此此时只有LED0亮起 , LED1-LED7保持熄灭转态。如下图所示:

 (2)第二次按下按键,8255 的A端口输出为 0FDH, 转化为 2 进制为 1111 1101B,故是PA1为低电平 , PA0和P2-PA7都为高电平。因此此时只有LED1亮起 ,其他 LED 保持熄灭转态。如下图所示:

(3)再次按下,同理可得。

5. 总体工程代码如下:

mode    equ 080H   ; 8255 工作方式
A8255   equ 080H   ; 8255 port A
COM8255 equ 086H   ; 设置 com口

A8259 equ 090H
B8259 equ 092H

icw1    equ 00010011b   ; 单片8259,下降沿中断,要写ICW4
icw2    equ 00100000b   ; 中断号为20H
icw4    equ 00000001b   ; 工作在8086/88方式
ocw1    equ 11111110b   ; 只响应IR0中断  
IntBase equ 20H         ; 基号:IRO 对应的中断号

data segment
    CNT DB 0FFH
data ends

sseg segment stack 'stack'
    STA DB 100 dup(?)
    ;TOP equ lengtH STA
sseg ends
code segment
    assume cs:code,ds:data,ss:sseg  

start:
    mov ax,data
    mov ds,ax         
;----SET 8255-----    
    mov dx,COM8255
    mov al,mode
    out dx,al     
;------------------------
    cli       
    pusH ds
;------------------------    
    mov ax,0
    mov ds,ax
    mov bx,IntBase*4        ; 20H*4=128 interrupt number   中断号为20H的中断向量入口 
    mov ax,code
    mov cl,4       
    sHl ax,cl               ; =*16
    add ax,offset IENTER    ; interrupt subroutine entry address 中断入口地址偏移地址
    mov [bx],ax    
    mov ax,0
    inc bx   
    inc bx
    mov [bx],ax             ; segment address is 0    
    pop ds
;------------------------     
Iinit:                      ;设置中断工作方式
    mov dx,A8259            ;写ICW1  
    mov al,icw1             ;00010011B
    out dx,al               ;下升沿触发,间隔为8,单片工作,写ICW4

    mov dx,B8259            ;写ICW2
    mov al,icw2             ;00100000B
    out dx,al     

    mov al,icw4             ;写ICW4
    out dx,al    
    mov al,ocw1             ;写OCW1
    out dx,al      
   
    mov al,CNT              
    mov dx,A8255
    out dx,al
;---------------在proteus 中仿真时做如下处理 ————————————;
    sti                     ; 打开CPU可屏蔽中断
LP:      
dead_wHile:
	mov al,IntBase
	out 0, al       	; 
	jmp dead_wHile  	;    
    jmp LP 
;------------------------    
IENTER:     
    cli
    mov dx,A8255
    dec CNT
    mov al,CNT
    out dx,al   ; out counter number   
 
    mov dx,A8259
    mov al,20H  ; ocw2, end of interrupt
    out dx,al

    sti    
    iret   
code ends 
end start

最后

以上就是难过豆芽为你收集整理的微机原理-8259下降沿中断-计数实验的全部内容,希望文章能够帮你解决微机原理-8259下降沿中断-计数实验所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部