资源描述
微机原理及接口技术课程设计报告
设计题目:开关控制霓虹灯状态
姓名:
班级:
学号:
同组人:
时间:
内容摘要:
课程设计内容为开关控制霓虹灯的状态显示,主要包括8255及8254芯片的使用,源程序代码的编辑以及硬件连接图的绘制和硬件实验箱的演示。
目录
1:设计任务及要求
2:小组成员及分工
3:硬件电路设计
4:软件编程
5:程序运行结果
6:设计过程出现的问题及解决方法
7:设计总结
8:程序清单
9:参考文献
一:设计任务及要求
设计霓虹灯闪烁控制系统,使外设的红、黄、绿三种颜色的发光二极管,在开关的控制下,按照不同规律闪烁。
(1)要求发光二极管的亮、灭变化有一定的规律;
(2)发光二极管变化规律要有多种状态。
二:小组成员及分工
1:小组成员:
2:成员分工 软件部分
硬件部分
三:硬件电路设计
8255芯片介绍
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。 8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部 分、控制部分。 1)与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进行读或写数据的操作。
2)与外设接口部分 根据定义,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口用于应答信号的通信。
3)控制器 8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。如图7.5所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下:
(1)A组控制器:控制A口与上C口的输入与输出。
(2)B组控制器:控制B口与下C口的输入与输出。
8254芯片介绍
8254 芯片是一款使用十分广泛的可编程定时,计数芯片,其主要功能是定时和计数的功能。我们的微机内的动态存储器刷新电路,系统日时钟的技术以及发声系统的声源都是由8254芯片来完成的。
8254的内部结构
8254芯片主要由四部分组成:
1 数据总线缓冲器
数据总线缓冲器是一个三态、双向8位寄存器主要作用是与cpu进行数据交换,8位数据线D7~D0与CPU的系统数据总线连接,构成CPU和8254之间信息传送的通道,CPU通过数据总线缓冲器向8254写入控制命令、计数初始值或读取计数值。
2 读写逻辑
读写逻辑是芯片的控制部分,编程人员通过控制信号的选择来选择芯片的工作方式。读/写控制逻辑用来接收CPU系统总线的读、写控制信号和端口选择信号,用于控制8254内部寄存器的读/写操作。
3 控制字寄存器 控制寄存器是一个只能写不能读的8位寄存器,系统通过指令将控制字写入控制寄存器,设定8254的不同工作方式。
4 计数器 8254内部有三个结构完全相同而又相互独立的16位减“1”计数器,每个计数器有六种工作方式,各自可按照编程设定的方式工作。
8254芯片的工作方式:
8254芯片共有六种工作方式,分别对应与六种不同的用途。
(1)方式0:计数到0结束输出正跃变信号方式。
(2)方式1:硬件可重触发单稳方式。
(3)方式2:频率发生器方式。
(4)方式3:方波发生器。
(5)方式4:软件触发选通方式。
(6)方式5:硬件触发选通方式。
硬件连接图:
四:软件编程
1:软件流程图
开始
显示提示信息
设置8254控制字
设置8255控制字设置为90H
有键按下?
工作方式1:从左到右同色亮0.25秒,
工作方式2:从右向左依次亮0.25:秒,
工作方式3:从中间依次向两边亮0.25秒
工作方式4:左边三个一起亮0.25秒,然后右边三个一起亮0.25秒,
工作方式5:六个LED一起亮0.25秒,然后熄灭0.25秒,
结束
N
Y
K3拨到1
K4拨到1
K5拨到1
K6拨到1
K7拨到1
当开关拨到0,状态延时四次停止
2:软件源程序:
DATA SEGMENT ;数据段
IOPORT EQU 0D880H-280H ;PCI外设I/O基地址
IO8255K EQU IOPORT+283H ;定义8255控制端口的地址
IO8255A EQU IOPORT+280H ;定义8255A端口地址
IO8255B EQU IOPORT+281H ;定义8255B端口地址
IO8255C EQU IOPORT+282H ;定义8255C端口地址
IO8254K EQU IOPORT+28BH ;定义8254控制端口地址
IO82542 EQU IOPORT+28AH ;定义8254A计数器2端口地址
IO82540 EQU IOPORT+288H ;定义8254A计数器0端口地址
MESS DB 'ENTER ANY KEY CAN EXIT TO DOS!',0DH,0AH,'$' ;定义提示信息
DATA ENDS ;数据段结束
STACK SEGMENT STACK ;堆栈段
STA DW 1000 DUP(?) ;预留1000字节的存储空间
TOP EQU LENGTH STA ;将堆栈STA的长度付给TOP作为栈顶地址
STACK ENDS ;堆栈段结束
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DATA,SS:STACK ;段分配
START: MOV AX,DATA ;初始化
MOV DS,AX ;将寄存器AX中的地址给DS作为段基地
MOV AH,09H ;9号功能调用
MOV DX,OFFSET MESS ;显示提示信息
INT 21H
MOV DX ,IO8254K ;设置8254控制字,计数器0,方式3
MOV AL,36H
OUT DX,AL ;输出AL中的信息00110110
MOV DX, IO82540 ;设置闪烁频率
MOV AX, 50000 ;设定初始值50000,输出时钟周期50ms
OUT DX, AL ;8254输出50ms的方波信号
NOP ;空操作
NOP ;空操作
MOV AL, AH ;将AX寄存器的AH高8位给AL低八位
OUT DX, AL ;输出高8位信息
MOV DX, IO8255K ;设置8255控制字
MOV AL, 90H ;控制字为10010000定义ABC端口,A口工作方式0输入,B口方式0输出C口输出,B口控制数码管C口控制灯
OUT DX, AL ;输出控制字10010000
LLL: MOV AH, 01H ;有键按下则退出
INT 16H ;显示提示信息
JNZ QUIT ;结果为0跳到QUIT程序
KAIGUAN: MOV DX,IO8255A ;开关控制
IN AL,DX
JIANCE: TEST AL,80H ;检测是否T1状态
JNZ T1
TEST AL,40H ;检测是否T2状态
JNZ T2
TEST AL,20H ;检测是否T3状态
JNZ T3
TEST AL,10H ;检测是否T4状态
JNZ T4
TEST AL,08H ;检测是否T5状态
JNZ T5
JMP KAIGUAN ;转到开关检测状态
T1: MOV CX, 0004H ;将4付给CX寄存器,每种工作方式循环4次
T11: MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 06H ;将00000110付给AL
OUT DX, AL ;输出00000110,高电平点亮灯
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 24H ;将00100100付给AL,
OUT DX, AL ;输出001000100
CALL DELAY ;调用延时程序,相邻灯闪所需要的时间0.25秒
MOV AL, 12H ;将00010010付给AL, 相同颜色的灯一次点亮
OUT DX, AL ;输出00010010
CALL DELAY ;调用延时程序,相邻灯闪所需要的时间0.25秒
MOV AL, 09H ;将00001001付给AL
OUT DX, AL ;输出00001001
CALL DELAY ;调用延时程序
LOOP T11 ;循环T11状态,
MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 00H ;所有灯灭
OUT DX, AL ;输出01011011,显示1
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 00H ;所有灯灭
OUT DX, AL
JMP KAIGUAN ;转到检测状态
T2: MOV CX, 0004H ;将4付给CX寄存器,每种工作方式循环4次
T22: MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 5BH ;将01011011付给AL,
OUT DX, AL ;输出01011011,显示1
MOV DX, IO8255C ;8255C口地址给DX寄存器
PUSH CX ;压入CX寄存器
MOV CX, 0006H ;依次点亮六个灯
MOV AL, 01H ;将00000001付给AL,
T: OUT DX, AL ;输出00000001
PUSH AX ;把AX中的内容压入堆栈
CALL DELAY ;调用延时程序
POP AX ;弹出AX寄存器
SHL AL,1 ;将AL中信息左移位,第二次00000010,一次左移
LOOP T ;AL中的信息不为0就继续循环T
POP CX ;弹出CX寄存器
LOOP T22 ;循环T22状态,
MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
JMP KAIGUAN ;转到检测状态
T3: MOV CX, 0004H ;将4付给CX寄存器,循环4次
T33: MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 4FH ;将01001111付给AL
OUT DX, AL ;输出01001111
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 21H ;将00100001付给AL 由中间向两边
OUT DX, AL ;输出00100001
CALL DELAY ;调用延时程序
MOV AL,12H ;将00010010付给AL
OUT DX,AL ;输出00010010
CALL DELAY ;调用延时程序
MOV AL, 0CH ;将00001100付给AL
OUT DX, AL ;输出00001100
CALL DELAY ;调用延时程序
MOV AL, 00H ;将00000000付给AL
OUT DX, AL ;输出00000000
CALL DELAY ;调用延时程序
MOV AL, 0CH ;将00001100付给A
OUT DX, AL ;输出00001100
CALL DELAY ;调用延时程序
MOV AL, 21H ;将00100001付给AL
OUT DX, AL ;输出00100001
CALL DELAY ;调用延时程序
LOOP T33 ;循环T33状态,
MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
JMP KAIGUAN ;转到检测状态
T4: MOV CX, 0004H ;循环T4状态,直到CX为0即循环4次
T44: MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 66H ;将01100110付给AL
OUT DX, AL ;输出01100110
MOV DX, IO8255C ;8255C口地址给DX寄存器, 三个三个亮
MOV AL, 07H ;将00000111付给AL
OUT DX, AL ;输出00000111
CALL DELAY ;调用延时程序
MOV AL, 38H ;将00111000付给AL
OUT DX, AL ;输出00111000
CALL DELAY ;调用延时程序
LOOP T44 ;循环T44状态
MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
JMP KAIGUAN ;转到检测状态
T5: MOV CX, 0004H ;循环T5状态,直到CX为0即循环4次
T55: MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 6DH ;将01101011付给AL
OUT DX, AL ;输出01101011
MOV DX, IO8255C ;8255C口地址给DX寄存器,六个灯同时闪烁
MOV AL, 3FH ;将00111111付给AL
OUT DX, AL ;输出00111111
CALL DELAY ;调用延时程序
MOV AL, 00H ;所有灯灭
OUT DX, AL
CALL DELAY ;调用延时程序
LOOP T55 ;循环T55状态
MOV DX, IO8255B ;8255B口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
MOV DX, IO8255C ;8255C口地址给DX寄存器
MOV AL, 00H
OUT DX, AL ;所有灯灭
JMP KAIGUAN ;转到检测状态
QUIT: MOV AH, 4CH ;返回DOS
INT 21H
DELAY PROC NEAR ;延时
PUSH DX ;将DX中的内容压入堆栈
MOV DX, IO8254K ;8254设置控制字
MOV AL, 90H ;将10010000付给AL,计数器2只读写低字节工作在方式2,采用二进制计数
OUT DX, AL ;输出10010000
MOV DX, IO82542 ;8254计数器2地址给DX寄存器
MOV AL, 5 ;将5付给AL, 5个50ms的方波信号即闪烁间隔0.25秒
OUT DX, AL ;每五个周期记一次即输出0.25秒周期的方波信号
MOV DX, IO8255A ;8255A口地址给DX寄存器
A1: IN AL, DX ;将8254中的信号送到8255的A端口
AND AL, 01H ;将AL中的信息与1想与,
JZ A1 ;结果为0跳到A1继续读入A口输入信号,不为0则继续延时
POP DX ;弹出DX寄存器
RET ;段内子程序返回
DELAY ENDP ;延时程序结束
CODE ENDS ;数据段结束
END START ;整个程序结束
五:程序运行结果
六:设计过程出现的问题及解决方法
在课程设计过程中,开始编辑程序代码时,由于分块实现功能。所有组合时出现了衔接的问题,由于软件与硬件的衔接,开始时霓虹灯的闪烁状态并不符合一定的规律,甚至出现了杂乱现象,通过检验代码和检查硬件演示实验箱,检查接线的顺序解决了灯的闪烁规律,由于用开关控制霓虹灯的闪烁状态,演示时,开关拨动一下,能够显示状态并且能够按照设定的规律闪烁,但是当开关关闭后,灯还是不停地闪烁,并且拨动其他开关时,状态也不会发生变化,数码管显示的状态次数也不变,通过检查发现代码段出现了问题,缺少了控制代码。由于我们开始用的延时程序是软件延时,没有用8254,后来,我们选择用8254芯片进行延时,上机调试时,遇到了一个问题,就是第二种LED闪烁状态显示不对,且数码管有个状态显示不对,经过检查,发现数码管显示问题是因为那个数字段代码写错了,但是第二个状态的LED闪烁规律还有问题,经过仔细检查发现是因为我们在利用那个左移循环时,然后调用子程序,其中对AX没有保护,导致结果不对,然后加了一对PUSH和POP入栈保护和出栈保护。由于霓虹灯的闪烁延时开始较长,每个状态在开关拨到0状态时很长时间才停止,开始以为程序有问题,状态不能停止,后来发现是延时太长,缩短了延时周期后,闪烁延迟周期及开关关闭后停止的时间变短,每个状态变得更加明显。
七:设计总结
这次课程设计过程中有不少挑战,对于对理论知识尚不能充分领会的,开始实际地运用知识来完成任务,对于只会走马看花的读程序的,要实际的编辑一段程序代码,并且要实现一些功能,但是,正是这样一次机会才能使我们认识我们认识到我们所学的知识的用处,认识的脚踏实地的重要,我们可以进一步加强对所学芯片的认识和运用。本次课题中用到了8255.、8254、数码管、LED灯等,初步熟练地掌握了通过汇编语言来使用这些硬件获得特定的功能,熟悉了微机系统的硬件开发工具的使用方法 ,微机系统硬件设计的方法、原理、设计步骤,事实求是和严肃认真的工作态度, 实际动手能力, 培养了在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。经过这次课设,我们更加深刻的理解了出栈和入栈保护,最重要的是,通过课设,使我们意识到对于程序,原本看起来容易的事情但是真正到了让自己独立写程序时是困难多多的,作为一个学生不能眼高手低,应该扎扎实实的从基础做起,认真学习基础知识,打好基础,多学多练,日积月累,多写程序,编程能力才能有所提高,课设是对学习的知识加以实际应用
展开阅读全文