1.実験の目的
8254の基本的な動作原理とプログラミング方法を把握し、オシロスコープを使用してさまざまなモードで波形を観察します。(注:オシロスコープはありませんので、LEDライトの点滅を使用して観察してください)
2.実験原理と内容
3つのプログラミングのヒント
4、回路配線図
実験1:
実験2:
5、プログラム設計フローチャート
実験1:
実験2:
六、いくつかの説明
- 実験1では、各読み取り後に、前回と同じかどうかを判断します。これは、この読み取り中にカウンターが1減少していない可能性があるためです。
- 実験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位再写高8位0001 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