【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器

实验内容:

计时器基本功能:
1)CPU必须用8086
2)计时器最小计时单位为秒。
3)以00:00格式显示计时,前2位表示分钟,后2位表示秒。

4)计时器是正计时方式
5)有暂停、继续计时功能

6)有复位计时功能
7)每次按下暂停键,能显示计时间隔时间

参考书籍:

微机原理与接口技术——基于8086和Proteus仿真(第3版)(作者:顾晖等),p273,13.1电子秒表。若有补充内容,放在评论区。

具体实现的功能描述:

1)CPU 使用 8086

2)计时器最小计时单位为秒。

3)按下 START 键,以正计时方式开始计时。以 00:00 格式在数 码管 L1 上显示计时,前 2 位表示分钟,后 2 位表示秒。

4) 数码管 L1 显示正常计时时间,数码管 L2 显示两次按下暂停 的时间间隔。在正常计时情况下,按下 PAUSE/RESUME 键,计时 器暂停计时,数码管 L1 显示暂停时刻,数码管 L2 显示从暂停 时刻从 0 开始计时的时间,直到再次按下暂停,计时器从暂停 时刻开始继续计时, L1 显示对应的计时时间,数码管 L2 开始 显示从继续计时时刻从 0 开始计时的时间,直到再次按下暂 停,回到前述的暂停情况。

5) 按下 RESET 键,计时器复位,数码管 L1 显示 0000,然后按 下 START 键,可以重新从 0000 开始计时。

电路图:

 电路图的绘制和项目创建可以参看专栏的其他文章。如:【Proteus】绘制简单的电路图-CSDN博客

1.I/O 地址译码电路: 

【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器_第1张图片

2. 8253 计时电路:

注意: 这里clk0设为了1khz,数码管显示比较接近1s

【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器_第2张图片

 3.8255A 显示及中断电路:

 【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器_第3张图片

 4.总览和器件列表(图的左边)

【Proteus/8086】swjtu西南交大微机与接口技术实验:计时器_第4张图片

汇编代码(部分):

A8255 EQU 0000H                  ;用于显示正常计时时间8255A各端口地址
B8255 EQU 0002H
C8255 EQU 0004H
CTR8255 EQU 0006H
AA8255 EQU 0300H                 ;用于显示暂停时间间隔8255A各端口地址
BB8255 EQU 0302H
CC8255 EQU 0304H
CCTR8255 EQU 0306H

CH0 EQU 0200H                    ;8253计数器0的端口地址
CTR8253 EQU 0206H                ;8253 控制端口地址
AD245 EQU 0100H                  ;74LS245地址    

CODE SEGMENT 'CODE'
    ASSUME DS:DATA,CS:CODE,SS:SSEG
START: 
    MOV AX,SSEG                       
    MOV SP,AX
    
    CLI                           ;关中断
    MOV AX,0                      ;设中段向量       
    MOV ES,AX
    MOV BX,2*4                    ;NMI为2号中断
    MOV AX,OFFSET INTR_KEY
    MOV WORD PTR ES:[BX],AX
    MOV AX,SEG INTR_KEY
    MOV WORD PTR ES:[BX+2],AX
    STI                           ;开中断

    MOV AX,DATA                   ;初始化数据段
    MOV DS,AX
    MOV AX,DATA
    MOV ES,AX

    MOV AL,10001001B               ;8255A初始化
    MOV DX,CTR8255
    OUT DX,AL
    MOV AL,10001001B               ;8255A初始化
    MOV DX,CCTR8255
    OUT DX,AL
RUN:
    CALL RUNNING                   ;循环等待中断
    JMP RUN    
    
INTR_KEY PROC                      ;中断服务程序
    PUSH AX                        ;现场保护
    PUSH BX
    PUSHF
    CALL KEY                       ;读取按钮状态
    TEST AL,01H                    ;检测启动按钮
    JZ K1
    TEST AL,02H                    ;检测暂停按钮
    JZ K2
    TEST AL,04H                    ;检测复位按钮
    JZ K3
K1:
    MOV KEYST,1                    ;按钮标志位置为1
    JMP FIN
K2:
    MOV KEYST,2                    ;按钮标志位置为 2
    INC PAUSEKEY                   ;记录暂停按钮按下次数
    JMP FIN
K3:
    MOV KEYST,3                    ;按钮标志位置为3
FIN:
    POPF                           ;恢复现场
    POP BX
    POP AX
    IRET
INTR_KEY ENDP  

RUNNING PROC                     ;根据当前的中断触发类型,转入不同的显示
AGAIN: 
    CMP KEYST,1
    JZ T1
    CMP KEYST,2
    JZ T2
    CMP KEYST,3
    JZ T3
    JMP E0
T1:
    MOV AL,0                       ;正常计时和继续计时,暂停时间清零
    LEA DI,PAUSEBUF
    MOV CX,4
    CLD
    REP STOSB
    
    CALL TIME                      ;转入计时
    JMP E0
T2:
    TEST PAUSEKEY,1             ;检测暂停按钮按下次数,转入暂停或继续计时
    JZ T1  
    CALL PAUSETIME                 ;调用暂停时间计时子程序
                                   
    MOV AL,0                       ;奇数次,把继续计时时间暂存区清零
    LEA DI,RESUMEBUF
    MOV CX,4
    CLD
    REP STOSB
    JMP E0
T3:
    CALL RESET                     ;系统复位
E0:
    CALL DISP                      ;调用显示子程序
    CMP KEYST,3
    JZ OUT2
    CMP KEYST,1
    JZ OUT2
    TEST PAUSEKEY,1 
    JZ OUT1
    CALL PAUSEDISP                ;调用暂停计时时间显示子程序
    JMP OUT2
OUT1:
     CALL RESUMEDISP              ;调用继续计时时间显示子程序 
OUT2:RET
RUNNING ENDP

TIME PROC                         ;计时子程序,按时间进位规则
    PUSH AX
    PUSH BX
    PUSH SI
    PUSH DI

    LEA SI,TIMEBUF                ;10毫秒
    MOV AH, [SI]
    INC AH

    CMP AH,100
    JZ S1
    MOV [SI],AH
    JMP S5
S1:
    MOV AH,0                      ;秒
    MOV [SI],AH
    MOV AH,[SI+1]
    INC AH
    CMP AH,60
    JZ S2
    MOV [SI+1],AH
    JMP S5
S2:
    MOV AH,0                       ;分
    MOV [SI+1],AH
    MOV AH,[SI+2]
    INC AH
    CMP AH,60
    JZ S3
    MOV [SI+2],AH
    JMP S5
S3:
    MOV AH,0                       ;时
    MOV [SI+2],AH
    MOV AH,[SI+3]
    INC AH
    CMP AH,24
    JZ S4
    MOV [SI+3],AH      
    JMP S5
S4:
    MOV AL,0
    LEA DI,TIMEBUF
    MOV CX,4
    CLD
    REP STOSB
S5:
    CALL DIGIT                      ;将正常计时时间转换为数位值
    CALL RESUMETIME                 ;从继续计时时刻开始的计时
    CALL RESUMEDIGIT                ;将继续计时时间转换为数位值

    CALL DELAY8253                  ;8253计时
    POP DI
    POP SI
    POP BX
    POP AX
    RET
TIME ENDP  

DIGIT PROC                          ;将时间转换为数位值
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH SI
    PUSH DI
    MOV BL,4                        ;4个时间单位,依次转换
    LEA DI,LEDBUF
    LEA SI,TIMEBUF
NEXT: 
    LODSB                           ;从TIMEBUF中依次取出时间值
    MOV AH,0
    MOV CL,10                ;除以10,分离出时间的个位和十位,存入 LEDBUF
    DIV CL
    XCHG AH,AL
    STOSB
    MOV AL,AH
    STOSB
    DEC BL
    JNZ NEXT
    POP DI
    POP SI
    POP CX
    POP BX
    POP AX
    RET
DIGIT ENDP 

DISP PROC                            ;显示 LEDBUF 中的值
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    PUSH SI
    LEA BX,LEDTAB
    LEA SI,LEDBUF
    MOV CX,8
    MOV AH,7FH
LOOP1: 
    MOV AL,[SI]
    XLAT                             ;换码,数位值转换成LED显示段码
    MOV DX,A8255                     ;段码值送8255A端口A
    OUT DX,AL
    CMP AH,7FH
    JZ DIS1
    CMP AH,0BFH
    JZ DIS1   
    
    MOV AL,AH                        ;LED位选送 8255A端口 B
    MOV DX,B8255
    OUT DX,AL
DIS1:    CALL DELAY
    ROR AH,1
    INC SI
    CALL CLRLED                      ;LED清屏
    LOOP LOOP1
    POP SI
    POP DX
    POP CX
    POP BX
    POP AX
    RET
DISP ENDP    

CLRLED PROC                           ;清屏子程序
    PUSH AX
    PUSH DX
    MOV AL,0FFH
    MOV DX,B8255
    OUT DX,AL
    POP DX
    POP AX
    RET
CLRLED ENDP 

DELAY8253 PROC                       ;8253延时子程序
    PUSH AX
    PUSH DX
    MOV DX,CTR8253                   ;设置8253控制字,计数器0,方式0
    MOV AL,00010000B
    OUT DX,AL
    MOV DX,CH0
    MOV AL,06H
    OUT DX,AL
    MOV DX,AD245
W1:
    IN AL,DX
    TEST AL,01H                ;检测8253计时是否结束,计数器0输出高电平
    JZ W1
    POP DX
    POP AX
    RET
DELAY8253 ENDP   

DELAY PROC                            ;软延时
    PUSH CX
    MOV CX,50
WAIT1: 
    LOOP WAIT1
    POP CX
    RET
DELAY ENDP  

RESET PROC                            ;计数复位子程序,数据缓冲区全部清0
    PUSH AX
    PUSH CX
    PUSH DI
    MOV AL,0
    LEA DI,TIMEBUF
    MOV CX,13
    CLD
    REP STOSB
    
    MOV AL,0
    LEA DI,PAUSEBUF
    MOV CX,4
    CLD
    REP STOSB

    MOV AL,0
    LEA DI,RESUMEBUF
    MOV CX,4
    CLD
    REP STOSB
    POP DI
    POP CX
    POP AX
RESET ENDP  

KEY PROC                             ;读开关子程序
    MOV DX,C8255
    IN AL,DX
    RET
KEY ENDP      

更多(源文件、报告)请见:

西南交大swjtu微机与接口技术实验:计时器源文件与报告资源-CSDN文库

你可能感兴趣的:(proteus)