51单片机延时时间计算和延时程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、关于单片机周期的几个概念
●时钟周期
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12MHz的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。
在一个时钟周期内,CPU仅完成一个最基本的动作。
●机器周期
完成一个基本操作所需要的时间称为机器周期。
以51为例,晶振12M,时钟周期(晶振周期)就是(1/12)μs,一个机器周期包
执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。
对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
1.指令含义
DJNZ:减1条件转移指令
这是一组把减1与条件转移两种功能结合在一起的指令,共2条。
DJNZ Rn,rel ;Rn←(Rn)-1
;若(Rn)=0,则PC←(PC)+2 ;顺序执行
;若(Rn)≠0,则PC←(PC)+2+rel,转移到rel所在位置DJNZ direct,rel ;direct←(direct)-1
;若(direct)= 0,则PC←(PC)+3;顺序执行
;若(direct)≠0,则PC←(PC)+3+rel,转移到rel 所在位置
2.DJNZ Rn,rel指令详解
例:
MOV R7,#5
DEL:DJNZ R7,DEL; rel在本例中指标号DEL
1.单层循环
由上例可知,当Rn赋值为几,循环就执行几次,上例执行5次,因此本例执行的机器周期个数=1(MOV R7,#5)+2(DJNZ R7,DEL)×5=11,以12MHz的晶振为例,执行时间(延时时间)=机器周期个数×1μs=11μs,当设定立即数为0时,循环程序最多执行256次,即延时时间最多256μs。
2.双层循环
1)格式:
DELL:MOV R7,#bb
DELL1:MOV R6,#aa
DELL2:DJNZ R6,DELL2; rel在本句中指标号DELL2
DJNZ R7,DELL1; rel在本句中指标号DELL1
注意:循环的格式,写错很容易变成死循环,格式中的Rn和标号可随意指定。
2)执行过程
由上表可知,本循环可以分成两个部分,一个部分是内部循环:包括DELL2:DJNZ R6,DELL2,计算机器周期个数=2(DELL2:DJNZ R6,DELL2)×4=8。
外部循环包括:DELL1:MOV R6,#4执行一次,DELL2:DJNZ R6,DELL2执行4次,DJNZ R7,DELL1执行一次,机器周期的计算与单层循环相同,计算机器周期个数=1(DELL1:MOV R6,#4)+2(DELL2:DJNZ R6,DELL2)×4+2(DJNZ R7,DELL1)=11。
本例总机器周期个数=外部循环×3+1(DELL:MOV R7,#3)=34。
因此:双层循环的总机器周期个数=1(DELL:MOV R7,#bb)+bb【1(DELL1:MOV R6,#aa)+2(DELL2:DJNZ R6,DELL2)×aa+2(DJNZ R7,DELL1)】=1+bb(3+2aa)。当aa比较大时,如果计算精度要求不高,可以忽略(3+2aa)忽略中的3,同理可忽略1+bb(3+2aa)中的1,此时双层循环的总机器周期个数≈2aa×bb。以机器周期为1μs为例,延时时间≈2aa×bb×1μs,当aa和bb都取0时,延时时间最多≈2×256×256×1μs=0.13s。
4)延时程序设计
设计延时程序时,只要计算出aa和bb即可。为了使精度高一些,将aa的值尽量变大,忽略(3+2aa)的3作用才会减少。
例1:50ms的延时程序设计(机器周期为1μs):
50ms=50000μs=2aa×bb×1μs=2×250×100×1μs
则延时程序为:
DELL:MOV R7,#100
DELL1:MOV R6,#250
DELL2:DJNZ R6,DELL2; rel在本句中指标号DELL2
DJNZ R7,DELL1; rel在本句中指标号DELL1
例2:0.1s的延时程序设计(机器周期为1μs):
0.1s=100000μs=2aa×bb×1μs=2×250×200×1μs
则延时程序为:
DELL:MOV R7,#200
DELL1:MOV R6,#250
DELL2:DJNZ R6,DELL2; rel在本句中指标号DELL2
DJNZ R7,DELL1; rel在本句中指标号DELL1
例3:0.1s的延时程序设计(机器周期为2μs):
0.1s=100000μs=2aa×bb×2μs=2×250×100×2μs
则延时程序为:
DELL:MOV R7,#100
DELL1:MOV R6,#250
DELL2:DJNZ R6,DELL2; rel在本句中指标号DELL2
DJNZ R7,DELL1; rel在本句中指标号DELL1
2.三层循环
1)格式:
DELL:MOV R7,#cc
DELL1:MOV R6,#bb
DELL2:MOV R5,#aa
DELL3:DJNZ R5,DELL3; rel在本句中指标号DELL3
DJNZ R6,DELL2; rel在本句中指标号DELL2
DJNZ R7,DELL1; rel在本句中指标号DELL1
注意:循环的格式,写错很容易变成死循环,格式中的Rn和标号可随意指定。
2)执行过程