如何在DOS下实现精确定时,要求误差小于5毫秒

fat_how 2003-10-09 01:42:49
如何在DOS下实现精确定时,要求误差小于5毫秒
...全文
58 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
LCLIOI 2004-02-15
  • 打赏
  • 举报
回复
8253跟主板有关还是跟cpu有关?我在一台amd的机器上试了,无效.
LCLIOI 2004-02-14
  • 打赏
  • 举报
回复
这个东西在某些机器上不行耶
fat_how 2003-10-20
  • 打赏
  • 举报
回复
谢谢,问题已解决
用的是8253
andywolf 2003-10-14
  • 打赏
  • 举报
回复
可以用Intel的CPU特殊指令RDTSC来计时,应该可以达到你要求的5mS级别的!
W32API 2003-10-14
  • 打赏
  • 举报
回复
设置/清除 IF 中断允许位
happybob51 2003-10-14
  • 打赏
  • 举报
回复
请教,汇编指令中有cli和sti吗?什么作用?先谢了
baobeixiong 2003-10-13
  • 打赏
  • 举报
回复
gz
Alecksun 2003-10-12
  • 打赏
  • 举报
回复
;T=5ms 即 f=200hz
cli
mov al,36
out 43h,al
mov ax,147eh ;1.1932MHz/200 = 147eh
out 40h,al
mov al,ah
out 40h,al
sti

然后你的IRQ8就是5ms一次中断了
pankun 2003-10-12
  • 打赏
  • 举报
回复
用RDSTC指令也可以实现.
Parkliuer 2003-10-12
  • 打赏
  • 举报
回复
编程8253A到5毫秒中断一次

刚刚学,能解释一下吗?
ahjoe 2003-10-11
  • 打赏
  • 举报
回复
编程8253A到5毫秒中断一次

这样做可以!
Alecksun 2003-10-09
  • 打赏
  • 举报
回复
编程8253A到5毫秒中断一次
W32API 2003-10-09
  • 打赏
  • 举报
回复
不可能
PC 系统无法直接实现这么准的定时。
必须借助外部时钟。
aabiao 2003-10-09
  • 打赏
  • 举报
回复
重新初始化8253,使产生的定时中断时间减少。
magicworld 2003-10-09
  • 打赏
  • 举报
回复
这个运行后可以显示系统时间,注意看中间的记数如何做的就可以了
希望能帮你忙,
下次记得多给点分拉
magicworld 2003-10-09
  • 打赏
  • 举报
回复
用芯片的脉冲记时
每18次跳一下,基本可以的,看看这个程序,驻留内存的,显示时间,tasm5.0 编译的,98下最好
CODE SEGMENT 'CODE'
ORG 100H
ASSUME CS:CODE

START: JMP INSTALL
AR1C DD ?
HOURS DB '0' ;时十位
HOURG DB '0' ;时个位
MINS DB '0' ;分十位
MING DB '0' ;分个位
SECS DB '0' ;秒十位
SECG DB '0$' ;秒个位
COUNT DB 18 ;时钟记数单元
BUFF1 DB ?
BUFF2 DB ?

MAIN PROC FAR
MOV AX,CS
MOV DS,AX
STI ;允许中断
PUSHF
CALL CS:AR1C ;执行原1ch中断向量
PUSH DX
PUSH AX
PUSH CX
PUSH BX

MOV AH,3h ;读光标的位置
MOV BH,0
INT 10H
PUSH DX;保存光标的位置

DEC COUNT
JNZ EXIT ;不为零退出

MOV AH,6
MOV CH,1
MOV CL,69
MOV DH, 1
MOV DL, 78
MOV AL, 1
MOV BH, 01EH ;显示属性值存入BH
INT 10H


MOV AH,02H ;置光标位置
MOV DH, 1
MOV DL,70
MOV BH,0
INT 10H

MOV BX,0H
MOV AH,0EH ;以电传方式写HOUR字符
MOV AL,CS:HOURS
INT 10H
MOV AH,0EH ;以电传方式写HOUR字符
MOV AL,CS:HOURG
INT 10H

MOV AH,0EH ;以电传方式写:字符
MOV AL,3AH
INT 10H

MOV AH,0EH ;以电传方式写MIN字符
MOV AL,CS:MINS
INT 10H
MOV AH,0EH ;以电传方式写MIN字符
MOV AL,CS:MING
INT 10H
MOV AH,0EH ;以电传方式写:字符
MOV AL,3AH
INT 10H

MOV AH,0EH ;以电传方式写SEC字符
MOV AL,CS:SECS
INT 10H
MOV AH,0EH ;以电传方式SEC写字符
MOV AL,CS:SECG
INT 10H

MOV COUNT ,18 ;以下代码处理进位
CMP SECG,'9'
JE S1
INC SECG
JMP EXIT
S1: MOV SECG,'0'
S2: CMP SECS,'5'
JE S3
INC SECS
JMP EXIT

S3: MOV SECS,'0'
CMP MING,'9'
JE S4
INC MING
JMP EXIT
S4: MOV MING,'0'
CMP MINS,'5'
JE S5
INC MINS
JMP EXIT

S5: MOV MINS,'0'
CMP HOURG,'4'
JE S6
INC HOURG
JMP EXIT
S6: MOV HOURG,'0'
CMP HOURS,'2'
JBE EXIT
INC HOURS

EXIT: POP DX ;恢复光标位置
MOV AH,02H
MOV BH,0
INT 10H

POP BX
POP CX
POP AX
POP DX
IRET
MAIN ENDP

INSTALL:MOV AX,CS ;该中断由系统每秒执行18次
MOV DS,AX

MOV AX,351CH ;取原1ch中断向量
INT 21H
MOV WORD PTR AR1C,BX ;保存原1ch中断
MOV WORD PTR AR1C+2,ES

MOV AX,251CH
MOV DX,OFFSET MAIN ;给出中断服务程序的地址
INT 21H ;设置新1ch中断向量

MOV DX,OFFSET INSTALL;驻留程序长度
MOV CL,4
SHR DX,CL
ADD DX,2 ;驻留新1ch中断向量


MOV AH,02CH ;取系统时间
INT 21H

MOV BUFF1,CL
MOV BUFF2,DH
MOV CL,CH
MOV CH,0
MOV AX,CX
CWD
MOV BX,10 ;转化HOURS成可以显示的形式
DIV BX
ADD AL,30H
MOV CS:HOURS,AL
ADD DL,30H
MOV CS:HOURG,DL

MOV CL,BUFF1 ;转化MIN成可以显示的形式
MOV CH,0
MOV AX,CX
CWD
MOV BX,10
DIV BX
ADD AL,30H
MOV CS:MINS,AL
ADD DL,30H
MOV CS:MING,DL


MOV CL,BUFF2 ;转化SEC成可以显示的形式
MOV CH,0
MOV AX,CX
CWD
MOV BX,10
DIV BX
ADD AL,30H
MOV CS:SECS,AL
ADD DL,31H
MOV CS:SECG,DL

MOV AX,3100H
INT 21H ;驻留程序main,返回dos

CODE ENDS
END START


jinjinlyw 2003-10-09
  • 打赏
  • 举报
回复
用GPS外部时钟吧,电脑时钟只到秒级。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧