8253定时计数器实验

一、实验目的

  1. 掌握8253的工作原理和六种工作方式;

  2. 学会如何使用8253进行应用编程。

二、实验内容

  1. 在实验台上连接所需导线。8255A芯片的PC6与8253的GATE0相连,8253的CLK0与时钟脉冲相连,8253的OUT0与示波器相连。

  2. 编写程序,提供八个选择项,根据波特率的不同分为:110bps、150bps、300bps、600bps、1200bps、2400bps、4800bps和9600bps。当选择某一项时,在示波器中显示相应频率的方形波。

三、实验提示

定时/计数器8253是24脚双列直插式芯片,+5V电源供电。每个芯片内部有3格独立的计数器,每个计数器有自己的时钟输入CLK、计数输出OUT和门控信号GATE。通过编程选择计数器和设置工作方式,计数器既可作计数器用,也可作定时器用,故称定时/计数器。其引脚如图3-10 所示,内部结构如图3-11所示:

   D0~D7:数据总线,为三态输出/输入线。

A1、A0:地址线,这两根地址线连接到系统地址总线的A1A0上,用于选择8253内部寄存器,以便对它们进行读写操作。

CLK:计数器时钟信号,输入信号。时钟信号的作用是在8253进行定时或计数工作时,每输入1个时钟脉冲信号CLK,便使计数值减1。

GATE:计数器门控信号,输入信号。是用来禁止、允许或开始计数过程的。

OUT:计数器输出信号,输出信号。OUT信号作用是:计数器工作是,每来1个时钟脉冲,计数器减1,当计数值减为0,就在输出线上输出一OUT信号,以示定时或计数已到。这个信号可作外部定时、计数控制喜好引到I/O设备,用来启动某种操作;也可作为定时、计数已到的状态信号供CPU检测,或作为中断请求信号使用。

8253芯片由数据总线缓冲器、读/写控制逻辑、控制命令寄存器和计数器组成。数据总线寄存器是一个三态、双向8位寄存器,用于将8253与系统数据总线D0~D7相连。数据总线缓冲器有3个基本功能:向8253写入确定8253工作方式得命令,向计数寄存器装入初值,读出计数器得初值或当前值;读/写逻辑由CPU发来得读/写信号和地址信号来选择读出或写入寄存器,并且确定数据传输得方向,是读出还是写入;控制命令寄存器接受CPU送来得控制字,这个控制字用来选择计数器及相应的工作方式,控制命令寄存器只能写入,不能读出;8253有三个独立的计数器,其内部结构完全相同,如图3-12 所示:

8253的计数器由16位计数初值寄存器、减1计数器和当前计数值锁存器组成。

8253是一个减1计数器,而不是加1计数器。因此,在它开始计数之前,一定要根据计数的要求,先计算出计数初值,并装入计数初值寄存器和减1计数器。计数初值与输入时钟频率(CLK)及输出波形(OUT)频率之间的关系为:

                      Ci = CLK/OUT

或                     TC = CLK/OUT

8253的方式命令主要是对8253进行初始化,同时也可以对当前计数值进行锁存。8253初始化的工作有两点:一是向命令寄存器写入方式命令,以选择计数器,确定工作方式,指定计数器计数初值的长度和装入顺序以及计数初值的码制;二是向已选定的计数器按方式命令的要求写入计数初值。方式命令的格式如下:

D7

D6

D5

D4

D3

D2

D1

D0

计数器选择

读写字节数

工作方式

码制

 

D7D6(SC1SC0):用于选择计数器。SC1SC0=00,选择0号计数器;SC1SC0=01,选择1号计数器;SC1SC0=10,选择2号计数器;SC1SC0=11,不用。

D5 D4(RL1RL0):用来控制计数器读/写的字节数(1或2个字节)及读/写高低字节的顺序。

RL1RL0=00,为锁存命令,把由SC1SC0指定的计数器的当前值锁存在锁存寄存器中,以便去读取它;RL1RL0=01,仅读/写一个低字节;RL1RL0=10,仅读/写一个高字节;RL1RL0=11,读/写2个字节,先是低字节,后是高字节。

D3~D1(M2~M0):用来选择计数器的工作方式。M2 M1M0=000,0方式;M2 M1M0=001,1方式;M2 M1M0=010,2方式;M2 M1M0=011,3方式;M2 M1M0=100,4方式;M2 M1M0=101,5方式。

D0(BCD):用来指定计数器的码制,是按二进制还是按二~十进制数计数。BCD=0,二进制;BCD=1,二~十进制。

8253的每个计数器通道都有6中工作方式可供选用。区分这6种工作方式的主要标志有3点:一是输出波形不同;二是启动计数器的触发方式不同;三是计数过程中门控信号GATE对计数操作的控制不同。

各种方式的比较如表3-5所示:

工作

方式

GATE引脚输入状态所起的作用

OUT引脚

输出状态

低电平

下降沿

上升沿

高电平

0

禁止

计数

暂停

计数

置入初值后,由WR上升沿

开始计数,由GATE的上升

沿继续开始计数

允许

计数

计数过程中输出低电平。计数至0,输出高电平(单次)

1

不影响

计数

不影响

计数

置入初值后,由GATE的上

升沿触发开始计数,或重新

开始计数

不影响

计数

输出宽度为n个CLK的低电平(单次)

2

禁止

计数

停止

计数

置入初值后,由写信号WR

的上升沿开始计数,由

GATE的上升沿重新开始计数

允许

计数

输出宽度为n个CLK、宽度为1个CLK的负脉冲(重复波形)

3

禁止

计数

停止

计数

置入初值后,由写信号WR

的上升沿开始计数,由GATE

的上升沿重新开始计数

允许

计数

输出周期为n个CLK的方波(重复波形)

4

禁止

计数

停止

计数

置入初值后,由WR的上升

沿开始计数,由GATE的上

升沿重新开始计数

允许

计数

计数至0,输出宽度为1个CLK的负脉冲(单次)

5

不影响

计数

不影响

计数

置入初值后,由GATE的上

升沿触发开始计数或重新开

始计数

不影响

计数

计数至0,输出宽度为1个CLK的负脉冲(单次)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

表3-5 8253各个计数器6种工作方式的比较

从以上对比分析可知,一般,0方式,1方式和4方式,5方式选作计数器用(输出一个电平或一个脉冲),而2方式,3方式选作定时器用(输出周期脉冲或周期方波)。

8253初始化编程如图3-13所示:

四、实验流程图

五、参考程序

data   segment

tc_table dw 678       ; 0=110bps

     dw 497       ; 1=150b/s

     dw 249       ; 2=300b/s

     dw 124       ; 3=600b/s

     dw 62        ; 4=1200b/s

     dw 31        ; 5=2400b/s

     dw 16        ; 6=4800b/s

     dw 8         ; 1=9600b/s

temp   db (?)

 

input_mes  db 0dh,0ah ;系统提示信息

        db 'Choices:'

       db 0dh, 0ah

       db ' 0: 110 BPS’s, 0dh, 0ah

       db ' 1: 150 bps', 0dh, 0ah

       db ' 2: 300 bps', 0dh, 0ah

       db ' 3: 600 bps', 0dh, 0ah

       db ' 4: 1200 bps', 0dh, 0ah

       db ' 5: 2400 bps', 0dh, 0ah

       db ' 6: 4800 bps', 0dh, 0ah

       db ' 7: 9600 bps', 0dh, 0ah

       db 'Please TAKES a choice (0-7) of baud-rate dispayed above! ', 0dh, 0ah

      db 'or click [ESC] to quit', 0dh, 0ah

         db 0dh, 0ah

       db 'Please input your choice HERE:’ 0dh, 0ah,'$'

error_mes   db 0dh, 0ah

            db 'Input error! Please try again HERE:’ 0dh, 0ah,'$'

succ_mes   db 'Now begin to generate baud, you can click other choice to change the RATE:’ 0dh, 0ah,'$'

 

data ends 

code  segment

    ASSUME CS: CODE, DS: DATA

ok:   mov  dx,21bh            ;8253命令口

    mov  al,036h             ;8253方式命令, 0计数器,3工作方式,输出方波

    out   dx, AL  

    mov  dx,203h             ;8255命令口

    mov  al,80h              ;8255方式命令

    out   dx, AL             

    mov  al,0ch              ;使PC6=0,关8253

    out   dx, AL

    MOV AX, DATA

    MOV DS, AX

choice:  lea  dx,input_mes           ;提示选择波特率

 MOV AH, 09H

       int   21h

input:   mov  ah,08h                 ;等待键盘输入

       int   21h

    cmp al,1bh     ;判断是否是esc键

    jz quit

       cmp  al,'0'                   ;选择波特率是否正确?

       jb  error                    ;不正确,则转出错处理

       CMP AL,'7'

      JA ERROR

      sub  al,30h                  ;正确

       mov  temp,al                ;则保存波特率代号

       call   load                 ;装入计数初值

      jmp   start                  ;启动8253波特率时钟发生器

 

error:   mov  ah,9h                 ;出错处理

       lea   dx, ERROR_mes

       int   21h

      jmp  input                    ;重新选择波特率

 

start:   mov  dx,203h                 ;8255命令口

      mov  al,0dh                  ;使PC6=1,启动8253,产生波特率时钟

      out   dx, AL

 

lea dx, SUCC_mes

mov ah, 9H

 int 21h

       jmp  choice                    ;不是,循环查Esc键

 

quit:    MOV DX, 203H

        mov  al,0ch                   ;关闭8253

        out   dx, AL

        mov  ax,4c00h                ;退出,返回DOS 

         int   21h 

load proc near

      PUSH AX

       PUSH DX

       PUSH SI

       MOV DL, TEMP

       shl   dl,1                          ;波特率代号乘2,存入在dx中

       and  dx,0fh                        ;只取dx的低4位

      mov  si,offset tc_table           ;取定时常数表的首址→si

       add  si,dx                          ;si为定时常数表指针(首址+偏移量)

      mov  dx,218h                       ;计数器0的数据口

      mov  al,[si]                         ;装入计数初值低字节

      out   dx, AL

      mov  al,[si]+1                       ;装入计数初值高字节

      out   dx, AL

      pop   si

      pop   dx

      pop   ax

      ret

LOAD ENDP

 

CODE ENDS

END OK

六、实验结果

【去实验】