欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

微机接口实验四:可编程定时器/计数器8254

程序员文章站 2022-03-04 23:08:46
...

一、实验目的

掌握8254的基本工作原理和编程方法,用示波器观察不同方式下的波形。(说明:没有示波器,所以用LED灯的闪烁来观察)

二、实验原理和内容

微机接口实验四:可编程定时器/计数器8254

三、编程提示

微机接口实验四:可编程定时器/计数器8254

四、电路接线图

实验1:
微机接口实验四:可编程定时器/计数器8254
实验2:
微机接口实验四:可编程定时器/计数器8254

五、程序设计流程图

实验1:
微机接口实验四:可编程定时器/计数器8254
实验2:
微机接口实验四:可编程定时器/计数器8254

六、一些说明

  1. 实验1中,每次读取后简单判断一下是不是跟上次一样,因为可能本次读取时计数器还没有减1。
  2. 实验2中,由于要输出两个不同的频率方波,并且要使LED灯来得及闪烁,所以需要用到三个计数器。

七、程序源代码

实验1:

stack segment stack
    db 200 dup(0)
stack ends

data segment
      ZERO equ 280h
      ONE equ 281h
      CTRL equ 283h
data ends

code segment
      assume cs:code,ds:data,ss:stack

      newline MACRO   ;回车换行
        push ax
        push dx
        mov ah,02h
        mov dl,0ah
        int 21h
        mov ah,02h
        mov dl,0dh
        int 21h
        pop dx
        pop ax
      ENDM

      dispchar MACRO x    ;输出单个字符并换行
        push dx
        push ax
        newline
        mov ah,02h
        mov dl,x
        int 21h
        pop ax
        pop dx
      ENDM

      put_data MACRO x, y  ;x为端口,y为数据
        push ax
        push dx
        mov al, y
        mov dx, x
        out dx, al
        pop dx
        pop ax
      ENDM

   main:mov ax,data
        mov ds,ax
        mov ax, stack
        mov ss, ax
        put_data CTRL, 00010000b  ;计数器0工作在方式0下,只读写低8位,二进制计数码
        put_data ZERO, 0fh   ;写入计数器初值15,开始计数
  again:mov dx, ZERO
        in al, dx   ;读取通道0数据
        and al, 0fh;  读取低四位
        mov dl, al
        cmp bl, dl
        jz again   ;本次读出的数值与上次一样,说明还没有手动输入脉冲,继续读取,直到本次读取 的数据与上次不一样
        mov bl, dl  ;本次与上次不一样
        cmp dl, 9  ;判断是否小于9
        ja disp_
        add dl, 30h
        dispchar dl   ;显示0-9的一个数
        jmp again
  disp_:add dl, 37h
        dispchar dl    ;显示A-F中的一个数
        jmp again
        mov ah,4ch
        int 21h
code ends
     end main

实验2:

stack segment stack
    db 200 dup(0)
stack ends

data segment
      ZERO equ 280h
      ONE equ 281h
      TWO equ 282h
      CTRL equ 283h
      
data ends

code segment
      assume cs:code,ds:data,ss:stack
      
      put_data MACRO x, y  ;x为端口 y为数据
        push ax
        push dx
        mov al, y
        mov dx, x
        out dx, al
        pop dx
        pop ax
      ENDM

;分析:连接时钟频率为1MHz,周期为1us,要求输出的1Hz的信号周期为1,分频系数为1e6,but8254最大计数为65536
;又因为1e6 = 1000 * 1000,所以通道0和通道1分别把信号1000分频即可

   main:mov ax,data
        mov ds,ax
        mov ax, stack
        mov ss, ax
        put_data CTRL, 00110111b  ;计数器0工作在方式3,读写16,BCD计数码
        put_data ZERO, 00   ;写入计数器初值1000
        put_data ZERO, 10h  ;先写低8位再写高80001 0000 0000 0000
        put_data CTRL, 01110110b  ;计数器1工作在方式3,读写16,二进制数码
        put_data ONE, 0e8h
        put_data ONE, 03h   ;写入计数器初值1000,开始计数,out0端为高电平,接LED灯,LED灯亮
        put_data CTRL 10110111b    ;计数器2工作在方式3下,读写16位,BCD计数码
        put_data TWO 02      ;写入计数初值2,输出两个端口,out1端口输出频率是out2端口2倍
        put_data TWO 00h
        mov ah, 4ch
        int 21h
code ends
     end main