⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 关于while(--n)延时测试_1.txt

📁 单片机延时计算程序源代码
💻 TXT
字号:
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
File:	关于while(--n)的优化设计		〓
Time:	12:25-9:56 8:02-                        〓
Date:	08-7-26-27 				〓
Note:	MOV	Direct,#Data  为两个机器周期    〓
	MOV	Rn,Direct     为两个机器周期	〓
〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

▲测试代码:
void delay_us(unsigned char)
{
	while(--n);
}

▲测试记录:
n=1
0.000 398 00
0.000 407 00
0.000 415 00	0.000 008 00
1+2+2*1+2+1=8

n=2
0.000 400 00
0.000 411 00
0.000 421 00	0.000 010 00
1+2+2*2+2+1=10


n=3
0.000 402 00
0.000 415 00
0.000 427 00	0.000 012 00
1+2+2*3+2+1=12

n=255
0.000 906 00
0.001 423 00
0.001 939 00	0.000 516 00
1+2+2*255+2+1=516


▲Keil C编译成汇编代码:
MOV	0x80,#00H
MOV	R7,#255		1'
LCALL	delay_us	2'
delay_us:
	DJNZ	R7,$    2'	2*255
	RET		2'


▲测试结论:
延迟时间=1+2+2*n+2
即Time=2*n+5	误差:-1us

当n=255时,Time_Max=2*255+5=515 us



▲软件改进:
延迟时间Time=2*n+6	误差:0us
void delay_us(unsigned char)
{
	while(--n);
	_nop_();
}

Delay_Max=516 us
Delay_Min=8   us
	

▲改进后测试:
n=100
0.000 907 00
0.001 425 00
0.001 942 00	0.000 517 00
2*255+6+1=517	零误差



▲双重循环▲
void delay(unsigned char n)
{
	do{unsigned char m=47;while(--m);}while(--n);
}

n=10
0.001 376 00
0.002 363 00
0.003 349 00	0.000 986 00
1+1+2+(47*2+2)*10+10*2+2=986

n=5
0.000 886 00
0.001 383 00
0.001 879 00	0.000 496 00
1+1+2+(47*2+2)*5+5*2+2=496



▲得出结论:
延迟时间: Time=1+1+2+(m*2+2)*n+n*2+2
	  由于MOV	P1,A		1'
          【即: Time=(m*2+2)*n+n*2+5】


▲结论验证:
n=20,则Time=(47*2+2)*20+20*2+6=1966

n=20
0.002 356 00
0.004 323 00
0.006 289 00	0.001 966 00	OK!验证通过



▲双重循环程序C51代码:

void delay(unsigned char m, unsigned char n)
{
	unsigned char tempm,tempn=n;
	do{tempm=m;while(--tempm);}while(--tempn);
}



▲生成的A51代码为:
             ; FUNCTION _delay (BEGIN)
;---- Variable 'n' assigned to Register 'R5' ----
;---- Variable 'm' assigned to Register 'R7' ----
;---- Variable 'tempn' assigned to Register 'R5' ----
0000         ?C0003:
;---- Variable 'tempm' assigned to Register 'R6' ----
0000 AE07              MOV     R6,0x07		1'
0002         ?C0004:
0002 DEFE              DJNZ    R6,?C0004	2'
0004         ?C0001:
0004 DDFA              DJNZ    R5,?C0003	2'
0006 22                RET     			2'
             ; FUNCTION _delay (END)

             ; FUNCTION main (BEGIN)
0000 E4                CLR     A		1'
0001 F580              MOV     P0,A		1'
0003 7D0A              MOV     R5,#0AH		1'
0005 7F2F              MOV     R7,#02FH		1'
0007 120000      R     LCALL   _delay		2'
000A 7580FF            MOV     P0,#0FFH		2'
000D 22                RET     			2'
             ; FUNCTION main (END)



▲测试记录:
m=47,n=10
0.000 389 00
0.001 377 00	0.000 988 00
1+1+1+1+2+(2*47+2)*10+10*2+2=988



▲实验结论:
延迟时间:
	Time=1+1+2+(2*m+2)*n+n*2+2
	即:【Time=(2*m+2)*n+n*2+6】



▲结论验证:
C51代码:
void delay(unsigned char m, unsigned char n)
{
	unsigned char tempm,tempn=n;
	do{tempm=m;while(--tempm);}while(--tempn);
}

令m=10,n=10
则Time=(20+2)*10+10*2+6=246

m=10,n=10
0.000 389 00
0.000 637 00	0.000 248 00
		246+1+1=248	OK!测试通过



〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

★最后,实验总结:

【C51代码:】
void delay(unsigned char m, unsigned char n)
{
	unsigned char tempm,tempn=n;
	do{tempm=m;while(--tempm);}while(--tempn);
}
延迟时间为:【Time=(2*m+2)*n+n*2+6】

〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -