用汇编实现8253定时计数器应用实验

用汇编实现8253定时计数器应用实验

要求

目的:
(1)掌握8253可编程定时器/计数器定时方法;
(2)掌握8253多级串联实现大时间常数的定时方法;
(3)掌握8086与8253的连接方法与控制方法。
内容:
(1)利用8086外接8253可编程定时器/计数器,通道0方式0实现对外部事件进行计数并显示;
(2)实现频率计功能,8253通道0通过标准脉冲信号(2000HZ)实现1秒定时中断(8259),
在8253通道1实现对外部频率信号进行计数,测得的计数值用2位数码管显示,测量范围0~99HZ。硬件电路已经搭建好。

要求1

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

要求2

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


小结

感谢大佬们的帮助,感谢老师,顺便说一下,老师的记性是真的好。。。
本文章儿童节之前不允许抄袭转载

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是汇编语言实现定时/计数器TO实现20ms定时,以中断方式实现的程序: ``` ORG 0 ;程序起始地址 START: MOV AL, 00110110B ;将AL寄存器的值设为00110110B,即选择定时/计数器0为模式3,16位二进制计数器 OUT 43H, AL ;向计数器控制器8253的端口43H写入AL寄存器的值,设置计数器工作模式 MOV AX, 0E200H ;设置计数器初值为0E200H,即65536-20000,20ms的计数数值 OUT 40H, AL ;向计数器8253的端口40H写入AL寄存器的值的低8位 MOV AL, AH ;将AX寄存器的高8位存入AL寄存器 OUT 40H, AL ;向计数器8253的端口40H写入AL寄存器的值的高8位 MOV AH, 0 ;清空AH寄存器 CLI ;禁止中断 MOV AL, 00110101B ;将AL寄存器的值设为00110101B,即开启定时/计数器0的IRQ0中断 OUT 21H, AL ;向中断控制器8259A的端口21H写入AL寄存器的值,开启IRQ0中断 STI ;开启中断 WAIT: HLT ;等待中断事件 JMP WAIT ;跳转到WAIT标签处 INTERRUPT: ; 在这里编写定时器中断服务程序的代码 JMP WAIT ;跳转到WAIT标签处 ``` 该程序通过选择定时/计数器0为模式3,设置计数器的初值为0E200H,即20ms的计数数值,打开定时/计数器0的IRQ0中断,并使用HLT指令等待中断事件。当定时器计数完成时,触发中断事件,跳转到中断服务程序的代码中执行。在中断服务程序中,可以编写需要定时执行的代码,例如控制LED灯的闪烁等。完成中断服务程序后,跳转到WAIT标签处等待下一次定时器中断事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值