循环灯实验报告与代码.docx
《循环灯实验报告与代码.docx》由会员分享,可在线阅读,更多相关《循环灯实验报告与代码.docx(15页珍藏版)》请在冰豆网上搜索。
![循环灯实验报告与代码.docx](https://file1.bdocx.com/fileroot1/2023-1/24/b6ba935a-13f4-4f18-9a7a-f8151963e756/b6ba935a-13f4-4f18-9a7a-f8151963e7561.gif)
循环灯实验报告与代码
合肥工业大学
计算机与信息学院
课程设计
课程:
微机原理与接口技术设计
专业班级:
计算机科学与技术12-1班
学号:
**********
******
一、
设计题目及要求:
题目:
利用8255A和8253使发光二极管按一定规律轮流点亮
要求:
发光二极管的点亮方式:
将发光二极管分为n组,每组12/n个灯管,每组灯管发光时间没t。
设有8种组合:
(1)n=12,
t=1s:
每个灯管单独一组,间隔1秒循环点亮。
(2)n=12,
t=2s:
每个灯管单独一组,间隔2秒循环点亮。
(3)n=6,
t=1s:
每两个灯管一组,间隔1秒循环点亮。
(4)n=6,
t=2s:
每两个灯管一组,间隔2秒循环点亮。
(5)n=4,
t=1s:
每三个灯管一组,间隔1秒循环点亮。
(6)n=4,
t=2s:
每三个灯管一组,间隔2秒循环点亮。
(7)n=3,
t=1s:
每四个灯管一组,间隔1秒循环点亮。
(8)n=3,
t=2s:
每四个灯管一组,间隔2秒循环点亮。
要求:
按键盘的“A”,“B”,“C”,“D”分别表示选择的灯管数目(一个一组,两个一组,三个一组,四个一组),按键盘的“E”,“F”,表示选择时间(一秒两秒)。
程序启动时默认按第一种方式进行循环,当按动“A~F”时,根据设定情况随时改变循环方式,当按“0”键退出程序,所有灯管熄灭。
提示:
1:
主程序为键盘输入按’A’~’D’命令分支到各点亮功能程序段,按’0’退出。
2:
定时时间1秒2秒可由8253产生定时中断,通过IPQ2引起中断请求。
8253的定时器工作可参考“定时/计数器:
8253方波”。
3:
在中断服务程序中,通过8255A的端口B的PB4-PB7,端口C的PC0—PC7来设置发光二极管下一组灯点亮,其他灯都暗。
次序可从左到右,也可以从右到左。
4:
8255A输出点亮发光二极管可参考“8255A”并行口实验(三)。
二、设计思想:
使用8259中断服务子程序,来去执行中断,用8253方波计时器来去产生1秒和两秒的时间间隔。
把8253和8259结合正好可以把间隔一秒和两秒的计时器导入程序之中。
利用5255A交通灯的特性,把交通灯按要求轮流点亮。
(一)可编程并行接口芯片8255
系统中的8255线路8255的数据线片选信号线、地址线、读写控制线等分别与系统总线相连,其A、B、C三个端口以排针形式引出供825实验使用。
可编程并行接口Intel8255A,其内部结构如图所示,由以下
4个部分组成:
①数据总线缓冲器。
这是一个三态双向8位缓冲器,它是8255A与CPU系统数据总线的接口。
所有数据的发送与接收,
以及CPU发出的命令字和从8255A来的状态信息都是通过该缓冲器传送的。
②读/写控制逻辑。
读/写控制逻辑由读信号RD,写信号WR,选片信号CS以及端口选择信号A0、A1等组成。
读/写控制逻辑控制了总线的开放、关闭和信息传送的方向,以便把CPU的控制命令或输出数据送到相应的端口;或把外设的信息或输入数据从相应的端口送到CPU。
8255A的基本操作及在TP86A、PC/TX和扩展板上的端口地址如下表所示。
③输入/输出端口A、B、C。
8255A包括3个8
位输入输出端口(port)。
每个端口都有一个数据输入寄存器和一个数据输出寄存器,输入时端口有三态缓冲器的功能,输出时端口有数据锁存器功能。
在实际应用中,PC口的8位可分为两个4位端口(0
方式下),也可以分成一个5位端口和一个3位端口(2方式下)来使用。
④A组和B组控制电路。
控制A,B,C三个端口的工作方式,A
组控制A口和C-4-口的上半部(PC4-PC7),B组控制B口和C口的下半部(PC0-PC3)的工作方式和输入输出。
A组和B组的命令寄存器还接收按位控制命令,以实现对PC口的按位置位/复位操作。
(二)Intel8253可编程定时/计数器
1片8253内部有3个计数器,分别称为计数器0、1、2,其结构完全,互相之间工作完全独立。
每个计数器有三个引脚和外部联系CLK:
计数脉冲输入,计数器对该引脚出现的信号进行计数,最高计数速率为2.6MHZ。
Gate:
门控输入,用于控制计数器是否对CLK计数。
OUT:
输出信号端。
每个计数器内部都有1个8位的控制寄存器,三个控制寄存器使用同一端口地址,在编程结构图中,画为1个控制寄存器。
每个计数器内部还有1个计数初值寄存器(CR)、1个计数执行部件(CE)和1个输出锁存器(OL),它们都是16位的。
执行部件(CE)是1个16位减法计数器,其起始值等于初值寄存器(CR)的值。
CR的值通过程序设置。
输出寄存器(OL)用来锁存执行部件(CE)的值,以便CPU读出。
原理:
通过Intel8253可编程定时/计数器方式3方波发生器与方式0计数结时产生中断风别产生的方波和中断来计数,配合可编程并行接口芯片8255来控制流水灯的循环点亮,通过键盘扫描来接受外部控制.并通过八段数码管将A,B,C,D显示,并且转入相应的模式执行。
实验连线:
8255A:
PA0-L15PA1-L14PA2-L13PA3-L11
PA4-L10PA5-L9PA6-L7PA7-L6
PB0-L5PB1-L3PB2-L2PB3-L1
8259:
连接138译码输入端A.B.C,其中A连A2,B连A3,C连A4,138使能控制输入端G与总线单元上方的GS相连。
将8259CS插孔与译码单元的Y0相连,中断源IR7与单脉冲单元的SP插孔相连。
用8芯扁平电缆将8259中断控制单元的数据总线插座与数据总线单元任一插座相连。
8253:
将8253CS与译码单元的Y1相连,中断源IR0与8253的OUT0口相连。
用8芯扁平电缆将8251串行通信单元的数据总线插座与数据总线单元任一插座相连。
GATE0与+5V相连,CLK0与频单元T7相连
三、功能流程图:
按键
ABCD
按键按键按键按键
EFEFEFEF
按键0
四、结果讨论:
刚开始使用循环计时来实现倒计时,计时会有误差,改为8253计时器之后,及时秒数比较准确。
因为要求可以随时切换状态,所以将检测有无按键以及按键之后的切换写成一个子程序,在需要切换的地方进行调用。
所有的模块都写成子程序,这样在调用的时候比较方便。
使用8259中断时,要注意关中断和开中断的位置,否则会造成中断脉冲按键不灵。
程序的关键是每个状态的相互切换。
附录:
实验代码:
(完整的源程序)
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE,ES:
CODE
ORG2000H
JMPA
PAEQU0FFD8H
PBEQU0FFD9H
PCEQU0FFDAH
PCTLEQU0FFDBH
OUTSEGEQU0FFDCH;段控制口
OUTBITEQU0FFDDH;位控制口/键扫口
IN_KEYEQU0FFDEH;键盘读入口
ZXKEQU0FFDCH;字型口
ZWKEQU0FFDDH;字位口
Port0EQU0FFE4H
Port1EQU0FFE5H
SHOW1DB02H
FLAGDB?
PCC1DB07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH,0FFH,0FFH,0FFH,0FFH
PBC1DB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,07FH,0BFH,0DFH,0EFH
PCC2DB03FH,0CFH,0F3H,0FCH,0FFH,0FFH
PBC2DB0FFH,0FFH,0FFH,0FFH,03FH,0CFH
PCC3DB01FH,0E3H,0FCH,0FFH
PBC3DB0FFH,0FFH,07FH,08FH
PCC4DB0FH,0F0H,0FFH
PBC4DB0FFH,0FFH,0FH
;---------------------8253芯片初始化---------------------------
A:
MOVDX,0FFE3H;控制口
MOVAL,36H;计数器0,方式3,二进制计数
OUTDX,AL
MOVDX,0FFE0H
MOVAL,00
OUTDX,AL
MOVAL,4bH
OUTDX,AL
;---------------------------------------------------------------
;---------------------8255芯片初始化---------------------------
MOVDX,PCTL
MOVAL,80H;10000000b
OUTDX,AL
MOVDX,PA;PA置0
MOVAL,0
OUTDX,AL
MOVDX,PB
MOVAL,0FFH
OUTDX,AL
MOVDX,PC
MOVAL,0FFH
OUTDX,AL
;---------------------------------------------------------------
;----------------------中断向量地址------------------------------
CLI
MOVAX,OFFSETINT8259
MOVBX,003CH
MOV[BX],AX
MOVBX,003EH
MOVAX,0000H
MOV[BX],AX
CALLFOR8259
STI
;-----------------------------------------------------------------
JMP_AE
START:
CALLGetKey
CMPAL,0AH
JZNEXTA
CMPAL,0BH
JZNEXTB
CMPAL,0CH
JZNEXTC
CMPAL,0DH
JNZ_D
JMPNEXTD
_D:
CMPAL,00H
JNZSTART
JMPEXIT
NEXTA:
MOVFLAG,0
CALLGetKey
CMPAL,0EH
JZ_AE
CMPAL,0FH
JZ_AF
JMPNEXTA
_AE:
MOVSI,0
MOVDI,0
CALLE
JMPLAST
_AF:
MOVSI,0
MOVDI,0
CALLF
JMPLAST
NEXTB:
MOVFLAG,1
CALLGetKey
CMPAL,0EH
JZ_BE
CMPAL,0FH
JZ_BF
JMPNEXTB
_BE:
MOVSI,0
MOVDI,0
CALLE
JMPLAST
_BF:
MOVSI,0
MOVDI,0
CALLF
JMPLAST
NEXTC:
MOVFLAG,2
CALLGetKey
CMPAL,0EH
JZ_CE
CMPAL,0FH
JZ_CF
JMPNEXTC
_CE:
MOVSI,0
MOVDI,0
CALLE
JMPLAST
_CF:
MOVSI,0
MOVDI,0
CALLF
JMPLAST
NEXTD:
MOVFLAG,3
CALLGetKey
CMPAL,0EH
JZ_DWE
CMPAL,0FH
JZ_DWF
JMPNEXTD
_DWE:
MOVSI,0
MOVDI,0
CALLE
JMPLAST
_DWF:
MOVSI,0
MOVDI,0
CALLF
JMPLAST
EXIT:
CALLFINISH
JMPFIN
LAST:
JMPSTART
FIN:
HLT
;------------------------------中断服务子程序-----------------------------
INT8259:
CLI
CMPFLAG,0
JZLA
CMPFLAG,1
JZLB
CMPFLAG,2
JZLC
JMPLD
LA:
MOVAL,PCC1[SI]
MOVDX,PC
OUTDX,AL
MOVAL,PBC1[DI]
MOVDX,PB
OUTDX,AL
CMPSI,0BH
JZCONA
INCSI
INCDI
JMPFINI
CONA:
MOVSI,00H
MOVDI,00H
JMPFINI
LB:
MOVAL,PCC2[SI]
MOVDX,PC
OUTDX,AL
MOVAL,PBC2[DI]
MOVDX,PB
OUTDX,AL
CMPSI,05H
JZCONB
INCSI
INCDI
JMPFINI
CONB:
MOVSI,00H
MOVDI,00H
JMPFINI
LC:
MOVAL,PCC3[SI]
MOVDX,PC
OUTDX,AL
MOVAL,PBC3[DI]
MOVDX,PB
OUTDX,AL
CMPSI,03H
JZCONC
INCSI
INCDI
JMPFINI
CONC:
MOVSI,00H
MOVDI,00H
JMPFINI
LD:
MOVAL,PCC4[SI]
MOVDX,PC
OUTDX,AL
MOVAL,PBC4[DI]
MOVDX,PB
OUTDX,AL
CMPSI,02H
JZCOND
INCSI
INCDI
JMPFINI
COND:
MOVSI,00H
MOVDI,00H
JMPFINI
FINI:
MOVDX,PORT0
MOVAL,20H
OUTDX,AL
STI
IRET
;------------------------------中断服务子程序-----------------------------
;---------------------8259芯片初始化------------------------------
FOR8259:
MOVAL,13H
MOVDX,Port0
OUTDX,AL
MOVAL,08H
MOVDX,Port1
OUTDX,AL
MOVAL,09H
OUTDX,AL
MOVAL,7FH;IRQ7
OUTDX,AL
RET
;-----------------------------------------------------------------
;------------------------------按键E-----------------------------
E:
MOVDX,PA
MOVAL,01H
OUTDX,AL
MOVDX,0FFE0H
MOVAL,00
OUTDX,AL
MOVAL,4BH
OUTDX,AL
RET
;-----------------------------------------------------------------
;------------------------------按键F-----------------------------
F:
MOVDX,PA
MOVAL,01H
OUTDX,AL
MOVDX,0FFE0H
MOVAL,00
OUTDX,AL
MOVAL,96H
OUTDX,AL
RET
;-----------------------------------------------------------------
;------------------------------按键0-----------------------------
FINISH:
MOVDX,PCTL
MOVAL,80H
OUTDX,AL
MOVDX,PB
MOVAL,0FFH
OUTDX,AL
MOVDX,PC
MOVAL,0FFH
OUTDX,AL
RET
;-----------------------------------------------------------------
;-----------------------键扫子程序------------------------------
GetKey:
;
moval,0ffh;关显示口
movdx,OUTSEG
outdx,al
movbl,0
movah,0feh
movcx,8
key1:
moval,ah
movdx,OUTBIT
outdx,al
shlal,1
movah,al
nop
nop
nop
nop
nop
nop
movdx,IN_KEY
inal,dx
notal
nop
nop
andal,0fh
jnzkey2
incbl
loopkey1
nkey:
moval,20h
ret
key2:
testal,1
jekey3
moval,0
jmpkey6
key3:
testal,2
jekey4
moval,8
jmpkey6
key4:
testal,4
jekey5
moval,10h
jmpkey6
key5:
testal,8
jenkey
moval,18h
key6:
addal,bl
cmpal,10h
jncfkey
movbx,offsetKeyTable
xlat
fkey:
ret
KeyTable:
;键码定义
db07h,04h,08h,05h,09h,06h,0ah,0bh
db01h,00h,02h,0fh,03h,0eh,0ch,0dh
;----------------------------------------------------------------
CODEENDS
END