c语言 DOS 定时器中断
我需要用TC环境下用C语言完成播放wav文件,思路是用定时器产生一个音乐采样率的时间中断来实现播放每一个音,通常采样率11K,22K,41KHz,想请问大家如何实现这个频率的中断。以下是我参照网上写的代码,但是中断的频率并不对,望请教!其实,我试过50Hz,100Hz,1000Hz,2KHz,5KHz,当频率大于1khz就开始出问题了,小于1khz时定时器中断都是正常的,不知道为何如此。#include"dos.h"
#include"stdio.h"
#define OLDTIMERINT 0x60
unsigned int multiple=0;
unsigned int mulcounter=0;
unsigned int counter=0;
/*写一个任意时间的时间中断模块*/
void settimer(void interrupt(*funp)(void),unsigned int freq)//装中断频率为freq
{
unsigned int icnt;
unsigned char temp1,temp2;
disable();//禁止中断发生。
setvect(OLDTIMERINT,getvect(8));//将旧8号中断入口地址放到0x60中断向量
multiple=freq/18.2;
mulcounter=multiple;//倍数计数变量赋初值;
icnt=1193180/freq;//得到计数器初始值;
temp1=icnt&0x00ff;temp2=icnt>>8;
outportb(0x43,0x36);//设置8253工作方式;
outportb(0x40,temp1);
outportb(0x40,temp2);
setvect(8,funp);//把新的时间中断放到8号入口;
enable();
}
/*新的中断*/
void interrupt newtimer(void)
{
struct REGPACK R;
counter++;
if(--mulcounter==0)
{
intr(OLDTIMERINT,&R);//为何不直接用int指令呢?
mulcounter=multiple;
}
outportb(0x20,0x20);
}
/*恢复旧8号中断*/
void restoretimer(void)
{
disable();
outportb(0x43,0x36);
outportb(0x40,0);
outportb(0x40,0);
setvect(8,getvect(OLDTIMERINT));
enable();
}
void main()
{
clrscr();
settimer(newtimer,5000);//以5000Hz工作.
while(!kbhit())
{
if(counter==5000)
{counter=0;printf("yeah");}
}
restoretimer();
}