为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

8253定时器计数器接口与数字电子琴

2018-01-08 6页 doc 27KB 35阅读

用户头像

is_591137

暂无简介

举报
8253定时器计数器接口与数字电子琴8253定时器计数器接口与数字电子琴 实验目的 1(通过程序改变定时器的数值来改变声音频率 2(通过编程来获得声调和节奏,使计算机演奏出乐曲来。 硬件设计 利用实验板上的8253计数/定时器和8255并行接口,定时器8253利用工作方式3产生一定频率信号,通过可编程的并行外围接口芯片8255控制频率信号的通断。 8255的A口设置为输出,8255的A口的低两位用来控制扬声器驱动,当输出端口的PA0位为“1”或为“0”时,将使控制驱动器的与门电路接通或关闭,使8253所发出的音频信号能到达驱动器或被阻断。这样通过控制P...
8253定时器计数器接口与数字电子琴
8253定时器计数器接口与数字电子琴 实验目的 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所示: 8253 Q0 8255 PA0 计数器 门控 扬 扬声器驱动 8255 PA1 控制喇叭 与门 声 器 图1 硬件原理图 扬声器驱动电路如图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 - | 3 1 | 3 1 | 56545654 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 实验体会: 本次实验的主要难处在于汇编程序的编写,但编译通过后看到运行的结果便感到由衷的高兴。 在接好电路,运行程序后,注意按下键后,声音延长作用的长短的变化。同时增大取正弦波,可以看到延长变大,减小次数,则声音变短,这正是由于取了正弦波数变了的原因。说明正弦波的个数使声音延长时间的关键。
/
本文档为【8253定时器计数器接口与数字电子琴】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索