循环灯实验报告与代码Word文件下载.docx
《循环灯实验报告与代码Word文件下载.docx》由会员分享,可在线阅读,更多相关《循环灯实验报告与代码Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
(2)n=12,
t=2s:
每个灯管单独一组,间隔2秒循环点亮。
(3)n=6,
每两个灯管一组,间隔1秒循环点亮。
(4)n=6,
每两个灯管一组,间隔2秒循环点亮。
(5)n=4,
每三个灯管一组,间隔1秒循环点亮。
(6)n=4,
每三个灯管一组,间隔2秒循环点亮。
(7)n=3,
每四个灯管一组,间隔1秒循环点亮。
(8)n=3,
每四个灯管一组,间隔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
4、结果讨论:
刚开始使用循环计时来实现倒计时,计时会有误差,改为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
MOVAL,4bH
---------------------------------------------------------------
---------------------8255芯片初始化---------------------------
MOVDX,PCTL
MOVAL,80H;
10000000b
MOVDX,PA;
PA置0
MOVAL,0
MOVDX,PB
MOVAL,0FFH
MOVDX,PC
----------------------中断向量地址------------------------------
CLI
MOVAX,OFFSETINT8259
MOVBX,003CH
MOV[BX],AX
MOVBX,003EH
MOVAX,0000H
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
CMPAL,0EH
JZ_AE
CMPAL,0FH
JZ_AF
JMPNEXTA
_AE:
MOVSI,0
MOVDI,0
CALLE
JMPLAST
_AF:
CALLF
NEXTB:
MOVFLAG,1
JZ_BE
JZ_BF
JMPNEXTB
_BE:
_BF:
NEXTC:
MOVFLAG,2
JZ_CE
JZ_CF
JMPNEXTC
_CE:
_CF:
NEXTD:
MOVFLAG,3
CALLGetKe