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

一、实验目的

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

二、实验原理和内容

在这里插入图片描述

三、编程提示

在这里插入图片描述

四、电路接线图

实验1:
在这里插入图片描述
实验2:
在这里插入图片描述

五、程序设计流程图

实验1:
在这里插入图片描述
实验2:
在这里插入图片描述

六、一些说明

  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

猜你喜欢

转载自blog.csdn.net/Cyril_KI/article/details/110678076