一、实验目的<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
1.掌握利用pc机扬声器发出声音的方法。
2.学习利用系统功能调用从键盘上读取字符的方法。
二、实验内容与要求
利用PC机和扬声器实现简易电子琴的功能。
1.基本要求
(1)电子琴功能,编写程序,程序运行时使pc机成为一架可弹奏的“钢琴”。当按下PC机键盘数字键1-8时,依次发出1,2,3,4,5,6,7,i八个音调。
(2)音乐盒功能,内部存储至少2首以上的乐曲,根据菜单选择播放。
2.提高要求
(1)使一组放光二极管随音调变化而改变,实现音乐彩灯
(2)能够实现高、中、低音的选择。
(3)能够存储弹奏的内容,进行回放。
三、实验报告要求
1.设计目的和内容
2.总体设计
3.硬件设计:原理图(接线图)及简要说明
4.软件设计框图及程序清单
5.设计结果和体会(包括遇到的问题及解决的方法)
四、设计原理
要使扬声器发出不同的音调,就得输入不同频率的波形。通过给8253定时/计数器装入不同的计数值,可以使其输出不同频率的方波。经过放大器的放大作用,便可驱动扬声器发出不同的音调,只要插入一段延时程序之后,再将扬声器切断,音调的声音就可以持续一端时间。
通过计算机的不同按键输出不同的音调,需要使用系统调用功能以接收键入字符,并且要建立一张表,使键入字符与频率构成一个对应关系。
按键 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
音符 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | I |
频率值 | 524 | 588 | 660 | 698 | 784 | 880 | 988 | 1048 |
乐曲是由不同的频率和节拍的音调组成的,因此控制驱动脉冲的频率和持续时间就是编写乐曲程序的关键。频率对应8253的计数初值,而乐曲中的节拍决定了各音频持续的时间。
五、总体设计
1.用PC机的键盘数字键对应电子琴的8个琴键。
2.8255和8253配合构成音频发生器。8255的PA0口控制扬声器的开关,8253控制扬声器的发声频率。
3.音频信号经LM386放大后,驱动扬声器。
4.系统运行时,首先显示主菜单,选择子菜单后进行相应的操作。
六、硬件设计
利用实验板上的8253计数/定时器和8255并行接口,定时器8253利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255控制频率信号的通断。
8255的A口设置为输出,8255的A口的低两位用来控制扬声器驱动,当输出端口的PA0位为“<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1”或为“0”时,将使控制驱动器的与门电路接通或关闭,使8253所发出的音频信号能到达驱动器或被阻断。这样通过控制PA0的变化,可使扬声器接通和断开,控制扬声器是否能发出声音。此外,通过控制PA0的通断时间,就能发出不同的音长。8255的PA1位为“1”时,控制8253定时器产生驱动扬声器发声的音频信号,该位为“0”则不发信号。8253有三个定时器,分为0号、1号和2号定时器,驱动扬声器的是0号定时器,该定时器工作在方式3,是一个频率发生器,它负责向扬声器发送指定频率的脉冲信号。当8255的PA0和PA1都为1时,8253发出指定频率的声音信号的前提下,声音信号通过与门到达驱动器驱动扬声器发声。
硬件原理图如图1所示:
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
8253 计数器 |
与门 |
扬声器驱动 |
8255 PA0 |
8255 PA1 |
门控 |
控制喇叭 |
Q0 |
图1 硬件原理图
扬声器驱动电路如图2所示。
图2 扬声器驱动电路
七、软件设计
系统要求实现2个功能,电子琴和音乐盒的功能。两者发声的方法一样,只是一个数据是从键盘读取的,另一个是已经保存好的数据。首先我们可以用一个子程序实现单个音调的产生,对8253输入不同的计数初值生成不同频率的波形,然后延时一段时间。电子琴程序主要是读取键盘按键,根据键值产生不同的音调即可。而乐曲的播放先将乐曲的音符编码表和节拍编码表建立好的,然后在播放时读取数据。
1. 单音调子程序SOUND
单音调子程序的调用前需要进行以下几个方面工作:
1)确定相应的音调所对应的频率,查表可以得到,再由频率得到对应的8253计数初值。
2)确定音长,即一个音符所持续的时间。
在单音调子程序中实现发出一个音符的声音,持续所需的时间,流程图如图3所示:
读取8253计数初值和音长 |
8253置初值 |
开启与门和8253GATE |
延时 |
关闭与门和8253GATE |
返回
|
图3 单音调子程序流程图
2.电子琴程序
由于是用键盘的数字键1-8,要先读取键盘的输入,判断输入是否在1-8之间,不在就退到主菜单,若是就根据键值查表找出相应的频率,计算初值,调用发音子程序即可,此时的音长固定。初值的计算方法是用输入的clk频率除以音符的频率。
程序流程图如图4所示。
Y |
N |
Y |
N |
显示提示信息 等待键盘按键放入AL |
AL—30—>AL |
查表FREQ得频率 |
计算初值,置音长 |
返回主菜单 |
调用SOUND |
AL 小于‘1’ |
AL大于‘8’ |
图4 电子琴程序流程图
3.音乐盒程序
音乐盒的乐曲播放程序中需要有两组数据支持:一组是频率数据,一组是节拍时间数据。音符的频率可以通过简谱从频率表中查得。节拍时间就是音符的持续时间,取决于乐曲的速度和每个音符的节拍数据。如4/4(四四拍)中,每小节包括4拍,全音符持续4拍,二分音符持续2拍,四分音符持续一拍,八分音符持续半拍等。
有了音调与频率和时间的关系后,就可以按照乐曲的曲谱将每个音符的频率和持续的时间定义成两组数据表,然后编程依次取出表中的频率值和节拍值,调用单音调子程序就可依次产生各个音调,播放出乐曲。
在程序中存储几个乐曲数据,根据音乐盒子菜单选择相应的乐曲演奏,读取对应的数据输出。
乐曲《两只老虎》的简谱如下:
两只老虎
1=C 4/4
1 2 3 1 | 1 2 3 1 | 3 4 5 - |
3 4 5 - | 3 1 | 3 1 |
2 5 1 - | 2 5 1 - |
对应的频率数据表Freq、节拍数据表Time如下:
TWOTIGERS_FRE DW 2 DUP(524,588,660,524,0) ;乐曲的频率表
DW 2 DUP(660,698,784,0)
DW 2 DUP(784,880,784,698,660,524,0)
DW 2 DUP(588,392,524,0),1
TWOTIGERS_TIME DW 10 DUP(100),200,100,100,200 ;乐曲的时间表
DW 2 DUP(50,50,50,50,100,100)
DW 2 DUP(100,100,200)
其他乐曲的数据将频率数据表Freq、节拍数据表Time和乐曲名修改就可以实现其他乐曲的播放。
用户377235 2014-6-24 15:32
用户377235 2013-1-24 09:05
tengjingshu_112148725 2009-5-19 09:02