推荐可控制循环灯设计微机原理课程设计 精品.docx
《推荐可控制循环灯设计微机原理课程设计 精品.docx》由会员分享,可在线阅读,更多相关《推荐可控制循环灯设计微机原理课程设计 精品.docx(15页珍藏版)》请在冰豆网上搜索。
推荐可控制循环灯设计微机原理课程设计精品
<<微机原理>>课程设计
可控制循环灯设计
姓名:
纪乐
学号:
120XX241906
专业:
通信工程
班级:
20XX级1班
指导老师:
李萍
学院:
物理电气信息学院
完成日期:
20XX年12月8日
可控制循环灯设计
一.设计内容
本次设计实验用LED作为中断显示器,在我的课程设计过程中需要使用八个LED灯,先对8059初始化,开始第一个灯亮,有中断时按下开关第二个灯亮,依次循环亮。
二.设计目的
1、了解可控制循环灯的工作原理。
2、掌握可控制循环灯编程方法和芯片8259的逻辑功能及使用方法。
3、掌握一定的汇编语言知识,培养自己的动手操作能力。
4、学习程序设计的基本思路和方法
三.设计原理
1.8086的简介
Intel8086拥有四个16位的,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了指标)。
资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。
它提供64K8位元的输出输入(或32K16位元),以及固定的。
大部分的指令只能够存取一个内存位址,所以其中一个必须是一个寄存器。
运算结果会储存在中的一个寄存器。
2.8086的结构
8086引脚图
8086具有两种不同工作方式,即最小模式和最大模式。
若把MN/MX#引脚连至电源+5V,则为最小模式。
若把它接地,则处在最大模式。
在最小模式中引脚定义
AD15~AD0(AddressDataBus):
16位地址/数据总线,分时复用。
传输地址时三态输出,传输数据时三态双向输入/输出。
在总线周期T1状态,CPU在这些引脚上输出存储器或I/O端口的地址、在T2~T4状态,用来传送数据、在中断响应及系统总线“保持响应”周期一,AD15~AD0被置成高阻状态。
A19/S6~A16/S3(Address/Status):
地址/状态线,三态,输出,分时复用。
在T1状态作地址线用,A19~A16与A15~A0一起构成20位物理地址,可访问存储器1M字节。
当CPU访问I/O短口时,A19~A16为“0”、在T2~T4状态作状态线用,S6~S3输出状态信息。
BHE/S7(BusHighEnable/Status):
高8位数据线允许/状态信号,三态输出,低电平有效。
16位数据传送时在T1状态,用BHE指出高8位数据总线上数据有效,用AD0地址线指出低8位数据线上数据有效。
在T2~T4状态S7输出状态信息,在“保持响应”周期被置成高阻状态。
MN/MX(Minimun/Maximun):
最小/最大工作模式选择信号,输入。
当MN/MX接+5V时,CPU工作在最小模式,当MN/MX接地时,CPU工作在最大模式。
RD(Read):
读选通信号,三态,输出,低电平有效。
由M/IO信号区分读存储器或I/O端口,在读总线周期的T1、T2、TW状态,RD为低电平。
在“保持响应”周期,被置成高阻状态。
WR(Write):
写选通信号,三态,输出,低电平有效。
由M/IO信号区分写存储器或I/O端口,在读总线周期的T1、T2、TW状态,WR为低电平。
在DMA方式时,被置成高阻状态。
M/IO(Memory/InputandOutput):
存储器或I/O端口控制信号,三态,输出。
M/IO信号为高电平时,表示CPU正在访问存储器,信号为低电平时,表示CPU正在访问I/O端口。
一般在前一个总线周期的T4状态,有效,直到本周期的T4状态为止。
在DMA方式时,M/IO置为高阻状态。
ALE地址锁存允许信号,输出,高电平有效。
READY(Ready):
准备就绪信号,输入,高电平有效。
在T3状态结束后CPU插入一个或几个TW暂停状态,直到READY信号有效后,才进入T4状态,完成数据传送过程。
RESET(Reset):
复位信号,输入,高电平有效。
CPU收到复位信号后,停止现行操作,并初始化段寄存器DS、SS、ES,标志寄存器PSW,指令指针IP和指令队列,而使CS=FFFFH。
RESET信号至少保持4个时钟周期以上的高电平,当它变成低电平时,CPU执行重启动过程,8086/8088将从地址FFFF0H开始执行指令。
INTR(InterruptRequest):
可屏蔽中断请求信号,输入,电平触发,高电平有效。
当外设接口向CPU发出中断申请时,INTR信号变成高电平。
INTA(InterruptAcknowledge):
中断响应信号,输出,低电平有效。
在中断响应总线周期T2、T3、TW状态,CPU发出两个INTA负脉冲,第一个负脉冲通知外设接口已响应它的中断请求,外设接口收到第二个负脉冲信号后,向数据总线沙锅内放中断类型号。
NMI(Non—MaskableInterruptRequest):
不可屏蔽中断请求信号,输入,边沿触发,正跳变有效。
此类中断请求不受中断允许标志位IF的影响,也不能用软件进行屏蔽。
一旦收到信号,在当前指令执行完后,自动引起类型2中断。
经常处理电源掉点的紧急情况。
TEST(Test):
测试信号,输入,低电平有效。
CLK(Clock):
时钟信号,输入。
VCC(+5V),GND(地)
2.8259A的结构
a.中断的概念:
所谓中断,是指CPU在正常运行时由于程序的预先安排或内外部事件引起CPU暂行正在运行的程序,转到为预先安排的事件或内外部事件服务的程序中去,服务程序执行结束后再返回到暂行的程序继续执行。
引起中断的事件称为中断源。
预先安排的事件是指PC的中断指令。
内部事件是指系统板上出现的一些事件信号,中断指令也可看作内部事件。
外部事件是指某些接口设备所发出的请求中断程序执行的信号,这些信号称为中断请求信号,中断请求信号是不能预知的,然而它们一旦请求中断,则会向CPU发出信号,这样CPU就无需花大量时间去查询这些信号是否产生。
中断请求信号一旦产生,CPU得知这个信号后,便立即去执行相应的中断服务程序,执行完成后CPU恢复被中断的程序。
有时中断源有几个,因此CPU响应这些中断就得有先后次序,这称为中断优先级。
优先级高的中断首先响应,优先级低的中断暂不响应。
CPU响应中断由中断源提供地址信息,引导程序转移到中断服务程序中去,这个地址信息称为中断向量,它一般是和中断源相对应的,PC机采用类型码来识别中断源。
b.中断控制器8259A的逻辑结构
在微机中,利用8259芯片来完成中断。
中断控制器8259引脚图
芯片引脚定义如下:
D0~D7:
数据线,双向。
WR#:
写控制信号,低电平有效。
RD#:
读控制信号,低电平有效。
CS#:
片选端,低电平有效。
A0:
地址线。
在8088中由CPU的A0接入8259的A0端;而在8086中由CPU的A1接入8259的A0端。
IRQ0~IRQ7:
8级中断请求输入。
INT:
中断请求信号(输出)。
用来向CPU发中断请求信号。
INTA:
中断应答线(输入)。
当接收到CPU的应答信号后,8259A就把中断向量类型号送到数据线。
SP#/EN#:
在缓冲器工作方式作为输入信号允许缓冲器选通。
在主从工作方式作为输入信号由该输入脚的电平来区分“主”或“从”8259A,若输入高电平则为“主”8259A,若输入低电平则为“从”8259A。
CAS0~CAS2级联控制信号。
系统中最多可以把8级中断请求扩展为64级主从式中断请求,对于“主”8259A,CAS0~CAS2为输出信号,对于“从”8259A,CAS0~CAS2为输入信号。
c.8259A工作原理
当一个中断请求从IR0到IR7中的某根线到达IMR时,IMR首先判断此IR是否被屏蔽,如果被屏蔽,则此中断请求被丢弃;否则,则将其放入IRR中。
在此中断请求不能进行下一步处理之前,它一直被放在IRR中。
一旦发现处理中断的时机已到,将从所有被放置于IRR中的中断中挑选出一个优先级最高的中断,将其传递给CPU去处理。
IR号越低的中断优先级别越高,比如IR0的优先级别是最高的。
8259A通过发送一个INTR信号给CPU,通知CPU有一个中断到达。
CPU收到这个信号后,会暂停执行下一条指令,然后发送一个INTA信号给8259A。
8259A收到这个信号之后,马上将ISR中对应此中断请求的Bit设置,同时IRR中相应的bit会被reset。
比如,如果当前的中断请求是IR3的话,那么ISR中的bit-3就会被设置,IRR中IR3对应的bit就会被reset。
这表示此中断请求正在被CPU处理,而不是正在等待CPU处理。
随后,CPU会再次发送一个INTA信号给8259A,要求它告诉CPU此中断请求的中断向量是什么,这是一个从0到255的一个数。
8259A根据被设置的起始向量号(起始向量号通过中断控制字ICW2被初始化)加上中断请求号计算出中断向量号,并将其放置在DataBus上。
3.CPU中断处理的过程:
4.CPU在系统的应用
5.对8086的初始化
因为8259的内部寄存器寻址与命令字的写入顺序有关,所以,对8259的初始化一定要按规定的顺序进行,如下图。
6.设置中断向量表
本实验设计中采用一片8259A中断控制芯片工作于主片方式,8个中断请求,求输入端IR0~IR7对应的中断型号为0~7,中断矢量关系如下表所示
四.实验设备
PC机一台,proteus仿真软件以及emu8086编译软件。
五.硬件电路图
a.原理图
b.接口电路
c.原理布图
六.汇编程序设计
;定义堆栈------------------
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
;定义变量------------------
DATASEGMENT;定义T=1
TDB1
DATAENDS
;代码段
codeSEGMENT'code'
assumeCS:
code,DS:
data
start:
MOVAX,DATA
MOVDS,AX
CLI;修改中断向量前关中断
MOVAX,0
MOVES,AX;es段=0
MOVSI,60H*4;设置中断向量96号中断
MOVAX,OFFSETint0;中断入口地址
;stosw
MOVES:
[SI],AX;[si]=60h*4,存放入口地址->IP8086
MOVAX,CS;segint0->CS8086
;stosw;
MOVES:
[SI+2],AX
;初始化8259
MOVAL,00010011b
MOVDX,400H;ICW1=00010011B//010000010000A0=0,D4=1,CS=0400H
OUTDX,AL
MOVAL,060h;060b
MOVDX,402h;ICW2=01100000B//010000000010A0=1,CS=0402H
OUTDX,AL
MOVAL,1bh;ICW4=00011011B//1bh
OUTDX,AL
MOVDX,402h
MOVAL,00h;OCW1,八个中断全部开放00h
OUTDX,AL
MOVAL,20H;EOI
OUT20H,AL
;MOVDX,400h;//010000000000A0=0,CS=0
;MOVAL,60H;OCW2,非特殊EOI结束中断
;OUTDX,AL;OCW2可以不赋值
;完成8259初始化
MOVAL,t;初始t=1
MOVDX,0200H;led的地址//001000000000,led=0
OUTDX,AL;开始第一个灯亮
STI;开中断
li:
;8086模型有问题,它取得的中断号是最后发到总线上的数据,并不是由8259发出的中断号
;所以造成了要在这里执行EOI的假相,这三句与下面的指令效果是一样的
MOVDX,400H;CS=0400H
MOVAL,60h;如果改为其它值,将出错,因为只有60H有中断向量
OUTDX,AL
JMPli
;中断服务程序----------------------------------
int0:
CLI;关中断,
MOVAL,t;t=1;
ROLAL,1;t=t<<1
MOVt,AL
MOVDX,0200h;led=t<<1
OUTDX,AL
STI;开中断
IRET;返回主程序
;-------------------------------------------------
codeENDS
ENDstart
7.实验结果:
a.emu8086编译图
b.仿真初始状态
c.按下开关后的仿真结果
八.实验分析
经过一周的时间的努力,使得这次的实验成功的完成,在这次实验过程中我对8259进行了一系列的研究,在一般中断实验,为了保护现场,程序开头都会引用堆栈把把现在的程序放入堆栈中进行保护,所以,PUSH DS就起到这样的作用.在中断程序结束后,为了能回到之前执行的程序入口,还得用POP DS 指令返回现场. 这个实验是关于8259的单中断,不牵涉级联问题,所以,8259的初始化只需要看主片就可了.初始化的时候,一般先使用CLI指令将所有的可屏蔽中断禁止,然后写入始化字.8259有四个初始化控制字ICW1,ICW2,ICW3,ICW4,由于8259只有一根地址线,因此对各个制字的操作是按照一定的顺序并结合某些数据位来进行寻址设置的.当初始化完成后,对8259的操作命令字的寻址是通过8259的地址线A0和某些数据位结合来进行的.
通过此次课程设计,发现了自己有很多地方不足,感觉我不能很好地把平时学的知识应用到实际实验中。
因此,通过本次课程设计,我认识到做实验首先要端正实验态度,正确对待任何一个程序,有耐心,一步一步的做下去,不断完善。
在调试程序的时候要脚踏实地,逐个调试子程序,找出哪步出现问题,继而解决问题,实现预期功能,从而圆满的完成了此次课程设计的要求。
其次,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,但总的来说还是圆满的。