第一种方法:
若想延时2s(12MHZ石英):
MOV R0, #50
DLY1: MOV R1, #100
DLY2: MOV R2, #200
DJNZ R2, $ ; 200*2+2
DJNZ R1, DLY2 ; (200*2+2)*100+100*2+2
DJNZ R0, DLY1 ; [(200*2+2)*100+100*2+2]*50+50*2+2个机器周期
最内层循环为200*2+2 个机器周期;外层循环使内层循环执行100次,还有其自己(DJNZ R1, DLY2 )执行100次,还有MOV R1, #100 执行一次,一共执行了(200*2+2)*100+100*2+2 个机器周期;再外层又使里面的循环执行50次,自己(DJNZ R0, DLY1 )执行50次,还有MOV R0, #50 执行一次,于是一共延时了[(200*2+2)*100+100*2+2]*50+50*2+2=2020202个机器周期。12MHZ石英,机器周期1us,所以延时2.020202s。
第二种方法:
利用定时器定时,定时器最大定时不够时,就需要附加一个软件计数器,定时器没计时完一次,产生中断,软件计数器就减一。假定每次定时50mS,计数器就需计到40次为止。这就延时了2s。
第三种方法:
也需占用硬件端口资源,外接定时器,把主频接出去分频即可。
第四种方法:
一个定时器计时,从某个IO口输出周期波形,这个波形从另一个定时器输入,另一个定时器对波形下降沿计数.