汇编1S的延时程序怎么弄?

汇编1S的延时程序怎么弄?,第1张

延时1s计算方法是将所有指令执行时间相加得出的。比如:

dly1s:

mov

r2,#10

1

dly1:

mov

r3,#200

1*10

dly2:

mov

r4,#248

1*200*10

djnz

r4,$

2*248*200*10

djnz

r3,dly2

2*200*10

djnz

r2,dly1

2*10

ret

2

total=1+10+2000+992000+4000+20+2=998033

如果使用12m晶振,那么延时时间为0.998秒。

比较常用的有两种

一种比较简单的就是粗略的软件延时;

如:

void delay_1s(void)

{

unsigned char i,j

for(i=0i<128i++)

for(j=0j<254j++)

}

这种通过调整i和j的最终值来确定延时时间,没有办法精确计算的。

另一种,做比较精确的延时,使用89C51的定时器来做

当AT89C51使用12M的晶体时,机器周期刚好是1us.用定时器非常好计算,非常精确,一月偏一秒都可以做到,加入偏查校正可以做到更精确。这个一般书上都会有的,查下书咯。这里说不清楚。一下子也不记得了,现在AT89C51已经停产了,代替他的是89S51 4K FLASH,建议用89S52 8K FLASH,

用中断,定时器工作方式1,计数最大数为65536,那么从15536开始计数,达到65536要计50000次,6M的晶振机器周期为2微秒,那么溢出一次耗时为100000微秒,计数溢出10次即为1秒钟

ORG 000BH

AJMP TIME0

ORG 30H

MAIN:

MOV 30H,#00H先把30H地址的数据清零,用做给溢出计数用

MOV TMOD,#00000001B

MOV TH0,#3CH

MOV TL0,#0B0H

SETB EA

SETB ET0

SETB TR0

LOOP:AJMP LOOP

TIME0:PUSH ACC

PUSH PSW

INC 30H进入中断后就自增

MOV A,30H

CJNE A,#10,T_RET看计数器的溢出到了10次没,没有就跳到T_RET再继续从15536计数

T_L1:延时1秒到了,写自己的程序吧。

MOV 30H,#00H记得把溢出计数器再次清零

T_RET:MOV TH0,#3CH

MOV TL0,#0B0H

POP PSW

POP ACC

RETI

END


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11003005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存