目的:
(1)掌握8253可编程定时器/计数器定时方法;
(2)掌握8253多级串联实现大时间常数的定时方法;
(3)掌握8086与8253的连接方法与控制方法。
内容:
(1)利用8086外接8253可编程定时器/计数器,通道0方式0实现对外部事件进行计数并显示;
(2)实现频率计功能,8253通道0通过标准脉冲信号(2000HZ)实现1秒定时中断(8259),
在8253通道1实现对外部频率信号进行计数,测得的计数值用2位数码管显示,测量范围0~99HZ。硬件电路已经搭建好。
C8253 EQU 9006H
P8253_0 EQU 9000H
LEDOUT EQU 8000H
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:
mov dx,c8253
mov al,00010000B
out dx,al
mov dx,P8253_0
mov al,0Fh
out dx,al
start:
mov dx,P8253_0
in al,dx
mov dx,LEDOUT
out dx,al
mov dx,P8253_0
in al,dx
jmp start
CODE ENDS
END BEGIN
P8253_0 EQU 8000H ;8253地址
P8253_1 EQU 8002H
C8253 EQU 8006H
ICW1 equ 00010011b ; 单片8259, 上升沿中断, 要写ICW4
ICW2 equ 01100000b ; 中断号为60H
ICW4 equ 00011001b ; 工作在8086/88 方式
OCW1 equ 11111110b ; 中断屏蔽字,只响应INT0 中断
CS8259A EQU 9000h ; 8259地址
CS8259B EQU 9002h
LEDOUT EQU 0A000H ; 数码管显示地址
DATA SEGMENT
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,DS:DATA,ES:DATA
BEGIN:
MOV AX, DATA
MOV DS, AX
MOV ES, AX
CLI
MOV SI,ICW2*4;中断控制程序地址
LEA AX,INT0
MOV [SI],AX
MOV AX,CS
MOV [SI+2],AX
MOV AL,ICW1
MOV DX,CS8259A
OUT DX,AL
MOV AL,ICW2
MOV DX,CS8259B
OUT DX,AL
MOV AL,ICW4
OUT DX,AL
MOV AL,OCW1
OUT DX,AL
start: ;初始化通道0和通道1
mov dx,c8253
mov al,00110000B
out dx,al
MOV DX,C8253
MOV AL,36H;00110110B
OUT DX,AL
MOV DX,P8253_0
MOV AL,0D0H
OUT DX,AL
MOV AL,07H
OUT DX,AL
mov dx,c8253
mov al,01110000B
out dx,al
mov dx,P8253_1
mov al,64H
out dx,al
mov dx,P8253_1
mov al,00H
out dx,al
sti
LI:
nop
jmp LI
;中断服务程序
int0 proc
cli ;频率检测
mov dx,P8253_1
in al,dx
xchg al,ah
in al,dx
xchg al,ah
mov ah,64H
sub ah,al
mov dx,LEDOUT
mov al,ah
mov ah,0 ;进制转换
mov bl,10
div bl ;;div之后al为商,ah为余数
mov cx,4 ;针对这个范围,商和余数均只占al和ah的低四位
lp: ;把al的低四位变成al的高四位,在与ah相加即可
rcl al,1
loop lp
add al,ah
out dx,al
mov dx,P8253_1
mov dx,P8253_1
mov al,64H
out dx,al
mov dx,P8253_1
mov al,00H
out dx,al
mov dx,CS8259A ;非自动结束方式,发送结束EOI命令
mov al,20h
out dx,al
sti
iret
int0 endp
CODE ENDS
END BEGIN
感谢大佬们的帮助,感谢老师,顺便说一下,老师的记性是真的好。。。
本文章儿童节之前不允许抄袭转载