Experimento 4 de interfaz de microordenador: temporizador / contador programable 8254

1. El propósito del experimento

Comprenda los principios de funcionamiento básicos y los métodos de programación del 8254, utilice un osciloscopio para observar formas de onda en diferentes modos. (Nota: no hay osciloscopio, así que use el parpadeo de la luz LED para observar)

2. Principio y contenido experimentales

Inserte la descripción de la imagen aquí

Tres, consejos de programación

Inserte la descripción de la imagen aquí

Cuatro, diagrama de cableado del circuito

Experimento 1:
Inserte la descripción de la imagen aquí
Experimento 2:
Inserte la descripción de la imagen aquí

Cinco, diagrama de flujo del diseño del programa

Experimento 1:
Inserte la descripción de la imagen aquí
Experimento 2:
Inserte la descripción de la imagen aquí

Seis, alguna explicación

  1. En el Experimento 1, después de cada lectura, simplemente juzgue si es igual que la última vez, porque puede ser que el contador no haya disminuido en 1 durante esta lectura.
  2. En el experimento 2, debido a que deben emitirse dos ondas cuadradas con diferentes frecuencias y las luces LED deben parpadear a tiempo, se necesitan tres contadores.

Siete, código fuente del programa

Experimento 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

Experimento 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

Supongo que te gusta

Origin blog.csdn.net/Cyril_KI/article/details/110678076
Recomendado
Clasificación