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,
delay1000ms:(HT46R65的单片机)(注意不要开启计时中断允许位)mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)
mov a,low(65536-31250) (设置的频率就是1S上升31250)因此是DELAY1S
mov TMR0L,a (计数器的赋予初始值的低位寄存器)
mov a,high(65536-31250)
mov TMR0h,a(计数器的赋予初始值的高位寄存器)
set tmr0c.4 (打开记数)
snz intc0.6 (是否有中断请求标志)(有就跳过)
jmp $-1(退回一步)
clr tmr0c.4(关闭记数)
clr intc0.6 (清除中断标志)
ret
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)