基于8086电子琴的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

郑州科技学院
《微机原理与接口技术》课程设计
题目_基于8086电子琴的设计与实现
学生姓名
专业班级12级计算机科学与技术一班
学号
院(系)信息工程
指导教师
完成时间 2015 年 1 月 11 日
目录
1 引言 (1)
2 设计方案与论证 (3)
2.1方案一 (3)
2.2 方案二 (3)
2.2.1设计思路 (4)
2.2.2各个音节频率的设定 (8)
3 设计原理及功能说明 (9)
3.1硬件 (9)
3.1.1 8253简介 (10)
3.1.2 8255简介 (12)
3.2 软件 (14)
3.2.1 设计实验总流程图 (14)
3.2.2 设计子程序流程图 (15)
4 调试与结果测试 (17)
4.1 硬件调试 (17)
4.2 软件调试 (20)
4.3测试方案和测试结果 (22)
5 总结 (23)
参考文献 (26)
附录1:总体电路原理图 (27)
附录2:元器件清单 (28)
附录3:源代码 (29)
1 引言
随着电子技术的发展,计算机在现代科学技术的发展中起着越来越重要作用。

多媒体技术、网络技术、智能信息处理技术、自适用控制技术、数据挖掘与处理技术等都离不开计算机。

本次课程设计是基于微机原理与接口技术的简单应用。

微机技术目前运用最广泛的就是单片机。

单片机是随着大规模集成电路的出现极其发展,将计算机的CPU、RAM、ROM定时/计数器和多种I/O接口集成在一片芯片上,形成了芯片级的计算机,因此单片机早期的含义称为单片微型计算机。

它拥有优异的性价比、集成度高、体积小、可靠性高、控制功能强、低电压、低功耗的显著优点.主要应用于智能仪器仪表、工业检测控制、机电一体化等方面,并且取得了显著的成果。

单片机控制通用MIDI音源模块制作制作出的电子琴,结构简单,可靠性高,并且价格低廉,具有实用的价值。

这种电子琴能够支持单音和复音弹奏,如果与高品质的音源芯片连接,音质更可与高档电子琴相媲美。

手机中通用的音乐芯片构成音源模块,效果不错,价格更低廉,如韩国产的QS6400等,这些芯片的驱动要复杂一些,需要对芯片进行初始化设置。

此外还有音乐盒、附有生日歌的生日卡片等等。

所以利用微机制作的简易电子琴在我们的日常生活中随处可见[1]。

微机原理简易电子琴设计主要是通过对电子琴主体部分的电路进行模仿设计,达到电子琴固有的基本功能,故叫简易电子琴。

利用定时器可发出不同频率的方波,不同频率的方波经喇叭就会发出不同音调。

其次,定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平,由于定时参数不同,就发出不同频率的方波[2],本设计中按键一次,会发出方波,松开后随之延时,但在延时的
期间继续检测按键,若此时又有键被按下,若被按下的仍为原键则声音不变,否则键盘会译出被按下的另一个键的音调。

本次课程设计的目的是通过D/A转换器产生摸拟信号,使PC机作为简易电子琴。

其主要任务有以下几点:基于8086系统;使用计算机的数字键1、2、3、4、5、6、7、8作为电子琴的按键,按下即可发出相应的音阶;音阶通过扬声器发出声音。

本次设计通过8255和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。

输入部分:主要是由8255和8个常开型开关来完成。

发音部分:CUP 通过对定时器8253的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响[3]。

本文用到的是8253的方式3——方波发生器。

通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。

通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。

为以后学生结合专业从事微机应用设计奠定基础。

2 设计方案与论证
2.1方案一
首先利用了编程程序,编辑8255芯片控制字, 对其进行初始化,使其工作在方式0,即基本输入输出状态,将8255的A端口设置为输出,C端口进行,经CPU运算后, 输出到8254芯片的A端口中,由此实现对其的初始化。

将8254芯片设置为工作在方式3,即输出对称方波状态。

A端口为输入,“OUT”指令可将输出对应一定频率的方波送到扬声器中,由此实现发声[4]。

本实验频率大小控制发出声音的高低,通过对延时程序的调用控制发出声音的长短。

并通过所编程序实现对键盘的重复扫描,从而可以弹奏多个音符的试验目的。

2.2 方案二
8253的CLK0接1MHz时钟,G ATE0接+5V,OUT0接8255的PA0,K8跳线连接喇叭,使用汇编语言设计一个运行于计算机的电子琴程序,程序应实现弹奏功能。

其中弹奏:用户每按一琴键弹奏相应音符;软件预想功能为:按数字1~8为弹奏功能,按下即发出相应的音阶。

按键发音,当从键盘上敲击1~8时,音响发出哆、唻、咪、发、嗦、啦、唏、唗的音节。

对比方案一,其实两个方案差不多,但是我对于8254不熟悉,所以最终决定此方案为我选择的最佳方案,并附上本次设计的设计框图如图2-1所示:
图2-1 设计框图
2.2.1设计思路
电子琴的设计实际上就是要设计一个程序,能够通过该程序控制PC 机内扬声器的发声规律,按下相应的按键后,扬声器能发出指定频率的声音。

PC 机内的扬声器是通过并行接口芯片8255和定时芯片8253来控制发音的。

在本次课程设计中,分析和确定程序总体设计目标:电子琴基本功能后,将总体目标确定为连接电路与编程来实现功能。

程序设计的思路按以下顺序进行:
(1)分析与确定程序总体设计目标;
通过D/A 转换器产生摸拟信号,使PC 机作为简易电子琴。

其总体原理图如图2-2所示:
系统总线 键盘
8255芯片 8253芯片 扬声器发声
图2-2 总体原理图
(2)按照电路图连接实验箱,如图2-3所示:
图2-3 电路连接图
(3)编写源程序,进行调试,包括:
发音部分功能实现
由更件的连接形式可知,扬声器的开断是由8255的PB0和PB1以及8253通道2同时控制的,PB0和PB1同时为高电平时,扬声器开,有一个为低电平时,扬声器关断,又知8255 B口地址为61H,8253通道2地址为42H,控制口地址为43H。

具体程序编写[5]如下:
8253初始化程序段:
mov al,10110110b ;选择8253的通道2,并设置为工作方式3
out 43h,al
mov ax,bx
out 42h,al ;将计数初值的低8位写入计数通道
mov al,ah
out 42h,al ;将计数初值的高8位写入计数通道
开扬声器程序段:
in al,61h ;读入B口数据
or al,03h ;将PB0 和PB1置1
out 61h,al ;将设置好的数据送回B口
关扬声器程序段:
in al,61h ;读入B口数据
and al,0fch ;将PB0 和PB1置0
out 61h,a ;将设置好的数据送回B口
弹奏功能的实现
当按键为数字1-8时,选择弹奏功能,通过对按键的判断,求得其偏移地址,然后通过查表得其相应频率值,再由上述计算计数初值的方法求得计数初值,然后将计数初值送人8253的通道2,最后调用发音子程序即实现弹奏功能。

具体程序段如下:
sub al,31h ;求偏移量
shl al,1
mov bl,al ;保存偏移量
mov bh,0
mov ax,num1 ;计算计数初值
mov dx,num2
div word ptr[tab+bx]
mov bx,ax ;保存计数初值
延时功能的实现
当弹奏完音乐之后,调用延时子程序,音乐延时播放。

具体程序段[6]如下:
delay proc near ;延时子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0为方式0工作
mov al,10h
out dx,al
mov dx,io8255b ;设8255A口输入
mov al,9bh
out dx,al
m ov al,num ;取相应的时间常数
xlat
mov dx,io8253a
out dx,al ;向8253通道0输出
kkk: mov dx,io8255a
in al,dx ;从8255A口读一字节
test al,01 ;判PA0口是否为1
jz kkk ;若不为1,则转KKK
ret ;子程序返回
delay endp
2.2.2各个音节频率的设定
(1)对于一个特定的D/A转换接口电路CPU执行一条输出指令
将数据送入D/A即可在其输出端得到一定的电压输出。

给D/A转换
器输入按正弦规律变化的数据,在其输出端即可产生正弦波。

对于音
乐,每个音阶都有确定的频率,如表2-1所示:
表2-1 各音阶标称频率表
音阶12345678频率(单位:Hz)261.1293.7329.6349.2392.0440.0493.9529.7 120106948979706359对应num取值
(us)
以1~8 接8255 的A口做为电子琴的键盘分别输入哆、唻、咪、发、嗦、啦、唏、唗的音,以8255的B口作为输出。

用8253定
时器产生频率控制扬声器发声。

以8255接八个开关1~8,做电子琴按键输入。

以8253 控制扬声器,发出相应的音阶。

要求:
1—发哆的音261.1Hz
2—发唻的音293.7Hz
3—发咪的音329.6Hz
4—发发的音349.2Hz
5—发嗦的音392.0Hz
6—发啦的音440.0Hz
7—发唏的音493.9Hz
8—发唗的音529.7Hz
(2)产生一个正弦波的数据可取32个(小于亦可),不同频率的区别,可通过调节向D/A转换器输出数据的时间间隔,例如:发"1"频率为261.1HZ,周期为1/261.1=3.83ms,输出数据的时间间隔为3.83ms/32=0.12ms。

定时时间可以由8253配合8255来实现。

按下某键后发音时间的长短可以由发出的正弦波的个数多少来控制。

3 设计原理及功能说明
3.1硬件
通过8255 和8253来实现电子琴模拟,主要可以分成两部分,分别为输入部分和发音部分。

输入部分:主要是由8255和8个常开型开关来完成。

发音部分:CUP通过对定时器的通道2 进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,端口61H的最低位控制通道2门控的开断,以产生特殊的音响。

当通道2用于发声时,采用的是方式3,在方式3下,输出线为“1”和为“0”的时间各占计数时间的一半,因而产生一系列间隔均匀的脉冲。

从定时器输出的方波信号,经功率放大和滤波后驱动扬声器。

送到扬声器的信号还受到了从并行接口芯片8255(端口地址为61H)来的双重控制,端口61H的最低位控制通道2的门控开断,以产生特殊的音频信号端口61H的PB1位和定时器的输出信号同时作为与门的输入,PB0和PB1位可由程序决定为0还是为1。

显然只有PB0和PB1都是1时,才能使扬声器发出声音。

控制音长的时间可以简单地通过反复执行指令来得到。

3.1.1 8253简介
(1)基本介绍
8253芯片是常用的可编程计数器,在微机中有着极其重要的作用。

常用于事件计数器,单稳态触发器,分频器,方波发生器,硬件触发的单脉冲发生器等。

计数器/定时器8253包括3个独立的16位计数器通道,而每个计数器都有6种工作方式,可以按二进制或十进制(BCD码)进行计数。

本文用到的是8253的方式3——方波发生器来实现了简易电子琴的设计。

(2)工作原理
8253芯片中有3个计数通道,称为通道0,1,2,它们与外部电路相连的信号线有3根:CLK,GATE,OUT,CLK是脉冲输入端,GATE是门控信号,OUT是输出信号,计数器工作在减1状态。

其内部结构图,方式控制字格式,如图3-1,图3-2所示。

其中当计数器工作在方式3时,输出信号为方波信号。

内 部 总 线
RD
A1
GATE 0
CLK0 OUT0 GATE 1
CLK1
OUT1
GA TE 2
CLK2 OUT2
D0-D 7
计数器0
计数器2
计数器1
控制寄存器
A0 数据总线缓冲器
R/W 逻辑电路
WR
CS
图3-1 8253内部结构图
图3-2 8253控制字格式
D7 D6 D5 D4 D3 D2 D1 D0
计数器选择 00 计数器0 01计数器1 10 计数器2 11 不用
00 计数器锁存 01 读写低8位 10 读写高8位 11 读写16位
工作方式选择 000 方式0 001 方式1 ×10 方式2 ×11 方式3 100 方式4 101 方式5
计数方式 0 二进制 1 BCD 计数
PC机内8253的通道0,通道1,通道2,控制口的端口地址分别为:40H,41H,42,43H。

因为扬声器是由通道2来控制的,故应选择通道2,工作方式选为方式3,输出的信号则为方波信号。

(3)8253的工作方式3——方波发生器
其特点是:输出为周期性的方波。

若计数值为N,则输出方波的周期是N 个CLK脉冲的宽度;
写入控制字后,输出将变为高电平,当写入计数初值后,就开始计数,输出仍为高电平;当计数到初值的一半时,输出变为低电平,直至计数到0,输出又变为高电平,重新开始计数;
若计数值为偶数,则输出对称方波;如果计数值为奇数,则前(N+1)/2 个CLK脉冲期间输出为高电平,后(N-1)/2 个CLK 脉冲期间输出为低电平;
GATE信号能使计数过程重新开始,GATE=1允许计数,GATE=0禁止计数。

停止后OUT将立即变高电平,当GATE 再次变高以后,计数器将自动装入计数初值,重新开始计数。

3.1.2 8255简介
(1)基本介绍
按功能可把8255分为三个逻辑电路部分。

即:口电路、总线接口电路和控制逻辑电路。

8255共有三个8位口,其中A口和B口是单纯的数据口,供数据I/O使用。

而C口则既可以作数据口,又可以作控制口使用,用于实现A口和B口的控制功能。

(2)工作原理
8255的内部结构图如图3-3所示,它有3个数据端口,分为两组,A
图3-4 8255方式控制字
方式控制字的特征位
D 0
D 7 D 6 D 5 D 4 D 3 D 2 D 1 1
A 组工作方式 0 0——方式0 0 1——方式1 1 ⨯——方式2
B 组 工作方式 0——方式0 1——方式1
A 口 输入/输出 1——输入 0——输出 PC 7~PC 4 输入/输出 1——输入 0——输出
B 口 输入/输出 1——输入 0——输出
PC 3~PC 0 输入/输出 1——输入 0——输出
组由A 口和C 口高四位组成,B 组由B 口和C 口低四位组成。

其方式控制字如图3-4所示。

图3-3 8255内部结构图
PC 机内8255的A 口,B 口,C 口和控制口的端口地址分别为:
60H,61H,62H,63H 。

3.2 软件
3.2.1 设计实验总流程图
结合实验指导书的程序,实现简单的电子琴功能。

电子琴主程序流程图如图3-5所示:
图3-5 电子琴主程序流程图
Y N
求出音阶值保存
赋相应频率
延时
键盘读入一个字符
是ESC 键吗?
是数字1~8键吗?
返回DOS
Y
N
开始
3.2.2 设计子程序流程图
(1)发音子程序
本子程序实现放音功能。

首先从键盘读出一个字符,判断,如果是ESC键,返回DOS,如果不是,判断,如果键码不是1~8,即仍然处于音阶输入准备状态,如果是,即求出音阶值保存,取60次32个正弦波数据,播放32个数据,组成一个正弦波。

播放60次后,然后判断是否有按键,如果有就进入死循环,直到下次按键为止。

在弹奏时都需调用发音子程序,发音子程序的作用是控制扬声器的发音,其流程图如图3-6所示:
8253初始化
开扬声器
延时
关扬声器
返回
图3-6 发音子程序流程图
(2)弹奏子程序
当按键为1-8时,调用演奏子程序。

演奏子程序的流程图如下图3-7所示:
查表得相应频率
计算计数初值
调用发音子程序
返回
图3-7 演奏子程序的流程图
(3)延时子程序
当弹奏完音乐之后,音乐延时播放。

延时子程序的流程图如下图3-8所示:
Y
N
图3-8 延时子程序的流程图
4 调试与结果测试
4.1 硬件调试
⑴利用实验板上的8253计数/定时器和8255并行接口,定时器8253利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255控制频率信号的断。

8255的B 口设置为输出,8255的B 口的低两位用来控制扬声
取出音阶值
求出8253定时时间常数(计数器初值)
8253初始化为方式0
设置8253A 口输入
PA0为1吗?
吗?
子程序返回
器驱动,当输出端口的PB0位为“1”或为“0”时,将使控制驱动器的与门电路接通或关闭使8253所发出的音频信号能到达驱动器或被阻断。

这样通过控制PB0的变化,可使扬声器接通和断开,控制扬声器是否能发出声音。

此外,通过控制PB0的通断时间,就能发出不同的音长。

8255的PB1位为“1”时,控制8253定时器产生驱动扬声器发声的音频信号,该位为“0”则不发信号。

8253有三个定时器,分为0号、1号和2号定时器,驱动扬声器的是2号定时器,该定时器工作在方式3,是一个频率发生器,它负责向扬声器发送指定频率的脉冲信号。

当8255的PB0和PB1都为1时,8253发出指定频率的声音信号的前提下,声音信号过与门到达驱动器驱动扬声器发声。

连接简易电子琴系统的电路图如图4-1所示
图4-1
⑵将实验箱与微型计算机保持串口通讯成功。

⑶将汇编程序代码输入微型计算机进行硬件调试。

4.2 软件调试
⑴把弹奏功能的程序代码输入微型计算机;
代码:
data segment
ioport equ 0d400h-0280h
io8253a equ ioport+280h
io8253b equ ioport+283h
io8255a equ ioport+288h
io8255b equ ioport+28bh
io0832a equ ioport+290h
data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
time db 120,106,94,89,79,70,63,59;发不同音时8253的计数器初值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
num db ? ;num为8253计数器初值的序号
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h ;显示提示信息
sss: mov ah,7
int 21h ;从键盘接收字符,不回显
cmp al,1bh
je exit ;若为ESC键,则转EXIT
cmp al,31h
jl sss
cmp al,38h
jg sss ;若不在'1'-'8'之间转sss
sub al,31h
mov num,al ;求出相应的时间常数的序号
mov cx,60 ;取60次32个正弦波数据
ddd: mov si,0
lll: mov al,data1[si];取正弦波数据
mov dx,io0832a
out dx,al;放音
call delay ;调延时子程序
inc si
cmp si,32;是否取完32个数据
jl lll;若没有,则继续
loop ddd;总循环次数60是否完,没有,则继续
jmp sss
exit: mov ah,4ch
int 21h
delay proc near ;延时子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0为方式0工作
mov al,10h
out dx,al
mov dx,io8255b ;设8255A口输入
mov al,9bh
out dx,al
m ov al,num ;取相应的时间常数
xlat
mov dx,io8253a
out dx,al ;向8253通道0输出
kkk: mov dx,io8255a
in al,dx ;从8255A口读一字节
test al,01 ;判PA0口是否为1
jz kkk ;若不为1,则转KKK
ret;子程序返回
delay endp
code ends
end start
⑵与硬件相结合进行修改调试,运行程序后,显示如下界面,等待输入字
符,如图4-2所示:
图4-2 运行界面
从键盘上敲击1~8时,音响发出哆、唻、咪、发、嗦、啦、唏、唗的音节,则调试成功。

4.3测试方案和测试结果
如表4-1所示:
表4-1 测试表
测试方案测试结果
启动程序,出现按键提示,按下1~8键机内/实验仪发出相应的音阶
改变开关状态,按1~8键对应发出相应的音阶
“弹琴”发出优美旋律
按下ESC键退出程序
5 总结
在为期一周的微机原理课程设计中,我学会了制做项目的一般步骤。

第一部是硬件设计主要是实现控制对象与被控制对象之间的联系。

第二步就是软件设计,就是要完成各个可编程芯片与CPU之间的数据传送和各个进程的逻辑顺序。

在本次设计中对硬件要求就要熟练掌握可编程器件8255A和8253的应用。

对软件设计就要熟练掌握汇编语言。

由于时间限制的问题和硬件的局限性也只能将电子琴的功能简易化。

另外,我从中学到了许多从课本上学不到的东西,锻炼了自己编程的能力,最后程序运行时能够实现目标,我感到很有成就感,从中也获得了很多乐趣,当然,最重要的是加深了我对课本理论知识的理解。

当刚看到这个课设题目时,我感到无从下手,因为我都不知道PC 机的内部具体结构,从理论课上只是了解了CPU的结构和工作原理,以及几个接口芯片的工作原理,还有汇编语言的一些基本指令。

但我没有被吓到,我冷静下来思考后,发现其本质就是控制PC机内扬声器的
发音,通过查阅资料我了解了PC机内扬声器的电路连接形式,发现它是由接口芯片8255和8253共同控制的,8255的PB0作为8253通道2的门信号,而8255的PB1和8253通道2的输出相与后的信号作为扬声器的驱动信号,了解了其内部接线方式后,思路也就有了,要想让扬声器发声,8255的PB0和PB1必须同时为高电平,其中之一为低电平时,扬声器就不能发声,而发声的音调则可通过改变8253的计数初值来实现,接下来的任务就是通过编程来控制8255和8253,从而间接地控制扬声器的发声规律,而8255和8253这两个接口芯片在理论课上都已介绍过,对其工作原理和编程方法都有一定的了解,看到这些熟悉的内容时,我淡定了很多。

有了思路之后,我并没有急着写程序,因为我怀疑是不是每台PC 机的扬声器接线方式都是这样的,所以我开始只编了一段控制扬声器发音的程序,来看看程序运行时扬声器到底发不发音,结果发声了,这让我很惊喜,也很有动力,更加激发了我的兴趣,接下来我就开始编写实现指定功能的程序了,首先是最简单的弹奏功能,通过对按键的判断来发出相应频率的声音,因为要判断按键,所以很自然地就想到了CMP 指令,在计算计数初值时,因为要用到相应音符的频率,所以需要将按键转换为音符的频率,我开始想用书上常见的XLAT换码指令[7],但AL存放的数最大为128,很明显容量不够,于是我采用了基址+变址的寻址方法,在编程的过程中,由于要程序实现多个功能,所以用子程序的结构会比较方便,需要完成某个功能时,只需调用相应子程序就可以了,这样会使得程序的结构清楚明了。

在完成基本功能后,我还试着加上一些附加功能,比如延时,变调,通过我的不断尝试,终于把延时功能实现了,但变调功能没能像预期的那样。

总之,这次课程设计让我学到了许多从课本上学不到的知识,加深了对理论知识的理解,激发了我对汇编语言的兴趣。

上理论课时,只是
老师讲,我们听,那些指令让我感到很枯燥,因为不知道它到底有什么作用,而这次课程设计刚好把这些指令应用到了实际中来,加深了对各种指令功能的理解,最后功能实现时,感到很有成就感,觉得汇编语言很神奇,激发了我对它的兴趣。

参考文献
[1]专著.杨素行.微型计算机系统原理及应用[M].北京.清华大学出版社,2004
[2]专著.龚尚福.微机原理与接口技术[M].西安电子科技大学出版社,2003.8
[3]专著.李芷.微机原理与接口技术[M].电子工业出版社,2002
[4]专著.宋杰等.微机原理与接口技术课程设计[M].机械工业出版社,2005
[5]专著.小捷. 汇编语言程序设计(第二版)[M].西安电子科技大学出版社,2003
[6]专著.钱晓捷.汇编语言程序设计(第二版)[M].电子工业出版社,2003
[7]专著.杨立,邓振杰等.微型计算机原理与接口技术(第二版)[M].中国铁道出版社,2006
附录1:总体电路原理图
附录2:元器件清单
(1)8253
(2)8255A
(3)
附录3:源代码
data segment
ioport equ 0d400h-0280h
io8253a equ ioport+280h
io8253b equ ioport+283h
io8255a equ ioport+288h
io8255b equ ioport+28bh
io0832a equ ioport+290h
data1 db 80h,96h,0aeh,0c5h,0d8h,0e9h,0f5h,0fdh
db 0ffh,0fdh,0f5h,0e9h,0d8h,0c5h,0aeh,96h
db 80h,66h,4eh,38h,25h,15h,09h,04h
db 00h,04h,09h,15h,25h,38h,4eh,66h ;正弦波数据
time db 120,106,94,89,79,70,63,59;发不同音时8253的计数器初值msg db 'Press 1,2,3,4,5,6,7,8,ESC:',0dh,0ah,'$'
num db ? ;num为8253计数器初值的序号
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
mov dx,offset msg
mov ah,9
int 21h ;显示提示信息
sss: mov ah,7
int 21h ;从键盘接收字符,不回显
cmp al,1bh
je exit ;若为ESC键,则转EXIT
cmp al,31h
jl sss
cmp al,38h
jg sss ;若不在'1'-'8'之间转sss
sub al,31h
mov num,al ;求出相应的时间常数的序号
mov cx,60 ;取60次32个正弦波数据
ddd: mov si,0
lll: mov al,data1[si];取正弦波数据
mov dx,io0832a
out dx,al;放音
call delay ;调延时子程序
inc si
cmp si,32;是否取完32个数据
jl lll;若没有,则继续
loop ddd;总循环次数60是否完,没有,则继续jmp sss
exit: mov ah,4ch
int 21h
delay proc near ;延时子程序
ccc: mov bx,offset time
mov dx,io8253b ;置8253通道0为方式0工作
mov al,10h
out dx,al
mov dx,io8255b ;设8255A口输入
mov al,9bh
out dx,al
m ov al,num ;取相应的时间常数
xlat
mov dx,io8253a
out dx,al ;向8253通道0输出
kkk: mov dx,io8255a
in al,dx ;从8255A口读一字节
test al,01 ;判PA0口是否为1
jz kkk ;若不为1,则转KKK
ret;子程序返回
delay endp
code ends
end start。

相关文档
最新文档