前言.课程设计(论文)任务书
课程名称 | 汇编语言与微机接口 | |||||||
课设题目 | 电子秒表 | 项目 C | ||||||
设计任务 | 设计一个可任意启动/停止的电子秒表,有6位LED数码管显示,可以显示分、秒、单位时间。计时单位为1/100秒。 | |||||||
设计要求 | 1.硬件测试通过。8259 能够实现中断。8254 能够实现呼吸灯。8255 能够控制 L8— L15 的亮与灭。 2. 采用定时中断方式实现时、分、秒的计时。 3. 二进制到十进制的代码转换程序。 4. 十进制到显示代码的查表转换程序。 5. 数码管动态显示程序。 6. START 和 STOP 代码。 7. 利用启动/暂停功能进行启动/暂停控制。 8. 用复位键清零。 | |||||||
成果要求 | 1. 设计出完整的硬件线路图。 2、编写出全部控制程序。 3、在实验箱上调试通过。 4、参加答辩或小测验。 5、写出完整、规范的课程设计报告。在指定的时间内提交指导教师。 | |||||||
其他事项 | 课程设计的封面、内容要求以及格式要求等相关资料,请参看附件。格式 必须按照要求编辑、打印、装订。如不符合要求的将按不合格处理。在课程 设计中严禁出现相互抄袭、雷同的情况。如有发现,将按照零分处理。 | |||||||
一、设计目的
1. 掌握电子秒表的工作原理。
2. 进一步巩固 8259 、 8254 以及 8255 的应用。掌握综合设计能力。
二、设计任务与要求
2.1设计任务:
设计一个可任意启动/停止的电子秒表 。 有 6 位 LED 数码管显示, 可以显示分、
秒、单位时间 。 计时单位为 1/100 秒。利用启动/暂停功能键进行启/停控制。有复 位键。
2.2设计要求如下 :
- 1.硬件测试通过。8255 基本 IO 实验通过。8254 能够实现呼吸灯。8259 能够实 现中断。
- 2 . 采用定时中断方式实现分、秒、单位时间的计时。
- 3 . 上电后 ,计时器显示 00:00:00 。
- 4 . 当第一次(或奇数次)按下启/停键时开始计时 。
- 5 . 第 2 次(或偶数次) 按下该键时暂停计时。
- 6 . 只有在暂停状态时,按复位键后又进入初始状态。再一次按启/停键时重新开始计时。
- 7. 单位时间 100 进位。秒和分 60 进位
- 8 如此往复
三、设计方案
3.1设计思路以及教师问题解答
首先利用8254芯片的定时功能向8259芯片定时发送中断请求,从而调用中断服务子程序MIR7,在MIR7中通过8255芯片首先实现了秒表的基本输出。
而在输出的规律是单位时间100进位,秒和分60进位。而因为本方案设置数码管每次只显示一位,所谓六位数码管从后向前依次是满10进一,满10进一,满10进一,满6进一,满10进一,满6清零。所以每次显示的变化本质上都是由最低位控制的,所以本方案秒表的基本输出就是由最低位的进位控制。
而本方案的启动/停止功能和清零功能都是通过在最低位自加处的判断而实现的。启动/停止功能由KK1开关控制的中断服务子程序MIR6控制,而在MIR6子程序中只是实现了启停控制量STATUS的自加,每次点击一次KK1,STATUS就会+1,也就是相当于在奇数和偶数之间相互循环,而在MIR7程序中在最低位自加之前会有一个TEST指令的判断,将STATUS与01H进行相与,如果STATUS是偶数,则自动跳转到只显示当前六位数码管数值的子程序中;如果是奇数,则最低位自加循环输出六位数码管;从而实现了动态方式下得启动和暂停。
清零功能和启动/停止功能相似,清零功能由KK2开关控制的中断服务子程序SIR1控制,而在SIR1子程序中只是实现了启停控制量STATUS1的自加,每次点击一次KK2,STATUS1就会+1,也就是相当于在奇数和偶数之间相互循环,而在SIR1程序中在最低位自加之前会有一个TEST指令的判断,将STATUS与01H进行相与,如果STATUS是偶数,则自动跳转到只显示全零的六位数码管数值的子程序中;如果是奇数,则最低位自加循环输出六位数码管;从而实现了动态方式下的清零。
使用的 I/O 设备
本实验使用的I/O 设备为六位LED数码管
使用的芯片
8259芯片、8255芯片、8254芯片
芯片的作用
- 8259芯片:用于接受8254芯片的中断请求和开关KK1,KK2的中断请求。
- 8255芯片:用于实现对数码管的输出。
- 8254芯片;用于定时中断。
四、源代码
1、参考程序
PP8255A EQU 0600H
P8255B EQU 0602H
P8255C EQU 0604H
P8255M EQU 0606H
TIMER0 EQU 06C0H
TIMER1 EQU 06C2H
TIMER2 EQU 06C4H
TIMERM EQU 06C6H
DATA SEGMENT
DISCODE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;0--7 的显示代码
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;8--F 的显示代码
INDEX DB 00H,00H,00H,00H,00H,00H,0CCH,0CCH
DYNBUFF DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示缓冲
LOCATN DB 00H,00H,00H,00H,00H,00H,00H,00H ;动态显示位置控制
MINUTE DB 0 ;分钟
SECOND DB 0 ;秒
UINTIME DB 0 ;单位时间
COUNT DB 100
DATA ENDS
SSTACK SEGMENT PARA STACK 'STACK'
DW 32 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS: SSTACK
START: MOV AX,DATA
MOV DS,AX
;--------------------------------------------------------------- 8255 初始化
INITA: NOP
;--------------------------------------------------------------- 中断芯片
INITB: PUSH DS
MOV AX,0000H
MOV DS,AX
MOV AX,OFFSET MIR7
MOV SI,003CH
MOV [SI],AX
MOV AX,CS
MOV SI,003EH
MOV [SI],AX
MOV AX,OFFSET MIR6
MOV SI,0038H
MOV [SI],AX
MOV AX,CS
MOV SI,003AH
MOV [SI],AX
MOV AX, OFFSET SIR1
MOV SI, 00C4H
MOV [SI], AX
MOV AX, CS
MOV SI, 00C6H
MOV [SI], AX
CLI
POP DS
;--------------------------------------------------------------- 主
MOV AL,11H
OUT 20H,AL ;ICW1
MOV AL,08H
OUT 21H,AL ;ICW2
MOV AL,04H
OUT 21H,AL ;ICW3
MOV AL,01H
OUT 21H,AL ;ICW4
;-------------------------------------------------------------初始化从片 8259
MOV AL, 11H
OUT 0A0H, AL ;ICW1
MOV AL, 30H
OUT 0A1H, AL ;ICW2
MOV AL, 02H
OUT 0A1H, AL ;ICW3
MOV AL, 01H
OUT 0A1H, AL ;ICW4
;---------------------------------------------------------------
MOV AL, 0FDH ;OCW1 = 1111 1101B
OUT 0A1H,AL
MOV AL,2BH ;OCW1 = 00101011B
OUT 21H,AL
STI
AA1: NOP
JMP AA1
;--------------------------------------------------------------- 定时器芯片
INITC: MOV DX, TIMERM
MOV AL,36H
OUT DX,AL
MOV DX, TIMER0 ;计数器 0
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL
MOV DX, TIMERM
MOV AL,76H
OUT DX,AL
MOV DX, TIMER1 ;计数器 1
MOV AL,0E8H
OUT DX,AL
MOV AL,03H
OUT DX,AL
;---------------------------------------------------------------
BEGIN: NOP
AA2: JMP AA2
;---------------------------------------------------------------
MIR7 PROC NEAR
PUSH AX
PUSH DX
MOV AX,0137H
INT 10H
MOV AX,0120H
INT 10H
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
MIR7 ENDP
;---------------------------------------------------------------
MIR6 PROC NEAR
PUSH AX
PUSH DX
MOV AL,20H
OUT 20H,AL
POP DX
POP AX
IRET
MIR6 ENDP
SIR1 PROC NEAR
PUSH AX
PUSH DX
MOV AL, 20H
OUT 0A0H, AL
OUT 20H, AL
POP DX
POP AX
IRET
SIR1 ENDP
CODE ENDS
END START
CODE ENDS
END START
2.最终程序清单
MYDATA SEGMENT
LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
;8255端口
PA DW 0640H ;
PB DW 0642H ;
PC DW 0644H ;
CWR55 DW 0646H ;
;8259主片地址端口
ICW1 DW 20H
ICW2 DW 21H
ICW3 DW 21H
ICW4 DW 21H
OCW1 DW 21H
OCW2 DW 20H
OCW3 DW 20H
;8259从片地址端口
ICWW1 DW 0A0H
ICWW2 DW 0A1H
ICWW3 DW 0A1H
ICWW4 DW 0A1H
OCWW1 DW 0A1H
OCWW2 DW 0A0H
OCWW3 DW 0A0H
;数码管
L0 DB 00H
L1 DB 00H
L2 DB 00H
L3 DB 00H
L4 DB 00H
L5 DB 00H
;控制暂停和启动的信号量
STATUS DW 00H
;控制清零的信号量
STATUS1 DW 01H
MYDATA ENDS
;----------------------------------------
SSTACK SEGMENT STACK
DW 32 DUP(?)
SSTACK ENDS
;-------------------------------------------
MYCODE SEGMENT
ASSUME CS:MYCODE, SS:SSTACK,DS:MYDATA
START:
;8255初始化
MOV AX, MYDATA
MOV DS, AX
MOV DX, CWR55
MOV AL, 80H
OUT DX, AL
MOV DX,PA
MOV AL,00H ;选定所有数码管
OUT DX,AL
MOV DX,PB
MOV BX,OFFSET LED
MOV AL,00H ;所有数码管最开始显示0
XLAT
OUT DX,AL
;-------------------------------------------------
;8254初始化
MOV DX,06C6H
MOV AL,00110110B
OUT DX,AL
MOV DX,06C0H
MOV AL,00H
OUT DX,AL
MOV DX,06C0H
MOV AL,48H
OUT DX,AL
;--------------------------------------------------------------
;初始化中断向量表
;MIR6
MOV AX,00H
MOV ES,AX
MOV BX,0038H
MOV AX,OFFSET MIR6
MOV ES:[BX],AX
MOV AX,CS
MOV ES:[BX+2],AX
;MIR7
MOV AX,00H
MOV ES,AX
MOV BX,003CH
MOV AX,OFFSET MIR7
MOV ES:[BX],AX
MOV AX,CS
MOV ES:[BX+2],AX
;SIR1
MOV AX,00H
MOV ES,AX
MOV BX,00C4H
MOV AX,OFFSET SIR1
MOV ES:[BX],AX
MOV AX,CS
MOV ES:[BX+2],AX
;8259主片控制字初始化
CLI
MOV DX,ICW1
MOV AL,00010001B
OUT DX,AL
MOV DX,ICW2
MOV AL,08H
OUT DX,AL
MOV DX,ICW3
MOV AL,00000100B
OUT DX,AL
MOV DX,ICW4
MOV AL,00000001B
OUT DX,AL
;8259从片控制字初始化
MOV DX,ICWW1
MOV AL,00010001B
OUT DX,AL
MOV DX,ICWW2
MOV AL,30H
OUT DX,AL
MOV DX,ICWW3
MOV AL,00000010B
OUT DX,AL
MOV DX,ICWW4
MOV AL,00000001B
OUT DX,AL
; 从片中断屏蔽控制字初始化
MOV DX,OCWW1
MOV AL,0FDH ;11111101B
OUT DX,AL
;主片中断屏蔽控制字初始化
MOV DX,OCW1
MOV AL,2BH ;00101011B
OUT DX,AL
STI
AA1: JMP AA1
;------------------------------------------
;SIR1作用是将清零控制字+1
SIR1 PROC
CLI
INC STATUS1
MOV DX,OCWW2
MOV AL,00100000B
OUT DX,AL
MOV DX,OCW2
MOV AL,00100000B
OUT DX,AL
STI
SIR1 ENDP
JMP MIR7
;MIR6作用是将启动暂停控制字+1
MIR6 PROC
CLI
INC STATUS
MOV DX,OCW2
MOV AL,00100000B
OUT DX,AL
STI
MIR6 ENDP
;MIR7作用是一直在循环显示数码管
MIR7 PROC ; 59 59 99 00 00 00
SKIP1: CMP L0,9;9
JBE T0
MOV L0,00H
INC L1
T0: CALL LED0
CALL DELAY
CMP L1,9;9
JBE T1
MOV L1,00H
INC L2
T1: CALL LED1
CALL DELAY
CMP L2,9;9
JBE T2
MOV L2,00H
INC L3
T2:
CALL LED2
CALL DELAY
CMP L3,5
JBE T3
MOV L3,00H
INC L4
T3:
CALL LED3
CALL DELAY
CMP L4,9
JBE T4
MOV L4,00H
INC L5
T4:
CALL LED4
CALL DELAY
CMP L5,5
JBE T5
CALL CLEAR
JMP TO
T5:
CALL LED5
CALL DELAY
;----------------------------------------------
TO:
TEST STATUS1,01H ; 如果是偶数则直接跳转到清零,如果是奇数则继续判断启动还是暂停
MOV STATUS1,01H ;判断完成将判断为重置为奇数
JZ OUT_2
TEST STATUS,01H ;如果是偶数则直接跳转到暂停;如果是奇数则让末位+1实现运转
JZ OUT_1
INC L0
JMP SKIP1
OUT_1: ;利用无限循环重复输出一组数据,达到动态暂停显示的效果
STOPS:
CALL LED0
CALL DELAY
CALL LED1
CALL DELAY
CALL LED2
CALL DELAY
CALL LED3
CALL DELAY
CALL LED4
CALL DELAY
CALL LED5
CALL DELAY
JMP STOPS
OUT_2: ;无限循环输出全零达到动态清零显示效果
STOPS1:
MOV L0,0
MOV L1,0
MOV L2,0
MOV L3,0
MOV L4,0
MOV L5,0
CALL LED0
CALL LED1
CALL LED2
CALL LED3
CALL LED4
CALL LED5
JMP STOPS1
MOV DX,OCW2
MOV AL,00100000B
OUT DX,AL
MIR7 ENDP
JMP AA1
;清零函数
CLEAR PROC
MOV L0,0
MOV L1,0
MOV L2,0
MOV L3,0
MOV L4,0
MOV L5,0
RET
CLEAR ENDP
;-------------------------------------延时函数-------------------
DELAY PROC
PUSH SI
PUSH CX
MOV SI, 0040H
D11: MOV CX,000FH
D22: LOOP D22
DEC SI
JNZ D11
POP CX
POP SI
RET
DELAY ENDP
;利用查表法将数据显示到相应的单独数码管
LED0 PROC
PUSH DX
PUSH AX
; PUSH BX
MOV DX,PA
MOV AL,11111110B;SPOINT
OUT DX,AL
MOV BX,OFFSET LED
MOV AL,L0
XLAT
MOV DX,PB
OUT DX,AL
;
POP AX
POP DX
RET
LED0 ENDP
LED1 PROC
PUSH DX
PUSH AX
MOV DX,PA
MOV AL,11111101B;SPOINT
OUT DX,AL
MOV BX,OFFSET LED
MOV AL,L1
XLAT
MOV DX,PB
OUT DX,AL
POP AX
POP DX
RET
LED1 ENDP
LED2 PROC
PUSH DX
PUSH AX
MOV DX,PA
MOV AL,11111011B;SPOINT
OUT DX,AL
MOV BX,OFFSET LED
MOV AL,L2
XLAT
MOV DX,PB
OUT DX,AL
POP AX
POP DX
RET
LED2 ENDP
LED3 PROC
PUSH DX
PUSH AX
MOV DX,PA
MOV AL,11110111B;SPOINT
OUT DX,AL
MOV BX,OFFSET LED
MOV AL,L3
XLAT
MOV DX,PB
OUT DX,AL
POP AX
POP DX
RET
LED3 ENDP
LED4 PROC
PUSH DX
PUSH AX
MOV DX,PA
MOV AL,11101111B;SPOINT
OUT DX,AL
MOV BX,OFFSET LED
MOV AL,L4
XLAT
MOV DX,PB
OUT DX,AL
POP AX
POP DX
RET
LED4 ENDP
LED5 PROC
PUSH DX
PUSH AX
MOV DX,PA
MOV AL,11011111B
OUT DX,AL
MOV BX,OFFSET LED
MOV AL,L5
XLAT
MOV DX,PB
OUT DX,AL
POP AX
POP DX
RET
LED5 ENDP
MYCODE ENDS
END START
七、调试过程
调试步骤:首先在WM86软件上编译链接并加载程序,加载成功后点击运行,这时数码管显示全零,之后点击KK1,秒表开始及时,再次点击KK1秒表暂停,点击KK2,秒表清零。再次点击KK1,秒表重新开始计时。