8253问答题 下载本文

1、8253可编程计数器有两种启动方式,在软件启动时,要使计数正常进行,GATE端必须为( )电平,如果是硬件启动呢?

答:8253可编程计数器有两种启动方式,在软件启动时,要使计数正常进行,GATE端必须为(高)电平;如果是硬件启动,则要在写入计数初值后使GATE端出现一个由低到高的正跳变,以启动计数。

2、某个计算机应用系统采用8253的计数器0作频率发生器,输出频率为500Hz;用计数器1产生1000Hz的连续方波信号,输入8253的时钟频率为1.19MHz。试问:初始化时送到计数器0和计数器1计数初值分别为多少?计数器工作在什么方式下? 解:计数器0工作在方式2,其计数初值为=1.19MHz/500Hz=2380 计数器1工作在方式3,其计数初值为=1.19MHz/1000Hz=1190 3、若要求8253用软件产生一次性中断,最好采用哪种工作方式?现在用计数器0对外部脉冲计数,每计满10 000个产生一次中断,请写出工作方式控制字及计数值。

解:若8253用软件产生一次性中断,最好采用方式0,即计数结束后产生中断的工作方式。但若要求每计满10 000个产生一次中断,则表示具有重复中断的功能,因此,此时应使用计数器0工作于方式3,即连续方波输出方式。其工作方式控制字为0011X111B,计数初值=10 000

4、试编写一段程序,按下列要求设置如下图中8254的三个计数器 计数器0:二进制计数,在操作方式0下操作,计数初值为1234H 计数器1:BCD计数,在操作方式2下操作,计数初值为100H 计数器2:二进制计数,在操作方式4下操作,计数初值为1FFFH

解:计数器0的方式字=00110000B 计数器1的方式字=01010101B 计数器2的方式字=10111000B MOV AL , 30H OUT 4CH , AL MOV AL , 55H OUT 4CH , AL MOV AL , 0B8H OUT 4CH , AL MOV AL , 34H OUT 40H , AL MOV AL , 12H OUT 40H , AL

MOV AL , 00H OUT 44H , AL MOV AL , 01H OUT 44H , AL MOV AL , 0FFH OUT 48H , AL MOV AL , 1FH OUT 48H , AL

5、试编写一个在计数进行的过程中进行读计数器2内容的程序段,并把读取的值放入AX寄存器中,假设8253定位在I/O地址40H上,其中芯片输入线A1、A0分别接到A3、A2。 解:

MOV AL , 1000XXXXB OUT 4CH , AL IN AL ,48H MOV BL ,AL IN AL ,48H MOV AH , AL MOV AL , BL

6、设8253芯片的端口地址为230H~233H.要求通道0工作在方式3,计数器初值01F0H。通道1工作在方式2,计数器初值0064H。试编制初始化程序 解:

MOV DX , 233H MOV AL , 36H OUT DX , AL MOV DX , 230H MOV AL , 0F0H OUT DX , AL MOV AL , 01H OUT DX , AL MOV DX , 233H MOV AL , 74H OUT DX , AL MOV DX , 231H MOV AL , 64H OUT DX , AL MOV AL , 00H OUT DX , AL 7、要求8253输出周期为100ms的方波。设系统时钟为2MHz,口地址为1E0H~1E3H,CPU为8088

解:计数器初值N= 100ms /(1/ 2MHz )=20×10000>65535,故需要两个计数通道协助完成,设选用通道0和通道1 MOV AL , 17H MOV DX , 1E3H OUT DX , AL

MOV AL , 20H MOV DX , 1E0H OUT DX , AL MOV AL , 57H MOV DX , 1E3H OUT DX , AL MOV AL , 00 MOV DX , 1E1H OUT DX , AL

8、若要用8253通道0,工作在方式1,按二-十进制计数,计数值为5080,初始化编程为什么?(若端口地址为F8H~FBH) 解:确定通道控制字 00 11 001 1 MOV AL , 33H OUT 0FBH , AL MOV AL , 80H OUT 0F8H , AL MOV AL , 50H OUT 0F8H , AL

9、编程将8253计数器0设置为模式1,计数初值为3000H;计数器1设置为模式2,计数初值为2010H;计数器2设置为模式4,计数初值为4030H;口地址为80H~83H,CPU为8088.

解:计数通道0 控制字 00 10 001 0=22H 计数通道1 控制字 01 11 010 0=74H 计数通道2 控制字 10 11 100 0=B8H MOV AL , 22H OUT 83H , AL MOV AL , 30H OUT 80H , AL MOV AL , 74H OUT 83H , AL MOV AL , 10H OUT 81H , AL MOV AL , 20H OUT 81H , AL MOV AL , 0B8H OUT 83H , AL MOV AL , 30H OUT 82H , AL MOV AL , 40H OUT 82H , AL 10、PC/XT中的8253的通道0为系统提供恒定的时钟基准。通道0的工作方式控制字是36H,规定以方式3工作,计数初值为216(即0000H)。OUT0输出频率为18.2Hz(1.193/216)基准方波信号。该信号送给中断控制器8259A的中断请求端IRQ0,申请中断,中断周期为55ms,CPU在中断服务子程序中,对该基准信号进行处理,计算出当前时间。在ROM-BIOS

对8253通道0的编程?

解:MOV AL , 00 11 011 0B

OUT 43H , AL MOV AL , 0 OUT 40H , AL OUT 40H , AL

11、若要读取通道1的16位计数值,其程序为什么?(若端口地址为F8H~FBH) 解:MOV AL , 40H

OUT 0FBH , AL IN AL , 0F9H MOV CL , AL IN AL , 0F9H MOV CH , AL

12、设8253的口地址为0C8H~0CBH,计数脉冲为1MHz,试说明下述程序段的作用:

MOV AL , 35H OUT 0CBH , AL MOV AL , 00 OUT 0C8H , AL MOV AL , 50H OUT 0C8H , AL MOV CX , 100

LP: NOP

LOOP LP

MOV AL , 00H OUT 0CBH , AL IN AL , 0C8H MOV AH , AL IN AL , 0C8H

解:设置8253计数通道0工作在方式2,每5ms(=(1/1MHz)*5000)发一个负脉冲。延时一段时间后读出当前计数值,并存入在AX中。

13、设某8088系统中,8253占用口地址40H~43H。其实现产生电子时钟基准(定时时间为50ms)和产生方波用作扬声器音调控制(频率为1kHz)。试为其编制8253的初始化程序(设系统中提供计数时钟为2MHz)

解:产生电子时钟基准可采用方式2,计数初值N=50ms*(1/2MHz)=100000>65535,故需要2个计数通道协作完成,设选用通道0和通道1 通道0:控制字=00 11 010 0B,计数初值=1000 通道1:控制字=01 01 010 0B,计数初值=100

产生方波采用方式2,计数初值=(1/1kHz)*(1/1MHz)=1000<65535,故需要一个计数通道完成,设选用通道2.计数初值=1000H,控制字=10 10 011 1B MOV AL , 00 11 010 0B OUT 43H , AL MOV AX , 1000 OUT 40H , AL MOV AL , AH

OUT 40H , AL

MOV AL , 01 01 010 0B OUT 43H , AL MOV AL , 100 OUT 41H , AL

MOV AL , 10 10 011 1B OUT 43H , AL MOV AL , 10H OUT 42H , AL

14、试用PC系统的8254组成一个时钟系统。0通道作为秒计数器,1通道作为分计数器,2通道作为时计数器。设系统提供的计数脉冲频率已被分频为50kHz,口地址为90H~93H。编制初始化程序并画出连线图。

解:计数器0 计数初值=1s/(1/50kHz)=50000 控制字=00 11 010 0 B 计数器1 计数初值=60 控制字=01 01 010 0 B 计数器2 计数初值=60 控制字=10 01 010 1 B

50kHzCLK0OUT08254CLK1OUT1CLK2OUT2

MOV AL , 34H OUT 93H , AL MOV AX , 50000 OUT 90H , AL MOV AL , AH OUT 90H , AL MOV AL , 54H OUT 93H , AL MOV AL , 60 OUT 91H , AL MOV AL , 95H OUT 93H , AL MOV AL , 60H OUT 92H , AL

15、设8253的4个端口地址分别为210H、211H、212H、213H,其计数器0的时钟CLK0端输入1MHz脉冲,编程使其实现:

1)将计数器0设置为连续产生20kHz方波;

2)将1)中计数器0的输出OUT0作为计数器1的时钟CLK1,使其连续产生20ms定时中断

解:要计数器0设置为连续产生20kHz方波,需设置方式3,方式控制字 00 01 011 0B 计数器初值=1MHz/20kHz=50=32H 初始化程序如下:

MOV AL , 16H MOV DX , 213H OUT DX , AL MOV DX , 210H MOV AL , 32H OUT DX , AL

将OUT0作为计数器1的时钟CLK1 计数器初值=20kHz/50Hz=400=190H 方式控制字01 11 011 0B

MOV AL , 01 11 011 0B MOV DX , 213H OUT DX , AL MOV DX , 211H MOV AX , 190H OUT DX , AL MOV AL , AH OUT DX , AL

16、若8253芯片的接口地址为D0D0H~D0D3H,时钟信号频率为2MHz。现利用计数器0、1、2分别产生周期为10μs的对称方波及每1ms和1s产生一个负脉冲,试画出连接图,编写初始化程序。

2MHzCLK0OUT08253CLK1OUT1CLK2OUT2

解:

计数器0 计数初值=10μs /0.5μs =20 计数器1 计数初值=1ms /0.5μs=2000

计数器2 计数初值=(1s /0.5μs)/2000=2*106/2000=1000

MOV DX , 0D0D3H MOV AL , 16H OUT DX , AL MOV AL , 74H OUT DX , AL MOV AL , 0B4H OUT DX , AL MOV DX , 0D0D0H MOV AL , 20 OUT DX , AL MOV DX , 0D0D1H MOV AX , 2000 OUT DX , AL

MOV AL , AH OUT DX , AL MOV DX , 0D0D2H MOV AX , 1000 OUT DX , AL MOV AL , AH OUT DX , AL

17、PC/XT中8253产生声音3个程序,见PPT,回答问题 18、

Stack segment stack Dw 64 dup(?) Stack ends

Code segment Assume cs:code

Start: in al , 21h and al , 7fh out 21h , al mov al , 90h out 43h , al mov al , 05h out 42h , al hlt a1: sti

jmp a1

irq7: mov ax , 014dh

int 10h

mov ax , 0120h int 10h

in al , 20h out 20h , al

iret

code ends

end start

(1)试验步骤(3)中在内存中填入IRQ7中断矢量,请描述如何完成? 使用反汇编U命令,查找irq7: mov ax , 014dh 地址(IP=1220H CS=0000H),然后使用E命令将0000:003CH单元填写IRQ7中断程序入口地址。 19、

8253+51.19MHzGATE0CLK08259OUT0IRQ0Stack segment stack Dw 64 dup(?) Stack ends

Code segment Assume cs:code

Start: push ds

Mov ax , 0000h Mov ds , ax

Mov ax , offset irq0 Add ax , 2000h Mov si , 0020h

Mov [si] , ax Mov ax , 0000h

Mov si , 0022h Mov [si] , ax Pop ds

Mov al , 0fch Out 21h , al Mov al , 15h Out 43h , al Mov al , 0ffh Out 40h , al

Mov dl , 30h a1: sti

jmp a1 irq0: mov ah , 01h

mov al , dl cmp al , 3ah jnz a2

mov al , 0dh

int 10h

mov al , 30h a2: int 10h

inc ax

mov dl , al mov ax , 0120h int 10h call dally

in al , 20h out 20h , al iret

dally: push ax

mov cx , 0100h a3: mov ax , 0560h a4: dec ax

jnz a4 loop a3 pop ax ret

code ends end start

20、

Stack segment stack Dw 64 dup(?) Stack ends

data segment stack

table DB 33H, 33H, 3DH, 33H, 26H, 26H, 26H, 26H, 2DH, 2DH, 26H, 2DH, 33H DB 33H, 33H, 33H, 33H, 33H, 4DH, 45H, 3DH, 3DH, 3DH, 45H, 4DH, 45H DB 45H, 45H, 45H, 45H, 45H, 45H, 45H, 33H, 33H, 3DH, 33H, 26H, 26H DB 26H, 28H, 2DH, 2DH, 26H, 26H, 33H, 33H, 33H, 33H, 45H, 3DH, 39H DB 39H, 39H, 52H, 4DH, 4DH, 4DH, 4DH, 4DH, 4DH, 4DH, 4DH, 2DH, 2DH DB 26H, 26H, 26H, 26H, 26H, 26H, 28H, 28H, 2DH, 28H, 26H, 26H, 26H DB 26H, 2DH, 28H, 26H, 2DH, 2DH, 33H, 3DH, 4DH, 45H, 45H, 45H, 45H DB 45H, 45H, 45H, 45H, 33H, 33H, 3DH, 33H, 26H, 26H, 26H, 28H, 2DH

DB 2DH, 26H, 2DH, 33H, 33H, 33H, 33H, 33H, 33H, 45H, 3DH, 39H, 39H DB 39H, 52H, 4DH, 4DH, 4DH, 4DH, 4DH, 4DH, 4DH, 4DH, 00H Data ends

Code segment Assume cs:code , ds:data

Start: mov ax , data

Mov ds , ax

Mov bx , offset table Mov al , [bx] Mov ah , 00h

A1: mov dl , 25h

Mul dl Push ax

Mov al , 0b7h Out 43h , al pop ax

Out 42h , al Mov al , ah Out 42h , al Inc bx

Mov ah , 00h Mov al , [bx] Test al , 0ffh Jz a3

Mov cx , 77ffh

A2: push ax Pop ax Loop a2

Jmp a1

A3: Mov bx , offset table Mov al , [bx] Mov ah , 00h Jmp a1

code ends end start