简单延时程序,通过计算反汇编后得出延时时间:
/************************************************************************************************************
程序循环延时指令(0-65535)
void delay_NOP( uint n )
代入变量:
n 循环次数(0-65535)
注:
【1】对W77E58系列, 当晶振频率=33.1776MHz, 选择4时钟周期模式时:
时钟周期 = 1/(33.1772*10^6) = 0.000,000,030,141(S) = 30ns
机器周期 = 4*30 = 120ns.
本程序汇编码:
; FUNCTION _delay_NOP (BEGIN)
;---- Variable 'n' assigned to Register 'R6/R7' ----
0000 E4 CLR A
0001 F500 R MOV i,A
0003 F500 R MOV i+01H,A
0005 ---- ?C0053: 机器周期(时间ns)
0005 D3 | SETB C 1 120
0006 E500 | R MOV A,i+01H 2 240
0008 9F | SUBB A,R7 1 120
0009 E500 | R MOV A,i 2 240
000B 9E | SUBB A,R6 1 120
000C 500E | JNC ?C0056 3 360
|
000E C294 | CLR CPU_SCS 2 240
0010 D294 | SETB CPU_SCS 2 240
|
0012 0500 | R INC i+01H 2 240
0014 E500 | R MOV A,i+01H 2 240
0016 70ED | JNZ ?C0053 3 360
0018 0500 | R INC i 2 240
001A | ?C0837:
001A 80E9 ---------- SJMP ?C0053 3 360
001C ?C0056:
001C 22 RET 2 240
; FUNCTION _delay_NOP (END)
结果:
单循环(n = 1 )时,执行时间约为:3000ns = 3us。
n = 333时 延时时间约为1ms.
n = 3333时 延时时间约为10ms.
n = 33333时 延时时约为0.1S.
*************************************************************************************************************/
void delay_NOP( uint n )
{
uint data i;
for ( i=0; i<=n; i++ )
{
CPU_SCS = 0; CPU_SCS = 1; // 访问看门狗
}
} |