江 江远 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-11 #1 本人本是一个DELPHI FAN,但无奈需要去写DOS下的BC31程序,好在还是Borland公司! 问题: 如何让程序每20微秒产生一个中断?注:不能用空循环,因为中间还要做别的事
江 江远 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-11 #2 本人本是一个DELPHI FAN,但无奈需要去写DOS下的BC31程序,好在还是Borland公司! 问题: 如何让程序每20微秒产生一个中断?注:不能用空循环,因为中间还要做别的事
江 江远 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-12 #4 谢谢tseug! 能给出详细的代码吗?本人的C语言功底实在太差 其他知道的朋友也请多指点!
天 天河流星 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-12 #5 { 我也还常写些DOS下的控制程序, 以下是我的1/10000秒的定时程序代码, 现在速度快的电脑可以做到1/100000秒的准确延时, 希望对你又帮助. borland pascal 和 borland C++差不多 } unit my_crt; interface procedure delay_10000(delay_count : word); procedure delay(delay_count : word); implementation var DelayCnt_10000 : longint; DelayCnt_1000 : longint; Delay_all : longint; { Delay one timer tick or by CX iterations } procedure delayLoop; assembler; asm @@1: sub word ptr[delay_all],1 sbb word ptr[delay_all+2],0 JC @@2 CMP BL,ES:[DI] JE @@1 @@2: RET end; procedure initialize_myCrt; begin asm MOV ES,Seg0040 MOV DI,006CH MOV BL,ES:[DI] @@2: CMP BL,ES:[DI] JE @@2 MOV BL,ES:[DI] mov word ptr[delay_all],0ffffh mov word ptr[delay_all+2],0ffffh CWD CALL DelayLoop end; DelayCnt_10000 := -delay_all div 550; DelayCnt_1000 := -delay_all div 55; end; procedure delay_10000(delay_count : word); assembler; asm MOV CX,delay_count JCXZ @@2 MOV ES,Seg0040 XOR DI,DI MOV BL,ES:[DI] @@1: mov ax,word ptr [delaycnt_10000] mov dx,word ptr [delaycnt_10000+2] mov word ptr [delay_all],ax mov word ptr [delay_all+2],dx XOR DX,DX CALL DelayLoop LOOP @@1 @@2: mov al,0 end; procedure delay(delay_count : word); assembler; asm MOV CX,delay_count JCXZ @@2 MOV ES,Seg0040 XOR DI,DI MOV BL,ES:[DI] @@1: mov ax,word ptr [delaycnt_1000] mov dx,word ptr [delaycnt_1000+2] mov word ptr [delay_all],ax mov word ptr [delay_all+2],dx XOR DX,DX CALL DelayLoop LOOP @@1 @@2: mov al,0 end; begin initialize_mycrt; end.
{ 我也还常写些DOS下的控制程序, 以下是我的1/10000秒的定时程序代码, 现在速度快的电脑可以做到1/100000秒的准确延时, 希望对你又帮助. borland pascal 和 borland C++差不多 } unit my_crt; interface procedure delay_10000(delay_count : word); procedure delay(delay_count : word); implementation var DelayCnt_10000 : longint; DelayCnt_1000 : longint; Delay_all : longint; { Delay one timer tick or by CX iterations } procedure delayLoop; assembler; asm @@1: sub word ptr[delay_all],1 sbb word ptr[delay_all+2],0 JC @@2 CMP BL,ES:[DI] JE @@1 @@2: RET end; procedure initialize_myCrt; begin asm MOV ES,Seg0040 MOV DI,006CH MOV BL,ES:[DI] @@2: CMP BL,ES:[DI] JE @@2 MOV BL,ES:[DI] mov word ptr[delay_all],0ffffh mov word ptr[delay_all+2],0ffffh CWD CALL DelayLoop end; DelayCnt_10000 := -delay_all div 550; DelayCnt_1000 := -delay_all div 55; end; procedure delay_10000(delay_count : word); assembler; asm MOV CX,delay_count JCXZ @@2 MOV ES,Seg0040 XOR DI,DI MOV BL,ES:[DI] @@1: mov ax,word ptr [delaycnt_10000] mov dx,word ptr [delaycnt_10000+2] mov word ptr [delay_all],ax mov word ptr [delay_all+2],dx XOR DX,DX CALL DelayLoop LOOP @@1 @@2: mov al,0 end; procedure delay(delay_count : word); assembler; asm MOV CX,delay_count JCXZ @@2 MOV ES,Seg0040 XOR DI,DI MOV BL,ES:[DI] @@1: mov ax,word ptr [delaycnt_1000] mov dx,word ptr [delaycnt_1000+2] mov word ptr [delay_all],ax mov word ptr [delay_all+2],dx XOR DX,DX CALL DelayLoop LOOP @@1 @@2: mov al,0 end; begin initialize_mycrt; end.
江 江远 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-12 #6 谢谢天河流星! 不过我不是要延时,而是要产生一个中断. 再次感谢关注!
G gongyuzhuo Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-15 #7 有money的话联系我 zgsdqd@126.com
K kinneng Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-15 #8 同意tseug的办法,利用主板上硬件定时器,时间周期准确,不占CPU资源,拦截中断就是了。
T tseug Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-15 #9 参考下面的文章 http://www.china-askpro.com/msg49/qa40.shtml
江 江远 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-15 #10 谢谢各位! to tseug: 你所说的程序我看过了,谢谢!不过它的精度太低,秒级,而我要求的是微秒级 没办法,只好用延时程序,以下是我从网上找的一个延时程序,为什么在PC104上一运行 就重启系统了.而我在笔记本上运行时没有问题, 哪位朋友帮忙看一下!(下午调了一下午的空循环,还是不好使) void TimeDelay(unsigned long microsec) /*延时函数 传入微秒数*/ {  union REGS r;  r.h.ah=0x86;  r.x.cx=microsec>>16;  r.x.dx=microsec;  int86(0x15,&r,&r); }
谢谢各位! to tseug: 你所说的程序我看过了,谢谢!不过它的精度太低,秒级,而我要求的是微秒级 没办法,只好用延时程序,以下是我从网上找的一个延时程序,为什么在PC104上一运行 就重启系统了.而我在笔记本上运行时没有问题, 哪位朋友帮忙看一下!(下午调了一下午的空循环,还是不好使) void TimeDelay(unsigned long microsec) /*延时函数 传入微秒数*/ {  union REGS r;  r.h.ah=0x86;  r.x.cx=microsec>>16;  r.x.dx=microsec;  int86(0x15,&r,&r); }
江 江远 Unregistered / Unconfirmed GUEST, unregistred user! 2005-09-20 #11 谢谢各位!最后还是用一个空循环,不过上面的方法更好! 8253不会用,应该是最佳的选择!