当前位置:文档之家› 微机原理与接口技术课程设计-倒计时

微机原理与接口技术课程设计-倒计时

微机原理与接口技术课程设计-倒计时
微机原理与接口技术课程设计-倒计时

微机原理与接口技术课程设计报告

题目:倒计时

学院:西安理工大学专业:机械实际制造及其自动化班级机械四班学号:

学生姓名刘小虎指导教师

课程成绩完成日期 2014年12月15日

目录

一.设计功能............. 错误!未定义书签。二.设计原理及原理图..... 错误!未定义书签。

1. 系统总设计原理....... 错误!未定义书签。

2. 硬件框架原理图....... 错误!未定义书签。

3. 硬件介绍............. 错误!未定义书签。

4. 功能电路............. 错误!未定义书签。三.程序模块及流程图..... 错误!未定义书签。

1. 8255A初始化 ......... 错误!未定义书签。

2. 显示程序模块......... 错误!未定义书签。

3. 延时程序模块......... 错误!未定义书签。

4. 控制程序模块......... 错误!未定义书签。

5. LED灯点亮程序模块 ... 错误!未定义书签。四.源程序............... 错误!未定义书签。五.总结................. 错误!未定义书签。附录1:系统硬件框架...... 错误!未定义书签。附录2:系统总程序流程图.. 错误!未定义书签。

题目:倒计时

一.设计功能

本次课程设计我们在TD-PIT+实验系统和PC机平台上利用并行接口8255A、键盘及数码管显示单元、开关及LED显示单元、键盘按键和电脑显示屏设计成一个倒计时器。具体功能包括:

1.用2位8段共阴数码管显示倒计时时间;

2.使用开关K0实现暂停/启动功能,开关K1实现倒计时复位功能;

3.倒计时为0时8盏LED灯实现跑马灯功能;

4.利用数字键输入倒计时初始数值,按键“r”实现重新启动倒计时器,

按键“e”实现退出程序进入DOS环境下,并对其他按键进行屏蔽;

5.屏幕显示相应的提示信息,包括提示用户输入数据、倒计时结束、倒计

时结束后用户进行的操作;

6.可以任意设定倒计时的初始时间,每隔1秒钟计时器减1,直到为0;

7.在倒计时过程中可通过开关K1实现退出当前的倒计时并开始新一轮的

倒计时。

二.设计原理及原理图

1.系统总设计原理

我们选择并行接口8255A芯片,在程序中使用延时语句来输出秒脉冲,并在其中调用显示函数不断刷新数码管进行数值显示。使用8255A作为输入/输出接口,其中A端口为输出口,连接LED显示单元的D8~D15;B端口为输出口,连接数码管的A~Dp,进行数码管的段锁存;C端口高4位为输出口,连接数码管的X4~X1,进行位锁存,低4位为输入端,连接开关的K3~K0。采用在软件中控制循环程序的方式来控制倒计时的复位和暂停功能,并通过程序来显示语句和读入用户的键盘输入,以进行相应操作。此方案性价比高,但由于使用了软件延时,当芯片损耗以及芯片在工作时间过长后会出现倒计时不够准确。

2.硬件框架原理图

图1 系统设计硬件框架

3.硬件介绍

并行接口8255A

(1) 8255A的内部结构

图2 8255A的内部结构

1)8255A有3个8位数据接口,即接口A、接口B和接口C,可利用编程方法

设置3个端口是作为输入端口还是输出端口;

2)8255A能适应CPU和I/O接口之间的多种数据传送方式的要求,如无条件

传送、查询方式传送、中断方式传送。8255A设置了方式0、方式1以及方式2;

3)数据总线缓冲器是个双向三态8位数据缓冲器,与CPU系统数据总线相连,

是8255A与CPU之间传输数据的必经之路。输入数据、输出数据、控制命令字都是通过数据总线缓冲器进行传递的;

4)读/写控制逻辑电路接收来自CPU地址总线的信号和控制信号,并发出命

令到两个控制组(A组和B组)。它控制把CPU发出的控制命令或输出的数据送到相应的端口,或者把外设的状态或输入的数据相应的端口送到

CPU;

5)A组控制和B组控制一方面接收芯片内部总线上的控制字,一方面接收来

自读/写控制逻辑电路的读/写命令,从而解决端口的工作方式和读/写操作。其中,A组控制电路控制端口A和端口C高4位(PC7-PC4)的工作方式和读/写操作:而B组控制电路控制端口B和端口C低4位(PC3-PC0)工作方式和读写操作。

(2) 8255A的外部引脚

图3 8255A的功能引脚图

1)与外部设备端相连的引脚

PA7-PA0:A端口的输入/输出引脚;

PB7-PB0:B端口的输入/输出引脚;

PC7-PC0:C端口的输入/输出引脚;

2)与CPU相连的引脚

RESET:复位信号,低电平有效。当RESET信号来到时,所有内部寄存

器都被清0,同时3个端口被自动设为输入端口;

D7-D0:8255A的数据线,和系统数据总线相连;

CS:芯片选择信号。只有当CS有效时,读出信号RD和写入信号WR才

对8255A有效;

RD:读出信号。CPU通过IN指令使RD有效,将数据或状态信息从8255A

中读到CPU;

WR:写入信号。CPU通过OUT指令使WR有效,将数据或状态信息从CPU

中写道8255A;

A1,A0:端口选择信号。8255A内部有3个数据端口和1个控制端口,

共4个端口。规定A1,A0为00、01、10和11时,分别选中端口A、

端口B、端口C和控制端口。

(3) 8255A的控制字

1) 8255A的方式控制字

8255A共有两个控制字,即工作方式控制字和对C口置位/复位控制字。

8255A的工作方式字格式和各位的含义如图4

图4 8255A工作方式控制字格式

方式0为基本的输入输出方式;方式1为选通式输入/输出;方式3为双向选通输入/输出方式。

2)C口置位/复位控制字

8255A的C口置位/复位控制字的格式如图5

图5 8255A的C口置位/复位控制字

八段共阴数码管

一般8段LED显示器的内部结构和引脚如图6(a)所示。每段都是一个发光二极管,通过点亮不同的字段,可以显示0,1,…,9和A,B,…F。其内部各发光二极管之间的连接方法有共阴极和共阳极两种,如图6(b)和图6(c)所示。

(a)结构和引脚 (b)共阴极接法 (c)共阳极接法

图6 八段LED显示器

(1)共阴极接法:把发光二极管的阴极连在一起构成公共阴极。使用时公共阴极

接地,这样阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的则不点亮。实验中使用的数码管为共阴极接法;

(2)共阳极接法:把发光二极管的阳极连在一起构成公共阳极。使用时公共阳极

接+5V。这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不点亮。

字型共阴极字形代码字型共阴极字形代码字型共阴极字形代码03FH67DH C39H

106H707H D5EH

25BH87FH E79H

34FH96FH F71H

466H A77H灭00H

56DH B7CH

4.功能电路

数码管显示电路

图7 显示连接电路

实验箱上有四个LED显示器,本实验利用PC口的最高两位选中X4和X3两个数码管,即进行位锁存;

八段数码管为阳极LED器件。要让A段点亮,要求PB0输出高电平“1”;要使B段熄灭,要求从PB1输出低电平“0”。其余各段以此类推。要使LED上显示0-9十个数字,需要按照如下段码表来驱动数码管的八段LED:

表2 8段数码管段码表

显示字符0123456789八段代码3FH06H5BH4FH66H6DH7DH07H7FH6FH

开关与LED灯控制电路

图8 开关与LED灯控制电路

设置8255的A端口工作在方式0下,作为输出端,电路连接如上图,在倒计时到0的时候LED灯从左到右接着再从右往左依次点亮,实现跑马灯功能。开关K1为复位开关,在倒计时过程中置K1为“1”可以实现退出当前倒计时,置K1为“0”时又开始重新倒计时。开关K0为暂停开关,在倒计时过程中置K0为“1”可以暂停倒计时,置K0为“0”时,数码管接着当前的显示数据执行递减,并且在暂停过程中数码管始终显示暂停时的数据。

三.程序模块及流程图

1.8255A初始化

程序开始时对8255A进行初始化,A组和B组控制工作在方式0,因此方式字中的D6D5和D2为0。A口为输出,因此D4为0;C口高4位为输出,因此D3为0,低4位为输入,因此D0为1;B口为输出,因此D1为0。根据程序设计要求,8255A的方式控制字为1000 0001B,即81H。

2.显示程序模块

根据方式控制字和连线可知,B口连接数码管的A~Dp进行段锁存,C口的高4位连接X4~X1进行位锁存。显示程序如下:

DIS PROC NEAR ;数码管显示子程序

PUSH AX ;保护现场

PUSH DX

MOV SI,3000H ;找到存数的缓冲区

MOV AL,0BFH ;1011 1111B,选中X3数码管

MOV DX,MY8255_C ;选中PC口,进而选中数码管

OUT DX,AL

MOV AL,[SI] ;取出缓冲区中存放的键值

XLAT

;查表指令,将以BX为基地址,AL为位移量的字节存储单元中的数赋给AL MOV DX,MY8255_B ;写入数码管A~Dp

OUT DX,AL

CALL DALLY1 ;调用延时函数

MOV AL,7FH ;0111 1111B,选中X4数码管

MOV DX,MY8255_C ;选中PC口,进而选中数码管

OUT DX,AL

MOV AL,[SI+1] ;取出缓冲区中存放的键值

XLAT

MOV DX,MY8255_B ;写入数码管A~Dp

OUT DX,AL

CALL DALLY1 ;调用延时函数

POP AX

POP DX

DIS ENDP

3.延时程序模块

控制一个循环程序循环N次以到达延时的目的。具体语句如下:

DALLY: PUSH CX ;保护现场

PUSH AX

MOV CX,0FFFFH

A1: MOV AX,4FFFH

A2: DEC AX ;自减

JNZ A2

LOOP A1 ;计数循环

POP AX

POP CX

RET

程序循环次数为N=(FFFF+1)*(4FFF+1),延时时间为N*n(n为程序语句执行时间) 4.控制程序模块

控制程序有暂停和复位,其中暂停可以用一个循环程序来实现,当暂停键拨下时,循环程序会进入死循环状态,直至暂停键拨回。复位则只需按条件跳转至输入初始时间的程序语句处即可。C口低4位为输入,读入开关状态,判断“0”和“1”状态进行控制。

程序代码如下:

PAUSE: CALL DIS ;调用显示子程序

MOV DX,MY8255_C ;C口低4位为输入

IN AL,DX ;读入C口的最低位的状态

TEST AL,01H ;0000 0001B

JNZ PAUSE ;最低位为1暂停倒计时

RESET1: MOV DX,MY8255_C ;C口低4位为输入

IN AL,DX

TEST AL,02H ;0000 0010B

JNZ RESET2 ;第2位置1后执行RESET2

DEC TIME ;减1倒计时

MOV CL,TIME

CMP CL,0FFH

;当从初始值减到0后继续减1则值为0FFH,说明计数结束

JNZ DISPY ;倒计时未到0,继续倒计时

JMP OUTPUT1 ;跳到流水灯点亮

;重新开始倒计时

RESET2: JMP SHURU

5.LED灯点亮程序模块

当程序运行至倒计时结束的语句时启动点亮LED灯程序。A口连接LED显示单元的D15~D8,通过A口送入的数据控制LED灯的点亮情况。

程序代码如下:

OUTPUT1: PUSH CX ;点亮流水灯,流水灯0灭1亮

MOV CX,7 ;循环计数初值

MOV LA,80H ;流水灯从左往右依次点亮

P4: MOV AL,LA

MOV DX,MY8255_A

OUT DX,AL ;通过A口输出控制LED点亮

CALL DALLY

ROR AL,1 ;不进位的循环右移

MOV LA,AL

LOOP P4

MOV CX,8

MOV LB,01H ;流水灯从右往左依次点亮

P5: MOV AL,LB

MOV DX,MY8255_A

OUT DX,AL

CALL DALLY

ROL AL,1 ;不进位的循环左移

MOV LB,AL

LOOP P5

JMP prompt ;流水灯显示结束跳转到prompt

四.源程序

;利用8255A设计倒计时,其中A端口连接LED显示单元的D8~D15,B口连接数码管的A~Dp,;进行段锁存,C口高4位连接数码管的X4~X1,进行位锁存,C口的低4位作为输入端,连;接开关的K3~K0,其他引脚与系统总线相连

;***************根据CHECK配置信息修改下列符号值*******************

IOY0 EQU 9C00H ;PCI卡中断控制寄存器地址

;*****************************************************************

MY8255_A EQU IOY0+00H*4 ;8255计数器0端口地址

MY8255_B EQU IOY0+01H*4 ;8255计数器1端口地址

MY8255_C EQU IOY0+02H*4 ;8255计数器2端口地址

MY8255_MODE EQU IOY0+03H*4 ;8255控制寄存器端口地址

;*****************************************************************

DATA SEGMENT

DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;对应0~9

TIME DB ;存储倒计时的初始时间

CHU DB 10 ;存储被除数10

LA DB ;存储数码管从左往右亮的数值

LB DB ;存储数码管从右往左亮的数值

BUF DB ;存储输入的十位数

TISHI DB 13,10,"Input the time:","$"

TIMESUP DB 13,10,"Times up!","$"

STRMSG DB 13,10,"press [r] to restart, [e] to exit:","$"

ENDMSG DB 13,10,"Thanks for using!","$"

DATA ENDS

;*****************************************************************

STACK1 SEGMENT STACK

DW 256 DUP()

STACK1 ENDS

;*****************************************************************

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK1

START: MOV AX,DATA

MOV DS,AX ;装载数据段

MOV DX,MY8255_MODE ;初始化8255

MOV AL,81H

;置8255的C口PC0~PC3输入开关状态,PC4~PC7进行数码管的位锁存B

;口的PB0~PB7进行数码管的段锁存,A口的PA0~PA7控制流水灯的点亮

OUT DX,AL

SHURU: LEA DX,TISHI ;给出输入时间提示

MOV AH,09H

INT 21H ;显示输入倒计时时间的提示

MOV AH,01H

INT 21H ;输入第1个数作为十位数

SUB AL,30H ;将AL的ASCLL减30H变为十进制的值

MOV CL,10

MUL CL ;将操作数10和AL相乘结果存入AX中

MOV BUF,AL ;把十位数存入BUF中

MOV AH,01H ;输入第2个数作为个位数

INT 21H

SUB AL,30H ;将AL的ASCII减30H变为十进制的值

ADD AL,BUF ;将两数相加作为倒计时的开始时间

MOV TIME,AL ;将数给TIME

DISPY: MOV BX,OFFSET DTABLE ;取DTABLE的偏移值

MOV AL,TIME ;初值给AL

CBW ;将AX的高8位置0

MOV CL,CHU ;除数10给CL

DIV CL ;商/十位数存入AL,余数/个位数存入AH

MOV SI,3000H ;定义一个缓冲区

MOV [SI],AL ;商/十位数存入[SI],X3中

MOV [SI+1],AH ;余数/个位数存入[SI+1],X4中

PUSH AX ;保护现场

PUSH CX

MOV CX,1FFFH ;通过延时不断刷新数码管

C1: MOV AX,0FFFH

C2: DEC AX

CALL DIS ;调用显示子程序

JNZ C2

LOOP C1 ;通过循环调用不断刷新数码管显示

POP CX

POP AX ;弹出现场

PAUSE: CALL DIS ;调用显示子程序

MOV DX,MY8255_C ;C口低4位为输入

IN AL,DX ;读入C口的最低位的状态

TEST AL,01H ;0000 0001B

JNZ PAUSE ;最低位为1暂停倒计时

RESET1: MOV DX,MY8255_C ;C口低4位为输入

IN AL,DX

TEST AL,02H ;0000 0010B

JNZ RESET2 ;第2位置1后执行RESET2

DEC TIME ;减1倒计时

MOV CL,TIME

CMP CL,0FFH ;当从初始值减到0后减1则值为0FFH,计数结束

JNZ DISPY ;倒计时未到0,继续倒计时

JMP OUTPUT1 ;跳到流水灯点亮

RESET2: JMP SHURU ;重新开始倒计时

OUTPUT1: PUSH CX ;点亮流水灯,流水灯0灭1亮 MOV CX,7 ;循环计数初值

MOV LA,80H ;流水灯从左往右依次点亮

P4: MOV AL,LA

MOV DX,MY8255_A

OUT DX,AL ;通过A口输出控制LED点亮

CALL DALLY

ROR AL,1 ;不进位的循环右移

MOV LA,AL

LOOP P4

MOV CX,8

MOV LB,01H ;流水灯从右往左依次点亮

P5: MOV AL,LB

MOV DX,MY8255_A

OUT DX,AL

CALL DALLY

ROL AL,1 ;不进位的循环左移

MOV LB,AL

LOOP P5

JMP prompt ;流水灯显示结束跳转到prompt DALLY: PUSH CX ;流水灯点亮延时函数

PUSH AX

MOV CX,0FFFFH

A1: MOV AX,4FFFH

A2: DEC AX

JNZ A2

LOOP A1

POP AX

POP CX

RET

DIS PROC NEAR ;数码管显示子程序

PUSH AX ;保护现场

PUSH DX

MOV SI,3000H ;找到存数的缓冲区

MOV AL,0BFH ;1011 1111B,选中X3数码管 MOV DX,MY8255_C ;选中PC口,进而选中数码管 OUT DX,AL

MOV AL,[SI] ;取出缓冲区中存放的键值

XLAT

;查表指令,将以BX为基地址,AL为位移量的字节存储单元中的数赋给AL MOV DX,MY8255_B ;写入数码管A~Dp

OUT DX,AL

CALL DALLY1 ;调用延时函数

MOV AL,7FH ;0111 1111B,选中X4数码管

MOV DX,MY8255_C ;选中PC口,进而选中数码管

OUT DX,AL

MOV AL,[SI+1] ;取出缓冲区中存放的键值

XLAT

MOV DX,MY8255_B ;写入数码管A~Dp

OUT DX,AL

CALL DALLY1 ;调用延时函数

POP AX

POP DX

DIS ENDP

DALLY1 PROC NEAR ;数码管显示延时函数

PUSH AX

PUSH CX

MOV CX,0FFH

C3: MOV AX,0FFH

C4: DEC AX

JNZ C4

LOOP C3

POP CX

POP AX

RET

DALLY1 ENDP

prompt: LEA DX,TIMESUP ;将TIMESUP字符串输出

CALL PUTS

LEA DX,STRMSG ;将STR字符串输出

CALL PUTS

P3: MOV AH,1

INT 21H ;键盘输入单个字符,AL=输入字符的ASCII码 CMP AL,72H ;测试按下的键为‘r’重新开始

JZ P1

CMP AL,65H ;测试按下的键为‘e’退出

JZ P2

JMP P3 ;不处理其他按键的输入

P1: JMP RESET2 ;重新开始

P2: LEA DX,ENDMSG

CALL PUTS

MOV AH,4CH ;退出程序

INT 21H

PUTS: MOV AH,9

INT 21H ;进行字符串显示

RET

CODE ENDS ;程序结束

END START

五.总结

通过本次微机接口课程设计,让我对微机原理与接口技术和汇编语言的了解更加深刻。我和我的组员王乐在TD-PIT+实验系统和PC机平台上利用并行接口8255A、键盘及数码管显示单元、开关及LED显示单元、键盘按键和电脑显示屏设计成一个倒计时器,最终很完美地实现了所有基本功能和扩展功能,感觉很有自豪感。

在这次课设中,我学到了很多,包括书本上的和书本外平时易忽视的东西。一方面锻炼了我的动手能力,一方面提升了我的分析问题和解决问题的能力,还有就是团队合作精神。在这过程中,我们遇到了很多问题,最突出的就是数码管显示问题,我们一起讨论研究并询问老师,最终都很完美地解决了所有问题,设计出了一个多功能的倒计时器。

感谢XXX老师的细心指导,感谢我的组员XX,最后感谢学校给我们提供这么好的学习平台。

附录1:系统硬件框架

附录2:系统总程序流程图

附录3:8086/88计算机主板图

相关主题
文本预览
相关文档 最新文档