c语言中的中断,求助:C中关于时间中断的问题

这篇博客介绍如何利用BIOS中的第0x1c号时钟中断来实现精确计时。通过修改中断向量,设置新的中断处理程序,记录中断次数,达到计算时间并实时显示秒数和分钟数的目的。在中断处理程序中,设置了一个累加器和计数器以减小由于中断频率不完全等于1秒造成的误差。当计数器达到一定值时,累加器才会增加,确保时间显示的准确性。
摘要由CSDN通过智能技术生成

/*时间中断定义*/

# define TIMER 0x1c

int t=0;

void interrupt(*oldhandler)();

void interrupt newhandler() /*定义新的时间中断处理函数*/

{

t++;

oldhandler();

}

/*设置时间中断*/

void SetTimer(void interrupt(*IntProc)())

{

oldhandler=getvect(TIMER); /*保存原中断调用函数*/

disable(); /*禁止*/

setvect(TIMER,IntProc); /*设置新的时间中断处理函数*/

enable(); /*开启*/

}

/*时间中断结束*/

void KillTimer()

{

disable(); /*禁止中断*/

setvect(TIMER,oldhandler); /*还原时间中断*/

enable(); /*允许中断*/

}

有点难理解 我再转贴篇文章

为了能够计算打字的时间并同时在屏幕上显示出来,比较好的办法就是修改中断服务程序。

在BIOS(基本输入输出系统)中的第0x1c号中断是一个时钟中断,它每秒钟产生18.2次的中断。该中断实际上不起什么作用,它是一个只有一条中断返回语句的空中断。在程序执行中,将第0x1c号中断的地址向量指向另外编写的一个中断处理程序(函数):

void far interrupt handler(void)。

方法是:setvect(0x1c,handler)。

在修改0x1c的中断向量之前,还必须将原来的中断向量保存起来。以便在程序结束时恢复原来的中断向量,否则即使程序运行结束了计时也不会停下来。因此程序中设置了一个函数指针用来保存原来的中断向量:

interrupt far (*oldhandler)(void)。

使用语句oldhandler=getvect(0x1c)把原来的中断向量保存在oldhandler中。要恢复原来的中断向量,用setvect(0x1c,oldhandler)即可完成,同时也起到停止计时的作用。

在下面的中断处理程序中,sj是时钟中断累加器,每产生一次时钟中断,sj便加1,当达到18次时,表示时间经过了1秒钟,则秒数增加1。实际上因为BIOS每秒钟产生18.2次的中断,5秒钟便产生91次中断,而前面的方法5秒钟产生90次中断,显然这种方法有误差,因此程序中设置了一个计数器count,当count达到5时让sj累加19次才进1秒。

void far interrupt handler(void)

{char sec[3]="0",min[3]="0",temp[3];

sj++; /*时钟中断次数累加器加1*/

if (sj>=18) /*时钟中断次数达到18次,即时间经过了1秒钟*/

{count++; /*计数器加1*/

Second++; /*秒数增加1秒*/

if (Second>=60) /*若秒数达到60,则秒复位为0,而分增加1*/

{Second=0;

Minute++;

}

if (Minute<10)

{itoa(Minute,temp,10); strcat(min,temp);}

else

itoa(Minute,min,10);

if (Second<10)

{itoa(Second,temp,10); s

trcat(sec,temp);}

else

itoa(Second,sec,10);

WriteString(24,72,0x70,min,2); /*在第24行72列显示分钟 */

WriteString(24,74,0x70,":",1);

WriteString(24,75,0x70,sec,2); /*显示秒钟 */

if (count==5) /*若计数器达到5,让sj延长1次中断*/

{count=0;sj=-1;}

else

sj=0;

}

}

[此贴子已经被作者于2004-12-15 22:46:06编辑过]

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值