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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)