8253定时器计数器接口与数字电子琴
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验目的
1.通过程序改变定时器的数值来改变声音频率
2.通过编程来获得声调和节奏,使计算机演奏出乐曲来。 硬件设计
利用实验板上的8253计数/定时器和8255并行接口,定时器8253利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255控制频率信号的通断。
8255的A 口设置为输出,8255的A 口的低两位用来控制扬声器驱动,当输出端口的PA0位为“1”或为“0”时,将使控制驱动器的与门电路接通或关闭,使8253所发出的音频信号能到达驱动器或被阻断。这样通过控制PA0的变化,可使扬声器接通和断开,控制扬声器是否能发出声音。此外,通过控制PA0的通断时间,就能发出不同的音长。8255的PA1位为“1”时,控制8253定时器产生驱动扬声器发声的音频信号,该位为“0”则不发信号。8253有三个定时器,分为0号、1号和2号定时器,驱动扬声器的是0号定时器,该定时器工作在方式3,是一个频率发生器,它负责向扬声器发送指定频率的脉冲信号。当8255的PA0和PA1都为1时,8253发出指定频率的声音信号的前提下,声音信号通过与门到达驱动器驱动扬声器发声。
硬件原理图如图1所示: 图1 硬件原理图
8253 计数器
与门 扬声器驱动 扬声
器
8255 PA0 8255 PA1 门控
控制喇叭 Q0
扬声器驱动电路如图2所示。
图2 扬声器驱动电路
软件设计
系统要求实现2个功能,电子琴和音乐盒的功能。两者发声的方法一样,只是一个数据是从键盘读取的,另一个是已经保存好的数据。首先我们可以用一个子程序实现单个音调的产生,对8253输入不同的计数初值生成不同频率的波形,然后延时一段时间。电子琴程序主要是读取键盘按键,根据键值产生不同的音调即可。而乐曲的播放先将乐曲的音符编码表和节拍编码表建立好的,然后在播放时读取数据。
1. 单音调子程序SOUND
单音调子程序的调用前需要进行以下几个方面工作:
1)确定相应的音调所对应的频率,查表可以得到,再由频率得到对应的8253计数初值。
2)确定音长,即一个音符所持续的时间。
在单音调子程序中实现发出一个音符的声音,持续所需的时间,流程图如图3所示:
读取8253计数初值和音长
8253置初值
开启与门和8253GATE
延时
关闭与门和8253GATE
返回
图3 单音调子程序流程图
2.音乐盒程序
音乐盒的乐曲播放程序中需要有两组数据支持:一组是频率数据,一组是节拍时间数据。音符的频率可以通过简谱从频率表中查得。节拍时间就是音符的持续时间,取决于乐曲的速度和每个音符的节拍数据。如4/4(四四拍)中,每小节包括4拍,全音符持续4拍,二分音符持续2拍,四分音符持续一拍,八分音符持续半拍等。
有了音调与频率和时间的关系后,就可以按照乐曲的曲谱将每个音符的频率和持续的时间定义成两组数据表,然后编程依次取出表中的频率值和节拍值,调用单音调子程序就可依次产生各个音调,播放出乐曲。
在程序中存储几个乐曲数据,根据音乐盒子菜单选择相应的乐曲演奏,读取对应的数据输出。
乐曲《两只老虎》的简谱如下:
两只老虎
1=C 4/4
1 2 3 1 | 1 2 3 1 | 3 4 5 - |
3 4 5 - |5654 3 1 |5654 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)
outb_p(0x34,0x43);
outb_p(LATCH&0xff,0x40);
outb_p(LATCH>>8,0x40);
outb(inb_p (0x21) & ~0x01, 0x21); //允许接收定时器中断
}
void do_timer(void)
{
这是定时器主程序,用于每隔一段时间后进行某些操作
}
[8253.asm]:
//以下是nasm格式的汇编代码,这个中断处理函数必须用汇编timer_interrupt:
push gs
push fs
push es
push ds
push ebp
push edi
push esi
push edx
push ecx
push ebx
push eax
如果你不在操作系统下使用,以下三行必须删除,否则必须把0x10更改为内核段选择符
mov eax,0x10
mov ds,ax
mov es,ax
mov al,0x20
out 0xa0,al ;发送EOI
out 0x20,al
call do_timer
pop ebx
pop ecx
pop edx
pop esi
pop edi
pop ebp
pop ds
pop es
pop fs
pop gs
xor eax,eax
iretd
实验体会:
本次实验的主要难处在于汇编程序的编写,但编译通过后看到运行的结果便感到由衷的高兴。
在接好电路,运行程序后,注意按下键后,声音延长作用的长短的变化。同时增大取正弦波,可以看到延长变大,减小次数,则声音变短,这正是由于取了正弦波数变了的原因。说明正弦波的个数使声音延长时间的关键。