为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

延时子程序

2017-11-30 11页 doc 26KB 59阅读

用户头像

is_769254

暂无简介

举报
延时子程序延时子程序 汇编延时程序大集合 2009-05-31 19:24 各种汇编延时程序大集合 ;513微秒延时程序 DELAY: MOV R2,#0FEH DELAY1: DJNZ R2,DELAY1 RET ;10毫秒延时程序 DL10MS: MOV R3,#14H DL10MS1:LCALL DELAY DJNZ R3,DL10MS1 RET ;0.1s延时程序12mhz DELAY: MOV R6,#250 DL1: MOV R7,#200 DL2: DJNZ R6,DL2 DJNZ R7,DL1 ...
延时子程序
延时子程序 汇编延时程序大集合 2009-05-31 19:24 各种汇编延时程序大集合 ;513微秒延时程序 DELAY: MOV R2,#0FEH DELAY1: DJNZ R2,DELAY1 RET ;10毫秒延时程序 DL10MS: MOV R3,#14H DL10MS1:LCALL DELAY DJNZ R3,DL10MS1 RET ;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秒延时子程序是以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秒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: ;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: ;500500MS 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 DELAY_MS DELAY_5MS: ;5MS MOV R2,#2 ;=================================== 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 DELAY: ;延时子程序(1秒) MOV R0,#0AH DELAY1: MOV R1,#00H DELAY2: MOV R2,#0B2H DJNZ R2,$ DJNZ R1,DELAY2 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 DELAY2: MOV R0,#0B2H DJNZ R0,$ DJNZ R1,DELAY2 ;延时 100 mS DJNZ R2,DELAY1 POP R0 POP R1 POP R2 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 ;(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 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 ..................................................................... .......................................... 延时5秒左右 DELAY5S:PUSH 04H PUSH 05H PUSH 06H MOV R4,#50 DELAY5S_0:MOV R5,#200 DELAY5S_1:MOV R6,#245 DJNZ R6,$ DJNZ R5,DELAY5S_1 DJNZ R4,DELAY5S_0 POP 06H POP 05H POP 04H RET 指令周期、机器周期与时钟周期 指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。 时钟周期:也称为振荡周期,一个时钟周期 ,晶振的倒数。 MCS-51单片机的一个机器周期=6个状态周期=12个时钟周期。 MCS-51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/12000000)=1µs。 程序 例1 50ms 延时子程序: DEL:MOV R7,#200 ? DEL1:MOV R6,#125 ? DEL2:DJNZ R6,DEL2 ? DJNZ R7,DEL1 ? RET ? 精确延时时间为:1+(1*200)+(2*125*200)+(2*200)+2 =(2*125+3)*200+3 ? =50603µs ?50ms 由?整理出公式(只限上述写法)延时时间=(2*内循环+3)*外循环+3 ? 详解:DEL这个子程序共有五条指令,现在分别就 每一条指令 被执行的次数和所耗时间进行分析。 第一句:MOV R7,#200 在整个子程序中只被执行一次,且为单周期指令,所以耗时1µs 第二句:MOV R6,#125 从?看到?只要R7-1不为0,就会返回到这句,共执行了R7次,共耗时200µs 第三句:DJNZ R6,DEL2 只要R6-1不为0,就反复执行此句(内循环R6次),又受外循环R7控制,所以共执行R6*R7次,因是双周期指令,所以耗时2*R6*R7µs。 例2 1秒延时子程序: DEL:MOV R7,#10 ? DEL1:MOV R6,#200 ? DEL2:MOV R5,#248 ? DJNZ R5,$ ? DJNZ R6,DEL2 ? DJNZ R7,DEL1 ? RET ? 对每条指令进行计算得出精确延时时间为: 1+(1*10)+(1*200*10)+(2*248*200*10)+(2*200*10)+(2*10)+2 =[(2*248+3)*200+3]*10+3 ? =998033µs?1s 由?整理得:延时时间=[(2*第一层循环+3)*第二层循环+3]*第三层循环+3 ?此式适用三层循环以内的程序,也验证了例1中式?(第三层循环相当于1)的成立。 注意,要实现较长时间的延时,一般采用多重循环,有时会在程式序里加入NOP指令,这时公式?不再适用,下面举例分析。 例3仍以1秒延时为例 DEL:MOV R7,#10 1指令周期1 DEL1:MOV R6,#0FFH 1指令周期10 DEL2:MOV R5,#80H 1指令周期255*10=2550 KONG:NOP 1指令周期128*255*10=326400 DJNZ R5,$ 2指令周期2*128*255*10=652800 DJNZ R6,DEL2 2指令周期2*255*10=5110 DJNZ R7,DEL1 2指令周期2*10=20 RET 2 延时时间=1+10+2550+326400+652800+5110+20+2 =986893µs约为1s 整理得:延时时间=[(3*第一层循环+3)*第二层循环+3]*第三层循环+3 ? 结论:论文针对初学者的困惑,对汇编程序的延时算法进行了分步讲解,并就几种不同写法分别出相应的计算公式,只要仔细阅读例1中的详解,并用例2、例3来加深理解,一定会掌握各种类型程序的算法并加以运用。
/
本文档为【延时子程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索