汇编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,

delay1000ms:(HT46R65的单片机)(注意不要开启计时中断允许位)

mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)

mov tmr0c,a (tmr0c 计数器的控制寄存器

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


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

原文地址: http://outofmemory.cn/yw/10954880.html

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

发表评论

登录后才能评论

评论列表(0条)

保存