单片机延时程序实例讲解

在单片机实验中,有一个很重要也是很基本的子程序必须要求我们掌握,那就是延时程序。下面我凭记忆来讲解延时程序。

课本上讲,1个机器周期=6个状态周期=12个时钟周期,而这个时钟周期与晶振频率有关。我们接下来要上的实验基本都是以12MHz的晶振。12M的频率,得其周期为1/12乘10的-6方s,那么1个机器周期就是它的12倍,即1us,而一般语句需要2个机器周期,例如

MOV R6,#20

DNJZ R6,$

      每一次执行时,每一个过程就需要2个机器周期,为1us乘2。.同样C语言中for循环语句没执行一次也是2个机器周期,即2us。下面我会以每个语句执行一次用时的2us为基本单位,不会再细化了。

汇编语言最基本延时:

        MOV R6,#20

D1:MOV R7,#248

        DNJZ R7,$//循环248次,共用248X2us,

        DNJZ R6,D1

我开始也是搞不懂怎么算它到底延时多少,现在给大家写它表达式:

我觉得应该从最后往前算,在MOR R7,#248执行一次前提下,用时1X2us,然后循环减248,用时248X2us,故共用时[2+2X248]us。

然而又由于DNJZ R6,D1,上面的过程又循环20次,故上面的循环最终用时20X[2+2X248]us。

接着注意到单纯DNJZ R6,D1会用时20X2=40us。

最后注意过执行唯一一次的  MOV R6,#20会用时1X2us。

所有,最终表达式为:1X2us+20X[2+2X248]us+20X2=10002us=10ms=0.01s。

同理,用c51编的延时程序要了解它必须也要写出它的表达式,下面的C51延时程序可以试着自己写出表达式:

void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}

我还是把表达式写在这,[(248X2+2)X20+2]X20=199240=199.24ms=0.2s

再给一个我验证过的程序,这是个比较典型和基本的延时程序应用例子:

#include<reg51.h>
sbit L1=P0^0;
void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}
void main(void)
{
while(1)
{
L1=0;
delay02s();
L1=1;
delay02s();
}
}

能看出它的功能么?他就是让一个灯不停的闪啊闪,亮个0.2s,又熄个0.2s,如此反复。

本文由:蒋匿 奉献
如若复制、转载请注明原文地址:
http://mtoou.info/danpianji-yanshichengxu/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>