51单片机比较精确延时程序大集合
时间:2025-05-25
时间:2025-05-25
51单片机比较精确延时程序大集合
;(缺 DELAY) 0.1s 延时程序 12MHz DELAY: MOV R6,#250 DL1: MOV R7,#200 DL2: DJNZ R6,DL2 DJNZ R7,DL1 RET
微秒(12MHz) 延时 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 秒延时子程序是以 12MHz 晶振 Delay1S:mov r1,#50 del0: mov r2,#91 del1: mov r3,#100 djnz r3,$ djnz r2,del1 djnz r1,del0 Ret
1 秒延时子程序是以 12MHz 晶振为例算指令周期耗时 KK: MOV R5,#10 ;1 指令周期×1 K1: MOV R6,#0FFH ;1 指令周期×10 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 微秒
这个算下来也只有 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: 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
(11.0592mhz) MOV R4,#20 DELAY10MSA: MOV R5,#247 DJNZ R5,$ DJNZ R4,DELAY10MSA DJNZ R3,DELAY10MS RET
DELAY_500MS: MOV R2,#208 JMP DELAY_MS DELAY_175MS: ;175MS MOV R2,#73 JMP DELAY_MS delaY_120MS: ;120MS MOV R2,#50 JMP DELAY_MS delay_60ms: ;60ms MOV R2,#25 JMP DELAY_MS delay_30ms: ;30ms MOV R2,#12 JMP DEL
AY_MS DELAY_5MS: ;5MS MOV R2,#2
;500MS
DELAY_MS: CALL DELAY2400 DJNZ R2,DELAY_MS RET
DELAY2400: ;10x244+4=2447 /1.024=2390 MOV R0,#244 ;1 DELAY24001: MUL AB ;4 MUL AB ;4 DJNZ R0,DELAY24001 ;2 RET
;延时子程序 延时子程序(1 DELAY: ;延时子程序(1 秒) MOV R0,#0AH DELAY1: MOV R1,#00H JUZINAIYOU: MOV R2,#0B2H DJNZ R2,$ DJNZ R1,JUZINAIYOU DJNZ R0,DELAY1 RET
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
1:DEL:
MOV R7, #200 DEL1: MOV R6, NOP DEL2: DJNZ R6, DJNZ
#123 DEL2 R7, DEL1
RET 是 50.001ms 算法是: 0.001ms+200*0.001ms+200*0.001ms+200*123*0.002ms+200*0.002ms ;(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
DELAY: ;延时 1 毫秒 ;延时 PUSH PSW SETB RS0 MOV R7,#50 D1: MOV R6,#10 D2: DJNZ R6,$
DJNZ R7,D1 POP PSW RET
ORG
0 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 LJMP
定时器中断延时 TMOD=0x01; /*定时器 0 工作在模式 1 下(16 位计数器)*/ TH0=0xfd; TL0=0x83; TR0=1; /*启动定时器*/ TF0==0; TR0=0; 等待中断; 100ms 定时,11.0592 晶振 他定时准确啊又不影响程序运行
下面几个是单片机的延时程序(包括 asm 和 C 程序,都是我在学单片机的过程中用到的),在单片机延 时程序中应考虑所使用的晶振的频率, 51 系列的单片机中我们常用的是 11.0592MHz 和 12.0000MHz 在 的晶振,而在 AVR 单片机上常用的有 8.000MHz 和 4.000MH 的晶振所以在网上查找程序时如果涉及到 精确延时则应该注意晶振的频率是多大。 软件延时:(asm) 12MHZ,延时 晶振 12MHZ,延时 1 秒 程序如下: 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, 晶振 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 语言延时程序: 延时子程序(12MHZ) 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--); } 延时子程序(12MHZ) 1s 延时子程序(12MHZ) void delay1s(void) { unsigned char h,i,j,k; 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) 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--); } 延时子程序程序: 12MHZ) 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--); } 的晶振的几个延时程序( 1): 下面是用了 8.0000MHZ 的晶振的几个延时程序(用定时 0 的工作模式 1): (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)延时 (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) { TMOD=0x01; /*定时器 0 工作在模式 1 下(16 位计 …… 此处隐藏:2692字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:儒道互补与中国传统文化
下一篇:7.特殊题型训练(学生卷)