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

更新时间:2023-03-08 06:23:47 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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

题目:倒计时

学 院:西安理工大学 专 业:机械实际制造及其自动化 班 级 机械四班 学 号: 2012030408 学生姓名 刘小虎 指导教师 课程成绩 完成日期 2014年12月15日

目 录

一. 设计功能 ........................................................ 3 二. 设计原理及原理图......................................... 3 1. 系统总设计原理 ............................................ 3 2. 硬件框架原理图 ............................................ 3 3. 硬件介绍 ........................................................ 4 4. 功能电路 ........................................................ 7 三. 程序模块及流程图......................................... 8 1. 8255A初始化 ................................................. 8 2. 显示程序模块 ................................................ 8 3. 延时程序模块 ................................................ 9 4. 控制程序模块 ................................................ 9 5. LED灯点亮程序模块 .................................... 10 四. 源程序 ......................................................... 11 五. 总结 ............................................................. 15 附录1:系统硬件框架 ......................................... 16 附录2:系统总程序流程图 ................................. 17

题目:倒计时

一. 设计功能

本次课程设计我们在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. 硬件介绍 3.1 并行接口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口置位/复位控制字 3.2 八段共阴数码管

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

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

图6 八段LED显示器

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

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

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

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

表1 8段LED显示字形段码 字型 共阴极字形代码 字型 共阴极字形代码 字型 共阴极字形代码 0 1 2 3 4 5 4. 功能电路 4.1 数码管显示电路

图7 显示连接电路

3FH 06H 5BH 4FH 66H 6DH 6 7 8 9 A B 7DH 07H 7FH 6FH 77H 7CH C D E F 灭 39H 5EH 79H 71H 00H 实验箱上有四个LED显示器,本实验利用PC口的最高两位选中X4和X3两个数码管,即进行位锁存;

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

表2 8段数码管段码表

显示字符 八段代码 0 3FH 1 06H 2 5BH 3 4FH 4 66H 5 6DH 6 7DH 7 07H 8 7FH 9 6FH 4.2 开关与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 IN AL,DX

;调用显示子程序

;C口低4位为输入 ;读入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 MOV CX,7 MOV LA,80H P4: MOV AL,LA

MOV DX,MY8255_A OUT DX,AL 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

;点亮流水灯,流水灯0灭1亮 ;循环计数初值

;流水灯从左往右依次点亮

;通过A口输出控制LED点亮 ;不进位的循环右移

;流水灯从右往左依次点亮

;不进位的循环左移

;流水灯显示结束跳转到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,\ TIMESUP DB 13,10,\

STRMSG DB 13,10,\ ENDMSG DB 13,10,\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

DISPY: MOV BX,OFFSET DTABLE CBW MOV SI,3000H MOV [SI],AL MOV [SI+1],AH

C1: C2: CALL DIS

PAUSE: CALL DIS IN AL,DX

RESET1: MOV DX,MY8255_C MOV CL,TIME

;将数给TIME ;取DTABLE的偏移值 ;初值给AL

;将AX的高8位置0 ;除数10给CL

;商/十位数存入AL,余数/个位数存入AH ;定义一个缓冲区

;商/十位数存入[SI],X3中 ;余数/个位数存入[SI+1],X4中 ;保护现场 ;通过延时不断刷新数码管 ;调用显示子程序 ;通过循环调用不断刷新数码管显示 ;弹出现场 ;调用显示子程序

;C口低4位为输入 ;读入C口的最低位的状态 ;0000 0001B

最低位为1暂停倒计时 ;C口低4位为输入 ;0000 0010B 第2位置1后执行RESET2 减1倒计时 当从初始值减到0后减1则值为0FFH,计数结束

MOV AL,TIME MOV CL,CHU DIV CL PUSH AX PUSH CX

MOV CX,1FFFH MOV AX,0FFFH DEC AX

JNZ C2

LOOP C1 POP CX

POP AX MOV DX,MY8255_C TEST AL,01H JNZ PAUSE ; IN AL,DX

TEST AL,02H JNZ RESET2 ; DEC TIME ; CMP CL,0FFH ; JNZ DISPY ;倒计时未到0,继续倒计时 JMP OUTPUT1

RESET2: JMP SHURU

OUTPUT1: PUSH CX MOV CX,7 MOV LA,80H P4: MOV AL,LA

MOV DX,MY8255_A

OUT DX,AL 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 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 MOV DX,MY8255_C OUT DX,AL

;跳到流水灯点亮 ;重新开始倒计时 ;点亮流水灯,流水灯0灭1亮 ;循环计数初值

;流水灯从左往右依次点亮 ;通过A口输出控制LED点亮 ;不进位的循环右移 ;流水灯从右往左依次点亮 ;不进位的循环左移 ;流水灯显示结束跳转到prompt ;流水灯点亮延时函数 ;数码管显示子程序 ;保护现场 ;找到存数的缓冲区

,选中X3数码管 ;选中PC口,进而选中数码管

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 OUT DX,AL

MOV AL,[SI+1] XLAT

MOV DX,MY8255_B 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 CALL PUTS

LEA DX,STRMSG CALL PUTS P3: MOV AH,1

INT 21H CMP AL,72H JZ P1

CMP AL,65H JZ P2

JMP P3

P1: JMP RESET2 ;选中PC口,进而选中数码管 ;取出缓冲区中存放的键值 ;写入数码管A~Dp ;调用延时函数 ;数码管显示延时函数 ;将TIMESUP字符串输出 ;将STR字符串输出 ;键盘输入单个字符,AL=输入字符的ASCII码 ;测试按下的键为‘r’重新开始 ;测试按下的键为‘e’退出 ;不处理其他按键的输入 ;重新开始

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,最后感谢学校给我们提供这么好的学习平台。

本文来源:https://www.bwwdw.com/article/884.html

Top