8253实验报告

  • 格式:docx
  • 大小:81.47 KB
  • 文档页数:12

定时器计数器实验

1. 简单计数器:用实验系统的频率发生器作为输入信号,作为定时器T0输入,实现秒脉冲发生器,秒脉冲信号接8259A INT0。用发光二极管二进制方式显示秒计数。

此实验利用8253的一路计时器,将定时频率接到CLK上,使该路工作在方式2下,即将其作为频率发生器,GATE端置为高电平,OUT端接到8259A的INT0端,即当OUT给出一个上升沿跳变时,程序调用中断服务程序,在中断服务程序中,向输出接口273进行写入并输出,每次进中断输出值加一,给适当的输入脉冲,即可实现秒脉冲发生器。

初始化(8259A、8253和273)开始

写计数值,由OUT输出给出中断计算中断服务程序入口等待中断,中断来时,进入中断在中断程序中利用273输出结束

程序代码如下: ICW1 equ 00010011b ; 写8259A控制字(单片8259, 上升沿中断, 要写ICW4)

ICW2 equ 00100000b ; 中断号为20H

ICW4 equ 00000001b ; 工作在8086/88 方式

OCW1 equ 11111110b ; 只响应INT0 中断

CS8259A equ 09000h ; 8259地址

CS8259B equ 09001h

CONTROL equ 08003h ;8253控制字

COUNT0 equ 08000h ;1路计数器方式字

COUNT1 equ 08001h ;2路计数器方式字

COUNT2 equ 08002h ;3路方式字(此程序中未用)

CS273 equ 0A000h

data segment

CNT db 0

data ends

code segment

assume cs:code, ds: data

IEnter proc near

push ax

push dx

sti

mov dx, CS273 inc CNT

mov al, CNT

out dx, al ; 输出计数值

mov dx, CS8259A

mov al, 20h ; 中断服务程序结束指令

out dx, al

nop

pop dx

pop ax

iret

IEnter endp

IInit proc

mov dx, CS8259A

mov al, ICW1

out dx, al

mov dx, CS8259B

mov al, ICW2

out dx, al

mov al, ICW4

out dx, al

mov al, OCW1

out dx, al ret

IInit endp ;8259A的初始化子程序

start proc near

mov al, 34h ; 通道0,方式2

mov dx, CONTROL

out dx, al ;写入程序控制字

mov al, 0

out dx, al ; 高八位

mov al, 00000000B ; 锁存计数器值

mov dx, CONTROL

out dx, al

mov dx,COUNT0 ;写入0通道方式字

mov ax,1000

out dx,al

mov al,ah

out dx,al

mov ax, 0

mov ds, ax

mov bx, 4*ICW2 ; 中断号

mov ax, code

shl ax, 4 ; x 16

add ax, offset IEnter ; 中断入口地址(段地址为0) mov [bx], ax

mov ax, 0

inc bx

inc bx

mov [bx], ax ; 代码段地址为0

call IInit

mov ax, data

mov ds, ax

mov CNT, 0 ; 计数值初始为0

mov al, CNT

mov dx, CS273

out dx, al

sti

LP: ; 等待中断,并计数。

nop

jmp LP

start endp

code ends

end start

上述程序中共用到8259A、8253和273三片外界设备,在上面程序中,8253接8000H地址开始的片选,8259A接9000H地址开始的片选,8253接0A00H开始的片选。程序先进行初始化,即对8259A、8253和273分别进行初始化,在主程序中,先调用子程序对8259A进行初始化,然后计算出中断向量,随后进入死循环等待中断。程序中每计数1000次,给出一次中断,进入中断服务程序中,在此程序中,对一变量进行加一累加并通过273输出,若输入1000Hz的脉冲信号(用频率发生器实现),即每一秒给出一次中断,中断程序中输出值,实现秒信号脉冲。

2.脉宽调制信号输出:用8253两路定时器,产生脉宽调制信号,要求频率为4K,要求占空比是周期变化的,变化规律为5%,10%,15%....90%,95%,5%,…….,每秒占空比变化一次,则整个pwm波占空比变化周期是19秒。

该程序的基本原理是利用两路计时器进行配合,利用一计时器给出周期,利用另外一个计时器调节占空比。由于程序要求占空比是变化的,即需用到中断,在中断中改变某些参数使占空比得到改变。具体做法为利用一路计时器1工作在方式2,即作为频率发生器,其OUT端会输出一固定频率的脉冲,利用该脉冲作为另一计时器2的GATE信号,计时器2工作在方式1,即需GATE的上升沿来触发计数过程,且计时完成即停止,等待下一个GATE的上升沿来重新计数,同时,利用此GATE信号来触发中断,由于8259A也是上升沿触发,即每次触发计数都会进入中断,在中断中修改计数值并不会影响当前一次的计数,自会在下一个GATE沿时用新数进行计数。程序要求占空比周期性变化,在中断服务程序中来做到这一点,要求脉冲的频率是4K,即第一次输出OUT1的频率是4K,如果用4MHz的信号作为时钟脉冲输入,即第一路计数器计数1000不变,且在中断服务程序中计数(对计数器2)的值应加5%*1000=50(如果要加的话),当加满1000,即复位为0,重新计算。由于程序在1秒内会进4000次中断,而1秒钟程序占空比只改变一次,即每4000次中断改一次计数器2的计数值。

程序框图如下:

初始化(8259A和8253)开始

写计数器1计数值,初始化计数器2计数值计算中断服务程序入口等待中断,中断来时,进入中断结束是否要修改计数器2计数值计数值加50是否加到设定值复位计数值退出中断是是否否 程序源代码如下:

ICW1 equ 00010011b ; 单片8259, 上升沿中断, 要写ICW4

ICW2 equ 00100000b ; 中断号为20H

ICW4 equ 00000001b ; 工作在8086/88 方式

OCW1 equ 11111110b ; 只响应INT0 中断

CS8259A equ 09000h ; 8259地址

CS8259B equ 09001h

CONTROL equ 08003h ;8253控制字

COUNT0 equ 08000h ;1路计数器方式字

COUNT1 equ 08001h ;2路计数器方式字

COUNT2 equ 08002h ;3路方式字(此程序中未用)

data segment

CNT dw 0

CNT1 dw 0

data ends

code segment

assume cs:code, ds: data

IEnter proc near

push ax

push dx

sti

inc CNT1 mov ax, CNT1

cmp ax,4000 ;对进中断的次数进行累计,每进4000次可改变计数字(即一秒钟)

jnz r2

mov ax,CNT

add ax,50

mov CNT,ax

mov dx, COUNT0

out dx,al ;计数字加50

mov al,ah

out dx,al ; 修改计数值

mov CNT1,0

cmp CNT,1000

jnz r1

mov CNT,50 ;满1000复为50

r1:

mov dx, CS8259A

mov al, 20h ; 中断服务程序结束指令

out dx, al

nop

pop dx

pop ax

iret IEnter endp

IInit proc

mov dx, CS8259A

mov al, ICW1

out dx, al