编辑: star薰衣草 | 2019-07-05 |
// 保存原中断向量 setvect(INTR, handler)装载新中断向量 outportb( 0x303, 0x90);
// 初始化8255 outportb( 0x303, 0x0c);
// 置pc6=0 禁止8253通道2的gate引脚 outportb( 0x303, 0x00);
// 置pc0=0 禁止7408 outportb( 0x307, 0xb6);
// 初始化8253 pFreq = pf;
取歌曲的第一个音频 pTimeDelay = pt;
// 取歌曲的第一个时延 while ( *pFreq &
&
!kbhit()) { outportb( 0x306, (unsigned char)(CLK / *pFreq % 256));
// 先送低字节 outportb( 0x306, (unsigned char)(CLK / *pFreq / 256));
// 再送高字节 // 以上置8253通道2 的计数初值 outportb( 0x303, 0x01);
outportb( 0x303, 0x0d);
// 开扬声器 *pr = ~*pr;
outportb(0x301,*pr);
//printf( %x , ~*pr);
while ( *pTimeDelay){};
//等待延时到 outportb(0x301,0xff);
outportb( 0x303, 0x0c);
outportb( 0x303, 0x00);
// 关闭扬声器 pFreq+获取下一个音频 pTimeDelay++;
// 获取下一个延时 pr+获取下一个音频灯闪烁的数目 } // 歌曲结束或按了任意键 outportb( 0x303, 0x0c);
outportb( 0x303, 0x00);
// 再次关闭扬声器 setvect(INTR,oldhandler);
// 恢复原中断向量 return 0;
} 在Playing函数里面,首先做的是保存原中断向量,转载新的中断向量.然后是就是初始化8255和8253,在通过一个while循环,把歌曲中的每个音符相应的频率取出来放到8253的计数器2中计数.然后开扬声器播放音乐,在播放音乐的时候,把从文件中读到的音符的闪烁频率送到8255的PB口中.实现闪烁效果.直到音乐结束,灯全灭.最后关闭扬声器,恢复中段向量. 在main函数中,我们编写了一个界面, void main(void) { char c;
char s[20];
printf( now play music!\n );
printf( strike ESC to exit\n );
printf( music menu:\n );
printf( meijiujiakafei-1\n );
printf( yifenqian-2\n );
printf( xiangshuiyoudu-3\n );
printf( tianheihei-4\n );
printf( exit-5\n );
printf( please choose the song you want to sing\n );
while(c!='
5'
){ c = getchar();
if(c=='
1'
){ s[] = d:\\temp.txt ;
pr = read(s);
pf = nFreq1;
pt = nTimeDelay1;
Playing();
} else if(c=='
2'
){ s[] = d:\\temp1.txt ;
pr = read(s);
pf = nFreq2;
pt = nTimeDelay2;
Playing();
} else if(c=='
3'
){ s[] = d:\\temp2.txt ;
pr = read(s);
pf = nFreq3;
pt = nTimeDelay3;
Playing();
} else if(c=='
4'
){ s[] = d:\\temp3.txt ;
pr = read(s);
pf = nFreq4;
pt = nTimeDelay4;
Playing();
} }} 按照输出来的提示信息,输入相应的歌曲的代号来收听你想听的音乐.比如输入一你就会听到动听的美酒加咖啡的美妙旋律,当你按下ESC键时,就是结束当前所听的歌曲,当按下5时则推出程序 4.3具体代码实现 #include getvect();
setvect();
#include //kbhit();
#include //exit(0);
#include //printf();
#ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif short int nFreq1[] = { //声明歌曲 美酒加咖啡 的音乐频率 196,165,196,220,262,294,330,392,392,440,330,294,262,330,294,294,330,392,330,294,262,220,262,196,220,262,220,196,165,196,220,262,196,196,165,196,220,262,294,330,294,262,294,330,294,330,392,440,392,330,294,262,294,294,330,392,330,294,262,220,196,220,262,294,330,392,294,196,330,294,262,262,294,330,392,294,196,330,294,262,0};
short int nTimeDelay1[] = { //声明歌曲 美酒加咖啡 的音乐延时 12,4,4,4,4,4,32,8,4,4,4,4,4,4,32,12,4,8,8,4,4,2,2,4,16,8,4,4,4,4,4,4,32,8,4,4,8,8,4,2,2,4,4,16,4,4,4,4,4,4,4,4,32,12,4,8,8,4,4,4,4,16,4,4,4,4,4,4,4,4,32,4,4,4, 4,4,4,4,4,32 };