| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1292 人关注过本帖
标题:c语言 DOS 定时器中断
只看楼主 加入收藏
zamely
Rank: 2
等 级:论坛游民
帖 子:42
专家分:10
注 册:2013-6-15
结帖率:77.78%
收藏
已结贴  问题点数:20 回复次数:4 
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();
}
搜索更多相关主题的帖子: multiple counter include 定时器 c语言 
2013-08-03 11:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
时钟中断是每18毫秒1次,高频下当然要错失数据。

授人以渔,不授人以鱼。
2013-08-04 11:49
zamely
Rank: 2
等 级:论坛游民
帖 子:42
专家分:10
注 册:2013-6-15
收藏
得分:0 
回复 2楼 TonyDeng
你好,我已经将定时器中断初始值改了,所以他的中断频率与我设置的值相关,而不是以前的18.2Hz
2013-08-04 15:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你测试过你的修改对这中断调用有效了?有效就不知道了,你连硬件都能改,总有办法的。

授人以渔,不授人以鱼。
2013-08-04 15:30
zamely
Rank: 2
等 级:论坛游民
帖 子:42
专家分:10
注 册:2013-6-15
收藏
得分:0 
回复 4楼 TonyDeng
修改的周期大于1ms都是可以的,但是小于1ms就没用了。硬件能不能改其实我不确定,因为8253在电脑里都没了,但确实中断频率被改变了

[ 本帖最后由 zamely 于 2013-8-5 08:56 编辑 ]
2013-08-05 08:35
快速回复:c语言 DOS 定时器中断
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067259 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved