欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    c语言发声程序.doc

    • 资源ID:33862044       资源大小:500KB        全文页数:17页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    c语言发声程序.doc

    如有侵权,请联系网站删除,仅供学习与交流c语言发声程序【精品文档】第 17 页字号:大 中 小 :发声技术问题:乐谱的 1、2、3、4、5、6、7,加上高低音可以谱出动听的曲子,请编写程序,使计算机能够播放歌曲。分析   播放歌曲意味着让计算机发声,声音从 PC 机内的扬声器发出,所以这个问题将与硬件扬声器电路有关。解答  解决这一编程问题,让我们首先简单了解一下计算机发声的原理。在PC 机的系统板上装有定时与计数器 8253 芯片,还有 8255 可编程并行接口芯片,由它们组成的硬件电路可用来产生 PC 机内扬声器的声音,对于 286、386、486、586 等 PC 微机,由于采用了超大规模集成电路,因而看不到这些芯片,它们均集成在外围电路芯片上了。当我们操作计算机时,常常听到的发声,就是由软件控制这些电路而产生的。声音的长短和音调的高低,均可由程序进行控制。在扬声器电路中,定时器的频率决定了扬声器发音的频率,所以可通过设定定时器电路的频率来使扬声器发出不同的声音。对定时器电路进行频率设定时,首先对其命令寄存器(口地址为 0x43)写命令字,如写入     0xb6,这可用outporb(0x43,0xb6);来实现,则表示选择该定时器的第二个通道,计数频率先送低 8 位(二进制),后送高 8 位。接着用口地址 0x42 送频率计数值,先送低 8 位,后送高 8 位,即用outportb(0x42,低 8 位频率计数值)和 outportb(0x42,高 8 位频率计数值)来实现。通过这两步使定时器电路产生一系列方波信号,此信号是否能推动扬声器发音,还要看由 8255 产生的门控信号和送数信号是否为 1,而它们也可编程,口地址为 0x61。为了不影响 8255 口地址 61H 中的其他高位,应先输入口地址 6lH 的现有值 bits,即用 bits= inportb(0x61)来实现,然后就可用 outportb(0x61,bits|3)来允许发声,而用 outportb(0x61,bits&0xfc)来禁止发声,且不改变 8255 其它位原来的值,关于这方面的详细内容可以参阅 IBM PC/XT 接口技术方面书籍有关内容。5.1 声音函数编写音乐程序播放歌曲,最简单的方法是可以直接使用 TURBO C 在 dos.h 中提供的有关发声的函数 sound()和 nosound()。sound()函数用于产生声音,其原型如下:void sound(unsigned frequency);该函数的入口参数为扬声器要产生声音的频率。与 sound()函数相反,nosound ()函数用于关闭扬声器,其原型为:void nosound(void);该函数没有入口和出口参数,它只是简单地把口地址 61H 中的低 2 位清 0。在利用函数 sound 产生指定频率的声音后,一般要过一段时间后再调用函数 nosound 关闭扬声器,这样我们才能清楚地听到一个声音。如果扬声器刚打开就关闭,我们是很难听到一个声音的。某个频率的声音延续时间的长短是重要的,它将直接影响音响效果。这需要使用 TURBOC 提供了专门的延时函数 delay,其原型说明如下:void delay (unsigned milliseconds);该函数中断程序的执行,中断的时间由 milliseconds 指定。例程 3-36:该程序每间隔 10000 milliseconds pc 扬声器发出不同频率的声音,直到频率大于5000hz。#include<dos.h>main()   int freq;   for(freq=50;freq<5000;freq+=50)      sound (freq);      delay(10000);   nosound();  如果不能使用上述现成的函数 sound()和 nosound(),当然我们也可以采用上节中的方法,用  I/O  接口的输入输出函数,自己编写产生声音和关闭声音的函数。下面可供参考的函数SOUND()与 TURBOC 提供的产生声音函数 sound()的算法类似:首先函数 SOUND()中使用了一个由一个整数和两个字符组成的联合,其目的在于方便地把一个 16 位数分解成两个 8位数。为了打开扬声器,需要把口地址 61H 的低 2 位置位,但又不能影响其他高位,为此,先输入口地址 61H 中的现有值,与 3 逻辑或后再输出到口地址 61H。void SOUND(unsigned frequency)union   unsigned divisor;unsigned char c2; tone;/*    定义由个整数和两个字符组成的联合 */tone.divisor=119328/frequency; /* 计算该频率对应的定时器计数值  */    outportb(0x43,0xb6);  /*     通知定时器采用新的计数 */outportb(0x42,tone.c0); /* 计数低字节先送到定时器 */outportb(0x42,tone.c1);  /*  计数高字节后送到定时器 */    outportb(0x61, inportb(0x61) | 3 );   /*             使定时器到喇叭的输出有效             */如下供参考的函数 NOSOUND(),为了不影响口地址 61H 中的其他高位,应先输入口地址 6lH 的现有值在屏蔽掉低 2 位后再输出到口地址 61H。void NOSOUND(void) outportb(0x61,inportb(0x61) & 0xfc);      /*  使定时器到喇叭的输出无效 */5.2 计算机乐谱表 3-18 是频率与音阶的对照表。我们可以通过该表编制出自己的驱动程序。编制乐谱程序一般在原乐谱的基础上添加一些控制字符来完成。如:_11176 3232 6 2就是孟庭苇演唱的“羞答答的玫瑰静俏俏地开”的第一句歌词的乐谱。在计算机中可以表述为:600 H1 0.5 H1 0.5 H1 0.5 M7 0.5 M6 1 H3 1 H2 0.5 H3 0.5 H2 0.5 M6 0.5 H2 2第一个为音长基准,一般为 300,600,900,1200。后面字 H1 表示高音的 1,音阶的设置如下:最高音:在音符前加“E”;高音:在音符前加“计”;中音:在音符前加“M”;低音:在音符前加“L”;再后面的字为节拍数,其中的 0.5 表示节拍数,每个音的音长音长基数×u33410X拍数,如第一个“1”的音长为 600×0.5300。表 3-18 频率与音阶的对照表低音1234567频率131147165176196220247中音1234567频率262296330349392440494高音1234567频率523587659699784880988最高音1234567频率1047117513191397156817601976知道了这些知识,就容易编制个乐谱驱动程序。思路是将各个频率存储在一个二维数组中,根据音阶字符、音符和节拍数,得到发音的音长,使用 sound 函数发音,使用 delay函数控制。5.3 问题实现5.3.1  调用 sound()和 unsound()下面的程序(例程 3-37)先开辟两个数组 freq96和 dely96分别用于存储声音的频率和延时。采用图形方式,利用 printtext()函数在屏幕上分别显示字符串 Welcome !","Please press any key to start .","Enjoy yourself !”,"Press any key to end !"  和  "Thank you! ByeBye ."    printtext()定义如下:void printtext(unsigned char *temp,int i)       setcolor(4);                            /设置颜色为 red       settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); / 设置字符的字体,方向和大小        outtextxy(100,40+i*50,tempi);         / 显示字符串另外,在此程序中还调用了 conio.h       中的函数 kbhit(),用于判断是否有键按下,当没有键按下时返回 0。      /*例程 3-37*/#include<dos.h>#include<graphics.h>void printtext(unsigned char *temp,int i);     /   用于在屏幕上显示字符串main()int i,graphdriver,graphmode;   unsigned char *temp4;   int freq96=784,660,588,660,523,523,  588,494,440,523,392,392,  330,392,440,523,784,440,523,392,  784,1048,880,784,660,784,588,588,  588,660,494,440,392,440,523,588,  330,523,440,392,440,523,392,392,  660,784,494,588,440,523,392,392,  330,392,330,392,392,440,494,588,440,440,392,440,  523,588,784,660,588,660,588,523,440,392,  330,523,440,523,440,392,330,392,440,523,  392,392,660,784,588,660,588,523,494,440,784,784;   int dely96=25,50,12,12,50,50,  25,50,12,12,50,50,  50,38,12,38,12,12,12,25,  38,12,12,12,12,12,50,50,  38,12,25,25,38,12,25,25,  25,25,12,12,12,12,50,50,  38,12,25,25,12,12,50,25,  12,12,12,12,12,12,12,12,50,25,12,12,  38,12,25,25,25,12,12,25,12,12,  50,50,12,12,12,12,12,12,12,12,  50,25,12,12,12,12,12,12,25,25,50,50;   graphdriver=DETECT;    graphmode=0;   temp0="Welcome !"      temp1="Please press any key to start ."   temp2="Enjoy yourself !"      temp3="Press any key to end !"      temp4="Thank you! Bye Bye ."   initgraph(&graphdriver,&graphmode,"");       /系统初始化      cleardevice();                                                          /清除屏幕   settextjustify(LEFT_TEXT,CENTER_TEXT);   /设置字符排列方式   for(i=0;i<2;i+)              printtext(temp,i);                               getch();    for(i=2;i<4;i+)       printtext(temp,i);      i=0;    while(i<96&&!kbhit()      sound(freqi);                       /    扬声器根据频率发声      delay(1100*delyi);                   /  声音延时            i+;    nosound();                             /     关闭扬声器   printtext(temp,4);        getch();       closegraph();                                                      /  关闭图形模式void printtext(unsigned char *temp,int i)      setcolor(4);                                                          /  设置颜色   settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); /       设置字符的字体,方向和大小   outtextxy(100,40+i*50,tempi);            / 在所指定的坐标出显示字符串5.3.2  调用 inportb()和 outportb()这个程序(例程 3-38)利用 3.5.2 节的 SOUND()和 UNSOUND()改写前一实现,播放一段不同的曲目。        /*例程 3-38*/#include<dos.h>#include<graphics.h>void printtext(unsigned char *temp,int i);void SOUND(unsigned frequency);void NOSOUND(void);main()   int i,graphdriver,graphmode;   unsigned char *temp4;   int freq87=196,262,262,262,330,294,262,294,330,294,262,330,394,440,440,394,330,330,262,294,262,294,330,294,262,230,230,196,262,440,394,330,330,262,294,262,294,440,394,330,330,394,440,523,394,330,330,262,294,262,294,330,294,262,230,230,196,262,440,394,330,330,262,294,262,294,440,394,330,330,394,440,523,394,330,330,262,294,262,294,330,294,262,230,230,196,262;   int dely87=25,38,12,25,25,38,12,25,12,12,56,25,25,50,25,38,12,12,12,38,12,25,12,12,38,12,25,25,100,25,38,12,12,12,38,12,25,25,38,12,25,25,100,25,38,12,12,12,38,12,25,12,12,38,12,25,25,100,25,38,12,12,12,38,12,25,25,38,12,25,25,100,25,38,12,12,12,38,12,25,12,12,38,12,25,25,100graphdriver=DETECT;    graphmode=0;   temp0="Welcome !"      temp1="Please press any key to start ."   temp2="Enjoy yourself !"      temp3="Press any key to end !"      temp4="Thank you! Bye Bye ."   initgraph(&graphdriver,&graphmode,"");   cleardevice();   settextjustify(LEFT_TEXT,CENTER_TEXT);   for(i=0;i<2;i+)       printtext(temp,i);      getch();    for(i=2;i<4;i+)       printtext(temp,i);      i=0;    while(i<87&&!kbhit()      SOUND(freqi);      delay(1100*delyi);            i+;    NOSOUND();   printtext(temp,4);      getch();    closegraph();void printtext(unsigned char *temp,int i)   setcolor(4);   settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);   outtextxy(100,40+i*50,tempi);void SOUND(unsigned frequency)   union       /*定义由-个整数和两个字符组成的联合*/ unsigned divisor;   unsigned char c2; tone;   tone.divisor=119328L/frequency;  /*                                                      计算该频率对应的定时器计数值                                                    */   outportb(0x43,0xb6);   /*    通知定时器采用新的计数 */   outportb(0x42,tone.c0); /*  计数低字节先送到定时器 */   outportb(0x42,tone.c1);         /*      计数高字节后送到定时器 */   outportb(0x61,inportb(0x61) | 3 );  /*                                              使定时器到喇叭的输出有效                                                               */void NOSOUND(void)    outportb(0x61,(inportb(0x61) & 0xfc); /*           使定时器到喇叭的输出无效             */

    注意事项

    本文(c语言发声程序.doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开