📄 8253.txt
字号:
一,原理
PC机的主机箱上装有一只小喇叭,由定时器8253和并行接口芯片8255控制其发音,其电路如下:
8253 DRIVER
1.9318MHZ CLK
OUT2
8255
PB0 GATE2
PB1
8253用定时器2来产生896Hz的音频信号使喇叭发声,我们可以改变定时器2的计数值来改变声音频率,通过发声的延时程序来获得时间长短不同的声音,于是就可以通过编程;来获得声调(频率)和节奏(延时长短),使计算机演奏出乐曲来。如果再把音符1,2,3,4,
. . .
5,6,7,1,2,3,??????与数字键1,2,3,4,5,6,7,8,9,??????对应起来,就可以把计算机变成电子琴。
以下给出有关资料:
1.音符 1, 2, 3, 4 ,5 ,6, 7, 1, 2, 3, 4, 5, 6, 7, ⅰ
频率 131 147 165 175 196 220 247 262 294 330 349 392 440 494 523
2.计数值计算公式
计数值=1.19318MHz(时钟频率)/ 给定频率
=1234DCH / 给定频率
8253道地地定时器通道2的端口地址:42H(存放计数值,先送低位字节,后送高位字节)
命令寄存器地址:43H
4.编程参考:
1) 计算计数值程序段:
MOV DI, 给定频率
MOV DX, 12H
MOV AX, 34DCH
DIV DI
AX中即为计数值。
2) 打开扬声器发声,8255PB0,PBI送出高电平:
IN AL 61H
OR AL 3
OUT 61H AL
3)关闭扬声器,停止发声:
IN AL 61H
OR AL 0FCH
OUT 61H AL
二.实验内容:
1. 设计程序让微机演奏一段简单乐曲
2. 利用DOS的键盘管理功能。将微机变为一个具有简单功能的电子琴(选作)。
下面是sound.asm通用发声程序
public soundf
cseg segment para'code'
assume cs:cseg
soundf proc far
push ax
push bx
push cx
push dx
push di
mov al,0b6h
out 43h,al
mov dx,12h
mov ax,348ch
div di
out 42h,al
mov al,ah
out 42h,al
in al,61h
mov ah,al
or al,3
out 61h,al
wait1: mov cx,4815
call waitf
delay: loop delay
dec bx
jnz wait1
mov al,ah
out 61h,al
pop di
pop dx
pop cx
pop bx
pop ax
ret
soundf endp
waitf proc near
push ax
waitf1:
in al,61h
and al,10h
cmp al,ah
je waitf1
mov ah,al
loop waitf1
pop ax
ret
waitf endp
cseg ends
end
;下面是music.asm一个示例乐曲可以在数据段该成别的
extrn soundf:far
stack segment para stack 'stack'
db 64 dup('stack...')
stack ends
dseg segment para 'data'
mus_freq dw 330,294,262,294,3 dup(330)
dw 3 dup(294),330,392,392
dw 330,294,262,294,4 dup(330)
dw 294,294,330,294,262,-1
mus_time dw 6 dup(25),50
dw 2 dup(25,25,50)
dw 12 dup(25),100
dseg ends
cseg segment para 'code'
assume cs:cseg,ss:stack,ds:dseg
music proc far
mov ax,dseg
mov ds,ax
lea si,mus_freq
lea bp,ds:mus_time
freq:
mov di,[si]
cmp di,-1
je end_mus
mov bx,ds:[bp]
call soundf
add si,2
jmp freq
end_mus:
mov ax,4c00h
int 21h
music endp
cseg ends
end music
;下面是piano键盘数字键变成电子琴
extrn soundf:far
stack segment para stack 'stack'
db 64 dup('stack...')
stack ends
dseg segment para 'data'
table dw 262,294,330,349,392,440,494,523
dseg ends
cseg segment para 'code'
assume cs:cseg,ds:dseg,ss:stack
main proc far
mov ax,dseg
mov ds,ax
new_note:
mov ah,0
int 16h
cmp al,0dh
je exit
mov bx,offset table
cmp al,'1'
jb new_note
and ax,0fh
shl ax,1
sub ax,2
mov si,ax
mov di,[bx][si]
mov bx,10
call soundf
jmp new_note
exit:
mov ax,4c00h
int 21h
main endp
cseg ends
end main
///////////////////////
cseg segment
assume cs:cseg, ds:cseg
org 100h
start:
mov word ptr [a+16], 1760
mov word ptr [a+26], 208
mov word ptr [a+78], 185
b:
mov ah, 07
int 21h
cmp al, 1bh
jz i
cmp al, 20h
jz b
cmp al, 96
jng c
sub al, 32
c:
shl al, 1
cbw
mov ah, 0
mov bx, ax
sub ax, ax ; mov ax, 0
mov dx, 12h
div word ptr[bx+a]
mov bx, ax
mov al, 0b6h
out 43h ,al
mov al, bl ; mov ax, bx
out 42h, al
mov al, bh ; mov al, ah
out 42h, al
in al, 61h
or al, 3
out 61h, al
mov bx, 0ffffh
d:
mov cx, 0ffh
e:
loop e
f:
mov ah, 0bh
int 21h
cmp al, 00
jnz g
dec bx
jnz d
g:
in al, 61h
and al, 0fch
out 61h, al
mov cx, 0ffffh
h:
loop h
jmp b
i:
mov ah, 4ch
int 21h
;----<data>-------------
a dw 44 dup(60)
dw 69, 1388, 78, 85, 1320, 524, 588, 660, 694, 784, 880, 988, 1048
dw 1176, 170, 170, 69, 1568, 78, 85, 588, 131, 98, 83, 165, 330, 174
dw 196, 20, 278, 247, 139, 156, 124, 110, 312, 338, 262, 347, 147
dw 392, 494, 87, 294, 74, 440, 65, 370, 467, 416, 880, 1388, 509
cseg ends
end start
/////////////////////////////////////
简介:用开关模拟电子琴发声 1、以8255接八个开关K1~K8,做电子琴按键输入 2、以8253控制扬声器,拨动不同的开关,发出相应的音阶 要求:K1-----静音 K2-----发si的音493Hz K3-----发la的音440H ...
用开关模拟电子琴发声
1、以8255接八个开关K1~K8,做电子琴按键输入
2、以8253控制扬声器,拨动不同的开关,发出相应的音阶
要求:K1-----静音
K2-----发si的音493Hz
K3-----发la的音440Hz
K4-----发sol的音392Hz
K5-----发fa的音349Hz
K6-----发mi的音329Hz
K7-----发re的音293Hz
K8-----发do的音261Hz
二、方案的论证比较:
此课程设计是用开关模拟电子琴发声。
硬件方面:
采用并口8255A接8个开关K1—K8,利用8255A方式0,端口A输入方式,即AL=10010000B,可以将开关的量输入到CPU中,利用8个开关做电子琴的8个按键。
驱动控制扬声器利用8253与8255A共同执行(见硬件电路图)。利用8255A的PB0、PB1控制扬声器的开启、关闭。利用定时器8253驱动发声,CPU通过对8253通道2(端口地址42H)进行编程,利用8253方式3以不同的脉冲频率产生不同的输出方波,方波信号通过滤波器、功率放大器使扬声器发声。
软件方面:
利用汇编语言对接口进行编程控制。程序模块主要包括8255A、8253的初始化、开关量的输入、扬声器的开启、关闭及程序的退出。在使8253的初值计数与频率相对应有两种方法,一是利用表的操作,但这种操作不太容易实现,硬件的连接也比较麻烦,易出错;所以我采用的是比较跳转的方式, 比较简单明了,容易理解。程序中的模块关系见程序流程图。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -