マイクロコンピューターインターフェース実験4:プログラム可能なタイマー/カウンター8254

1.実験の目的

8254の基本的な動作原理とプログラミング方法を把握し、オシロスコープを使用してさまざまなモードで波形を観察します。(注:オシロスコープはありませんので、LEDライトの点滅を使用して観察してください)

2.実験原理と内容

ここに写真の説明を挿入

3つのプログラミングのヒント

ここに写真の説明を挿入

4、回路配線図

実験1:
ここに写真の説明を挿入
実験2:
ここに写真の説明を挿入

5、プログラム設計フローチャート

実験1:
ここに写真の説明を挿入
実験2:
ここに写真の説明を挿入

六、いくつかの説明

  1. 実験1では、各読み取り後に、前回と同じかどうかを判断します。これは、この読み取り中にカウンターが1減少していない可能性があるためです。
  2. 実験2では、周波数の異なる2つの方形波を出力し、LEDライトを時間内に点滅させるため、3つのカウンターが必要です。

セブン、プログラムソースコード

実験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
おすすめ