www.pudn.com > 1xin.rar > 1xin.c
#include#include #include #include #include #include #define N1 64 #define N2 32 #define N4 16 #define N8 8 #define N16 4 #define END 0 void startplay(int fre,int *control) /*发音函数*/ { outportb(0x43,0xb6); /*初始化2号定时器 */ fre=(unsigned)(1193180L/fre); /*计算计数初值 */ fre=fre/2 ; outportb(0x42,(char)fre); /*先写计数初值的低8位*/ outportb(0x42,(char)(fre>>8)); /*右移8位后再写高8位*/ *control=inportb(0x61); /*读0x61的状态*/ outportb(0x61,*control|0X03); /*将第0位,第1位置1,使喇叭发声*/ } 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 }; typedef enum NOTES SONG; /*曲谱*/ SONG song[]={C2,N4,C2,N8,C2,N8,C2,N4,B1,N8,B1,N8,B1,N8, A1,N8,A1,N4,1,N4,1,N4,1,N8,C2,N8,C2,N8,C2, N8,C2,N4,D1,N8,D1,N8,D1,N8,C1,N8,C1,N4+N2, 1,N4,D0,N8,E0,N8,F0,N8,D0,N8,B0,N8,E0,N8,B0,N4, D1,N8,C1,N4,B0,N4+N8,1,N4,E1,N8,B0,N8+N4,B0,N16, C1,N16,B0,N16,A0,N16,G0,N1,1,N4+N8,A10,N8,A10,N8, B0,N8,C0,N8,D0,N8,E0,N4+N8,E0,N8,E0,N8,C1,N8,B0,N8,A0,N4, F0,N8+N4+N2,F0,N8,E0,N8,E0,N8,D0,N4,C0,N8,D0,N8,E0,N8 +N4+N8,A10,N8,A10,N8,B0,N8,C0,N8,D0,N8,E0,N4,E0,N8,E0,N8, C1,N8,B0,N4,A0,N8,F0,N8+N2,1,N8,D0,N16,E0,N16,F0,N8, E0,N8,E0,N8,D0,N4,C0,N8,D0,N8,C0,N8, B10,N2,A0,N8,B0,N8,C1,N8,B0,N4,G0,N2,E0,N8,G0,N4,A0, N8,C1,N8+N4,A0,N8,G0,N8,D0,N4,E0,N1,1,N2,A0,N8,B0,N8, C1,N4,B0,N4,G0,N8,E0,N4,G0,N8+N4,A0,N8,C1,N4,A0,N8, E1,N8,D1,N8,C1,N8,E1,N8,D1,N2,C1,N4,D1,N4,E1,N2+N8, A0,N8+N4,D1,N4,C1,N8,D1,N8+N4,C1,N8,B0,N8,A0,E1,N8,D1,N4,B0,N8, G0,N8,A0,N8,E0,N2+N4,C1,N8,D1,N8,E1,N4,E1,N8,E1,N4,A0,N8,A0,N4, D1,N4,C1,N8,D1,N8+N4,C1,N8,B0,N8,A0,N4,E1,N8,D1,N4,B0, N8,G0,N8,A0,N8+N4,A0,N2,B0,N8,C1,N8,D1,N1,1,N4+N8,E0,N8, B0,N8,C1,N8,B0,N8,G0,N8,A0,N1,1,N1,1,N1,1,N1,A0,N4+N8,B0,N8, B0,N4,C1,N8,B0,N2,C1,N8,B0,N8,G0,N8+N4,F0,N8,C1,N8,B0,N8,C1, N8,A0,N2,A0,N8,B0,N8,C1,N4+N8,E1,N4,D1,N16,E1,N16,E1,N2,A0, N8,B0,N8,C1,N8,B0,N8,B0,N8+N4,C1,N8,B0,N8,G0,N8,G0,N4, A0,N8,C1,N8,C1,N8,A0,N8,E1,N8,D1,N8,C1,N8,E1,N8,D1,N1, D1,N2,C1,N4,D1,N4,D0,N4+N8,A10,N8,A10,N8,B0,N8,C0,N8,D0,N8,E0,N4,E0,N8,E0,N8, C1,N8,B0,N4,A0,N8,F0,N8+N2,1,N8,D0,N16,E0,N16,F0,N8, E0,N8,E0,N8,D0,N4,C0,N8,D0,N8,C0,N8, B10,N2,A0,N8,B0,N8,C1,N8,B0,N4,G0,N2,E0,N8,G0,N4,A0, N8,C1,N8+N4,A0,N8,G0,N8,D0,N4,E0,N1,1,N2,A0,N8,B0,N8, C1,N4,B0,N4,G0,N8,E0,N4,G0,N8+N4,A0,N8,C1,N4,A0,N8, E1,N8,D1,N8,C1,N8,E1,N8,A0,N4,A0,N8,E1,N16,G1,N16,E1,N8, E1,N16,D1,N16,D1,N8,E1,N8, E1,N2+N8, A0,N8+N4,D1,N4,C1,N8,D1,N8+N4,C1,N8,B0,N8,A0,E1,N8,D1,N4,B0,N8, G0,N8,A0,N8,E0,N2+N4,C1,N8,D1,N8,E1,N4,E1,N8,E1,N4,A0,N8,A0,N4, D1,N4,C1,N8,D1,N8+N4,C1,N8,B0,N8,A0,N4,E1,N8,D1,N4,B0, N8,G0,N8,A0,N8+N4,A0,N2,B0,N8,C1,N8,D1,N1,1,N4+N8,E0,N8, B0,N8,C1,N8,B0,N8,G0,N8,A0,N1,1,N1,1,N1,1,N1, END,END,END,END}; void play(void) /*弹奏函数*/ { char play; int flag=0,control,fre; printf("\nstart now:\n"); while(1) { play=getch(); /*按键*/ switch(play) /*频率转换*/ { case'1':fre=131;break; case'a':fre=523;break; case'2':fre=147;break; case's':fre=587;break; case'3':fre=165;break; case'd':fre=659;break; case'4':fre=175;break; case'f':fre=698;break; case'5':fre=196;break; case'g':fre=784;break; case'6':fre=220;break; case'h':fre=880;break; case'7':fre=247;break; case'j':fre=988;break; case'q':fre=262;break; case'z':fre=1047;break; case'w':fre=294;break; case'x':fre=1175;break; case'e':fre=330;break; case'c':fre=1319;break; case'r':fre=349;break; case'v':fre=1397;break; case't':fre=392;break; case'b':fre=1568;break; case'y':fre=440;break; case'n':fre=1760;break; case'u':fre=494;break; case'm':fre=1976;break; default:flag=1; /*按键无效跳出*/ } if(flag) break; if(fre) startplay(fre,&control); /*发音*/ while(!kbhit()); /*等待按键*/ if(fre) outportb(0x61,control); /*关闭喇叭*/ } } void listen(SONG song[]) /*播放固有各处函数*/ { int note=0,fre,dur,control; clock_t goal; while(song[note]!=0&&song[note+1]!=0) /*未到结尾*/ { fre=song[note]; dur=song[note+1]; if(kbhit()) {getch(); break; } /*按键断开,防信息越位*/ if(fre) startplay(fre,&control); /*发音*/ goal=(clock_t)dur+clock(); while(goal>clock()); /*延时*/ if(fre) outportb(0x61,control); /*关闭喇叭*/ goal=(clock_t)0; note+=2; /*后移*/ } } main() { char op,choice='y'; while(choice=='y') { printf("\ndo you want to play (p|P) or listen (l|L)?\n"); op=getche(); switch(op) { case'p': case'P':play();break; case'l': case'L':printf("\nenjoy yourself:\n"); listen(song);break; default:printf("\ninput error!\n"); } printf("\ndo you want to try again?yes(y) or no(n)\n"); choice=getche(); } getch(); }