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(); 
}