跑马灯操纵器微机原理课程设计丁同飞0904013004.docx
《跑马灯操纵器微机原理课程设计丁同飞0904013004.docx》由会员分享,可在线阅读,更多相关《跑马灯操纵器微机原理课程设计丁同飞0904013004.docx(30页珍藏版)》请在冰点文库上搜索。
跑马灯操纵器微机原理课程设计丁同飞0904013004
合肥学院
运算机科学与技术系
微机原理与接口技术
课程设计报告
2020~2021学年第1学期
课程
微机原理与接口技术
课程设计名称
跑马灯控制器
学生姓名
丁同飞
学号
04
专业班级
计算机科学与技术专业(09计本3)
指导教师
张向东教授
2021年1月
一、题意分析及解决方案
一、题意需求分析
本次实验需要用STARES598PCI单板开发机和接口设计跑马灯操纵器,应用软件操纵并行接口电路,使连接在该接口上的8个发光二极管和8个操纵开关,按操纵开关概念的功能形式闪烁。
跑马灯的含义:
通过开关来操纵LED指示灯的不同闪烁形式,而不同的闪烁形式通过给开关设定不同的编码来确信不同的闪烁形式,使LED指示灯呈现一种流动闪烁的状态。
下面列出跑马灯可能的闪烁形式:
1、依次左移或右移闪烁
2、隔一左移或隔一右移闪烁
3、隔二左移或隔二右移闪烁
4、左右相向移动闪烁
5、左右从中间向两边依次闪烁
6、从左至右先依次点亮再反向熄灭
为了实现上述功能,需要解决一些问题:
1、需要利用什么芯片来实现跑马灯操纵器的运行?
2、开关的扫描问题?
如何设置开关的编码?
3、选择了芯片后,如何设置芯片操纵口的端口地址和各端口的输入输出形式?
4、开关的不锁存是不是有阻碍?
5、如何使显示灯转变进程中给人视觉上产生依次闪烁的成效?
二、解决问题及思路
(1)硬件部份
本实验需要在STARES598PCI单板开发机中执行,所用到用户程序存储器共32KB,集成环境为WinxpXingyan,接口选择8255A芯片,操纵用逻辑开关。
接口方面:
8255芯片是可编程的并行接口芯片,不需要附加外部电路即可和大多数并行传输数据的外部设备相连,数据的列位同时传送,利用十分方便。
8255A芯片内部有三个8位端口,别离为A口、B口和C口。
这三个端口可与外部设备相连接,可用来与外设进行数据信息、操纵信息和状态信息的互换。
本实验为了实现跑马灯的并行输入输出,选择奖8255A中的A口作为输出口,B口作为输入口,A口接8个LED指示灯,通过指示灯的移动闪烁来实现跑马。
B口作为输入口,连接操纵开关(8个)K0~K7,由于开关是简单的逻辑电路,能够直接连在B口上。
操纵开关:
选择逻辑开关,由8组逻辑电平开关组成(K0~K7),逻辑开关用于输出逻辑电平“1”和“0”,逻辑开关是简单的逻辑电路,只需设定对应的编码,由于选择的是方式0,因此不锁存,直接输入开关的编码即可直接被8255A芯片读取。
LED指示灯在亮度、功耗、可视角度和刷新速度等方面,都更具优势。
利用寿命较长,光电能转化效率高
操纵用逻辑开关来实现开关的操纵
(2)软件部份
8255A芯片操纵程序的初始化及编写,实现开关操纵LED指示灯循环闪烁。
开关的选取(对应的开关有对应的指示灯闪烁形式)
一、8255A芯片操纵程序初始化及操纵口端口地址的设置
movax,@data
movds,ax
nop
CALLINITPCI
CALLModifyAddress
movdx,COM_ADD
moval,82H
;向操纵口写入方式操纵字
outdx,al
init:
movbh,7fh;bh设为01111111B
movcl,0feh;cl设为B
2、开关设定
开关编码设定:
先设定了5种开关形式,这五种开关选择的是对应的子程序,
选择子程序采纳的是低位清零,即用前四个开关来选择,对应编码别离为(10h、20h、30h、40h、50h),而每组子程序中都有两个闪烁形式,再采纳高位清零,选择第五和第六个开关来选择闪烁形式,对应编码别离为04h和08h,最后两位开关为操纵速度的开关,及通过不同的开关形式选择不同的延时程序来操纵闪烁速度(01h、02h、03h)。
3、为了能够直观的看到LED发光二极管的闪烁挪用了延时子程序:
delayprocnear;延时子程序
pushax
pushdx
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx送al
andal,03h;al内容和0fH相与,即取低四位
cmpal,01h
jzaaaaa
cmpal,02h
jzbbbbb
cmpal,03h
jzzzzzz
movdx,50
movah,0ffh
int21h
JMPfff
aaaaa:
movdx,100
movah,0ffh
int21h
JMPfff
bbbbb:
movdx,200
movah,0ffh
int21h
JMPfff
zzzzz:
movdx,400
movah,0ffh
int21h
JMPfff
fff:
popax
popdx
ret
delayendp
二、硬件设计
一、选择芯片
(1)8255A
1)、8255A在本设计中的作用
在本设计中8255芯片要紧用于操纵开关的输入和LED指示灯的显示,通过8255A芯片的A口和B口别离连接操纵开关和LED指示灯,别离做输入输出操作。
2)、8255A的功能分析
8255A是Intel公司生产的通用可编程并行输入/输出接口芯片,通用性强,利用灵活,可直接与CPU总线相连,应用超级普遍。
8255A采纳40脚双列直插封装,单一+5V电源,全数输入/输出与TTL电平兼容。
用8255A连接外部设备时,通常不需要再附加其他电路,给利用带来专门大方便。
它有三个输入/输出端口:
端口A、端口B、端口C。
每一个端口都可通过编程设定为输入端口或输出端口,但有各自不同的方式和特点。
端口C可作为一个独立的端口利用,但一般是配合端口A和端口B的工作,为这两个端口的输入/输出提供操纵联络信号。
1、内部结构
8255A的内部结构如下图。
它包括四个部份:
数据总线缓冲器、读写操纵逻辑、A组操纵器(包括端口A和端口C的上半部)和B组操纵器(包括端口B和端口C的下半部)。
(1)端口A、端口B和端口C
8255A芯片内部有三个8位端口,别离为A口、B口和C口。
这三个端口可与外部设备相连接,可用来与外设进行数据信息、操纵信息和状态信息的互换。
●端口A包括一个8位数据输出锁存器/缓冲器和一个8位数据输入锁存器。
因此用端口A作为输入端口或输出端口时,数据均被锁存。
●端口B包括一个8位数据输出锁存器/缓冲器和一个8位数据输入锁存器。
因此用端口B作为输入端口或输出端口时,数据均被锁存。
●端口C包括一个8位数据输入缓冲器和一个8位的数据输出锁存器/缓冲器。
因此端口C作为输入端口时不能对数据进行锁存,作为输出端口时能对数据进行锁存。
端口C能够分成两个4位端口,别离能够概念为输入端口或输出端口,还可概念为操纵、状态端口,配合端口A和端口B工作。
(2)A组和B组
端口A和端口C的高4位(PC7~PC4)组成A组,由A组操纵部件来对它进行操纵;端口B和端口C的低4位(PC3~PC0)组成B组,由B组操纵部件对它进行操纵。
这两个操纵部件各有一个操纵单元,接收来自数据总线送来的操纵字,并依照操纵字确信各端口的工作状态和工作方式。
(3)数据总线缓冲器
数据总线缓冲器是一个双向三态的8位缓冲器,它与CPU系统数据总线相连,是8255A与CPU之间传输数据的必经之路。
输入数据、输出数据、操纵命令字都是通过数据总线缓冲器进行传送的。
(4)读/写操纵逻辑
读/写操纵逻辑接收来自CPU地址总线的信号和操纵信号,并发出命令到A组和B组,把CPU发出的操纵命令字或输出的数据通过数据总线缓冲器送到相应的端口,或把外设的状态或输入的数据从相应的端口通过数据总线缓冲器送到CPU。
8255A接口芯片的地址译码电路设计需考虑的问题是:
关于8086系统,由于采纳16位数据总线,CPU在进行数据传送时,老是将低8位数据送往偶地址端口,而将高8位数据送往奇地址端口;反过来,从偶地址端口取得数据老是通太低8位数据线传送到CPU,从奇地址端口取得数据老是通太高8位数据线传送到CPU。
在微机80386以上的32位外部数据总线的系统中,那么应将8255A的A1端与地址总线的A3相连,将8255A的A0端与地址总线A2相连,并使CPU访问8255A时地址总线的A一、A0两位老是为00。
二、8255A芯片引脚
8255A芯片引脚如下图,8255A芯片有40根引脚,可分为如下三类。
(1)电源与地线2根:
Vcc(26脚)、GND(7脚)。
(2)与外设相连的共24根,它们如下所示。
PA7~PA0:
端口A数据信号(8根)。
PB7~PB0:
端口B数据信号(8根)。
PC7~PC0:
端口C数据信号(8根)。
(3)与CPU相连的共14根。
●RESET(35脚):
复位信号,高电平有效。
当RESET信号有效时,内部所有寄放器都被清零。
同时,3个数据端口被自动设置为输入端口。
●D7~D0:
三态双向数据线,在8086系统中,采纳16位数据总线,8255A的D7~D0一般是接在16位数据总线的低8位上。
●cs(6脚):
片选信号,低电平有效。
该信号来自译码器的输出,只有当cs有效时,读信号RD和写信WR号才对8255A有效。
●RD(5脚):
读信号,低电平有效。
它操纵从8255A读出数据或状态信息。
●WR(36脚):
写信号,低电平有效。
它操纵把数据或操纵命令字写入8255A。
●A一、A0(八、9脚):
端口选择信号。
8255A内部共有4个端口(即寄放器):
3个数据端口(端口A、端口B、端口C)和1个操纵端口,当片选信号CS有效时,规定A一、A0为00、0一、10、11时,别离选中端口A、端口B、端口C和操纵端口。
CS、RD、WR、A一、A0这五个信号的组合决定了对3个数据端口和1个操纵端口的读写操作,见下表。
8255A的操作功能表
A1A0
操作
数据传送方式
00100
读A口
A口数据→数据总线
00101
读B口
B口数据→数据总线
00110
读C口
C口数据→数据总线
01000
写A口
数据总线数据→A口
01001
写B口
数据总线数据→B口
01010
写C口
数据总线数据→C口
01011
写控制口
数据总线数据→控制口
表1-18255A的操作功能表
3)、8255A的技术参数
①与外设相连的
PA7~PA0:
A口数据信号线。
PB7~PB0:
B口数据信号线。
PC7~PC0:
C口数据信号线。
②与CPU相连的
RESET:
复位信号。
当此信号来时,所有寄放器都被清除。
同时三个数据端口被自动置为输入端口。
D7~D0:
它们是8255A的数据线和系统总线相连。
CS:
片选信号。
在系统中,一样依照全数接口芯片来分派,假设低位地址(比如A5、A4、A3)组成各类芯片选择码,当这几位地址组成某一个低电平,8255A被选中。
只有当其有效时,读信号写才对8255A进行读写。
RD:
读信号。
当此信号有效时,CPU可从8255A中读取数据。
WR:
写信号。
当此信号有效时,CPU可向8255A中写入数据。
A1、A0:
端口选择信号。
8255A内部有3个数据端口和1个操纵端口,共4个端口。
规定:
A1、A0为00时,选中A端口;
A1、A0为01时,选中B端口;
A1、A0为10时,选中C端口;
A1、A0为11时,选中操纵口。
③参数说明:
输入最低电压:
min=,max=V
输入最高电压:
V
输出最低电压:
V
输出最高电压:
V
8255A的方式操纵字
D7D6D5D4D3D2D1D0
1
0
0
0
0
0
1
0
1:
工作方式A口方式0输出B口方式0输出
C口高4位输入C口低4位输入
图2-28255A的方式操纵字表
通道的功能为:
两个8位通道:
通道A和B。
两个四位通道:
通道C高4位和低四位,任何一个通道能够作输入/输出,输入是不锁存的,输出是锁存的,在方式0时各个通道的输入/输出可有16种不同的组合。
D7D6D5D4D3D2D1D0
0
X
X
X
写入位编码
写入内容
写入位编码0写入0
D0-D7000-1111写入1
图2-38255A的置位/操纵字表
3、硬件总逻辑图及其说明
A口接LED指示灯,B口接逻辑开关(K0~K7)。
三、操纵程序设计
一、操纵程序设计思路说明
本程序为了实现跑马灯操纵器的各类不同的闪烁形式,选择用可编程输入/输出接口8255A芯片,选择A口作为输出口,接LED指示灯,B口作为输入口,接8个逻辑开关,同时设定8255的方式操纵字为82h,即B,即设定A口输入,B口输出,且都为方式0。
开关编码设定:
先设定了5种开关形式,这五种开关选择的是对应的子程序,
选择子程序采纳的是低位清零,即用前四个开关来选择,对应编码别离为(10h、20h、30h、40h、50h),而每组子程序中都有两个闪烁形式,再采纳高位清零,选择第五和第六个开关来选择闪烁形式,对应编码别离为04h和08h,最后两位开关为操纵速度的开关,及通过不同的开关形式选择不同的延时程序来操纵闪烁速度(01h、02h、03h)。
2、
程序流程图
3、操纵程序
.MODELTINY
PCIBAR3EQU1CH
;8位I/O空间基地址(它确实是实验仪的基地址,也为DMA&32BITRAM板卡上的8237提供基地址)
Vendor_IDEQU10EBH
;厂商ID号
Device_IDEQU8376
;设备ID号
.STACK100
.DATA
IO_Bit8_BaseAddressDW?
flagDB?
msg0DB'BIOS不支持访问PCI$'
msg1DB'找不到StarPCI9052板卡$'
msg2DB'读8位I/O空间基地址时出错$'
COM_ADDDW00F3H;控制口偏移量
PA_ADDDW00F0H;PA口偏移量
PB_ADDDW00F1H;PB口偏移量
PC_ADDDW00F2H;PC口偏移量
LED_dataDBB
DBB
DBB
DB01111110B
DBB
DBB
numDB00h
.CODE
START:
movax,@data
movds,ax
nop
CALLINITPCI
CALLModifyAddress
movdx,COM_ADD
moval,82H
;向操纵口写入方式操纵字
outdx,al
init:
movbh,7fh;bh设为01111111B
movcl,0feh;cl设为B
AA1:
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx内容送到al中
andal,0F0h;低四位置0,取高4位
pushax
calldelay
popax
cmpal,00h;灯全亮的话
jzAA0
subal,10h
jzAB
addal,10h
subal,20h
jzAC
addal,20h
subal,30h
jzAD
addal,30h
subal,40h
jzAE
addal,40h
subal,50h
jzAF
jmpAA1
AA0:
movdx,PA_ADD;读A口
moval,0ffh;初始化灯全灭
outdx,al
movnum,00h;用来计数
jmpinit
AB:
callyici
AC:
callgeyi
AD:
callgeer
AE:
callxxf
AF:
callzy
yiciprocnear
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx内容送到al中
andal,0Ch
cmpal,04h
jzAA2
cmpal,08h
jzAA3
AA2:
movdx,PA_ADD;依次左移
Moval,cl;cl=B
outdx,al
rolcl,1;循环左移一名
calldelay
jmpAA1
AA3:
movdx,PA_ADD;依次右移
moval,bh;bh=01111111B
outdx,al
calldelay
rorbh,1;循环右移一名
jmpAA1
ret
yiciendp
geyiprocnear
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx送al
andal,0Ch
cmpal,04h
jzAA4
cmpal,08h
jzAA5
AA4:
movdx,PA_ADD;隔一左移
moval,cl
outdx,al
rolcl,2;循环左移两位
calldelay
jmpAA1
AA5:
movdx,PA_ADD;隔一右移
moval,cl
outdx,al
rorcl,2
calldelay
jmpAA1
ret
geyiendp
geerprocnear
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx送al
andal,0Ch
cmpal,04h
jzAA6
cmpal,08h
jzAA7
AA6:
movdx,PA_ADD;隔二左移
moval,cl
outdx,al
rolcl,3
calldelay
jmpAA1
AA7:
movdx,PA_ADD;隔2右移
moval,bh
outdx,al
rorbh,3
calldelay
jmpAA1
ret
geerendp
xxfprocnear
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx送al
andal,0Ch
cmpal,04h
jzAA8
cmpal,08h
jzAA9
AA8:
;从中间向两边再返回闪烁
movdx,PA_ADD
leabx,LED_data;把LED_data有效地址送bx
moval,num;al用来计数num
xlat;字节转换指令
outdx,al
incnum;num+1
incbx;bx+1
cmpnum,06h;num=6
jziii;跳到iii,为了执行下一次循环
calldelay
jmpAA1
iii:
movnum,00h;num重置为0
jmpAA1
AA9:
movdx,PA_ADD;相向移动闪烁并循环
pushcx
andcl,bh;cl,bh相与后置第一个灯和第七个灯亮
moval,cl
outdx,al
popcx
rorbh,1;bh循环右移1位
rolcl,1;cl循环左移1位,实现相向
calldelay
jmpAA1
xxfendp
zyprocnear
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx送al
andal,0Ch
cmpal,04h
jzAA10
cmpal,08h
jzAA11
AA10:
;依次点亮再反向依次点亮
cmpflag,01h;检测flag是不是为01
jzlll;是那么跳到lll
movdx,PA_ADD
moval,bh
outdx,al
cmpbh,00h;若是全亮
jzlll;那么跳至lll执行反向依次点亮
shrbh,1;bh逻辑右移一名
calldelay
jmpAA1
lll:
movflag,01h
movdx,PA_ADD;读A口
moval,cl
outdx,al
cmpcl,00h
jzbbb
shlcl,1;逻辑左移一名
calldelay
jmpAA1
AA11:
;从左至右依次点亮,再反向熄灭
cmpflag,01h
jzccc
movdx,PA_ADD;读A口
moval,bh;bh内容送al
outdx,al;显示al
cmpbh,00h;若是灯全亮
jzccc;那么跳至ccc执行反向熄灭
shrbh,1;bh逻辑右移1位,即下一个灯亮
calldelay
jmpAA1
ccc:
calldelay
movflag,01h;flag置为01
movdx,PA_ADD
orbh,01h;bh内容与01h相或,即置最后一个灯灭
moval,bh;bh内容送al
outdx,al
cmpbh,0ffh;判定灯是不是全灭
jzbbb;是那么跳至bbb为执行下一次循环
salbh,1;算数左移一名实现一个灯灭
jmpAA1
bbb:
movflag,00h;flag重置为00h
jmpinit
zyendp
delayprocnear;延时子程序
pushax
pushdx
movdx,PB_ADD;b口扫描是不是有开关拨动,哪个开关
inal,dx;dx送al
andal,03h;al内容和0fH相与,即取低四位
cmpal,01h
jzaaaaa
cmpal,02h
jzbbbbb
cmpal,03h
jzzzzzz
movdx,50
movah,0ffh
int21h
JMPfff
aaaaa:
movdx,100
movah,0ffh
int21h
JMPfff
bbbbb:
movdx,200
movah,0ffh
int21h
JMPfff
zzzzz:
movdx,400
movah,0ffh
int21h
JMPfff
fff:
popax
popdx