1、哈工大C语言课程设计说明书Harbin Institute of Technology课程设计说明书(论文)课程名称: C语言课程设计 设计题目: 音乐、滤波、计时器 院 系: 班 级: 设 计 者: 学 号: 指导教师: 设计时间: 哈尔滨工业大学教务处哈尔滨工业大学课程设计任务书 姓 名: 院 (系): 专 业: 班 号: 任务起至日期: 课程设计题目:1编制音乐程序,曲目自选,不要重复。2. 在数据测量和传输过程中,由于有强干扰或意外情况,可能会丢掉数据或出现有较大误差的数据 奇异项。 应找出奇异项,去掉并补充一个合适的值。可用预测的方法找出奇异项,最简单的方法是一阶差分法。根据具体情况
2、确定一个允许误差限M编写处理奇异项的程序;生成一组包含奇异项的数据,画出曲线;将数据用处理奇异项程序处理,并画出去除奇异项后数据的曲线。3编写计时器。 已知技术参数和设计要求: 一、音乐程序1.音乐程序可实现按键发声,模拟弹钢琴的过程,并设置乐谱供弹奏。2选择歌曲播放功能。3.最后要求有一个简单友好的菜单界面,并具有一定容错能力。2、滤波程序1.生成一组包含奇异项的数据,画出曲线;2.编写处理奇异项的程序,将数据用处理奇异项程序处理3.画出去除奇异项后数据的曲线。三、计时器程序 1.要求尽可能设计出较为酷炫的界面。 工作量:一周 工作计划安排:1 研究老师给出的例程序,弄清硬件功能,设计音乐程
3、序流程框图与滤波程序流程框图。2 完成音乐程序的按键发声部分的程序编写以及滤波程序生成奇异项的程序编写。3 完成音乐程序播放音乐的程序编写以及滤波程序的图形生成的编写。4 完成音乐程序菜单部分的程序编写以及滤波程序为曲线部分的编写。5 修改优化及调试程序。6 加分程序计时器的编写 同组设计者及分工:单人 指导教师签字_ 年 月 日 教研室主任意见: 教研室主任签字_ 年 月 日*注:此任务书由课程设计指导教师填写。题目一1.1 题目详细描述:编制音乐程序,曲目自选,不要重复。音乐程序可实现有一个简单友好的菜单界面,并具有一定容错能力,进而选择歌曲播放功能,按键发声模拟弹钢琴的过程并设置乐谱供弹
4、奏。1.2 程序设计思路及流程图: 题目要求编写一个程序,包括可以直接弹奏、播放乐谱等功能。直接弹奏功能初步设计思路是运用BIOS.H头文件中的BIOSKEY函数。bioskey()的函数原型在bios.h中 bioskey()完成直接键盘操作,cmd的值决定执行什么操作。 cmd = 0: 当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返回一个16位的二进制数,包括两个不同的值。各键状态存放在返回值的低8位字节中的特性,来检测键盘是否按下以及按下时的键值。播放乐谱功能初步设计思路是通过设定音调的频率控制speaker发声,而音长控制部分由clock_t(
5、)控制时间。1.3 程序清单及注释: #include #include #include #include #include #include #define N1 64#define N2 32#define N4 16#define N8 8#define N16 4#define END 0void listenmusic(void);void Playmusic(void);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=
6、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,X0=25000,; /*上面定义音调,下面是两首乐谱*/ typedef enum NOTES SONG;SONG song1=X0,N4,X0,N4,X0,N8,G10,N8,C0,N8,D0,N8,E0,N4,G10,N4,F0,N8, E0,N8,D0,N8,C0,N8,B10,N8,B10,N4,G0,N8,G0,N4,G0,N4,C0,N4, E10
7、,N4,D0,N8,C0,N8,B10,N8,A10,N8,A10,N8,B10,N4,G0,N4,G0,N4, G0,N4,F10,N4,C0,N4,B10,N8,B10,N8,A10,N8,G10,N4,C0,N4,C0,N4, C0,N4,F0,N8,E0,N8,F0,N8,E0,N8,F0,N4,E0,N4,D0,N4,D0,N4,D0,N4, X0,N8,G0,N8,C0,N8,D0,N8,E0,N4,G10,N4,F0,N8,E0,N8,D0,N8,C0, N8,B10,N8,B10,N8,G0,N8,G0,N4,G0,N4,C0,N4,E10,N4,D0,N8,C0,N8, B1
8、0,N8,A10,N8,A0,N8,G0,N8,G0,N4,X0,N8,C0,N8,A0,N4,F0,N8,E0,N8, D0,N4,E0,N8,F0,N8,G0,N4,E0,N4,C0,N4,X0,N8,A0,N8,END,END;SONG song2=G10,N4,F0,N8,E0,N8,E0,N4,E0,N4,E10,N8,D0,N8,B10,N8,C0,N8,C0,N8, C0,N4,X0,N8,C0,N8,A0,N8,G0,N8,E0,N8,D0,N4,C0,N8,D0,N4,D0,N4,D0, N4,D0,N4,G10,N4,F0,N8,E0,N8,E0,N8,G0,N4,C0,N
9、8+N16,C0,N8,D0,N8,C0, N8,C0,N4+N8,G0,N8+N8,A10,N4,F0,N4,E0,N4,G0,N8,E0,N8,D0,N4,D0,N4, D0,N4,D0,N4,X0,N8,G10,N8,F0,N8,E0,N8,E10,N8,E0,N4,E0,N8,E10,N8,D0, N8,D0,N8,C0,N8,C0,N8,C0,N4,X0,N8,G10,N8,A0,N8,E0,N8,D0,N4,C0,N8,D0, N4,D0,N4,D0,N4,D0,N4,D0,N4,F0,N8,E0,N8,E0,N8+N16,F0,N8,A10,N8,B10,N8, C0,N4,E0
10、,N8,A0,N8,A10,N8,D0,N8,C0,N8,C0,N4,C0,N4,C0,N4,C0,N8+N16,E0, N8,G0,N8,E0,N8,G0,N8,E0,N8,D0,N8,E0,N4,G0,N8,E0,N8,D0,N8,C0,N8,C0, N4,C0,N4,C0,N4,X0,N8,A0,N8,A0,N8,G0,N8,E0,N8,G0,N4,E0,N8,D0,N4,D0, N4,D0,N4,D0,N8,C0,N8,D0,N8,C0,N8,D0,N8,C0,N8,A0,N4,C0,N4,A0,N8,G0, N8,D0,N8,E0,N8,E0,N8+N16,E0,N8,END,END
11、;void main() int a; printf( * * * *n); printf( * * * * *n); printf(* 1.listen music *n); printf( * 2.play music *n); printf( * 3.exit *n); printf( * *n); printf( * * *n); printf( * *n); printf( * *n); /*菜单界面,以下是选择功能*/ do scanf(%d,&a); if(a=1) listenmusic(); if(a=2) printf(you must want to play a son
12、g,so follow this music score.n); printf( * * * *n); printf( * * * * *n); printf(* tfdddesuaaa *n); printf( * ahgdsasssstf *n); printf( * ddgaasaagyfdgd *n); printf( * ssss tjdsassss *n); printf( * * *n); printf( * *n); printf( * *n); printf( you can press p to exit.n); Playmusic(); if(a=3) break; el
13、se printf(* you press wrong!try again. *n); while(a!=1 & a!=2 & a!=3); void listenmusic(void) int note=0, fre , dur , control,m; clock_t goal; printf( * * * *n); printf( * * * * *n); printf(* 1.Left right hand *n); printf( * 2.long time no see *n); printf( * 3.any press exit *n); printf( * *n); prin
14、tf( * * *n); printf( * *n);printf( * *n); scanf(%d,&m); if(m=1) while(song1note!=END) fre=song1note; dur=song1note+1; if(kbhit() break; /*按键退出*/ if(fre) /*若频率值fre非0*/ outportb(0x43,0xb6); /*初始化2号定时器 */ fre=(unsigned)(1193180L/fre); /*计算计数初值 */ outportb(0x42,(char)fre); /*先写计数初值的低8位*/ outportb(0x42,(
15、char)(fre8); /*再写计数初值的高8位*/ control=inportb(0x61); /*读0x61的状态*/ outportb(0x61,control|0x03); /*将第0位,第1位置1,使喇叭发声*/ goal=(clock_t)dur+clock( ); /*计算发音时间*/ while(goalclock( ); if(dur) outportb(0x61,control); note+=2; if(m=2)while(song2note!=END) fre=song2note; dur=song2note+1; if(kbhit() break; if(fre)
16、 /*若频率值fre非0*/ outportb(0x43,0xb6); /*初始化2号定时器 */ fre=(unsigned)(1193180L/fre); /*计算计数初值 */ outportb(0x42,(char)fre); /*先写计数初值的低8位*/ outportb(0x42,(char)(fre8); /*再写计数初值的高8位*/ control=inportb(0x61); /*读0x61的状态*/ outportb(0x61,control|0x03); /*将第0位,第1位置1,使喇叭发声*/ goal=(clock_t)dur+clock( ); while(goal
17、clock( ); if(dur) outportb(0x61,control); note+=2; void Playmusic(void) int fre; int control; char c; do c=bioskey(0); switch(c) case q: /*分辨大小写*/ case Q: fre=C10; sound(fre); /*发声*/ delay(100); /*延时*/ nosound(); /*静音*/ break; case w: case W: fre=D10; sound(fre); delay(100); nosound(); break; case e
18、: case E: fre=E10; sound(fre); delay(100); nosound(); break; case r: case R: fre=F10; sound(fre); delay(100); nosound(); break; case t: case T: fre=G10; sound(fre); delay(100); nosound(); break; case y: case Y: fre=A10; sound(fre); delay(100); nosound(); break; case u: case U: fre=B10; sound(fre); d
19、elay(100); nosound(); break; while(c!=p & c!=P); /*按下p退出*/1.4 程序运行结果及自评: 1. 输入1,可通过按键选择播放音乐。 2. 输入2,可弹奏钢琴曲。 3. 输入3,退出。 自评:程序基本功能可以实现,但没实现返回菜单界面,尚需优化。 1.5 程序调试中遇到过的问题及解决办法 1.无法播放按键对应音符。解决办法:用bioskey函数检查按键对应键值,修改二维数组,使之 可以播放。 2.乐谱的编写,因之前没学过基本的乐谱知识,无法根据歌曲的简谱编写乐曲,然后去学,发现并 不难。 3.如何简便控制发声;sound(以指定频率打开PC扬
20、声器),nosound(关闭PC扬声器),delay函 数(将程序的执行暂停一段时间(毫秒))实现钢琴的发声。 4.弹琴时由于输入法的问题可能大小写不能发声; 5.其中还有一些问题,比如两个函数合在一起后变量混乱,以及程序运行过程逻辑错误。都是慢慢 修改。 题目二2.1 题目详细描述: 在数据测量和传输过程中,由于有强干扰或意外情况,可能会丢掉数据 或出现有较大误差的数据 奇异项。 应找出奇异项,去掉并补充一个合适的值。可用预测的方法找出奇异项, 最简单的方法是一阶差分法。根据具体情况确定一个允许误差限M编写处理奇异项的程序;生成一组包含奇异项的数据,画出曲线;将数据用处理奇异项程序处理,并画
21、出去除奇异项后数据的曲线。2.2 程序设计思路及流程图: 坐标轴,坐标值和曲线可以图形函数画出;对于含奇异项的数据组,可用预测的方法找出奇异项,最简单的方法是 一阶差分法。根据具体情况确定一个允许误差限M编写处理奇异项的 程序。2.3 程序清单及注释:#include#include#include#include#includevoid datadeal(int *p,int a);main() int driver=DETECT,mode,x00,x11,y00,y11,m,j,n,d; int data256,x1,x2,xstep,ystep,k=0; char stt10; doub
22、le value; initgraph(&driver,&mode, ); printf(please intput error range); /*输入误差范围*/ scanf(%d,&j); srand(time(0); for(k=0;k255;k+) /*生成规律的数据*/ datak=30*log(k+1); /*for(k=0;k255;k+) datak=fabs(120*sin(2.0*3.1415926/64.0*k); */ n=rand()%100; /*增加奇异项*/ datan=rand()%100; d=rand()%100; datad=rand()%100; x
23、00=100,y00=60,x11=x00+512,y11=y00+384; rectangle(x00,y00,x11,y11); /*画矩形框*/ m=(y00+y11)/2; line(x00,m,x11,m); /*画中间分界线*/ xstep=(x11-x00)/16; /*单位长度32*/ ystep=(y11-y00)/8; /*单位长度48*/ for(k=0;k=16;k+) line(x00+xstep*k,y11,x00+xstep*k,y11+5); /*画横坐标刻度线*/ value=xstep*k/2; gcvt(value,3,stt); outtextxy(x0
24、0+xstep*k-8,y11+8,stt); /*标刻度值*/ for(k=0;k=8;k+) line(x00-5,y00+ystep*k,x00,y00+ystep*k); /*画纵坐标刻度线*/ for(k=0;k=4;k+) value=ystep*k/1; gcvt(value,3,stt); outtextxy(x00-24,y11-ystep*k-8,stt); /*标刻度值*/ outtextxy(x00-24,m-ystep*k-8,stt); x1=x00; setcolor(2); for(k=0;k255;k+) x2=x1+2; /*每隔两个分辨率画两点连线*/ l
25、ine(x1,m-datak,x2,m-datak+1); x1=x2; x1=x00; datadeal(data,j); /*数据处理及之后显示图像*/ for(k=0;k255;k+) x2=x1+2; line(x1,y11-datak,x2,y11-datak+1); x1=x2; getch(); closegraph();void datadeal(int *p,int a) /*找奇异项并代换*/ int k=0,predict,b=0; for(k=1;ka) pk+1=predict; 2.4 程序运行结果及自评:1.可以通过输入数据的变化来改变曲线的形状2.有奇异项和无奇
26、异项的差别较明显3.自评:由于数据已经自行生成,无法从外界输入,误差范围不能设置太小,由于找奇异项的算法有 缺漏导致误差范围太小时改奇异项曲线错误。图形结尾处的多余线无法控制。2.5 程序调试中遇到过的问题及解决办法 1.如何弄出一个有规律一点的含奇异项的数组;先采用数组存入一系列有规律数字,如1-255.在用随 机数赋予其中某项随机值成为奇异项; 2.数据输入单调,图形结果只有直线。采用数学库函数,对数据进行处理使多样化。题目三3.1 题目详细描述:采用画图方法做出倒计时计时器。3.2 程序设计思路及流程图:从10到1分别采用十个图形来显示,图形与图形之间用清屏和延时函数处理,圈圈的渐进效果也由延时函数实现3.3 程序清单及注释: #include#include#include#include#include#define PI 3.1415926int main() int driver=DETECT,mode; /* int ,x_hour=200,x_minute=150;*/ initgraph(&driver,&mode,c:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1