8253音乐发生器微机原理实验.docx
《8253音乐发生器微机原理实验.docx》由会员分享,可在线阅读,更多相关《8253音乐发生器微机原理实验.docx(10页珍藏版)》请在冰点文库上搜索。
8253音乐发生器微机原理实验
8253音乐发生器实验
接线图:
单线连接:
排线连接:
将模块电源JP3接通将电源模块的JP7跳接.?
?
?
?
?
I/O端口地址:
8255的4个端口地址为300H~303H
A口:
300H,B口:
301H,C口:
302H,命令口:
303H。
8253的四个端口地址为304H~307H
其中通道0为304H,通道1为305H,通道2为306H,命令口为307H
流程图:
系统资源分配
本平台系统提供的I/O地址范围是300H~3FFH,目前已使用的I/O地址有:
8255A:
300H~303H
8253A:
304H~307H
8251A:
308H~30BH
DAC0832:
30FH
8237A:
主片0~0FH;从片0C0H~0DEH
8259A:
主片20H,21H;从片0A0H,0A1H
在此区有一个TP1测试点,可以对译码信号进行检测。
本平台为用户提供了两个中断识别源分别为:
IRQ2和IRQ10,当用户需要进行中断实验时,可以任意用单线连接,进行中断申请。
跳线开关说明
跳线开关
所在区
功能
JP1
G
(1-2)远距离通信(2-3)近距离通信
JP2
G
(1-2)RS485方式(2-3)RS232方式
JP3
G
(RXD-TXD)表示自发自收(空)表示双机通信
JP4
G
(跳接)收发时钟连到8253的OUT2作为波特率发生,(空)由用户自己连接收发时钟
JP5
L
(跳接)接通芯片6264电源(空)断开6264芯片电源
JP6
L
(跳接)接通芯片DAC0809电源(空)断开芯片DAC0809电源
JP7
L
(跳接)Q区74LS08芯片、M区74LS245芯片电源
JP8
L
(跳接)P区74LS373芯片、R区74LS04芯片、M区74LS06芯片、N区拨码开关、
T区4044芯片电源
JP9
L
放置跳接子
JP10
O
模拟量通道选择
JP11
E
(1-2)用PC6接Gate2(2-3)用PC3接Gate2
JP12
O
(1-2)用PC4查询EOC(空)EOC申请中断
;音乐发生器程序SourceFile
sstacksegmentstack
dw200dup(?
)
sstackends
datasegment
bgdb'Twotigers...'
db0ah,0dh
db'pressanykeytostop!
',0ah,0dh,'$'
freqdw2dup(262,294,330,262);"两只老虎"乐曲中,音符的频率(音阶)
dw2dup(330,349,392);其中,0频率表示结尾
dw2dup(392,440,392,349,330,262)
dw2dup(294,196,262),0
timedw10dup(8),16,8,8,16;"两只老虎"乐曲中,音符的延时(节拍)
dw2dup(4,4,4,4,8,8);其中4,8,16表示延时的次数
dw2dup(8,8,16)
old_segdw?
old_offdw?
dataends
codesegment
assumecs:
code,ds:
data,ss:
sstack
starprocfar;程序开始
movax,data
movds,ax
movax,sstack
movss,ax
pushdi;寄存器压栈
pushsi
pushbp
pushbx
moval,90h;8255初始化
movdx,303h
outdx,al
moval,0ch;关闭8253的T2计数器(8255的PC6=0)
movdx,303h
outdx,al
moval,00h;关闭喇叭(8255的PC0=0)
movdx,303h
outdx,al
moval,0b6h;8253初始化
movdx,307h
outdx,al
movdx,offsetbg;显示提示信息
movah,9
int21h
movsi,offsetfreq;设置频率指针→si
movbp,offsettime;设置延时指针→bp
pp:
movah,0bh;检测是否有任意键按下?
int21h
cmpal,00
jneend_sing;若有,则结束演凑
movdi,[si];取1个音符的频率→di
cmpdi,0;检测是否是乐曲结尾
jeend_sing;若是,则结束演凑
movdx,12h;计算音符的频率所对应的8253计数初值
movax,34dch;1.19318MHz
divdi
movdx,306h;向8253装入计数初值
outdx,al;先装低字节
moval,ah
outdx,al;再装高字节
movdx,303h;打开喇叭(8255的PC0=1)
moval,01h
outdx,al
moval,0dh;打开8253的T2(PC6=1),开始发声
outdx,al
movbx,ds:
[bp];取1个音符的延时次数→bx
calltime_delay;调用延时子程
movdx,303h;关闭8253的T2(PC6=0)
moval,0ch
outdx,al
moval,00h;关闭喇叭(PC0=0)
outdx,al
addsi,2;取下1个音符的频率
addbp,2;取下1个音符的延时次数
jmppp;继续
end_sing:
movdx,303h;关闭8253的T2
moval,0ch
outdx,al
moval,00h;关闭喇叭
outdx,al
popbx;寄存器出栈
popbp
popsi
popdi
movax,4c00h;返回DOS
int21h
starendp
new_intrproc;新中断服务程序
decbx;该服务程序只将延时次数-1
iret
new_intrendp
time_delayprocnear;延时子程序
pushf;压栈
pushds
pushes
pushbx
movah,35h;取原中断(INT1CH)的向量,并保存
moval,1ch;INT1CH—用户时钟服务
int21h
movold_off,bx
movbx,es
movold_seg,bx
popbx
popes
pushds
movah,25h;设置新中断服务程序的向量
moval,1ch
movdx,segnew_intr
movds,dx
leadx,new_intr
int21h
popds
TD:
cmpbx,0h;延时次数已到?
jnzTD;未到,则继续
movah,25h;已到,则恢复原中断向量
moval,1ch
movdx,old_seg
pushdx
movdx,old_off
popds
int21h
popds
popf
;timedelayend
ret
time_delayendp
codeends
endstar;程序结束