c语言音乐程序编制

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

8位端口输出函数 outportb( )
函数原型:
void outportb(int portid ,unsigned char value);
功能:向地址为 portid 的8位端口输出一个字节
(8位),其值为 value,由头文件 dos.h 说明。
用法: #include <dos.h>

outportb(端口地址,无符号字符型数据或变量);
源程序
#include <stdio.h> #include <dos.h> #include <stdlib.h> #include <time.h> #include <bios.h> #include <conio.h> #define N1 64 #define N2 32 #define N4 16
用C语言定义音乐
2. 32 1 C0 第一小节: 2 D0 1 . 6 |5 35 6 .1| 3 E0 4 5 6 7 B0
F0 G0 A0
D0,N4+N8 , E0,N16 , D0,N16 , C0,N4+N8 , A0,N8 第二小节:
G0,N4 , E0,N8 , G0,N8, A0,N4+N8 , C0,N8
outportb(0x61,control|0x03); /*将第0位,第1位置1,使喇叭发声*/
}
goal=(clock_t)dur+clock( );
while(goal>clock( )); if(dur)
outportb(0x61,control);
note+=2; } } 思考题:1.clock()函数的数据类型是什么?有无返回值? 2.提高八度或降低八度可采用什么办法? 3.解释下面语句的语法和作用?
计数初值是16位的,要分两次写入2号定时器,先写低8位, 再写高8位。
8位端口输入函数 inportb( )
函数原型:
unsigned char inportb(int portid);
功能: 从地址为 portid 的8位端口输入一个字节(8位), 所读的值是该函数的返回值,由头文件 dos.h 说明。 用法: #include <dos.h> unsigned … b = inportb(端口地址); char b;
E10,N8,G10,N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8, A10,N8,D10,N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8, G0,N8,F0,N2,G0,N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8, A10,N8,D0,N2,E0,N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8, G10,N8,A10,N8,C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8, C0,N8,E0,N8,D0,N1,END,END};
typedef enum NOTES SONG;
SONG song[]={D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8, G10,N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8,
E0,N8,G0,N8,D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G0,N8,
#define N8 8
#define N16 4 #define END 0
enum NOTES{ C10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247, C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494, C1=523,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988, C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1976 };
/*若频率值fre非0*/
/*初始化2号定时器 */
fre=(unsigned)(1193180L/fre); /*计算计数初值 */
outportb(0x42,(char)fre);
/*先写计数初值的低8位*/
outportb(0x42,(char)(fre>>8)); /*再写计数初值的高8位*/ control=inportb(0x61); /*读0x61的状态*/
音符的定义
音频信号的频率范围是 20~2000Hz,音乐中使用的频率一 般为131~1976Hz , 包括中央C调及其前后的4个八度的音程。 音符与频率的关系如下表所示。 音符 频率 音符 频率 音符 频率 音符 频率
C D E F
131 147 165 175
C D E F
262 294 330 349
控制扬声器发声
8254是可编程的定时器,有0号、1号、2号共3个可独 立编程的16位定时器,还有一个控制字寄存器。 2号定时器工作在方波频率发生器方式,即输出方波信号。 输出方波的频率为:1193180Hz / 计数初值。 向2号定时器写入不同的计数初值,可控制输出方波的频率。 控制字寄存器的I/O端口地址是 0x43 0号定时器的I/O端口地址是 0x40 1号定时器的I/O端口地址是 0x41 2号定时器的I/O端口地址是 0x42
main(){ int note=0, fre , dur , control; clock_t goal; while(song[note]!=END){ fre=song[note]; dur=song[note+1]; if(kbhit()) break;
if(fre){
outportb(0x43,0xb6);
C D E F
523 587 659 698
C D E F
1047 1175 1319 1397
G
A
196
220
G
A
392
440Байду номын сангаас
G
A
784
880
G
A
1568
1760
B
247
B
494
B
988
B
1976
音长的定义
音长即一个音符持续的时间。 N1 N2 N4 N8 N16 表示全音符 表示半音符 表示4分音符 表示8分音符 表示16分音符
音乐程序设计
1.PC机的扬声器驱动系统
8255并行接口 B口 (端口地址0x61)
7 6 5 4 3 2 1 0 1 1
1.193MHz输入脉冲
8254的2号 定时器
1
与门
8255并行接口 B口的第 0 位为1时,定时器开始工作,产生音频信号。 8255并行接口 B口的第 1 位为1时,与门打开,音频信号送到扬声器。
typedef enum NOTES SONG ;
4. clock_t 是什么?
相关文档
最新文档