当前位置:
文档之家› 51单片机精确延时程序大集合
51单片机精确延时程序大集合
51 单片机精确延时程序大集合
以下程序说是精确延时,实际上都不对。调用一次差个几微秒、几百微秒,一 天下来差好几分钟。加我的 QQ 群有精确版本哦,不同频率的晶振都适用。群: 38397759
2008-04-24 12:10:26,
在论坛上看到不少不错的延时程序,整理如下共同分享:
精确延时计算公式:
for(h=5;h>0;h--) for(i=4;i>0;i--) for(j=116;j>0;j--) for(k=214;k>0;k--); } 200ms 延时子程序(12MHZ) void delay200ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=132;j>0;j--) for(k=150;k>0;k--); } 500ms 延时子程序程序: (12MHZ) void delay500ms(void) { unsigned char i,j,k; for(i=15;i>0;i--) for(j=202;j>0;j--) for(k=81;k>0;k--); } 下面是用了 8.0000MHZ 的晶振的几个延时程序(用定时 0 的工作模式 1): (1)延时 0.9MS void delay_0_9ms(void) { TMOD=0x01; /*定时器 0 工作在模式 1 下(16 位计数器)*/ TH0=0xfd; TL0=0xa8; TR0=1; /*启动定时器*/ while(TF0==0); TR0=0; } (2)延时 1MS void delay_1ms(void) { TMOD=0x01; /*定时器 0 工作在模式 1 下(16 位计数器)*/ TH0=0xfd; TL0=0x65; TR0=1; /*启动定时器*/ while(TF0==0); TR0=0; } (3)延时 4.5ms void delay_4_5ms(void)
;0.1s 延时程序 12MHz DELAY: MOV R6,#250 DL1: MOV R7,#200 DL2: DJNZ R6,DL2 DJNZ R7,DL1 RET
;延时 1046549 微秒(12MHz) ;具体的计算公式是: ;((((r7*2+1)+2)*r6+1)+2)*r5+1+4 = ((r7*2+3)*r6+3)*r5+5 DEL : MOV R5,#08H DEL1: MOV R6,#0FFH DEL2: MOV R7,#0FFH DJNZ R7,$ DJNZ R6,DEL2 DJNZ R5,DEL1 RET
1:DEL: MOV R7, #200 DEL1: MOV R6, #123 NOP DEL2: DJNZ R6, DEL2 DJNZ R7, DEL1 RET
是 50.001ms 算法是: 0.001ms+200*0.001ms+200*0.001ms+200*123*0.002ms+200*0.002ms
程序如下: DELAY:MOV 72H,#100 LOOP3:MOV 71H,#100 LOOP1:MOV 70H,#47 LOOP0:DJNZ 70H,LOOP0 NOP DJNZ 71H,LOOP1 MOV 70H,#46 LOOP2:DJNZ 70H,LOOP2 NOP DJNZ 72H,LOOP3 MOV 70H,#48 LOOP4:DJNZ 70H,LOOP4 定时器延时: 晶振 12MHZ,延时 1s,定时器 0 工作方式为方式 1 DELAY1:MOV R7,#0AH ;; 晶振 12MHZ,延时 0.5 秒 AJMP DELAY DELAY2:MOV R7,#14H ;; 晶振 12MHZ,延时 1 秒 DELAY:CLR EX0 MOV TMOD,#01H ;设置定时器的工作方式为方式 1 MOV TL0,#0B0H ;给定时器设置计数初始值 MOV TH0,#3CH SETB TR0 ;开启定时器 HERE:JBC TF0,NEXT1 SJMP HERE NEXT1:MOV TL0,#0B0H MOV TH0,#3CH DJNZ R7,HERE CLR TR0 ;定时器要软件清零 SETB EX0 RET C 语言延时程序: 10ms 延时子程序(12MHZ) void delay10ms(void) { unsigned char i,j,k; for(i=5;i>0;i--) for(j=4;j>0;j--) for(k=248;k>0;k--); } 1s 延时子程序(12MHZ) void delay1s(void) { unsigned char h,i,j,k;
MOV R2,#10 ;延时 1 秒 LCALL DELAY MOV R2,#50 ;延时 5 秒 LCALL DELAY DELAY: ;延时子程序 PUSH R2 PUSH R1 PUSH R0 DELAY1: MOV R1,#00H JUZINAIYOU: MOV R0,#0B2H DJNZ R0,$ DJNZ R1,JUZINAIYOU ;延时 100 mS DJNZ R2,DELAY1 POP R0 POP R1 POP R2 RET
DELAY: ;延时 1 毫秒 PUSH PSW SETB RS0 MOV R7,#50 D1: MOV R6,#10 D2: DJNZ R6,$ DJNZ R7,D1 POP PSW RET
ORG 0 LJMP MAIN
ORG 000BH LJMP CTC0 MAIN: MOV SP, #50H CLR EA MOV TMOD, #01H MOV TH0,#3CH MOV TL0,#0B0H MOV R4, #10 SETB ET0 SETB EA SETB TR0 SJMP $ ; CTC0: MOV TH0, #3CH MOV TL0, #0B0H DJNZ R4, LP CPL P1.0 MOV R4, #10 LP: RETI END
K2: MOV R7,#80H ;1 指令周期 256×10=2560 K3: NOP ;1 指令周期
;128*256*10=327680 DJNZ R7,K3 ;2 指令周期
2*128*256*10=655360 DJNZ R6,K2 ;2 指令周期
2*256*10=5120 DJNZ R5,K1 ;2 指令周期 2*10=20 RET;2 指令周期 ;21+10+2560+327680+655360+5120+20+2=990753 ;约等于 1 秒=1000000 微秒
; 定时器中断延时 TMOD=0x01; /*定时器 0 工作在模式 1 下(16 位计数器)*/ TH0=0xfd; TL0=0x83; TR0=1; /*启动定时器*/ TF0==0; TR0=0; 等待中断; 100ms 定时,11.0592 晶振 他定时准确啊又不影响程序运行
2008-06-10 13:50:46 来源:来于网络,服务大家 作者:未知 【大 中 小】 点击: 9次
;这个算下来也只有 0.998 抄 T_0: MOV R7,#10; D1: MOV R6,#200; D2: MOV R5,#248; DJNZ R5,$ DJNZ R6,D2; DJNZ R7,D1; RET
;这样算下来应该是 1.000011 秒 T_0: MOV R7,#10; D1: MOV R6,#200; D2: NOP MOV R5,#248; DJNZ R5,$ DJNZ R6,D2; DJNZ R7,D1; RET
DELAY_2S: ;10MS(11.0592mhz) MOV R3,#200 JMP DELAY10MS DELAY_100MS: ;100MS(11.0592mhz) MOV R3,#10 JMP DELAY10MS
DELAY_10MS: MOV R3,#1 DELAY10MS: ;去抖动 10MS
;(123*2+4)*200+1
2: DEL: MOV R7, #200
DEL1: MOV R6, #123
DEL2:NOP
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
D500MS: PUSH PSW SETB RS0 MOV R7,#200 D51: MOV R6,#250 D52: NOP NOP NOP NOP DJNZ R6,D52 DJNZ R7,D51 POP PSW RET
延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+5
;延时 5 秒左右 DELAY5S:PUSH 04H;2 个机器周期 PUSH 05H;2 个机器周期 PUSH 06H;2 个机器周期 MOV R4,#50;1 个机器周期 DELAY5S_0:MOV R5,#200;1 个机器周期 DELAY5S_1:MOV R6,#245;1 个机器周期 DJNZ R6,$;2×245=490 个机器周期 DJNZ R5,DELAY5S_1;这条 2 个机器周期,这层循环包含 R5×(490+1) +2×R5=98600 个机器周期 DJNZ R4,DELAY5S_0;这条 2 个机器周期 ,这层循环包含 R4×(98600+1) +2×R4=4930150 个机器周期 POP 06H;2 个机器周期 POP 05H;2 个机器周期 POP 04H;2 个机器周期 RET;2 个机器周期 ;(共 2+2+2+1+4930150+2+2+2+2=4930165 个机器周期 )
;513 微秒延时程序 DELAY: MOV R2,#0FEH;1 个机器周期 JUZINAIYOU: DJNZ R2,JUZINAIYOU;2×R21 即 2×245 RET;2 个机器周期 ;(实际上是 493 个机器周期)