《音乐程序编制》PPT课件.ppt
8255并行接口 B口(端口地址0 x61),音乐程序设计,1.PC机的扬声器驱动系统,与门,8254的2号定时器,7 6 5 4 3 2 1 0,1.193MHz输入脉冲,1,1,1,8255并行接口 B口的第 0 位为1时,定时器开始工作,产生音频信号。,8255并行接口 B口的第 1 位为1时,与门打开,音频信号送到扬声器。,控制扬声器发声,8254是可编程的定时器,有0号、1号、2号共3个可独立编程的16位定时器,还有一个控制字寄存器。,2号定时器工作在方波频率发生器方式,即输出方波信号。输出方波的频率为:1193180Hz/计数初值。向2号定时器写入不同的计数初值,可控制输出方波的频率。,控制字寄存器的I/O端口地址是 0 x430号定时器的I/O端口地址是 0 x401号定时器的I/O端口地址是 0 x412号定时器的I/O端口地址是 0 x42,计数初值是16位的,要分两次写入2号定时器,先写低8位,再写高8位。,8位端口输入函数 inportb(),函数原型:unsigned char inportb(int portid);,功能:从地址为 portid 的8位端口输入一个字节(8位),所读的值是该函数的返回值,由头文件 dos.h 说明。,用法:#include unsigned char b;b=inportb(端口地址);,8位端口输出函数 outportb(),函数原型:void outportb(int portid,unsigned char value);,功能:向地址为 portid 的8位端口输出一个字节(8位),其值为 value,由头文件 dos.h 说明。,用法:#include outportb(端口地址,无符号字符型数据或变量);,音符的定义,音频信号的频率范围是 202000Hz,音乐中使用的频率一般为1311976Hz,包括中央C调及其前后的4个八度的音程。音符与频率的关系如下表所示。,音长的定义,音长即一个音符持续的时间。N1 表示全音符N2 表示半音符N4 表示4分音符N8 表示8分音符N16 表示16分音符,用C语言定义音乐,1 2 3 4 5 6 7 C0 D0 E0 F0 G0 A0 B0,第一小节:D0,N4+N8,E0,N16,D0,N16,C0,N4+N8,A0,N8,第二小节:G0,N4,E0,N8,G0,N8,A0,N4+N8,C0,N8,源程序,#include#include#include#include#include#include#define N1 64#define N2 32#define N4 16#define N8 8#define N16 4#define END 0,enum NOTESC10=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;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,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;,main()int note=0,fre,dur,control;clock_t goal;while(songnote!=END)fre=songnote;dur=songnote+1;if(kbhit()break;if(fre)/*若频率值fre非0*/outportb(0 x43,0 xb6);/*初始化2号定时器*/fre=(unsigned)(1193180L/fre);/*计算计数初值*/outportb(0 x42,(char)fre);/*先写计数初值的低8位*/outportb(0 x42,(char)(fre8);/*再写计数初值的高8位*/control=inportb(0 x61);/*读0 x61的状态*/outportb(0 x61,control|0 x03);/*将第0位,第1位置1,使喇叭发声*/,goal=(clock_t)dur+clock();while(goalclock();if(dur)outportb(0 x61,control);note+=2;,思考题:1.clock()函数的数据类型是什么?有无返回值?2.提高八度或降低八度可采用什么办法?3.解释下面语句的语法和作用?typedef enum NOTES SONG;4.clock_t 是什么?,