微机原理
课程设计说明书
设计题目:跑马灯
学 院 计算机科学与工程学院
专 业 计算机科学与技术专业
班 级
学 生
学 号
同组者
指导教师
2014 年 春季 学期
目录
一、 实验简介............................................................. 3
1、基本要求................................................................................. 3
2、设计提示................................................................................. 3
3、进一步设计要求.................................................................... 3
二、 实验原理............................................................. 3
1、 实验原理描述...................................................................... 3
2、8254芯片................................................................................ 4
2.1、8254芯片组成部分..................................................... 4
2.2、8254芯片工作方式..................................................... 4
3、8255芯片................................................................................ 5
3.1、8255芯片的组成部分................................................. 5
3.2、8255芯片工作方式..................................................... 6
4、实验原理图............................................................................. 7
三、 实验流程图与源程序........................................ 7
1、 流程图................................................................................... 7
1.1、 主程序流程图......................................................... 8
1.2 Appmain 子程序流程图................................................ 8
1.3 灯跳转阶段流程图...................................................... 10
2、源程序(见附录).................................................................... 11
四、 实验结果与测试.............................................. 11
五、 实验提高与扩展.............................................. 11
六、 个人心得与体会.............................................. 12
附录.............................................................................. 13
一、实验简介:
1、基本要求:
采用8254精确定时,LED的点亮规律为LED7--->LED0,每一个LED的点亮时间间隔由逻辑电平开关K1、K2、K3选择,K1的时间间隔为0.5s,K2的时间间隔为1.0s,K3的时间间隔为1.5s。当主机键盘按下任意键时停止演示。
2、设计提示:
采用8255的A口接LED灯,B口接逻辑电平开关K1、K2与K3。在8254的中断服务程序中完成对灯的控制,主程序检测灯的变化,改变点亮LED的时间间隔。
3、进一步设计要求:
将LED的点亮规律变为LED7--->LED0--->LED7。
二、实验原理:
1、实验原理描述:
该实验中跑马灯采用8255和8254芯片来实现,利用8254芯片来做定时器,采用8254的方式3(方波发声器),因此在8254芯中采用级联的方法,以此来控制跑马灯中实现0.5s,1.0s,1.5s的效果片;在8255芯片中将A口当做输出口连接LED灯,B口一个输入口来掌控三个逻辑开关的打开与关闭,选择三种不同的时间间隔,C7口作为另一个输入口连接着8254芯片的OUT1口来读从8254芯片传来的三种不同大小的频率之一,以此来实现具有三种不同时间间隔跳转的跑马灯。
2、8254芯片:
2.1、8254芯片组成部分:
(1)数据总线缓冲器:
数据总线缓冲器是一个三态、双向8位寄存器主要作用是与cpu进行数据交换,8位数据线D7~D0与CPU的系统数据总线连接,构成CPU和8254之间信息传送的通道,CPU通过数据总线缓冲器向8254写入控制命令、计数初始值或读取计数值。
(2)读写逻辑:
读写逻辑是芯片的控制部分,编程人员通过控制信号的选择来选择芯片的工作方式。读/写控制逻辑用来接收CPU系统总线的读、写控制信号和端口选择信号,用于控制8254内部寄存器的读/写操作。
(3)控制字寄存器:
控制寄存器是一个只能写不能读的8位寄存器,系统通过指令将控制字写入控制寄存器,设定8254的不同工作方式。
(4)计数器;
8254内部有三个结构完全相同而又相互独立的16位减“1”计数器,每个计数器有六种工作方式,各自可按照编程设定的方式工作。
2.2、8254芯片工作方式:
8254芯片共有六种工作方式,分别对应与六种不同的用途。
(1)方式0:计数结束中断方式,写入N后开始计数计数器为0 ,OUT输出H.
(2)方式1:可编程单稳态,外部GATE触发 OUT输出单拍负脉冲宽度N个CLK.
(3)方式2:速率发生器,每N个CLK输一个宽度为一个CLK周期的负脉冲 ,不断重复.
(4)方式3:方波发生器,N=偶,N/2个1,N/2个0N=奇,(N+1)/2个1,(N-1)/2个0 不断重复.
(5)方式4:软触发选通,写入N后开始计数计数器为0,OUT输出一个宽度为CLK周期的负脉冲.
(6)方式5:硬触发选通,写入N后GATE上升沿,开始计数计数器为0 ,写入N后GATE上升沿,开始计数计数器为0 ,OUT输出一个宽度为CLK,周期的负脉冲,OUT输出一个宽度为CLK,周期的负脉冲.
本次课设中,只是使用到了8254的工作方式3,将其当做一个方波发生器来使用,为8255提供固定频率的方波信号,8255以此来控制灯的点亮情况。使用8254的计数0和计数器1来进行级联,从out1中输出方波信号。
3、8255芯片:
3.1、8255芯片的组成部分:
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。
(一)与CPU连接部分:
根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。各信号的引脚编号如下:
(1)数据总线DB:编号为D0~D7,用于8255与CPU传送8位数据。
(2)地址总线AB:编号为A0~A1,用于选择A、B、C口与控制寄存器。
(3)控制总线CB:片选信号、复位信号RST、写信号、读信号。当CPU要对8255进行读、写操作时,必须先向8255发片选信号选中8255芯片,然后发读信号或写信号对8255进行读或写数据的操作。
(二)与外设接口部分:
根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。各通道的引脚编号如下:
(1)A口:编号为PA0~PA7,用于8255向外设输入输出8位并行数据。
(2)B口:编号为PB0~PB7,用于8255向外设输入输出8位并行数据。
(3)C口:编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。
(三)控制器:
8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下:
(1)A组控制器:控制A口与上C口的输入与输出。
(2)B组控制器:控制B口与下C口的输入与输出。
3.2、8255芯片工作方式:
8255芯片共有三种不同的工作方式
方式0:基本输入输出方式适用于无条件传送和查询方式的接口电路
方式1:选通输入输出方式适用于查询和中断方式的接口电路
方式2:双向选通传送方式
适用于与双向传送数据的外设
适用于查询和中断方式的接口电路
4、实验原理图:
三、实验流程图与源程序:
1、流程图:
1.1、 主程序流程图:
1.2 Appmain 子程序流程图:
1.3 灯跳转阶段流程图:
2、源程序:
.model small
.586
.stack
.data
p8255a=288h ;A口地址
p8255b=p8255a+1 ;B口地址
p8255c=p8255a+2 ;C口地址
p8255Ctrl=p8255a+3 ;控制口地址
p8254a=280h ;通道0地址
p8254b=p8254a+1 ;通道1地址
p8254c=p8254a+2 ;通道2地址
p8254Ctrl=p8254a+3 ;控制口地址
msg db 'Press anykey to Exit',0dh,0ah,'$'
.code
main proc
mov ax,@data
mov ds,ax ;建立数据段
mov dx,offset msg
mov ah,09h ;显示字符串
int 21h
call init8255
call Appmain
mov ah,4ch ;返回DOS
int 21h
ret
main endp
init8255 proc
mov dx,p8255Ctrl ;控制口地址
mov al,8ah ;设置8255为B,C口输入,A为输出
out dx,al ;控制字:10001010B
ret
init8255 endp
Appmain proc
mov dx,p8255b ;检测B口状态
in al,dx
mov cl,al
test:mov cl,al
cmp al,01h
jnz judge1
initk0:mov dx,p8254Ctrl ;初始化计数器0,1,实现定时0.5s
mov al,36h
out dx,al
mov dx,p8254a
mov ax,500
out dx,al
mov al,ah
out dx,al
mov dx,p8254Ctrl
mov al,76h
out dx,al
mov dx,p8254b
mov ax,1000
out dx,al
mov al,ah
out dx,al
mov bl,80h ;点亮L7
change:mov dx,p8255a
mov al,bl
out dx,al ;输出
next:mov dx,p8255c
in al,dx
and al,80h
jnz hight ;判断是否c口为下降沿
cmp ah,1
jnz next
mov ah,0
jmp x
hight:mov ah,1
jmp next
x:
mov dl,0ffh ;直接控制台IO,相当于C中while(!kbhit())
mov ah,06h ;等待按键
int 21h ;al=输入字符
jnz done ;若无按键,则继续
mov al,bl
cmp al,01h ;判断是否到达L0
jz change1
mov dx,p8255a
out dx,al ;输出
ror bl,2
mov dx,p8255b ;检测B口状态
in al,dx
cmp al,cl
jnz test
jmp next
change1:mov dx,p8255a
mov al,bl
out dx,al ;输出
next1:mov dx,p8255c
in al,dx
and al,80h
jnz hight1 ;判断是否c口为下降沿
cmp ah,1
jnz next1
mov ah,0
jmp out1
hight1: mov ah,1
jmp next1
out1:
;mov dx,offset msg
;mov ah,09h ;显示字符串
;int 21h
mov dl,0ffh ;直接控制台IO,相当于C中while(!kbhit())
mov ah,06h ;等待按键
int 21h ;al=输入字符
jnz done ;若无按键,则继续
mov al,bl
cmp al,80h
jz change
mov dx,p8255a
out dx,al ;输出
rol bl,1
mov dx,p8255b ;检测B口状态
in al,dx
cmp al,cl
jnz test
jmp next1
judge1:cmp al,02h
jnz judge2
initk1:mov dx,p8254Ctrl ;初始化计数器0,1,实现定时1s
mov al,36h
out dx,al
mov dx,p8254a
mov ax,100
out dx,al
mov al,ah
out dx,al
mov dx,p8254Ctrl
mov al,76h
out dx,al
mov dx,p8254b
mov ax,10000
out dx,al
mov al,ah
out dx,al
mov bl,80h ;点亮L7
jmp next
judge2:cmp al,04h
jnz judgeelse
judgeelse:
mov dx,p8254Ctrl ;初始化计数器0,1,实现定时1s
mov al,36h
out dx,al
mov dx,p8254a
mov ax,100
out dx,al
mov al,ah
out dx,al
mov dx,p8254Ctrl
mov al,76h
out dx,al
mov dx,p8254b
mov ax,10000
out dx,al
mov al,ah
out dx,al
mov bl,80h ;点亮L7
jmp next
initk2:mov dx,p8254Ctrl ;初始化计数器0,1,实现定时1.5s
mov al,36h
out dx,al
mov dx,p8254a
mov ax,1500
out dx,al
mov al,ah
out dx,al
mov dx,p8254Ctrl
mov al,76h
out dx,al
mov dx,p8254b
mov ax,1000
out dx,al
mov al,ah
out dx,al
mov bl,80h ;点亮L7
jmp next
done:
ret
Appmain endp
end main
四、实验结果与测试:
在这次试验中共有四种结果出现:
1.开关K0闭合:
七个灯相互间隔0.5s从L7开始依次被点亮,当L0被点亮时,又跳转到L7继续循环;
2.开关K1闭合:
七个灯相互间隔1.0s从L7开始依次被点亮,当L0被点亮时,又跳转到L7继续循环;
3.开关K2闭合:
七个灯相互间隔1.5s从L7开始依次被点亮,当L0被点亮时,又跳转到L7继续循环;
4.除了以上三种外其他开关闭合情况:
默认七个灯相互间隔1.0s从L7开始依次被点亮,当L0被点亮时,又跳转到L7继续循环.
总之,以上四种情况均实现了LED灯从LED7依次跳转到LED0。
五、实验提高与扩展:
对该实验所做的改进和提高之处有两处:
1、实现了LED7--->LED0--->LED7
实验基本要求为实现从LED7变化到LED0即可,我们在实现这个基本要求的基础上还实现了当LED灯被依次点亮到L0时,又从L0依次跳转到LED7。
2、错误处理
除了题目要求中的K0,K1,K2三个逻辑开关闭合的情况外,我们还对这三种情况除外的所有情况均进行了处理,在程序中默认出现其他情况后均跳转到1.0s的状态,使LED灯依次按照间隔1.0s来点亮。
六、个人心得与体会:
在本次课设中,我总共有以下六处体会:
1、在这次实验中,我们是两个人一组的合作实验,所以我们都有着自己的任务。我的任务是分析题目,设计原理图,连接电路以及测试效果。
2、本次课设在上学期所学的微型计算机的基础上,提出了比较高的起点和要求,充分检查了我们对理论知识的的掌握程度和实践动手的能力。即不但巩固了原有的理论知识,还在设计过程中锻炼了我们的思维能力,以及全局的思想。
3、通过本次课设的设计,我们进一步了解和掌握了各种理论知识,如微机的汇编语言的程序设计方法;8254和8255两种芯片的工作原理以及各种工作方式;以及两种芯片对实现跑马灯的作用。
4、在这次课设中,我们也遇到了不少的错误,在刚开始时对两种芯片的不透彻理解,导致我们走了不少弯路;还有在实现三种时间间隔的效果时,我们没有想到运用8254芯片接口之间的级联来实现,浪费了我们不少的时间;在编写程序的过程中,我们因为锻炼的次数较少,编写程序时比较吃力;在审题时不够仔细,在最初未实现从L0又再次跳转到L7这一步。虽然我们遇到了问题,但是经过我们询问老师,以及与同学不停的探讨,这些问题都有了很好的解决,所以本次课程不仅加强了我们对知识的在学习,还让我们加强了与同学之间的思想交流。
5、在本次实验中,我们还有做的不足的地方,就是在老师验收时,被检查出我们缺少了错误处理这个功能,经过老师的点拨,我们也最终对各种各种不同的错误有了比较好的处理方法,所以它还让我们学会了全面的思考问题,把所有可能出现的结果都实现化。
6、这次课设,再次告诉我,做实验或是其他事情,都要有足够的细心和耐心。在实验过程中,总会碰到许多实际的问题,因此,我们不仅要有比较扎实的基础知识,还要有比较强的心里素质。当实验的结果无法与理论值相一致时,不要烦躁,泄气,而是应该和自己的情绪交流,理清思路,分析导致出错的原因。必要时,可以把自己的想法和老师交流,请老师给予提示和指导。